はじめに
”人工知能””AI”という言葉とともに聞かない日はないくらいに急速に広がりつつある”ディープラーニング”。
ネット上には特に画像認識を中心にいろんなコードがあふれており、これらを活用したいと考えている人も多いかと思います。
が、やはりというか、巷のディープラーニング用コードを転用して業務や趣味で独自データセットを使いたいと思っている人にとってはまだまだ敷居が高いのが現状。
このほど、一般物体検出の手法の一つである”YOLO v1”を使ったコードを改良し、64ビット Windows版Anaconda 4.2.0 + TensorFlow 1.2 + OpenCV環境にて独自データセットを使えるようにしたので、ここで手順を紹介いたします。
コードはたくさん出てるんですが、この”独自データセット”を作成して実際にディープラーニングを実行するところまでをきちんと書いたものがほとんど見当たらないんですよね。
私自身かなり苦労したので、ここではなるべくちゃんと書きます。
まず、元コードは以下のものを使用してます。
https://github.com/hizhangp/yolo_tensorflow
”YOLO v1”という手法は2015年12月時点の技術ですが、対象オブジェクトがめちゃくちゃたくさん出てくる画像でなければ使える手法。
このコード自身は36層のニューラルネットワークからなる、わりと本格的なCNNコードです。
このままでもyolo_small.ckptを使った「test.py」での画像認識や、PASCAL VOC2007のデータを使ったディープラーニングは可能ですが、独自データセットを使おうとするとエラーが出て使用不能でした。
また、Python 2.7用に書かれているようで、Python 3.xでそのまま使うことができません。
なので、Python 3.5で使える、独自データセットが使えるようにすることを目的に元コードの修正を行い、かつ独自データセット作成ツールと作り方を紹介します。
準備
ここではWindowsでの動作を前提に書いてます。が、Linux版でも概ね同じかと思われます。
Windows版のAnaconda 4.2.0入れて、TensorFlowをインストールする手順は「TensorFlow(+Keras)がWindowsで簡単にインストールできた件 - Qiita」を参照ください。
OpenCVも使いますので「Windows Anaconda Python 3.5 への OpenCV 3.1 のインストール - にせねこメモ」を参考にOpenCVも入れておいてください。
さて、先の元コード(https://github.com/hizhangp/yolo_tensorflow)をダウンロード。Windowsなら「Clone or Download」をクリックして「Download Zip」というのをクリックすればZIPファイルが入手できます。Linuxの方なら「git clone ~」で入手可能でしょうか。
適当なフォルダに展開後、以下の3つのコードを修正しました。
・ util/pascal_voc.py
・ test.py
・ train.py
3つのコード名を右クリックして”名前を付けてリンク先を保存”としてもらうと、コードが入手できます。
これらのコードを、元コードと入れ替えておいてください。
さて、機械学習に必要な画像のデータセットを作る必要があります。
Linuxな方なら「物体検出用の画像アノテーション正解データ生成に便利なツール - verilog書く人」からツールをダウンロードすればいいんですが、Windows用というのはありませんでした・・・
てことでWindows版アノテーション用ツールをVisual Basic 2005で作ってみました。
AnnotationTool.exe
これをダウンロードしておいてください。使い方は後述。
画像データセットの作成
さて、ディープラーニング用教師データ作成編です。
例えば犬・猫を識別させたいときは大量の犬・猫の画像、社員とそれ以外の人を区別するAIを作りたいときはたくさんの社員の顔写真などが必要となります。
こればかりは自身でそろえていただくほかはありません。
やみくもにそろえろというのはなんですから、参考資料を載せておきます。
こちらの資料は、ディープラーニング向け教師データ作成に大変参考になります。ぜひご覧ください。
ここでは深層学習用画像ファイルを用意できているという前提で進めます。
さて、画像ファイルをそろえただけではディープラーニングさせることはできません。
画像内にある認識させたい物体の位置とそのラベル名が必要です。
この位置とラベル名を記述したファイルが「アノテーションファイル」と呼ばれるものです。
ちなみにこのコードで使うデータセットの形式は「PASCAL VOC 2007形式」ってのを使ってます。ディープラーニング用コードでは一般的な形式のようです。
この形式のアノテーションをWindows上で作成するためのツールが、先の「AnnotationTool.exe」です。

上にこのツールの外観と手順の番号をざっくり載せました。
使い方を①~⑦の順に書きます。
① まずアノテーションファイル(*.xmlと”trainval.txt”)を保存するフォルダ(作業フォルダ)を作りドラッグ&ドロップ
② アノテーションを作成したい画像ファイルをドラッグ&ドロップ
③ 画像ファイルが出てくるので、物体をマウスで囲みます
④ ”ラベル名”のテキストボックスに物体の名前を書きます(半角英数)
⑤ ”ラベル作成”をクリックすると登録
同一画像内で認識させたい物体の数だけ③~⑤を繰り返します。
⑥ 一通り終わったら「Annotation追加」をクリック
次の画像ファイルを読み込むため、再び②で別の画像を読み込み、⑥までを繰り返します。
すべての画像ファイルのアノテーション登録が終わったら
⑦ ”終了”をクリック
これで作業完了。
できたデータセットを以下の場所に登録。
「作業フォルダ」には以下のようなファイルができているはずです。

ここから”*.xml”のファイルを
(yolo_tensorflowのフォルダ)\data\pascal_voc\VOCdevkit\VOC2007\Annotations
の中へ移動。
ちなみに*.xmlの中身はこんな感じ。

”画像ファイル名.xml”という名前で、ラベル名(<name>)と位置(<bndbox>)が物体の数だけ記載されてます。
これが画像ファイルごとに必要となります。
また、”trainval.txt”というファイルは以下の場所に移動。
(yolo_tensorflowのフォルダ)\data\pascal_voc\VOCdevkit\VOC2007\ImageSets\Main
このフォルダ内で”trainval.txt”をコピーして、”test.txt”という名前のファイルを作成します。
つまり”Main”フォルダ内には”trainval.txt”、”test.txt”の2つのファイル(中身は同じ)が存在した状態にしておきます。
なぜかこうしないと動かないことがあるんですよね・・・プログラム上は”trainval.txt”だけでいいはずなんですが。
で、教師データとなる画像ファイルは以下のフォルダに入れておきます。
(yolo_tensorflowのフォルダ)\data\pascal_voc\VOCdevkit\VOC2007\JPEGImages
これでデータセットは準備完了。
設定
続いて”yolo”フォルダにある”config.py”の中身を記載します。
項目はたくさんありますが、書き換える必要のある項目は以下の
・ CLASSES
この後ろに、アノテーションファイル作成時に登録したラベル名をすべて書き込みます。
(追記 1)
後で書きますが、元々ある「config.py」のラベル(20個)の頭から書き換えて使う方がいいです。
例えば、以下が元々あるオリジナルの”CLASSES”ですが、
CLASSES = ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus',
'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse',
'motorbike', 'person', 'pottedplant', 'sheep', 'sofa',
'train', 'tvmonitor']
今回学習したいデータのラベルが”hogehoge”、”haguhagu”だとしたら、
CLASSES = ['hogehoge', haguhagu', 'bird', 'boat', 'bottle', 'bus',
'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse',
'motorbike', 'person', 'pottedplant', 'sheep', 'sofa',
'train', 'tvmonitor']
のように、頭2つを書き換えます。
この方法だと、最大20個までしかできませんが・・・
(追記 1 終了)
・ BATCH_SIZE
デフォルト値は”45”。そのままでもいいですが、ラベル当たりの画像ファイルが45枚より少ない場合は20などとしておいた方がよさそう。
・ MAX_ITER
最大サイクル数です。
いきなり”10000”でもいいですが、最初は10~100程度にして様子見するのがよさそう。
・ SUMMARY_ITER
学習での誤差(losses)のTensorBoard用データの書き込みタイミングです。10~100程度でもいいですが、MAX_ITERを100程度に刻む場合なら1~10としておいた方がいいでしょう。
・ SAVE_ITER
学習データ(save.ckpt-***という名前で保存)を書きだすサイクル数です。MAX_ITERの5~10分の一くらいにしておいた方がよさそうです。
ディープラーニング実行
いよいよディープラーニング実行です。
実行前に確認ですが、新たなデータを使って深層学習するときには、”(yolo_tensorflowのフォルダ)\data\pascal_voc\cache\”にファイルが入ってたら消してください。何もなければOKです。
以下のコマンドを実行します。
(追記 2)
学習済みデータなしでも流れますが、何度やってもまともに収束しません。
この後出てくる「YOLO_small.ckpt」をダウンロードし、これを初期値にして開始します。
YOLO_small.ckpt ダウンロード元:YOLO_small.ckpt - Google ドライブ
コマンドは以下のように打ち込みます。
> python train.py --weights YOLO_small.ckpt
写真系の教師データなら、これでうまくいきます。
(追記 2 終了)
ところで、うちでは以前「GeForce GTX 1050Ti買ってディープラーニングを加速してみた: EeePCの軌跡」でも書いた通り、ディープラーニング用にGeForce GTX1050Tiを導入してます。
ところがこのコードをGeForce GTX1050TiのGPUで実行すると、1050Tiのメモリ(4GB)では全く足りなくて落ちてしまいます。
GTX1080の8GBくらいは必要っぽい、できればGTX1080Tiの11GBくらいないと実行できないも・・・というくらいメモリ馬鹿食いコードです。
仕方がないので、うちではCPUオンリーで実行しました。
CPUのみで実行したい場合は、以下のようなコマンドを打ち込みます。
> python train.py --gpu None
これでCPUのみで動作。
(追記 3)
「YOLO_small.ckpt」を初期値に使うので、このコマンドは
> python train.py --weights YOLO_small.ckpt --gpu None
となります。
(追記 3 終了)
もっとも、GPUの恩恵がなくなるので恐ろしく遅いですが。
また、以前に機械学習を実行して学習データ(save.ckpt-***)がある場合、これを初期値にして続きから機械学習を実行することができます。
その場合は、
”(yolo_tensorflowのフォルダ)\data\pascal_voc\output\(実行日時のフォルダ)”にある学習データ(”save.ckpt-***.data-0000-of-0001”と”save.ckpt-***.index”の2つ)を
”(yolo_tensorflowのフォルダ)\data\pascal_voc\weights\”に入れて
以下のコマンドを実行します。
> python train.py --weights save.ckpt-*** --gpu None
これで続きから実行できます。
実行中の画面は以下。
実は、まだ最後までディープラーニングを流したことがありません。
このためどうやって終了したかをまだ確認したことがないのであれですけど。
この一覧で出てくる”Loss:”の値が小さくなっているならまだ過渡状態。
十分小さくなって、頭打ちになってくれば学習終了状態じゃないかと思われます。
おそらく5000~10000サイクル流さないと収束しないと思われますが、うちの環境でCPUオンリーで実行すると5000~10000分かかることがわかってます。
仮に5000サイクルで終わるとしても、5000分っていうのは・・・要するに3.5日ってことです。
さすがにPCを4日間つけっぱなしで全開運転というのはちょっとできませんねぇ・・・
GTX1080Tiが欲しいと思う、今日この頃です。
(追記 4)
職場で、最後まで回しました。
結果として、上の追記 1~3を加えました。そちらを参照願います。
(追記 4 終了)
一般物体検出・認識コードの実行
さてディープラーニングが終わったという前提で、画像認識の実行に移ります。
機械学習が終わってなくても”yolo_small.ckpt”という学習済みデータを入手すれば、この後の画像認識を実行できます(その場合は設定ファイル”config.py”を、元データの”config.py”に戻しておいてください)。
YOLO_small.ckpt ダウンロード元:YOLO_small.ckpt - Google ドライブ
まず学習済みデータを
”(yolo_tensorflowのフォルダ)\data\weights\”
に入れます。
また認識に使う画像ファイルを
”(yolo_tensorflowのフォルダ)\test\”
に入れておきます。
続いて、以下のコマンドを実行。
> python test.py --weights save.ckpt-***
(--weights の後ろは学習済みデータのファイル名)
すると

こんな感じの画像が出てきます。
(上の画像は、レゴランドの家族写真を”YOLO_small.ckpt”で検出・認識させたもの)
うまく対象物をとらえていれば、枠とラベル、認識率の数値が表示されるはずです。
これで独自データを使った一般物体検出コード”YOLO_TensorFlow”の使い方の説明は終わりです。
教師データとなる画像データをそろえて、ディープラーニングして、実際にテストして・・・を繰り返し、必要な認識精度になるまで繰り返す。
あとは「test.py」をベースにコードを改良し、させたい”動作”をこのコードにつけ加えていくだけです。
しかし、その前にやはり”ハードウェアの強化”は必須ですね。
さすがにディープラーニングの実行に何日もかかるようでは、学習データの調整のための試行錯誤なんてできませんし。
これくらいの深層学習実行にはやはりGPUボードは必須、できればGTX1080Tiの2枚挿しくらいが必要ですね。

最近のコメント