自分のための備忘録的なブログです。

Ubuntu14.04LTS を使って、ディープラーニングの勉強をしています。
記載されているコードは、他の OS には互換性がない可能性があります。


DNN:
マシン性能別 学習速度の比較, TFチュートリアルをmodifyする

python3:
オブジェクト指向プログラミングとは, モジュールとインポート、パスを通す, システムコマンド(os), ファイル・フォルダ名取得, 画像の前処理,

Ubuntu14 の初期設定:
Ubuntu14初期設定, 初期設定-2, cudaなども, 初期設定-3

labeling_for_object_detection の使い方

faster R-CNN, YOLO, SSD 等で用いる、学習データの生成ツール?  labeling_for_object_detection

 

セットアップに苦労しました。

ので、まとめておきます。

 

コードはこちら

github.com

 

セットアップの際に参考にしたサイトです。

ほとんど、このサイトの記載通りですが、少し違います。

ai-coordinator.jp

 

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

 

 

A. ソフトのインストールと起動

0. 環境

 Ubuntu 14.04 および、Windows 10

 1. Processing のダウンロード 以外はほぼ同じ。

 

1. Processing のダウンロード・インストール

 Processing というソフトをダウンロードします。

Download \ Processing.org

 

 32-bit, 64-bit は自分の OS に合わせて。普通は 64-bit を使っているはず。

 わからなければ 32-bit をダウンロードすれば、どちらでも動くとは思いますが・・・

 

 labeling_for... コードの対応は Processing 3.3 となっています。

 しかし、現在はダウンロードページから 3.3 をダウンロードできません。

 現時点では Processing 3.3.5, および, 3.3.6 にしかアクセスできませんが、3.3.5, 3.3.6 でも動きました。

 

 Windows でしたら、 .exe を使ってインストール。

  ウィザードで簡単にインストールできます。

スタートメニューには登録されません。

デスクトップに生成されたショートカットをダブルクリックして起動。

ショートカットは邪魔なので、生成されたフォルダ "processing-3.3.x" に移動しました。また、 "processing-3.3.x" フォルダも、邪魔にならない適当な場所に移動しておきます。

 

 Ubuntu 14 でしたら、

ダウンロードしたファイルを unzip で展開

ターミナルで展開されたフォルダ内に移動、

bash install.sh

にてインストールします。

 

デスクトップ上にショートカットが生成されます。私はわかりやすいように、展開されたフォルダ "processing-3.3.x" に移動しました。また、 "processing-3.3.x" ディレクトリ自体も適当な場所に移動しておきます。私は /home におきました。

 

ダウンロードしてきた processing-3.3.x.zip はあとは不要なので、

rm

するなり、保存フォルダに置いておくなり。

 

私の場合は、将来の再インストールに備えて、NAS に保存しておきます。  

   

 

 

2. github から コードをダウンロード

# terminal

cd

git clone https://github.com/slowsingle/labeling_for_object_detection

 

※私は /home にダウンロードしました。

 お好みで、お好きな場所に

 

 

3. Processing を起動、設定

1. Processing を起動します。(ショートカットのダブルクリック)

 

2. 「labeling_for_object_detection」内のファイル移動

labeling_for_object_detection 内に mainGUI ディレクトリーを作成。

すべてのファイル・ディレクトリをこの中に入れます。

cd labeling_for_object_detection

mkdir mainGUI

mv *.pde mainGUI

mv xml mainGUI

 

2. Processing で、 mainGUI.pde を開く、「フォルダ」「開く(Ctrl + O)」から、

メニュー「フォルダ」「開く(Ctrl + O)」から

「labeling_for_object_detection/mainGUI.pde」を開きます。

 

3. labeling_for_object_detection の起動

「labeling_for_object_detection/mainGUI」ディレクトリ内の mainGUI.pde をダブルクリック。

processing が起動します。

processing ウィンドウの左上の三角ボタン(再生ボタン)を押すと、使用可能状態になるはず。

 

 

 

B. コードの修正 と ラベル付け

コードの修正: mainGUI.pde

このプログラミング言語は使ったことがなので

間違ってたら申し訳ない。java なのかな。

1種類のみのラベル, lesion を使う方針。

 

