Chainer imagenet を試す
Version 1.21.0 のドキュメント等
chainer/examples/imagenet at v1.21.0 · pfnet/chainer · GitHub
優しく解説してくださっているブログ
PFN発のディープラーニングフレームワークchainerで画像分類をするよ(chainerでニューラルネット1) - 人工言語処理入門
ChainerのNINで自分の画像セットを深層学習させて認識させる - shi3zの長文日記
Chainer imagenet では、
- 画像(の入ったディレクトリ)
- test.txt
- train.txt
の3つを準備する必要がある。
また、label.txt
があると、ラベリングもできると言うことかな?
make_train_data をつかう
上記3つの準備の仕方は色々有ると思うが、make_train_data.py
は、
/Dir_name/Cat/cat001.jpg cat002.jpg cat003.jpg ... /Dog/dog001.jpg dog002.jpg dog003.jpg ... ...
のようなディレクトリ構造にしておくと
- すべての画像が入った images ディレクトリ (Dir_name 以下の画像を1箇所にまとめてくれる)
- train.txt (適当に train, test に振り分けている)
- test.txt
- label.tx (サブディレクトリ名を転用している)
を作成してくれる。
画像サイズを 255x255 にする
Chainer imagenet では、 255x255 を使用することに成っている。
なので、整形が必要になる。
$ mv images images.org $ mkdir images $ python ../../crop.py images.org images
平均画像を作る
「平均画像」ってのが必要らしい。
$ python (chainer_dir)/examples/imagenet/compute_mean.py train.txt
学習
$ python ../../train_imagenet.py -g 0 -E 10 train.txt test.txt 2>&1 | tee log
進捗をグラフで見る
$ cat log | grep iteration > log_pretty $ python ../../plot.py log_pretty
推定する
$ python resize.py panda.jpg $ python inspection.py resized/panda.jpg
パンダの画像でテスト行った所、どうもパンダは認識率が低い。
soccer_ball との判定が多い。
データセット
Caltech101
カテゴリ頃にディレクトリ分けされていて make_train_data
を使用できる。
Total 102 Classes, 9145 Images
パンダ有る
Caltech256
カテゴリ頃にディレクトリ分けされていて make_train_data
を使用できる。
Total 257 Classes, 30608 Images
パンダ無い
hiragana73
文字画像データセット(平仮名73文字版)を試験公開しました | NDLラボ
ひらがなデータ
png なので、make_train_data.py
の ls /*.jpg の部分を書き換える。
imageFiles = cmd("ls "+workdir+"/*.png")
find -name .jpg -o -name .png でも、できそうだが、./ が付いたりしてその処理まで確認しないとダメだから、今度やろう・・・。
ラベルデータ
あ
をキャプチャした物を判定させてみた。
$ ../../inspection.py a.jpg #1 | U3042 あ | 89.7% #2 | U3090 ゐ | 4.1% #3 | U308B る | 1.3% #4 | U308F わ | 1.1% #5 | U3082 も | 1.0% #6 | U304A お | 0.5% #7 | U3089 ら | 0.5% #8 | U306A な | 0.3% #9 | U3092 を | 0.2% #10 | U3061 ち | 0.2% #11 | U307F み | 0.2% #12 | U304D き | 0.2% #13 | U304B か | 0.1% #14 | U306D ね | 0.1% #15 | U3081 め | 0.0% #16 | U3093 ん | 0.0% #17 | U308A り | 0.0% #18 | U306E の | 0.0% #19 | U306F は | 0.0% #20 | U3046 う | 0.0%
以下は私的挫折メモ
Flickr Style から取得したデータの整理(挫折)
crop.py を実行した際にエラーが出て気がついたのですが、this image is not avaiable now. などという記載のある小さい画像がまじりっています。
これはマズイので、除外します。
sed でやる方法(失敗)
sedコマンドで、train.txt と test.txt を修正するスクリプトを作ります。
完成形は sed -i "/\/2204798837_68dba55252.jpg/d" train.txt
など。
$ find ./images_raw/ -size -15k -print | xargs mv -t ./image_ng/ $ find ./image_ng -type f | wc -l 9309
head で絞ってテスト。
問題なければファイルにする。
$ find ./image_ng/ -type f | head | sed -e 's/^.\/image_ng/sed -i \"\/\\/' | sed -e 's/$/\/d" train.txt/' sed -i "/\/2204798837_68dba55252.jpg/d" train.txt sed -i "/\/12666574533_3d6176a4a0.jpg/d" train.txt sed -i "/\/12443728084_afb95621fc.jpg/d" train.txt sed -i "/\/12431376425_a54d60bae1.jpg/d" train.txt sed -i "/\/9415591322_9c69b2858a.jpg/d" train.txt sed -i "/\/8679566699_bd290dfc1a.jpg/d" train.txt sed -i "/\/8576572799_b84b8100f5.jpg/d" train.txt sed -i "/\/12815768204_bed49ab0fd.jpg/d" train.txt sed -i "/\/10555846683_fbc5d58f97.jpg/d" train.txt sed -i "/\/11007037066_d975b7e769.jpg/d" train.txt $ find ./image_ng/ -type f | head | sed -e 's/^.\/image_ng/sed -i \"\/\\/' | sed -e 's/$/\/d" train.txt/' > ng_list.sh
バックアップを取って、実行。
63831 が、9309 減って 54522 になる予定。
$ cp train.txt train.txt.org $ cat train.txt.org | wc -l 63831 $ sh ng_list.sh $ cat train.txt | wc -l 56634
あれ?
grep でやる(中断)
リストを読み込んで、一致を弾く。
$ find ./image_ng -type f | sed -e 's/^.\/image_ng//' > ng.pattern.txt $ head ng.pattern.txt /2204798837_68dba55252.jpg /12666574533_3d6176a4a0.jpg /12443728084_afb95621fc.jpg /12431376425_a54d60bae1.jpg /9415591322_9c69b2858a.jpg /8679566699_bd290dfc1a.jpg /8576572799_b84b8100f5.jpg /12815768204_bed49ab0fd.jpg /10555846683_fbc5d58f97.jpg /11007037066_d975b7e769.jpg $ grep -f ng.pattern.txt -v train.txt.org > train.txt (待てど暮らせど終わらないので kill した。。。) メモリに展開しきれないのかな?
crop.py 改定
if src is None: continue
として、問題の出たファイルはスルーさせてみた。
$ find images -type f | wc -l 79785
train.txt と test.txt に登場するのに、images ディレクトリに無い行がありますが、その不一致は吸収してくれるのか、とりあえず先に進めます。
epoch iteration main/loss validation/main/loss main/accuracy validation/main/accuracy lr 0 1000 3.05539 0.08925 0.01 1 2000 2.81914 0.134531 0.01 1 3000 2.73034 0.163969 0.01 2 4000 2.69752 0.168375 0.01 2 5000 2.6506 0.188594 0.01 3 6000 2.62537 0.189906 0.01 3 7000 2.59254 0.201906 0.01 4 8000 2.5857 0.2035 0.01 4 9000 2.56082 0.211719 0.01 5 10000 2.54502 0.219031 0.01 5 11000 2.52094 0.221563 0.01 6 12000 2.51799 0.223937 0.01 6 13000 2.49525 0.229719 0.01 7 14000 2.49081 0.233094 0.01 7 15000 2.46874 0.238406 0.01 8 16000 2.46281 0.241531 0.01 8 17000 2.44324 0.243969 0.01 9 18000 2.44358 0.248281 0.01 9 19000 2.43107 0.250562 0.01
chainer Faster R-CNN
GitHub - mitmul/chainer-faster-rcnn: Object Detection with Faster R-CNN in Chainer
インストール
事前に cython 入れます。
$ sudo easy_install cython
$ git clone https://github.com/mitmul/chainer-faster-rcnn $ cd chainer-faster-rcnn/lib $ python setup.py build_ext -i $ cd .. $ mkdir data $ cd data $ wget https://dl.dropboxusercontent.com/u/2498135/faster-rcnn/VGG16_faster_rcnn_final.model $ cd .. $ $ python forward.py --img_fn test.jpg --gpu 0
実行すると、result.jpg が出来上がります。
chainer deel を試す
Deel を試します。
GitHub - uei/deel: Deel; A High level deep learning description language
$ sudo apt-get install libopencv-dev $ sudo apt-get install python-opencv
$ sudo apt-get install libhdf5-dev $ git clone http://github.com/uei/deel $ cd deel $ python setup.py install $ cd data $ ./getCaltech101.sh (エラー出た) ValueError: operands could not be broadcast together with shapes (3,144,145) (3,817,656) (3,144,145) $ cd ../misc $ ./getPretrainedModels.sh
テスト
$ python examples/gender.py panda.jpg Loading gender_net.caffemodel #1 | male | 63.8% #2 | female | 36.2%
chainer MNIST を試す
下準備
git, matplotlib を入れます。
$ sudo apt-get install git $ sudo pip install matplotlib
データをもらう
$ sudo git clone https://github.com/pfnet/chainer.git
mnist を動かす
$ cd chainer/examples/mnist/ $ ./train_mnist.py -g 0
ここでエラーが出ました。
nvidia-smi でもエラーが出たので、ドライバーを入れ直した所、正常に動きました。
初回の起動でデータセットをダウンロードしますが、http://yann.lecun.com/exdb/mnist/
のサイトがダウンしてたりします。
その際は、/usr/local/lib/python2.7/dist-packages/chainer/datasets/mnist.py
のURLを適当なミラーサイトに書き換えれば、とりあえず先に進めます。
次のエラーが出ました。
96 if extensions.PlotReport.available():
この部分で AttributeError: type object 'PlotReport' has no attribute 'available'
ということです。
ソースコードをみると、コンストラクタの中で def _check_available():
しています。
バージョンアップに伴って、メソッドの改定が有ったのでしょうか。
正常にコンストラクトできたら、そのチェックは出来ているという雰囲気?!
やむないので、
96 #if extensions.PlotReport.available(): 97 if True:
などしちゃいます。
とりあえず実行する。
$ ./train_mnist.py -g 0 GPU: 0 # unit: 1000 # Minibatch-size: 100 # epoch: 20 epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time 1 0.193103 0.0990286 0.94295 0.9691 25.6391 2 0.0731526 0.071707 0.977382 0.9773 31.8223 3 0.0473904 0.086795 0.984782 0.9736 37.7731 4 0.0367857 0.081037 0.987615 0.9758 44.0105 5 0.0254271 0.0803791 0.991698 0.9775 49.7157 6 0.0242218 0.0728918 0.992148 0.9819 55.351 7 0.0225581 0.0713523 0.992582 0.9805 61.1866 8 0.0151419 0.085011 0.995082 0.9789 66.9343 9 0.0154926 0.102077 0.994649 0.9768 72.5936 10 0.0187828 0.072758 0.993915 0.9823 78.331 11 0.0160584 0.0846834 0.994532 0.9812 83.9434 12 0.0101223 0.0924774 0.996732 0.9807 89.8204 13 0.0125349 0.0968882 0.996049 0.98 96.0304 14 0.0136353 0.079207 0.995899 0.9839 101.928 15 0.0109211 0.138 0.996482 0.9743 107.863 16 0.00852963 0.096225 0.997516 0.9812 113.651 17 0.00918454 0.0962035 0.997199 0.9819 119.358 18 0.00934543 0.0869832 0.997282 0.984 125.122 19 0.00991504 0.0877433 0.996999 0.983 130.87 20 0.00880426 0.103433 0.997282 0.9804 136.807
バージョンに有った train_mnist.py を使う
もしくは、ちゃんと github から、自分が使う chainer の version に有ったコードを手に入れます。
Chainer 1.21.0 用
chainer/train_mnist.py at v1.21.0 · pfnet/chainer · GitHub
実行
$ ./train_mnist.py -g 0 GPU: 0 # unit: 1000 # Minibatch-size: 100 # epoch: 20 epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time 1 0.19085 0.099535 0.941401 0.9684 6.44824 2 0.0744746 0.0768928 0.976717 0.9764 10.8679 3 0.0486528 0.0741029 0.984432 0.9772 15.2855 4 0.0382096 0.0868596 0.987816 0.9758 19.7071 5 0.0295276 0.073381 0.990398 0.9795 24.1291 6 0.0233222 0.0931531 0.992381 0.9751 28.5248 7 0.0199249 0.0811498 0.993565 0.9801 32.9042 8 0.0202854 0.10219 0.993432 0.9779 37.2762 9 0.0196941 0.0857413 0.993398 0.9805 41.6189 10 0.0114205 0.0849754 0.995932 0.9811 45.969 11 0.0153012 0.0857274 0.994949 0.9808 50.3032 12 0.0126985 0.0856742 0.996065 0.9805 54.6374 13 0.0142371 0.0987941 0.995348 0.9802 58.9803 14 0.00942709 0.0975199 0.996999 0.9811 63.318 15 0.0112361 0.109751 0.997066 0.9772 67.661 16 0.00985846 0.0991543 0.996982 0.9815 71.9995 17 0.0107471 0.107608 0.996932 0.9821 76.3405 18 0.0105749 0.11046 0.996966 0.98 80.6792 19 0.00803951 0.123615 0.997666 0.9814 85.0176 20 0.0115847 0.0917939 0.996799 0.9853 89.358
速度について
なお、結構遅いです。
nvidia-smi でチェックした所、GPU使用率は20%程度ですが、CPU使用率は100%に成っていましたので、私の環境におけるボトルネックは GPUではなく、CPUのようです。
ログのプロット
サンプルに含まれていそうだけど、ちょっと探して見当たらなかったので書きました。
import matplotlib.pyplot as plt import argparse import json parser = argparse.ArgumentParser() parser.add_argument("result") args = parser.parse_args() with open(args.result, 'r') as f: jsonData = json.load(f) xs = [] ys1 = [] ys2 = [] for line in jsonData: # print(line["main/loss"]) xs.append(line["iteration"]) ys1.append(line["main/loss"]) ys2.append(line["main/accuracy"]) plt.xlabel("iteration") plt.ylabel("error") plt.plot(xs, ys1, label="main/loss") plt.plot(xs, ys2, label="main/accuracy") plt.legend(loc='upper left') plt.show()
$ python plot.py ./result/log
学習結果を保存して、判定させる
保存する
スナップショット取るように、改変する。
(しらべちゅう)
... from chainer import serializers ... def main(): global model ... serializers.save_hdf5('modelhdf5', model)
読み込んで判定させる
ubuntu14.04 LTS + CUDA + cuDNN + Chainer インストールメモ
ubuntu14.04 LTS + CUDA + cuDNN + Chainer インストールメモ
OSの選定
インストールガイド — Chainer 1.18.0 ドキュメント
chainer 公式のインストールガイドに、We recommend these platforms. Ubuntu 14.04 LTS 64bit
と、有るので、従います。
LTS は Long Term Support.
ハードウェアの選定
GPU
CUDA を使用したいので、Nvidiaのチップが入っているやつにしたい。
Radeon も CUDA を利用できたりするらしいですが、動作確認が取れている組み合わせでも、かなりインストールで苦しむので、試す気になれない。
CUDA(Compute Unified Device Architecture:クーダ)とは、NVIDIAが提供するGPU向けのC言語の統合開発環境であり、コンパイラ (nvcc) やライブラリなどから構成されている。
スペックメモ
Chip | Architecture | CUDAコア | メモリ | 実売 | コメント |
---|---|---|---|---|---|
TITAN X | Pascal | 3584 | 12 GB | 18万 | 日本未発売? 冷却を工夫しないと性能が出ない? |
GTX1080 | Pascal | 2560 | 8 GB | 6~12万 | 簡易水冷バージョンも出ている |
GTX1060 | Pascal | 1280 | 6 GB | 3~4.5万 | |
GTX1050 | Pascal | 640 | 2 GB | 1~2万 | |
GTX 950 | Maxwell | 768 | 2 GB | 1.5~3万 |
補助電源は、6pin, 8pin 1つだったり、2つだったり、ミックスだったりする。
RAM
- 作者: 清水亮
- 出版社/メーカー: 技術評論社
- 発売日: 2016/12/07
- メディア: 大型本
- この商品を含むブログ (11件) を見る
曰く、32G では不足するとのこと。。。
電源
GPU の事を考えると、最低でも 400w
OS のインストール
ubuntu14,04 を DVD に焼いて、インストールします。
初期設定
パッケージのアップデート
$ sudo apt-get update $ sudo apt-get upgrade
ssh をインストール、自動起動設定して、ipを固定、nameサーバー設定
$ sudo apt-get install ssh $ service ssh start $ sudo apt-get install sysv-rc-conf $ sudo sysv-rc-conf ssh on $ sudo sysv-rc-conf --list ssh ssh 2:on 3:on 4:on 5:on $ sudo cat /etc/network/interfaces # interfaces(5) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.100.50 netmask 255.255.255.0 gateway 192.168.100.1 $ cat /etc/resolvconf/resolv.conf.d/base nameserver 8.8.8.8 $ sudo reboot
ドライバとCUDAのインストール
Ubuntu14.04にNVIDIAドライバーをインストールしたらGUIログインできなくなったときの話 - Qiita
こちらにならいました。
ドライバと CUDA を入れる
先に、古いドライバを確認し、削除します。その後、公式サイトから最新の物をダウンロードして入れます。
$ dpkg -l | grep nvidia $ dpkg -l | grep cuda $ sudo apt-get --purge remove nvidia-* $ sudo apt-get --purge remove cuda-*
※私の場合、初期設定では nvidia のドライバーと cuda は入っていませんでした。
グラフィックボードのドライバとCUDAを入れる
取得。
NVIDIA-Linux-x86_64-375.39.run
でした。
CUDA 8.0 Downloads | NVIDIA Developer
cuda_8.0.61_375.26_linux.run
でした。
入れる
$ chmod a+x NVIDIA-Linux-x86_64-375.39.run $ chmod a+x cuda_8.0.61_375.26_linux.run $ sudo service lightdm stop
$ sudo ./NVIDIA-Linux-x86_64-375.39.run --no-opengl-files
$ sudo ./cuda_8.0.61_375.26_linux.run --silent --no-opengl-libs --toolkit
nvidia ドライバ動作確認
$ nvidia-smi Tue Mar 14 10:36:45 2017 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 375.39 Driver Version: 375.39 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 GeForce GTX 106... Off | 0000:06:00.0 Off | N/A | | 0% 36C P0 25W / 120W | 0MiB / 6071MiB | 2% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
cuda 動作確認
toolkit をインストール して、nvcc -V
$ sudo apt-get install nvidia-cuda-toolkit $ nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2013 NVIDIA Corporation Built on Wed_Jul_17_18:36:13_PDT_2013 Cuda compilation tools, release 5.5, V5.5.0
環境変数追加
$ echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc $ echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc $ echo 'export CUDA_PATH=/usr/local/cuda' >> ~/.bashrc $ source ~/.bashrc
chainer 依存ライブラリ等を入れておく
NumPy 1.9, 1.10, 1.11 pip python2.7-dev
$ sudo apt-get install g++ $ sudo apt-get install python-numpy $ sudo apt-get install python-pip $ sudo apt-get install python2.7-dev
Six 1.9
cuDNN インストール
公式サイト曰く、
cuDNN support cuDNN v2, v3, v4, v5, v5.1
なので、
https://developer.nvidia.com/rdp/cudnn-download
cuDNN v5.1 Library for Linux
から、 cudnn-8.0-linux-x64-v5.1.tgz
を取得
$ tar -zxf cudnn-8.0-linux-x64-v5.1.tgz $ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/ $ sudo cp cuda/include/cudnn.h /usr/local/cuda/include/ $ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
Pathを通す。
$ echo 'export CPATH=/usr/local/cuda/include:$CPATH' >> ~/.bashrc $ echo 'export LIBRARY_PATH=/usr/local/cuda/lib64:$LIBRARY_PATH' >> ~/.bashrc
Pathの通っている場所に、libcuda.so をシンボリックリンクさせる
$ find /usr/local/ -name libcuda.so /usr/local/cuda-8.0/lib64/stubs/libcuda.so $ cd /usr/local/cuda/lib64 $ sudo ln -sv /usr/local/cuda-8.0/lib64/stubs/libcuda.so .
chainer インストール
ディレクトリ作るのに permission denied でたので、sudo してます。
いいのかな?これで。
$ sudo PATH=/usr/local/cuda/bin:$PATH LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH CUDA_PATH=/usr/local/cuda CPATH=/usr/local/cuda/include:$CPATH LIBRARY_PATH=/usr/local/cuda/lib64 pip install chainer
バージョンと動作の確認
$ python Python 2.7.6 (default, Oct 26 2016, 20:30:19) [GCC 4.8.4] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import chainer >>> chainer.__version__ '1.21.0' >>> import cupy >>> import cupy.cudnn