この記事は クリアデスク 第二回 になります。
今回の記事では、学習用のデータを大量に作成する前に、少量のデータを用いて実際にクリアデスクAIを作成していきます。このAIを基にして、今後の開発の方針を決定します。
クリアデスクAIの試作
Keras+TensorFlowを使用して、YOLOv3を転移学習をさせてAIを作成します。検出する物体は紙(paper)だけとします。
内容としては以下のようになります。
データ準備
学習
テスト
データ準備
データを用意し、VoTTというツールでアノテーションを行います。
1. 撮影
デスクの上に適当に紙を置き、動画を撮影しました。60fps(iPhone7)で数分撮影することで、数百枚の画像を入手することが出来ます。
2. 動画の形式変換
VoTTでアノテーションできるようにするために、動画の形式をmovからmp4に変換しておきます。
※movでもアノテーションできるようだったので、もしかしたらこの作業は不要かもしれません。
FFmpegをインストール
動画変換ツールはFFmpegを使用しました。
windowsであればこのページから、Version(上が最新、下が安定版)・Architecture・Linking(Static)を指定してダウンロードし、任意の場所に解凍します。
今回はC:¥Program Files
に配置しました。
https://ffmpeg.zeranoe.com/builds/環境変数にパスを追加
システムの環境変数にパスを追加すれば準備完了。
ユーザーの環境変数に以下を追加しました。C:\Program Files\ffmpeg-20191023-1f327f5-win64-static\bin
ffmpegの使い方
# 変換したい動画と変換後の動画のパスを指定して実行 ffmpeg -i input.mov output.mp4 # 今回は以下のようにして画像をリサイズした ffmpeg -i input.mov -s 416x234 output.mp4
動画のサイズが大きすぎると、不便なので変換時に解像度も下げておきます。
3. アノテーション
VoTTをダウンロード
https://github.com/Microsoft/VoTT/releases
↑からv2.1.0のvott-2.1.0-win32.exe をダウンロードして実行します。New Projectを作成
New Projectをクリック
Display Nameに任意のプロジェクト名を入力(今回は「paper」)
Source Connectionの右側にあるAdd Connectionをクリック
- Display Nameに任意の名前を入力
- ProvierでLocal File Systemを選択
- Folder Pathにこれからアノテーションする動画や画像の入っているパスを指定。 (もしFolder Pathが表示されない場合、Provierを別のものにしてからLocal File Systemに戻せば出てくる可能性があります。)
- Save Connectionをクリック
Source Connectionに今作ったコネクションを指定
Target Connectionの右側にあるAdd Connectionをクリック
- Display Nameに任意の名前を入力
- ProvierでLocal File Systemを選択
- Folder Pathにこれから作るアノテーションデータの出力先パスを指定 (もしFolder Pathが表示されない場合、Provierを別のものにしてからLocal File Systemに戻せば出てくる可能性があります。)
- Save Connectionをクリック
Target Connectionに今作ったコネクションを指定
Video Settingsに2と記入
1秒当たり2フレームにするという意味です。つまり、3分あれば180秒*2フレームで360画像分のアノテーションデータ作成の準備が完了するということです。
- Save Projectをクリック
次回以降は最初の画面右のRECENT PROJECTか、Open local projectから.vottファイルを読み込めばOKです。ファイルはTarget Connectionで指定した出力先のパスに作成されています。
アノテーション作業
- 右のTAGS>+でタグを作成。今回は「paper」のみ
- タグ「paper」を選択し、鍵マークをクリック、タグ名に鍵マークを付ける こうすることでドラッグで選択した部分を自動でpaperにタグ付けできる
- ドラッグして紙を囲んでいく。キーボードの→で次のフレームに移動できる
- 完了したら保存ボタン(フロッピーのマーク)
アノテーションデータを出力
最終的に、
- Annotation
- ImageSets
- JPEGImages
- pascal_label_map.pbtxt
が出力データとして作成されます。
学習
学習データができたので、学習させていきます。
1.YOLOv3をクローン
- ソースをクローン
git clone https://github.com/sleepless-se/keras-yolo3.git
- keras-yolo3というフォルダができるので、その直下にVOCDevkit/VOC2007という構造のフォルダを作ります。
- VOC2007フォルダにアノテーションで作成した以下のデータをコピーor移動
- Annotations
- ImageSets
- JPEGImages
- pascal_label_map.pbtxt
2.YOLOv3の学習済みウエイトの用意
ここから学習済みのウエイトを取得して、Kerasで使えるように変換しておきます。
https://pjreddie.com/media/files/yolov3.weights
変換するためのコードは以下
python convert.py yolov3.cfg yolov3.weights model_data/yolo_weights.h5
3.データの変換
keras-yolo3直下のmake_train_files.pyを動かす
python make_train_files.py
- keras-yolo3\VOCDevkit\VOC2007\ImageSets\Mainにtrain.txt、test.txt、val.txt が作成される
- 使うのはtrain.txtのデータだけなので、データ数が少なければtrain.txtにtest.txt、val.txt の中身を移しておいても良いです
- keras-yolo3\VOCDevkit\VOC2007\ImageSets\Mainにtrain.txt、test.txt、val.txt が作成される
keras-yolo3直下のvoc_annotation.pyを動かす(YOLOで使える形式に変換する)
python voc_annotation.py paper(分類するクラスを列挙)
- keras-yolo3\model_dataに2007_train.txt、2007_test.txt、2007_val.txt が作成される
- 使うのは2007_train.txtのデータだけなので、データ数が少なければ2007_train.txtに2007_test.txt、2007_val.txt の中身を移しておいても良いです
- models_dataの中にあるvoc_classes.txtの中身を確認する
- 検出するクラスが列挙されていればOK
- 今回はpaperのみ
- keras-yolo3\model_dataに2007_train.txt、2007_test.txt、2007_val.txt が作成される
4.学習の実行
データ数100で、サイズは416x234、バッチサイズは4、エポック数は初期値(50+50の100エポック)、input shapeは(320,320)で学習させてみます。
python train.py
で学習を実行する- keras-yolo3/logs に学習させたウエイトが保存されます
テスト
学習したモデルを実際にテストしてみます。
# 画像の場合 python yolo_video.py --image Input image filename:ここに画像のファイル名を入力 # 動画の場合 python yolo_video.py --input ファイル名.mp4(検出する動画) --output ファイル名.mp4(結果をアウトプットする場合)
ご認識もありますが、検出出来ていることが分かります。
今回のまとめ
YOLOv3を転移学習させた結果、紙を検出できるようになりました。方向性としては間違っていなさそうです。精度を向上させるためには、パラメータの調整などに加えて、データ数を増やす事が第一であると考えられます。また、今回は紙だけを検出するように学習しましたが、実用的にはもっと多くの物体に対応する必要があります。
課題をまとめると
- データ数を増やす
- 他の物体も検出する
になります。
次回はデータ収集に関する記事を予定しています。
参考文献
[1] 【windows】FFmpegをインストールする手順
https://fukatsu.tech/windows-ffmpeg
[2] YOLO V3に、VoTTでアノテーションを付けた独自のデータセットを学習させる
https://qiita.com/moto2g/items/dde7a55fceda862b2390
[3] VoTT v2.1.0 を使用して画像のアノテーション(教師データの作成)を行う
https://qiita.com/clerk67/items/8e7207284037dcf1f9ec
[4]【物体検出】アノテーションツールVoTTの使い方
https://sleepless-se.net/2019/06/21/how-to-use-vott/
[5]【物体検出】keras−yolo3の学習方法
https://sleepless-se.net/2019/06/21/how-to-train-keras%e2%88%92yolo3/