コードの修正前に、mainGUI.pde はどこかにコピーしておいて、バックアップしておくのが吉。私の場合は

mkdir backup

cp mainGUI.pde ./backup

のように保存。

 

line 10

final int N_CLASS = 1;


line 12

final String[] index2name = {"lesion"};

 

line 51-54 コメントアウト

/* radio.addItem(index2name[1], 2);
radio.addItem(index2name[2], 3);
radio.addItem(index2name[3], 4);
radio.addItem(index2name[4], 5); */

 

ラベルする

このソフトでは、画像を表示する領域の広さは 600x600程度

このため、対象画像も 512x512 程度以下のピクセルに縮小しておいたほうが無難。

 

1. processing の起動

 mainGUI.pde のダブルクリックで開くのが楽。

 左上の参画じるしをクリックすると、ラベルするためのウィンドウが開く。

2. ファイルを開く

 右上の LOAD IMAGE ボタンより

3. ラベルする

 ラベルしたい名前のボタン(Chiyo, Cocoa など)をクリックしたあとで、ラベルしたい場所の「左上と右下」、または「右上と左下」をクリック。赤い四角で囲まれるはず。

 場所が良ければ SAVE RECT をクリックして保存する(赤い四角は消えるはず)

 ラベルしたい場所が他にもあれば、3. を繰り返す。

4. 保存

 OUTPUT XML ボタンを押すと、同一ファイル名(拡張子が.xmlに変わったもの)が、/labeling_for_object_detection ディレクトリ内に保存される。

 ひとしきり保存が終わったら、

mkdir xml_data

mv *.xml xml_data

 などで全部移動してしまうこと。

 5. DELETE RECT ボタン

 現在書きかけの赤い四角を消去する。

 SAVE RECT を押し、保存しておいた赤い四角は消えないので注意 

 

 

ディープラーニング用GPUの選択 - リライト

本記事は、ページビューを集めている記事のリライト、修正版です。

リライト前の記事:

pmonty.hatenablog.com

 

2種類のCPU, 2種類のGPUの速度比較した記事:

pmonty.hatenablog.com

 

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 

ディープラーニングを行うのに、GPU があると、すごく高速になります。「CUDA」というソフトで GPU を動かすそうなんですけど、 

CUDA :NVIDIA 社の GPU を,計算で使うためにプログラム

CUDA - Wikipedia

 

で、CUDA に対応した NVIDIA 製の GPU を探すと、 

developer.nvidia.com

TESLA、QuadroGeForceNVS と製品がたくさんあります。初心者はどれを選べばいいのか?

 

店頭でたくさん売ってるのは GeForce ですし、ブログ記事を見ても、 GeForce がほとんど。GeForce の一択でしょう。

上記サイトでは、性能の指標で Compute Capability  というものがあります。これは新しい GPU ほど数値が高く、数値が高いと最新バージョンの CUDA に対応しているようです。 

 

ディープラーニングをする場合、普通、 tensorflow, Chainer などの "フレームワーク" を使うことになります。すべてのフレームワークが最新の CUDA に対応しているわけではありません。GPU 購入前に、自分の使いたいフレームワークが対応している CUDA を確認するべきです。ただし今のところ、最新モデルは、過去の CUDA にも対応しているようで、基本は最新モデルを買えばいい(CC高いのを買う)となります。

 

GeForce で最新というと、 10系(1030, 1050, 1050ti, 1060, 1070, 1080, 1080ti) です。モ基本はデル番号の数字が大きいほど値段が高く、高性能ですので、後はお財布と相談。

 

お財布に合うってことは重要で、ディープラーニングの教科書でも、

shop.ohmsha.co.jp

 

GeForce GTX 750 という旧機種を導入してたりします。教科書を書いた先生が、旧機種を使っている・・・それでもずいぶん高速化できています。できれば高性能のを買いたいですが、高速化できるのなら、安いのでもいいですよね。因みにこの本、Chainer v2 に対応した新版が出ましたね。これから買う人は、お気を付け下さい。

 

で、もし画像(データ量が多い)を対象にディープラーニングをするなら、メモリーが大きい方が良いでしょう。 最新モデルで、メモリーが大きめと言うことで、候補を上げると、1050ti(4GB), 1060(6GB), 1070(8GB), 1080ti(11GB)、この中から、財布が許すのを購入すれば良んだろうと思います。ちなみに、1060 にはメモリーが少ない 3GB のモデルもあるので、注意してください。

 

 

