マイブログ リスト

医療言語処理講座

2019年8月26日月曜日

Pyゼミ0.01 Pythonで医用画像のAIを試すための環境構築

それではPythonゼミナールをはじめます。


Keyword:Python, VMware Workstation Player, Anaconda, Chainer, ImageJ

Python開発環境の作成

最初は開発環境の作成です。ゼミでは特に統合開発環境は使わずにテキストエディタでプログラムを入力・保存して,ターミナル(端末)上で実行するようなシンプルな環境で勉強しています。

今回の目標は,次の通りです。

  • 仮想環境(ここではVMware)でUbuntuを起動する。
  • UbuntuにAnaconda,ChainerとImageJをインストールする。
  • テキストエディタgeditを開発しやすいように設定変更する。
  • 医療画像を扱える環境を作成する。


ハードウェアの環境


  • CPU,Corei3以上
  • メモリ,4GB以上,できれば8GB以上が望ましい
  • ストレージ,20GB以上の空き領域
  • GPU,動作条件には入れませんが,連載の中ではGPU対応について取り上げます。


---------------------------------------------------

PythonとChainerのインストール手順を示します.


①仮想環境VMwareのダウンロードとインストール

ゼミでは基本的に手持ちのWindowsノートPCを使います。
Windowsに仮想環境構築のためVMware Workstation Playerをインストールします。
VMwareのホームページからダウンロードしてインストールします。

②Ubuntuダウンロード

UbuntuのLTS(Long Time Support)の最新版は現在Ubuntu18.04ですが,ネット上の情報が多いUbuntu16.04を使います。
UbuntuのホームページからUbuntu16.04のisoイメージをダウンロードします。

③仮想環境にUbuntuをインストール

VMware Workstation Player上でUbuntu16.04をインストールします。
VMware Workstation Playerを起動し,Ubuntuのisoイメージを選択し仮想環境を作ります。インターネット上に方法がたくさん掲載されいるので参考にしましょう。

④Anacondaのダウンロードとインストール

VMware Workstation Player上でUbuntuを起動して,anacondaをインストールします。
 ancondaには開発に必要なPythonのパッケージがたくさん入っています。
Anacondaのホームページからファイルをダウンロードしてください。

ターミナル(ダウンロードフォルダ内で右クリックし,リストから「端末を開く」を選択)から以下のコマンドを実行します。

$bash␣Anaconda3-4.4.0-Linux-x86_64.sh⏎

($はプロンプト,␣はスペース,⏎はEnterキーです。Anacondaのバージョンにより数字「3-4.4.0」が異なります)

⑤Chainerのインストール

人工知能フレームワークのChainerをインストールします。
ここではバージョン2.0を指定してインストールします。指定しなければ最新版がインストールされます。

$pip␣install␣chainer==”2.0.0”⏎


⑥画像解析ビューワのImageJ

ImageJのホームページから画像解析ビューワImageJのファイルをダウンロードしてインストールします。
DICOM画像の表示やメタ情報を確認することができます。
また,Pythonのプログラムで処理した画像の確認にも利用できます。

これでとりあえずの環境がととのいました.

⑦確認してみよう

1)pythonを起動します。

ターミナルからpythonの入力するとプロンプト>>>が現れ,対話モードでの入力が可能な状態です。
$python⏎
Python 3.6.4 |Anaconda custom (64-bit)| (default, Dec 21 2017, 21:42:08)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

pythonを起動するとバージョンが表示されます。

2)簡単な演算

四則演算です.

>>> 1 + 2
3
>>> 2 - 3
-1
>>> 3 * 4
12
>>> 4 / 5
0.8


Pythonは整数の割り算で割り切れない場合,値は浮動小数点になります。割り算の結果を整数で得たい場合は // を使います.

>>> 5 / 2
2.5
>>> 5 // 2
2

3)NumPyの配列の生成

はじめにNumPyのライブラリをnpという名前でインポートします.

>>> import numpy as np


0から9までの範囲(range(10))の要素をもつ,浮動小数点(dtype = np.float32)の配列xを作成して表示します.

>>> x = np.array(range(10), dtype = np.float32)
>>> x
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.], dtype = float32)

4)Chainerの確認

Chainerをインポートしてバージョンを確認してみます。ゼミでは2.0を基本にしていますが,それ以降のバージョンでも問題なく動作するはずです。

>>> import chainer
>>> chainer.__version__
'2.1.0'


モジュールのインポート

次にChainerの3つのモジュールをインポートして簡単な演算の確認をしてみます。

>>> from chainer import Variable
>>> import chainer.functions as F
>>> import chainer.links as L


Variable,functionsとlinksを使って簡単ネットワークを作ってみる

VariableはChainerのネットワークに渡す変数を定義します。xに4つの値を[1,2,3,4]を代入します。

>>> x = Variable(np.array([[1,2,3,4]],dtype=np.float32))
>>> x
variable([[ 1.,  2.,  3.,  4.]])

