Mune's Weblog

鹿児島在住のstray radiologistです
仕事も趣味も画像関係…

2020.07.06

2020年07月06日 | 仕事関係
週休5日ではありません!
久々に環境構築を行いました。今回は、筐体を開けてグラフィックボード(なんとTITAN RTX!!!)換装から。
環境構築のメインはPytorchの導入。
今まではtensorflow+kerasで行っていたのですが、
1. TensorflowがTF2に変わり、また勉強しなおさざるを得なくなってしまったこと
2. NiftyNetがMONAIとして生まれ変わり、tensorflow+kerasからPytorchへ変わったこと
3. 参加させてもらうことになったAIベンチャー企業がPytorchをお好みのこと
4. あのPreferred NetworksがChainerの開発を止め、Pytorchへ合流したこと
これらの理由で踏み切りました。まだdefine by runがよくわかってませんが...



今回はシンプルなアドバイスをいただいていたので、大きなトラブルなく環境構築できたっぽいです。
手順としては
1. GPUドライバーのインストール
2. Anaconda最新版の導入 (Python 3.7だったので、Python 3.6の仮想環境を用意)
3. Visual Studio 2015 Communityの導入
4. CUDA Toolkitのインストール (CUDA10.2がOKhttps://pytorch.org/
5. 仮想環境をactivateして、Pytorchのインストール コマンドプロンプトから conda install pytorch torchvision cudatoolkit=10.2 -c pytorch
6. この状態で、一応CUDAは使えるみたいだけど (print(torch.cuda.is_avialable()) >> Trueなので)
 cuDNNもDLして、CUDA toolkitのフォルダにコピー

さて、お次はMONAIの導入だ。

No module named “xxx”

2020年06月10日 | 仕事関係
Anacondaで新しい仮想環境を作って、新しいライブラリを入れて「新しいことはじめるぞ!」と思ってJupyter Notebookを起動したときの絶望的なメッセージ。

No module named “xxx”

これまでも何度か出てきて、諦めたり、試行錯誤しているうちになぜか上手くいったり...
ようやく原因がわかりました。
https://weblabo.oscasierra.net/python-anaconda-jupyter-modulenotfounderror/
*「いいね!」も「シェア」もボタンが上手く働きません...

なんと、仮想環境にもJupyter Notebookを入れないとroot環境のJupyterが使われるらしい!!!知らなかった。
確かに、上手くいくときは入れていたな~。

これは勉強になった。

胸部単純写真によるCTR(心胸郭比)自動測定AIアプリケーション作成

2020年05月14日 | 仕事関係
はじめての共同作業(笑)
奥様にアノテーションしてもらい、作ってみました。
データ収集、モデル作成、計測アプリケーション作成、統計解析まで全てPythonで行いました。
1ヶ月ほどかかりきり、というほどでもなかったですが、とても勉強になりました。少しコーディングやデバッグがわかってきたかも。


Bland-Altmanプロット

Wilcoxonの符号付順位和検定(有意水準0.05) p=0.06

級内相関係数 ICC(3,1) 0.926 (95%信頼区間 [0.91-0.94])

さて、ここからどう進めよう!?(論文書けよ笑)

Pythonで級内相関係数(ICC)を計算する環境構築

2020年05月09日 | 仕事関係
絶賛、波乗り自粛中。
時間だけはたくさんあるので(^_^;)、Pythonで色々やっています。
必要があったので、級内相関係数を計算する環境を作ってみました。
Pythonでの実装を調べているとStack Overflow記事でRなら実装済み


Anacondaで仮想環境を用意してactivate
conda install -c r rpy2
参考記事の上のコードが動かなかったので、最後のコードをテスト。
...Rの外部パッケージのpysch, lme4が必要。
ローカルにRがないので、AnacondaからRパッケージインストールをできるか調べてみると
R language packages for Anaconda
https://docs.anaconda.com/anaconda/packages/r-language-pkg-docs/#l-packages
...ある!!
このページのリストを探しても良いし、
conda search -f r-EXACTNAME
のような形で検索してもOK

素晴らしいことにちゃんと用意されていたので
conda install -c r r-psych r-lme4
で仮想環境にインストール

ModuleNotFoundError Traceback (most recent call last)
in <module>
1 import rpy2
----> 2 from rpy2.robjects import IntVector, pandas2ri
3 from rpy2.robjects.packages import importr
4
5 psych = importr("psych")

~\anaconda3\envs\rpydicom\lib\site-packages\rpy2\robjects\pandas2ri.py in <module>
21 import numpy
22 import pytz
---> 23 import tzlocal
24 import warnings
25

ModuleNotFoundError: No module named 'tzlocal'

困ったときのStack Overflow

rpy2でjupyter notebookを使っている時に発生するみたいですね
conda install tzlocal

で、テストコードをトライ!
...
AttributeError Traceback (most recent call last)
in <module>
15 icc = psych.ICC(values)
---> 16 icc_df = pandas2ri.rpy2py(icc[0])

AttributeError: module 'rpy2.robjects.pandas2ri' has no attribute 'rpy2py'

もうこうなると、対処方法を探すのが苦しいので
16行目に
icc
と入れて、何か返ってくるかをチェックし、問題の行をコメントアウト。
するでました!!



しかし、調べたらタダで何でもできるすごい時代ですね(しかも面倒なビルド作業とかいらない)。サイエンティスト、エンジニア、プログラマの方々に感謝です。

2020.04.25 条件分岐を含むforループで関数を使用するスクリプトのメモ

2020年04月25日 | 仕事関係
先週から妻にアノテーションしてもらっていたパブリックデータでの人工知能モデルの開発に成功。
そこそこの精度だったので、本題である人工知能モデルの出力結果からの数値計算プログラムを作成するものの、Pythonの基本構文を今一つ理解しきれていないために中々苦労しています...リスト内包表記とか、λ式とか、いつになったら使えるようになるのだろう(._.)

自粛中で海には行けないし(連盟やローカル主体で自粛すること自体にたくさんの意味があると思っています)、朝から小さなプログラムを書いて勉強中。
ようやく先が見えてきたので、メモ代わりにアップ。
失敗例も明確に理由がわかるわけではないので、教えていただけるとうれしいです。
*入力したインデントが上手く反映されていません...インデントのミスはありませんでした!

次は例外処理を入れて上手くいくかテストしないと...


タプルのリストを作る
tup = [('CHEST',10,(1,2,3,4)),('chest',10,(1,2,3,4))]

リストの要素であるタプルから、任意の要素をスライシングで取り出す
tup[0][0]
Out[13]: 'CHEST'

通常のfor文のテスト
for i in tup:
print(i)

('CHEST', 10, (1, 2, 3, 4))
('chest', 10, (1, 2, 3, 4))

タプルのリストから、任意のスライシングで取り出す関数cnt2を定義
def cnt2(key,se):
return se[key]

for文に組み込んでのテスト
for cnt, se in enumerate(tup):
print(cnt2(cnt, tup))

('CHEST', 10, (1, 2, 3, 4))
('chest', 10, (1, 2, 3, 4))
成功!

リスト内にあるタプル内の3番目の要素を取り出す関数cnt3を定義
def cnt3(key, se):
return se[key][2]

for文に組み込んでのテスト
n [35]: for cnt, se in enumerate(tup):
print(cnt3(cnt, tup))

(1, 2, 3, 4)
(1, 2, 3, 4)
成功!

for文に条件分岐を上手く入れられなかったので、for文内に変数を定義してみる練習
for cnt, se in enumerate(tup):
key = cnt2(cnt, tup)[0]
print(key)

CHEST
chest

for文に変数を定義してやると、条件分岐が上手くいった!!
for cnt, se in enumerate(tup):
key = cnt2(cnt, tup)[0]
if key == 'chest':

print(key)
chest

以下、失敗例...

ダメだった例(1)

def cnt(se):
for i in se:
return i
cnt(tup)
Out[19]: ('CHEST', 10, (1, 2, 3, 4))

ダメだった例(2)
def cnt(se):
cont = 0
for cont in range(len(se)):
return se[cont]
cnt(tup)
Out[21]: ('CHEST', 10, (1, 2, 3, 4))

ダメだった例(3)
def cnt(se):
cont = 0
for cont in range(len(se)):
Element = se[cont]
cont +=1
return Element
cnt(tup)
Out[23]: ('CHEST', 10, (1, 2, 3, 4))

ダメだった例(4)
def cnt(se):
cont = 0
for cont in range(len(se)):
Element = se[cont]
#cont +=1
return Element
cont+=1
cnt(tup)
Out[25]: ('CHEST', 10, (1, 2, 3, 4))

ダメだった例(5)
def cnt(se):
cont = 0
for cont in range(len(se)):
Element = se[cont]
#cont +=1
#return Element
cont+=1
return Element
cnt(tup)
Out[27]: ('chest', 10, (1, 2, 3, 4))

ダメだった例(6-1) for文にif文で条件分岐を加えた失敗例
for cnt, se in enumerate(tup):
if cnt2(cnt, tup)[0] == 'chest':
print(cnt2(cnt, tup)
break


File "", line 4
break
^
SyntaxError: invalid syntax

ダメだった例(6-2) for文にif文で条件分岐を加えた失敗例
for cnt, se in enumerate(tup):
if cnt2(cnt, tup)[0] == 'chest':
print(cnt2(cnt, tup)
break


File "", line 4
break
^
SyntaxError: invalid syntax

ダメだった例(6-2) for文にif文で条件分岐を加えた失敗例
for cnt, se in enumerate(tup):
if cnt2(cnt, tup)[0] == 'chest':
print(cnt2(cnt, tup)

File "", line 4

^
SyntaxError: unexpected EOF while parsing



2019.03.31 Faster-RCNN成功\(^O^)/

2020年03月31日 | 仕事関係
今月アタマから取り組んでいたFaster RCNNを用いた「とあるAI」の最初のモデルが成功!!
パブリックデータベースの取得から、数10GBのDICOM画像の一括処理、アノテーション作成とアノテーションファイルの自動書き換え等々、人工知能開発だけでなくPython言語についても良いトレーニングになりました。



過学習かもしれませんが、概ね良い結果が得られていると思いたい...
これで益々色んな事ができるようになるはず!?

COVID-Netざっくり解説

2020年03月27日 | 仕事関係
胸部単純写真を用いたCOVID-19診断支援ツールの情報が公開されていますね。
ざっくり解説。

ソースはこちら
GitHub https://github.com/lindawangg/COVID-Net/
Arxiv Linda Wang and Alexander Wong, "COVID-Net: A Tailored Deep Convolutional Neural Network Design for Detection of COVID-19 Cases from Chest Radiography Images", 2020.

診断支援システムの内容ですが、
要は胸部単純写真による4クラス分類の分類器
1. no infection
2. bacterial infection
3. non-COVID viral infection
4. COVID-19 viral infection
です。
モデルを見ると入力画像が224×224×3(つまり224ピクセル×224ピクセル×3チャンネル)になっているので、RGBカラーの汎用画像を元に作成されているようです。ひょっとしたらImageNetで学習済みのモデルのファインチューニングかもしれないです。
GitHubのトップに出ている画像はGSInquireというツールなので、別モデルのような気がします(出力がsemantic segmentation)。こちらは商用化を視野に入れているかも?

データセットは下記2種類を用いており、さらにGitHubで公開して募集しています。

1. COVID chest X-ray dataset
2. Kaggle chest X-ray images (pneumonia) dataset

今のところ、そこそこの精度が出ているようですが、GitHubのissuesで議論されているようなlimitationsがあるので、注意が必要ですね。BacterialとCOVID-19の診断に迷っているようなので(胸部単純写真でわかる程度の所見を有するものが学習画像に多いということかもしれません)、病期に応じた画像の変化を考慮していない点や、DICOM画像から入力画像へ変換する際のがルールが決まっていないことなど。

医用画像AI開発一般に言えることですが、AIに解かせる課題の定義や、医用画像の取り扱いなどもう少しメディカル側からの働きかけが必要でしょう。

Windows10でFaster RCNN

2020年03月13日 | 仕事関係
久しぶりに物体検出アルゴリズムをしてみることにしました。
Haar like特徴量を用いたものを昔やっていたのですが、deep learningでもチャレンジ。
最新のモデルではありませんが、Faster RCNNの実装に取り組んでみました。
色んな方のブログ、まとめに助けてもらったので、一応備忘録として。

結果。


KerasでFaster RCNN 参考サイト
https://aerials.hatenablog.com/entry/2019/02/06/155055
英語サイト20200310追加*別画像での方法?やQ&Aが豊富
https://www.analyticsvidhya.com/blog/2018/11/implementation-faster-r-cnn-python-object-detection/

上のサイトはUbuntuなので、導入に際してはコマンドの読み替えが必要です。
wget→bitsadmim.exe /TRANSFER ~~~
mv→move
とかですね。

Tensorflow, kerasあるあるですが、ドはまりしたポイントのまとめは、
kerasのバージョン依存です。ResNet50が動かなかったし、VGG16は学習できたものの、認識が上手くいきませんでした。原因はkeras 2.2.4を使っていたことのようです。
エラーメッセージ:
“ValueError: Shape must be rank 1 but is rank 0 for ‘bn_conv1_7/Reshape_4’ (op: ‘Reshape’) with input shapes: [1,1,1,64], [].”

一応、Anacondaの仮想環境で行っていましたが、バージョン合わせとライブラリのインポートにはcondaでは上手くいかず、pipで成功しました。
普段、condaを使うのでかなりビビっていたのですが。。(他のライブラリを入れる可能性もあるので、まだわからない)
コマンドプロンプトから仮想環境をactivateして、
pip install tensorflow-gpu == 2.2.0
pip == 1.8.0
で、
python
from tensorflow.python.client import device_lib
device_lib.list_local_devices
GPUの認識に成功したことを確認。cuDNN, CUDAのあたりはpipでうまく解消してくれたみたいです...?

しかし、opencvが無かったので動かず
pip install opencv-python

これで成功!!numpyやmklなどがぶつかっていたらどうしようもないところでした。
自前のデータでするにはまだまだ障壁がありますが、梅雨までには1個発表できるAI作りたいですね。


2020.01.21. SK-2

2020年01月22日 | 仕事関係
日帰り出張です。
見事なSK-2(桜島、開聞岳のツーショット(笑))。



DC-LX100M2

この2年ほどANAの機内誌の占いが妙に当たるので、ドキドキしながら見たところ、エラく良いことが書いていました。
道に迷い中だったので、どうなることかと心配していたのですが、もうちょっとガマンですかねぇ。

2019.12.20 地方会断念・・・

2019年12月20日 | 仕事関係
次の放射線学会九州地方会は出身医局の佐賀大学が担当だったので、演題募集しようと思ったのですが・・・



昨年の総会から手を変え品を変え発表している、閉鎖孔ヘルニア分類AIの検討。
前回発表したGrad-CAMに、東大花岡先生からいただいたコメントへの回答としてGuided Grad-CAMを追加してみたのですが・・・
→Grad-CAM、Guided Grad-CAMのわかりやすい日本語解説はコチラhttps://qiita.com/kinziro/items/69f996065b4a658c42e8

何とか走るプログラムはかけたものの、これでは検討ができません・・・
しかも、出てきたGrad-CAMの絵が前のと違う。どこの計算が間違っている!?

というわけで、演題募集は時間切れ(;。;)
しかし次はコールドウォータークラシックもないので、参加だけさせていただきます!