いくつか気になってるモデルがあります。まず、1050ti はロープロファイル(小さい)モデルがあります。小さいのを買えば、コンパクトな PC ケースにも入りますね。こういうの

www.ask-corp.jp

 

コンパクトケースの一例。

apac.coolermaster.com

 

コンパクトは正義です。これくらいの GPU なら、CPU も 1万円以下の pentium とかで良いでしょう。

kakaku.com

5万円程度で組めると思います。それでもGPUなしのノートパソコンより十分速いはずで、最初は安いのでいいんではないかと。

 

安く作る上での注意点は、SSD を入れず、ストレージは HDD only にすることです。SSD 入れると起動とか速いですけど。ディープラーニング専用機なら、長時間立ち上げっぱなしにするでしょうから、起動が遅いのは無視できる。それに、ディープラーニングで処理する big data は結局HDD に入れますよね? それで、SSD の速さがあまり生かせない訳です。ディープラーニング専用のパソコンなら、SSD を入れるメリットは大きくないと思います。

 

高性能な GPU を買うなら、1080ti か、1080 の簡易水冷モデルが良いでしょうね。

1080

kakaku.com

こういうやつ。でも10万円くらいしますね。たっかい。この辺の GPU で組もうとすると、CPU も core-i7 とか、ストレージも SSD が欲しくなり、20万円以上するはず。個人でやるなら、このへんが限界かな。

 

ディープラーニングすると、CPU, GPU が非常に熱を持ちます。次のエントリに具体的に書いていますが、

pmonty.hatenablog.com

私の場合で、CPU は 80度近く、GPU は 85度まで行きました。

まず、GPU について。ディープラーニング中、GPUは本当に熱を持ちます。触ってみると本当に暑いです。冷却には、空冷、ヒートパイプ空冷、簡易水冷、本格水冷があり、この4つのうち後ろに行くほど冷却効果が高いです。1080 や 1080ti を買うなら、本格的にディープラーニングをやる(つもり)のはず。それなら、簡易水冷モデルを買いたいところです(本格水冷は初心者にはハードルが高いです)。

ディープラーニングで CPU もかなり発熱します。しかし、触ってみると、GPU ほど暑くはありません。CPUの冷却は、空冷(CPUにバンドルされてる奴)もしくはヒートパイプ空冷で十分だと私は思っています。

ところで、アメリカはこういったパソコン製品が安いので、アメリカに旅行する機会があれば、ホテル付で買ったりするのもありです。なお、アメリカアマゾンは、日本と違い、 Prime でも2日後がデフォ。基本的にもっと日数がかかります。なので、アメリカ旅行中に購入する場合、日程には余裕を持って。

 

 

本当は 1080ti の簡易水冷が良いんですけど

kakaku.com

あまり在庫がないし、

バカみたいに高いので。

 

最近は、GPUで、仮想通貨マイニングがはやってるみたいなので、

そっち方面でも どんどん売れていくんでしょうね。。。

 

私は GPU をもう一枚買って高速化(SLI)しようかと、時々値段を見ていますが、

10万円クラスの高性能モデル(1080ti)になると、かなり値動きが大きいです。1万、2万とか変化しますので、購入される場合、値動きにご注意下さい。

 

Amazonについては、過去の値動きをグラフ化してくれる「Keepa」というアドインがあります。

安く買いたいとき、参考になります。

chrome.google.com

 

憧れの NAS と現実

憧れの NAS を買いました。

Synology の 216j.

2ドライブの入門機です。

 

www.synology.com

 

数ヶ月運用したので感想。

 

まず、購入した目的は、複数 PC でのデータ共有でした。

 

これまで、複数 PC でのデータ共有は、

Dropbox の無料容量で頑張ってきました。

 

PC母艦は家に置いてあります。

外でノートでちゃっちゃとコード書いたり、処理を試すこともあり。

 

データのやりとりが必要。

で、メインで使ってる Dropbox では足りなくなってきたと。

 

Onedrive や GoogleDrive を併用しても良かったのですが、

