機械学習ノート-pytorch+unet+データサイエンスボウルコンペティション医療画像セグメンテーション

データセットの概要

1.データサイエンスボウル

        データセットは、KaggleWebサイトの2018DataScienceBowlコンテストからのものです。Booz AllenとKaggleが主催するデータサイエンスボウルは、社会的利益のためのデータサイエンスをめぐる世界有数のコンテストです。

        データサイエンスボウルは、データサイエンティスト、技術者、ドメインエキスパート、組織を集めて、世界のデータとテクノロジーの課題に対応します。これは、人々が情熱を利用し、好奇心を解き放ち、リーチを拡大して世界規模で変化をもたらすことができるプラットフォームです。

        競争を紹介するために、Booz Allenは、世界中に100万人以上のメンバーがいる主要なオンラインデータサイエンス競争コミュニティであるKaggleと提携しました。90日間にわたって、参加者は、個人またはチームで、特定の課題のアルゴリズムを開発するための固有のデータセットにアクセスできます。毎年、コンテストはトップチームに賞金を授与します。

        2015年、参加者はハットフィールド海洋科学センターから提供された100,000を超える水中画像を調べて、驚異的な速度と規模で海洋の健康状態を評価しました。1,000を超えるチームが参加し、17,000を超えるソリューションをチャレンジに提出しました。優勝チームであるDeepOceanは、現在の最先端のアルゴリズムを10%以上上回り、一部のカテゴリで人間レベルのパフォーマンスを達成する分類アルゴリズムを開発しました。

        2016年に、彼らは分析を心臓病学に適用し、心臓機能を評価する方法を変更しました。チャレンジは明らかに前年よりも複雑でしたが、コンテストには1,100を超えるチームから9,300近くのエントリーがありました。実際、優勝チームであるTenciaLeeとQiLiuは、従来のデータサイエンティストではなく、ヘッジファンドのトレーダーでした。NIHはさらに結果を研究し、成功したアプローチを医学および研究コミュニティと共有しています。

        2017年には、10,000人近くの参加者が肺がんのスクリーニング技術の改善に取り組み、18,000を超えるアルゴリズムを提出しました。予備的な結果では、誤検知が10%減少し、最新の結果よりも精度が10%向上しています。Bonnie J. Addario Lung Cancer FoundationとDrivenData.orgが後援するフォローアップコンテストが進行中で、2017年のデータサイエンスボウルアルゴリズムの進歩をコンセプトからクリニックに移しました。 

        データセットをダウンロードできる2018年大会のウェブサイト。

2018データサイエンスボウル| Kaggle発散画像で核を見つけて、医学的発見を進めますhttps://www.kaggle.com/competitions/data-science-bowl-2018/overview

2.データセットビュー

        データをダウンロードして解凍すると、次のファイルが表示されます。ここでは、stage1_train.zipとstage1_test.zipのみに一時的に焦点を当てています。

         サンプル画像の1つ。

サンプル

         サンプル画像に対応するマスクの部分のスクリーンショット。

マークされたマスク

2.参照コード

        参照コードのダウンロード

https://github.com/4uiiurz1/pytorch-nested-unet icon-default.png?t = M276https://github.com/4uiiurz1/pytorch-nested-unet

1.コード構造

        このファイルの有用性は、基本的にpyファイルの名前からわかります。

タイトル

 2.データセットをダウンロードして入力/解凍します

 3.画像の前処理

        主にマスクのマージなどのために、画像の前処理のためにスクリプトを実行します。

python preprocess_dsb2018.py

         処理が完了すると、次の画像とマスクが取得されます。

タイトル

 4.トレーニングする

python train.py --dataset dsb2018_96 --arch NestedUNet

        トレーニングが完了すると、トレーニングされたモデルがモデルフォルダーに生成されます。 

 5.確認します

        検証のために次のスクリプトを実行すると、結果が出力フォルダーに出力されます。

python val.py --name dsb2018_96_NestedUNet_woDS

        十分なトレーニングエポックがないため、まだあいまいさがあります。

3.ONNXに転送します

        pth_2onnx.pyを呼び出して、onnxモデルを変換します。

def pth_2onnx():
    """
    pytorch 模型转换为onnx模型
    :return:
    """
    torch_model = torch.load('./models/dsb2018_96_NestedUNet_woDS/model.pth')

    config = vars(parse_args())
    model = archs.__dict__[config['arch']](config['num_classes'],
                                           config['input_channels'],
                                           config['deep_supervision'])
    model.load_state_dict(torch_model)
    batch_size = 1  # 批处理大小
    input_shape = (3, 96, 96)  # 输入数据

    # set the model to inference mode
    model.eval()
    print(model)
    x = torch.randn(batch_size, *input_shape)  # 生成张量
    export_onnx_file = "model.onnx"  # 目的ONNX文件名
    torch.onnx.export(model,
                      x,
                      export_onnx_file,
                      # 注意这个地方版本选择为11
                      opset_version=11)

        推論のためにonnxモデルを呼び出す

ort_session = ort.InferenceSession('model.onnx')
input_name = ort_session.get_inputs()[0].name

img = cv2.imread('ba0c9e776404370429e80.png')  # 02_test.tif')#demo.png
#img = cv2.resize(img, (96, 96))

nor = alb.Normalize()
img = nor.apply(image=img)
img = img.astype('float32') / 255
#img = img.transpose(2, 1, 0)
img = cv2.resize(img, (96, 96))

tensor = transforms.ToTensor()(img)
tensor = tensor.unsqueeze_(0)

ort_outs = ort_session.run(None, {input_name: tensor.cpu().numpy()})

img_out = ort_outs[0]
img_out = torch.from_numpy(img_out)
img_out = torch.sigmoid(img_out).cpu().numpy()

cv2.imwrite(os.path.join('result.png'), (img_out[0][0] * 255).astype('uint8'))

おすすめ

転載: blog.csdn.net/bashendixie5/article/details/123282703