ブログ名

【第2回】クリアデスクAIの試作

この記事は クリアデスク 第二回 になります。

今回の記事では、学習用のデータを大量に作成する前に、少量のデータを用いて実際にクリアデスクAIを作成していきます。このAIを基にして、今後の開発の方針を決定します。

クリアデスクAIの試作

Keras+TensorFlowを使用して、YOLOv3を転移学習をさせてAIを作成します。検出する物体は紙(paper)だけとします。

内容としては以下のようになります。

  1. データ準備

  2. 学習

  3. テスト

データ準備

データを用意し、VoTTというツールでアノテーションを行います。

1. 撮影

デスクの上に適当に紙を置き、動画を撮影しました。60fps(iPhone7)で数分撮影することで、数百枚の画像を入手することが出来ます。

2. 動画の形式変換

VoTTでアノテーションできるようにするために、動画の形式をmovからmp4に変換しておきます。

※movでもアノテーションできるようだったので、もしかしたらこの作業は不要かもしれません。

  • FFmpegをインストール
    動画変換ツールはFFmpegを使用しました。
    windowsであればこのページから、Version(上が最新、下が安定版)・Architecture・Linking(Static)を指定してダウンロードし、任意の場所に解凍します。
    今回はC:¥Program Filesに配置しました。
    https://ffmpeg.zeranoe.com/builds/ f:id:shizuuuka0202:20200521230314p:plain

  • 環境変数にパスを追加
    システムの環境変数にパスを追加すれば準備完了。
    ユーザーの環境変数に以下を追加しました。
    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をクリック  f:id:shizuuuka0202:20200521230519p:plain

    • Display Nameに任意のプロジェクト名を入力(今回は「paper」)

    • Source Connectionの右側にあるAdd Connectionをクリック

      f:id:shizuuuka0202:20200521230614p:plain

      • 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で指定した出力先のパスに作成されています。
  • アノテーション作業 f:id:shizuuuka0202:20200521230712p:plain

    • 右のTAGS>+でタグを作成。今回は「paper」のみ
    • タグ「paper」を選択し、鍵マークをクリック、タグ名に鍵マークを付ける こうすることでドラッグで選択した部分を自動でpaperにタグ付けできる
    • ドラッグして紙を囲んでいく。キーボードの→で次のフレームに移動できる
    • 完了したら保存ボタン(フロッピーのマーク)
  • アノテーションデータを出力

    • 画面左端の↗マークから、Export Settingsを開く f:id:shizuuuka0202:20200521230809j:plain
      • ProvierでPascal VOCを指定
      • Asset StateをOnly tagged Assets
      • Test/Train splitは100にしてすべてtrainにまとめて出力
      • Export Unassignedのチェックを外す
      • Save Export Settingsをクリック
    • アノテーションする画面で↗マークをクリックし、出力 f:id:shizuuuka0202:20200521230834j:plain

最終的に、

  • 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直下の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のみ

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(結果をアウトプットする場合)

f:id:shizuuuka0202:20200521231150p:plain

ご認識もありますが、検出出来ていることが分かります。

今回のまとめ

YOLOv3を転移学習させた結果、紙を検出できるようになりました。方向性としては間違っていなさそうです。精度を向上させるためには、パラメータの調整などに加えて、データ数を増やす事が第一であると考えられます。また、今回は紙だけを検出するように学習しましたが、実用的にはもっと多くの物体に対応する必要があります。

課題をまとめると

  1. データ数を増やす
  2. 他の物体も検出する

になります。

次回はデータ収集に関する記事を予定しています。

参考文献

[1] 【windowsFFmpegをインストールする手順
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/


前の記事へ 戻る