それほど容量が増えるわけではないし。

 

複数のソフトを常駐させると、

  遅くなったり、

  消費電力が増えたり

しそうだから嫌。

 

OneDrive は Ubuntu で使えないし(使い方が分からない)。

 

MicrosoftGoogle は、Dropbox と比べ、

プライバシーに不安もありました。

 

アップルはテロリスト(疑い)の個人情報を守りましたし、

アップルなら信頼しますけど。

 

一部の企業は、サービス最適化のため、

顧客データで機械学習とか回してるでしょうしね。

 

ディープラーニングは「研究」でやってるんで、

虎の子の「データ」を、企業に渡すわけにはいかんのです。

 

で、クラウド上でデータやりとりするために、

憧れの NAS を導入しました。

 

(ホントにデータを守りたければ、クラウドなんか使っちゃダメで、

全部ローカルで管理しなきゃなんですけどね。)

 

 

RAID で冗長性確保。

データをロスする危険も減ってウハウハ!!

 

 

かと思っていたら!!

 

まず、Dropbox の様に使おうと思い、Synology-Cloud-Station-Drive と言うソフトを各 PC に導入、常時同期をやっていました。するといくつか問題が。。。

 

問題点

1.遅い

 LAN ケーブル1本、RAID 1 ですから、書き込みがめっちゃ遅い。

 しかも複数の PC で常時同期してるので、遅い、遅い。

 

2.時々同期されなかったり。

 いつまで待っても同期されなかったり。

 PC再起動、NAS再起動したりして、なんとか同期してくれました。

 

 けど、まぁ不安ですわね。

 「データを保存してるつもり」で「保存されてないかもしれない」訳ですから!

 

 

で、Dropbox って本当に優秀なんだと、今更気付きました。

高速

複数 PC からも常時同期。

世代管理で以前のファイルを復活

 など

 

良いんですけど、おかげさまでお値段も良い訳です。

当然ですね。

1TB で月々1000円という。

navi.dropbox.jp

1TB っていうのは、ちょっと少ないですね。

日常的に使う分なら十分ですけど、ビッグデータとなると足りないですね。

悩ましい。。。 

 

 

ビジネスのスタンダードとか言うサービスなら、2TB あるいはそれ以上使えるんですけど、「5名様から」なので、お値段は75ドル/月からですか。高いですね。

Dropbox plan comparison - Dropbox Business

 

 

 

でも、Dropbox の 1TB 有料プランって、本当に高いのでしょうか?

今回の NAS 導入費用はざっくり 4万円, で 3TB です。

4万円あれば Dropbox 1TB のでも 3年以上使えますね。

 

でも目的は、ディープラーニングビッグデータ管理。

1TB では足りません。

 

 

 

で、札束で殴って、

NAS を高速化することを考えてみます。

 

 

ボトルネック

データの入出力の LAN ケーブル

データ書き込みの HDD

なので、これらを複数帯域確保すれば、速くなるでしょう、と。

 

 

実際の RAID の速度比較 については

こちらのサイトを参照。

https://hikaku.cman.jp/raid/

 

 

例えば 5本差しの RAID 6

  (5本のうち2本が壊れても大丈夫)

  ざっと2-3倍に高速化するようです。

 

 

Synology は 5本モデルからは LAN の差し込み口が4本。

  LAN を複数挿せますし、

  PC とダイレクト接続もできますね。

  ルーターを介さず、ダイレクトの方が速いんでしょう。

 

 

しかしまあ、5本差しモデルというと、本体 10万円くらいになっちゃうし。

HDD も 3 本、買い足さないと。

なんか「沼」にハマる感じ。

 

DS1517 とか、DS 1517+ とか言う機種を考えてたんですけど

(これらは 5ベイだけど、拡張ユニットで 15 ベイまで増やせる)

 

カカクコムのレビューなんか見ると、

  「CPU は性能低い」

とかディスられてたりもして。

うーむ。悲しい。

 

自分に知識があれば、Ubuntu でデータサーバー組むんだけどなぁ。。。

 

と、妄想しています。

 

とりあえず、現状、運用方法を変えてます。

 

NAS はデータのバックアップのみで使用。

 

1.メインのノートパソコンのクラウドバックアップ

 