次にlinksパッケージのLiner関数を用いて入力が4ノード,出力が3ノードのネットワークを作ってみます.

>>> l = L.Linear(4,3)


このネットワークの重みWとバイアスbの初期値を見てみましょう.

>>> l.W.data
array([[-0.35292298, -0.23537879, -0.09752855,  0.19314146],
       [-1.20308304, -0.10927824, -0.37381825,  0.24644093],
       [ 0.31677744, -0.83313662,  0.28393224,  0.09073655]], dtype=float32)
>>> l.b.data
array([ 0.,  0.,  0.], dtype=float32)
重みWは3行4列の行列で乱数により初期化されているのがわかります.バイアスは出力ノードに関連するので3つの初期値0が表示されています.

このネットワークに入力xを与えて,出力hを見てみましょう。
>>> h = l(x)
>>> h
variable([[-0.34370032, -1.55733061, -0.13475287]])

variable型で3つの出力を得ることができました。
重みWとバイアスbをもつネットワークは次のように計算して出力を求めます。
           h = W x + b 
ここでhの出力の検算してみましょう。
ネットワークlの重みの1行目はl.W.data[0]で得ることができます。
>>> l.W.data[0]
array([-0.35292298, -0.23537879, -0.09752855,  0.19314146], dtype=float32)

これに内積のメソッドdot()を使って次のように計算し見ます。
>>> l.W.data[0].dot(np.array([1,2,3,4],dtype=np.float32))+l.b.data[0]
-0.34370035

確かに,hの出力のゼロ番目の要素の値をほぼ同じ値になりました。
同様に1番目,2番めの要素の値は次のようになり,chainerを使った計算とほぼ同じ出力が得られました。
>>> l.W.data[1].dot(np.array([1,2,3,4],dtype=np.float32))+l.b.data[1]
-1.5573305
>>> l.W.data[2].dot(np.array([1,2,3,4],dtype=np.float32))+l.b.data[2]
-0.13475287

最後に出力hは負の値ですが,これをsoftomax関数を使って確率分布に変換します。
>>> y = F.softmax(h)
>>> y
variable([[ 0.3953355 ,  0.11746077,  0.48720363]])

chainerの動作の確認ができました。
またchainerのモジュールを使うことにより簡単にネットワークを作ることができることもわかりました。

5)Anacondaの確認

condaコマンドを使ってAnacondaのバージョンおよびPythonのバージョンやその他のライブラリのバージョンが確認できます。

$conda␣list⏎
# packages in environment at /home/uesemi/anaconda3:
#
# Name                    Version                   Build  Channel
_license                  1.1                      py36_1 
alabaster                 0.7.10           py36h306e16b_0 
anaconda                  custom           py36hbbc8b67_0 
 ・・・・・
python                    3.6.4                hc3d631a_0 
 ・・・・・・
zeromq                    4.2.2                hb0b69da_1 
zict                      0.1.2            py36ha0d441b_0 
zlib                      1.2.11               ha838bed_2   


⑧Pythonの終了

>>>Ctl + D



テキストエディタの設定

これからテキストエディタのgeditを使ってpythonのプログラムを作成していきますが,最初にテキストエディタのgeditの設定を行います。

geditの起動

geditの起動には空のテキストファイルを作成し,ダブルクリックして起動するのが簡単でしょう。
プログラムを作成するディレクトリ上で右クリックし「新しいドキュメント/空のドキュメント」を作成します。
ファイル上で右クリックしてリストから「名前の変更」を選択し,プログラムの名前に変更します(例えばreadFile.pyなど)

ファイルをダブルクリックするとgeditが起動してファイルを開きます。

設定ダイアログの表示

geditのメニューバーの「編集/設定」を選択します。


表示設定

最初の「表示」タブです。
行番号を表示する」にチェックを入れます。
Pythonのプログラム実行時のエラーに行番号が表示されるので,行番号を有効にしておくと作業効率が上がります。


エディター設定

次に「エディター」タブです。
タブの代わりにスペースを挿入する」にチェックを入れます。
Pythonはインデントによりfor文やif文の有効範囲(ブロック)を明示しているのでタブは非常に重要です。しかしタブとスペースが混在したりするとインデントのエラーが出力されます。ここではタブをスペース4文字に置き換えるようにします。

自動インデントを有効にする」にチェックを入れます。
プログラム入力中,文の最後でenterキーを打つと,前の行の先頭と同じ位置にカーソルが来ますので便利です。


フォントと色設定

「フォントと色」ではカラースキームを選択することができます。
好みに合わせて選択するとよいでしょう。私は「クラシック」を選択して利用しています。



まとめ

これでPythonと人工知能のフレームワークChainerを使って,プログラムを作成する準備ができました。このほかに必要なモジュールについてはそのつど説明します。
次回はDICOM画像を表示するプログラム(Pyゼミ1.01)を作成しましょう。