2.ディープラーニングの大量データ保存。

  常時同期はやめる。

  データバックアップは、FTP? みたいに、

   ブラウザ上でアップロード・ダウンロード。

  重いデータは USBメモリとか、外付け HDD でやりとり

 

という感じ。

 

メインの PC のバックアップは、不安なんですけどね。

NAS にうまく同期されてないことがありましたし。

一応 外付け HDD にも時々保存しています。

 

 

現状に不満あって。

なんと言っても、転送が遅いので。

 

今から思えば、

ふつーに 2.5 か 3.5 の HDD を裸で買って

USB でつないで外付け HDD 風に使う

 

のが、一番ストレスなかったかもです。

 

Keras を使って驚いたこと:インストールの不具合に気付く。

と言うわけで、Keras を始めて約 1日が過ぎました。

 

Keras は簡単で良いですね。

 

できたこと

 

1.VGG 風の簡単なモデルを試す。

2.Keras に実装済みモデルを使う:Xception

3.Imagenet 学習済みモデルの転移学習を試す。

 

結果:これまで 精度 0.90 までしか出なかったのが、最高 0.97 を叩き出す。

 

これまで tf で、何ヶ月も苦しんでいた

1.batch normalization とか

2.既存の高精度なモデルの利用 とか

3.Imagenet 学習済みモデルの転移学習 とか

 

が解決してしまいました。

(tf で実装できている、学習過程の保存とか、tensorboard の利用は、まだ Keras ではできないのですが) 

 

その学習過程は壮絶で、これまで 65度程度だったオリファンの GTX1070 が、80度越えまで頑張ってくれちゃいました。

これを何日も回すのは不安・・・

 

もちろん、ここ数ヶ月の、tf での苦しみから学んだこともあります・・・

 

エラーを見て、どこの問題か推測する とか

エラーが出ても慌てず、手順を経て解消する とか

 

の経験が積めたし。

 

おかげで、Keras を短期間で使えるようになったと思いたい。。。

無駄じゃなかったと思いたい。。。

 

さておき、とんでもないことに気付きました。

 

私はディープラーニング用に2台のパソコンを使っていますが、

メインマシンでトラブル発生です。

 

気付いたのは些細なこと。

今回なぜか、サブマシンで Keras を使い始めました。

 

とりあえずの実装ができたので、メインマシンへコピー。2台でハイパーパラメータの調整を始めたところ、どうもメインマシンの精度が安定しないのです。

サブマシンだと val_accuracy は 0.95-0.99 に張り付いてるのが、メインだと 0.00 - 0.99 までめまぐるしく動く感じ。Seed 取ってないせいかもしれませんが、それにしたって上下動が激しすぎます。

 

で、なんだか変だと。

 

よくよく考えると、

 

「Python3.6 で、出るはずの pandas エラーが返らない!」

 

ことに気付きました。

Keras は python 3.5 までの対応でして、サブマシンの方で 3.6 で動かすと「pandasがなんちゃら」とか エラーを出して止まるのですが。

メインマシンだと、3.6 でも曲がりなりに動いてくれますが、 val_acc が 0 ~ 0.99 までめまぐるしく動きます。そうすると test accuracy も当然悪いと。

 

学習速度は 1080ti のおかげで 1.5 倍くらい速いのですが、どこかがおかしく、使い物になりません。 

 

pandas 関連の問題だとすれば Anaconda のインストールの問題なんでしょうけど。

前 Anaconda を入れ直した際、なんか設定ファイルがうまく消せなかった経験があり(再インストールで環境引き継がれてしまった)。

また、どこに問題があるか切り分けられず、そのうちにさっくり、 Ubuntu インストールからやり直そうと思っています。

 

 これで一日潰れるし、再インストールして再発した否にはどうしようって感じですけど。。。

 

Keras のインストール

というわけで、Keras に挑戦することに相成りました。

Keras Documentation

 

バックエンドに TensorFlow, CNTK または Theano を使い、

フロントエンドでディープラーニングを楽にしてくれるものらしい。

Tensorflow はインストール済み。

CNTK も Theano も定評あるモデルで、いつかは触ってみたいけど、

今回は Tensorflow でいこう。

 

それでは Keras のインストール。 

pip install keras

 

 ただし、対応は Python 2.7-3.5 だそうなので、 Python 3.6 を入れている私は

source activate py35 

しないといけない。

さて、依存パッケージがあるそうで、

 

Kerasは以下のライブラリに依存しています.

numpy, scipy
yaml
HDF5とh5py (モデルの保存や読み込み関数を使う場合のみ)
cuDNN: オプションですが,CNNを使用する場合は推奨

Anaconda で入れてる人は、 numpy, scipy は導入済みのはず。

HDF5っていうのは見つからなかったけど、ぐぐったらどうも HDF5 = h5py らしい。

いつの間にか PyPI でインストールされていた: h5py

 

yaml というのは、データの保存や読み込みに使うようなのだけど、

このインストールは

sudo apt-get install libyaml-dev

 とのこと。

 

かんたん!

 

Keras は公式ドキュメントが日本語化されているし、使い方も TensorFlow よりも簡単!

データの取り回しも numpy で行うようですね。

tf だと、 tf. なんちゃら みたいな Tensor でデータを保持したりしますが、そうすると 

sess.run

しないと中身が見えなくて使いづらいし、

私の中で RAM をバカ食いしている疑惑も。

 

ちうことで、しばらく Keras で遊んでみます。

 

Keras とは、ギリシア語で「角」のことだとさ。

 

 

apt で公開鍵登録

sudo apt-get update

で、

 

パッケージリストを読み込んでいます... 完了
W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: http://dl.google.com stable Release: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 0000A0A0000A000A

などと表示されるとき。

 

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 000A0A0000A000A

で公開鍵を登録したあとに

 

sudo apt-get upgrade

 

pip-review で python パッケージ一発アップグレード

pip-reviewのインストール

pip install pip-review 

 

pip でインストールされているパッケージ検索

pip freeze 

 

アップデートの有無を確認

pip list -o

または

pip-review

 

一括アップデート

pip-review --auto

 

依存関係が壊れていないかを確認

pip check 

 

もしも依存関係が壊れていたら、必要なパッケージをインストールし直す

pip install bleach==1.5.0

pip install html5lib==0.9999999 

 のように、

pip install [モジュールの名前]==[バージョン番号] 

 

日記、最近の進捗

 

 このところ、  CNN を使った画像分類の勉強をしていました。

 f:id:pmonty:20170718032024p:plain

 

 Qiita のコードを参考に 2クラス分類を Tensorflow で実装。

 医用画像で 85% の accuracy ・・・せめて 90% 欲しいのに。 Data augmentation や、層を深くするなど試したけど、どれもこれもダメでした。

 なお、Cifar-10 のチュートリアルを参考にしたので、画像は 32 x 32 に圧縮・・・これが良くないかも。解像度高いほうが成績はいいだろうから、落ち着いたら圧縮せずに試してみる。

 

 で、このスランプの時に、知識をつけようと、Python や 画像認識関連、プログラミング一般論の本などを乱読。

 いくつかの本はすごく役に立った。

 紙の本、Kindleなど色々読んだけど、中でもオライリーの e ブック が最高だった。

 

 最近こんなエントリがはてブで人気を博してましたが

www.kotsulog.com

 オライリーの e ブックは、紙の本より安い(同額の本もあり)。

 基本は pdf、epub、mobi などのフォーマットで提供されているが、一部の本は pdf しか提供されていないので注意。

 

 ここ半年でプログラミング関連の本がかなり増えた。プログラミングの本って辞書的に使うことが多いので、持ち運びやすい電子書籍のほうがいい。

 オライリーの e ブックは mobi 形式もあって Kindle などの電子ペーパー端末でも読めるし最高。

 

 さて、そんなこんなで以前からやってみたかった Chainer にも挑戦。

 

 Qiita のコード参考に CNN を作成。違ったタスク(120枚の画像で2クラス分類)で、accuracy 100%, (ベストの値)。

 良かった、過学習かもしれないけど。

 

 こんな感じ。 

f:id:pmonty:20170716023821p:plain

 

 

 

 で、 Tensorflow と Chainer を少し触ってみた感想。

 

1.DNN はデータ入力が大変

 Deep learning のコードはネット上にたっくさんある。 Neural network の作成や deep learning 自体は、私のような初心者でも可能。

 ただ、データを NN に入るように整形して、learning を始めるまでが大変。データの取り回し方法もネット上に多数の記事があるのだけど、自分の作った NN に合うような形で実装しないといけない。

 機械学習を長くやってきたプログラマには簡単かもですが、私には難しかった。

 

2.Chainer 愛憎

 言われている通り、Chainer はコードが書きやすい。tf と比べて楽。

 しかし、最近のアップデートで Chainer 2.0 となり、一部で互換性が失われたですよ。Chainer v1.14 で動くコードが v2.0 で動かなかったりする。困ったものだ。

 GPU の使い方もよくわからない。今は GPU を使えておらず、全部 CPU で処理している。CPU は i3-7100 や i5-7600K を使っているのだけど、遅い、遅い。

 

 この点、 Tensorflow は良い。明示的に 「GPU を使ってください」 と書かなくても、勝手に GPU を使ってくれる。

 ありがたやありがたや。

 CPU only だと数分かかるタスクが、モノの10秒で終わってしまうよ (^^)

 

 Tensorflow もアップデートを繰り返しているけど、互換性が切れたメソッドには、

  「こういうアップデートがありました。このように書いてください」

 ってエラーメッセージを返してくれる。

 Chainer も同じこと、できないのかなぁ。 

 

 

 Deep learning の勉強、歩みはのろいけど、まぁ順調かな。

 

 この先やるべきことはいろいろある。どこからどう手を付けていっていいのか。

 自分に技術力がないことはよく理解した。

 そろそろ専門家の人と共同研究にしたい。

 あいにくそのような知り合いがいないのだけど、どうやって探すものなんだろう。

  (あー、今年の人工知能学会に行っときゃよかった!! PyconJP も行きたかったけど、開催日を知ったのはごく最近。すでに定員いっぱいになっちゃってたし・・・)

 

 他に自然言語処理もやりたいのだけれど、これはさらに難しそう。ホント専門家にお任せしたいな・・・

 

 これを自分の専門にできればそれでいいのだけど、そういうポストあるのか。

 でも機械学習の基礎はないから、そういうポストに潜り込むのも難しそうだし。

 ぐだぐだ。

deep learning でよく使うimport文を保存しておく(python)

スクリプト・コピペ用

def main():

    import chainer, cv2, dicom, glob, os, pickle, shutil, sys, time
    from chainer import cuda, Function, gradient_check, \

                                    optimizers, serializers, utils, Variable

    from PIL import Image

    import chainer.functions as F

    import chainer.links as L

    import matplotlib.pyplot as plt

    import numpy as np

    import tensorflow as tf

if __name__ == '__main__':

    main()

 

対話的

import chainer, cv2, dicom, glob, os, pickle, shutil, sys, time

from chainer import cuda, Function, gradient_check

from chainer import optimizers, serializers, utils, Variable

from PIL import Image

import chainer.functions as F

import chainer.links as L

import matplotlib.pyplot as plt

import numpy as np

import tensorflow as tf 

 

dicom を匿名化 (python, pydicom, pycrypto)

python で、pydicom と pycrypto を使って dicom ファイルを匿名化・暗号化します。

 

 

 

暗号化については、pycrypto というライブラリを使い、AES 方式で暗号化する方法がネットに上がっておりましたので、それを利用しました。

 

pycrypto の使い方は

暗号化ライブラリ pycrypto · kamatari

を参考にしました。

 

コードを使う際は、必ず 'secret_key' のところを変更(ThisIsTopSecret! を別の単語に!)して使ってください。この部分が、暗号解読のパスワードになるためです。

(パスワードの文字数は、16、24、32文字のいずれかだそうです。当然長いほうがより secure ですので、できれば長いパスワードをご利用ください)

 

個人情報の大部分を 'no data' で置き換えますが、後で再使用が必要かもしれない

 ID

 age

 性別

は後で確認できるよう、暗号化としています。

 

pycrypto では、暗号化する対象は 半角英数字で、16の倍数の文字数 である必要があるそうです。

下記スクリプトは、

 ID が8桁

 age が2桁

 性別 が1桁

と想定して、文字数を調整しています。桁数がちばう場合には、適宜調整してください。

 

# -*- coding: utf-8 -*-

'''カレントディレクトリ内にある dicom ファイルを Encrypt します

実装かっこ悪くてすみません'''

import os, time, dicom

from Crypto.Cipher import AES

start = time.time()

print('started : ' + time.ctime())

secret_key = 'ThisIsTopSecret!'

#password は半角16,24,32文字

def main():

    print('__encryption started!!__')

    for file_name in os.listdir('.'):

        root, ext = os.path.splitext(file_name)

        if ext == '.dcm':

            ds = dicom.read_file(file_name)

            cryp = AES.new(secret_key)

            ds.PatientAddress = 'no data'

            ds.PatientBirthDate = 'no data'

            ds.PatientBirthName = 'no data'

            ds.PatientName = 'no data'

            ds.PatientSize = 0

            ds.PatientWeight = 0

            ds.PatientMohterBirthName = 'no data'

            ds.PatientTelephoneNumbers = 'no data'

            ds.CountryofResidence = 'no data'

            ds.PatientAge = cryp.encrypt(

              str(ds.PatientAge) + '___4___8__12__'

              )

            ds.PatientID = cryp.encrypt(

              str(ds.PatientID) + '___4___8'

              )

            ds.PatientSex = cryp.encrypt(

              str(ds.PatientSex) + '___4___8__12___'

              )

            ds.save_as(root + '_encrypted.dcm')

            print(

                    '__' + file_name + ' was encrypted as ' +

                    root + '_encrypted.dcm!!__'

                   )

    print('__finished!!__')

    elapsed_time = time.time() - start

    print('finished : ' + time.ctime())

    print('elapsed time : {0} sec'.format(elapsed_time))


if __name__ == '__main__':
    main()

'''こちらを参考にさせていただきました
https://kamatari.github.io/2016/04/23/what-is-pycrypto/'''

 

 

こちらは変更バージョンです。

上記スクリプトで 'no data' で置き換えていたところに 無意味な半角英数字 を挿入し、暗号化しているように見せかけたものです。

 

暗号化の解除に、多少 余計に時間がかかるかもしれないと思い、修正しました。

 

# -*- coding: utf-8 -*-

import os, time, dicom, random

from Crypto.Cipher import AES

 

start = time.time()

print('started : ' + time.ctime())

 

secret_key = 'ThisIsTopSecret!'

#password は半角16,24,32文字

 

def main():

    print('__encryption started!!__')

    for file_name in os.listdir('.'):

        root, ext = os.path.splitext(file_name)

        if ext == '.dcm':

            ds = dicom.read_file(file_name)

 

            cryp = AES.new(secret_key)


            SixteenInt = random.randint(

                1000000000000000,

                9999999999999999

                )

 

            ds.PatientAddress = cryp.encrypt(str(SixteenInt))

            ds.PatientBirthDate = cryp.encrypt(str(SixteenInt))

            ds.PatientBirthName = cryp.encrypt(str(SixteenInt))

            ds.PatientName = cryp.encrypt(str(SixteenInt))

            ds.PatientSize = 0

            ds.PatientWeight = 0

            ds.PatientMohterBirthName = cryp.encrypt(str(SixteenInt))

            ds.PatientTelephoneNumbers = cryp.encrypt(str(SixteenInt))

            ds.CountryofResidence = cryp.encrypt(str(SixteenInt))

 

            ds.PatientAge = cryp.encrypt(

              str(ds.PatientAge) + '___4___8__12'
              )

            ds.PatientID = cryp.encrypt(

              str(ds.PatientID) + '___4___8_'

              )

            ds.PatientSex = cryp.encrypt(

              str(ds.PatientSex) + '___4___8__12___'

              )

 

            ds.save_as(root + '_encrypted.dcm')

 

            print(

                    '__' + file_name + ' was encrypted as ' +

                    root + '_encrypted.dcm!!__'

                   )

 

    print('__finished!!__')

    elapsed_time = time.time() - start

    print('finished : ' + time.ctime())

    print('elapsed time : {0} sec'.format(elapsed_time))

 


if __name__ == '__main__':

    main()

 

'''こちらを参考にさせていただきました
https://kamatari.github.io/2016/04/23/what-is-pycrypto/'''