機械学習

ChainerCVとYoloで『カメラ・動画対応!リアルタイム物体検出ソフト』を作る

ChainerCVとYoloでリアルタイム物体検出

こんばんは。

コンピュータビジョン(『ロボットの眼』開発)が専門の”はやぶさ”@Cpp_Learningです。

最近は、Chainerで遊ぶのにハマっています!特にChainerファミリのひとつで画像処理に特化したChainerCVが楽しい!!

ChainerCV サンプルソースが豊富で嬉しいけど、カメラ・動画には対応してないのよね…

リアルタイム物体検出のYolo使うなら、カメラ・動画に対応させたい…

無いなら作るか!工学部出身だし!!

以降から ChainerCV と Yolo で『カメラ・動画対応!リアルタイム物体検出ソフト』の作り方を説明します。ソースコードだけ見せて!という人は目次から『Yolo_Chainer_Video.py開発』の項目に飛んでください。

ChainerCVのYoloサンプルソースを確認

ChainerでYoloを動かすサンプルソースは、ChainerCV公式Githubから取得できます。前回、このソースコードをGoogle Colaboratoryで動かしました。

あわせて読みたい
ColaboratoryでChainer使ってYoloを動かす
ColaboratoryでChainer使ってYoloを動かすオンライン実行環境Google Colaboratoryに深層学習フレームChainerと画像処理に特化した機械学習ライブラリChainerCVの環境構築をして、物体検出アルゴリズムYoloを動かす。...

ChainerCVのサンプルソースはOpenCV使わずに画像処理できる。これはこれで、すごく良いけど、本稿ではカメラ・動画を扱うためにOpenCVを使います。

環境構築

Chainerの環境構築については、下記の記事で紹介していますので、まだChainer環境を構築していない人は参考にして下さいな。

あわせて読みたい
WindowにAnacondaで機械学習の環境構築
【Chainer】WindowsにAnacondaで機械学習の環境構築WindowsにChainer/TensorFlow/Kerasなどの深層学習フレームをインスト―ルするには、Anacondaを使うのが簡単です。本記事ではChainerのインストールを例に機械学習の環境構築手順を説明します。...

上記の記事を参考に構築した仮想環境”Chainer”にChainerCVとOpenCVをインストールしてYoloが動く環境を構築します。

仮想環境”ChainerCV”を構築(必須ではない)

仮想環境”Chainer”をアクティブに切り替えて、必要なソフトをインストールします。また、以下のコマンドで仮想環境”Chainer”をベースに仮想環境”ChainerCV”を新規作成しても良いと思います。

conda create -n ChainerCV –clone Chainer

仮想環境よく分からない!という人は下記の記事を参考にしてみて下さい。

あわせて読みたい
PCやるハリネズミ
Anacondaで仮想環境を作るときに役立つTips集前回、『Anacondaで仮想環境を作ってC++プログラミングをするまで』という記事を書きました。この記事で紹介した仮想環境の作り方以外...

ChaineCVインストール

Chainer環境構築済みの仮想環境をアクティブに切り替えたら、以下のコマンドでChainerCVをインストールします。

pip install chainercv

以上でChainerCVのサンプルソースを動かす環境が構築できました。(カメラ・動画未対応のYoloも動かせます)

インストール時にバージョン指定もできますが、上記のコマンドで最新版をインストールするのが良いと思います。基本的にソフトはバージョンが新しいほど高性能なので。。

OpenCVインストール

今回はカメラ・動画を扱いたいので、以下のコマンドでOpenCVもインストールします。

pip install opencv-python

最新バージョンのリリース時期次第ですが、以降で説明するソースコードは以下のバージョンで動作確認しています。

  • Chainer 4.3.0
  • ChainerCV 0.10.0
  • OpenCV 3.4.1

開発手順の確認

下記の記事で簡単にですが『ソフトウェア開発手順』を説明しています。

あわせて読みたい
OpenCVでカメラ・動画を扱う
【Python】OpenCVでカメラ・動画を扱うための『雛形ソースコード』開発手順書こんばんは。現役エンジニアの”はやぶさ”@Cpp_Learningです。 画像処理メインの研究・開発を楽しく実施しています。最近は...

この記事の中で以下のポイントを説明しています。

複雑な機能や仕様も分解して、一つ一つの単機能の集合と考え、単機能ごとに「調査」→「コード作成」→「テスト」を行う

今回、開発対象はChainerCV と Yolo を使った『カメラ・動画対応!リアルタイム物体検出ソフト』です。このソフトを”ざっくり”分析すると、以下の二つの機能で実現できます。

【機能】

  • ChainerCV で Yolo が動く
  • OpenCVでカメラ・動画を扱う

各機能をどうやって実現するか検討します。

【実現方法の検討】

  • ChainerCVのYoloサンプルソースを使う
  • OpenCVでカメラ・動画を扱う雛形ソースコードを使う

ChainerCVのYoloサンプルソースはColaboratoryで動作確認済み。

OpenCVでカメラ・動画を扱う雛形ソースコードは、『ソフトウェア開発手順』の記事で作成・動作確認済み。

この二つのソースコードを合体させれば、対象のソフトが開発できそうです!

Yolo_Chainer_Video.py開発

以上を踏まえて開発したソースコード”Yolo_Chainer_Video.py”は以下の通りです。

Yolo_Chainer_Video.pyのポイント解説

Yolo_Chainer_Video.pyのポイントはOpenCVとChainerCVの画像用変数の扱い方です。以下のフローを見た方が分かりやすいですね。

【Yolo_Chainer_Video.pyの簡易フロー】

  1. OpenCVでカメラ or 動画をキャプチャ(変数名:frame
  2. frameがChainerで扱えるようにBGR ⇒ RGBに変換変数名:rgb
  3. Chainerはnumpy配列のfloat32しか扱えず、かつ画像サイズとチャンネルの順番がOpenCVと異なるので、(H, W, C) ⇒ (C, H, W)に変換変数名:img
  4. 結果出力でOpenCVを使うので、frameをコピーしておく変数名:result
  5. imgに対し物体検出(Yolo)を実施し、boxとlabelの算出結果を得る
  6. boxとlabelの結果をresultに描画して映像出力

分かるかな?青マーカーがOpenCV赤マーカーがChainerの変数や処理です。

入出力関係がOpenCV物体検出(Yolo)がChainerで処理していることが分かると嬉しい。つまり、OpenCVがChainerをサンドイッチしている状態。このサンドイッチのような骨組みは、あらゆるコンピュータビジョン(『ロボットの眼』開発)に応用できます。

OpenCVとChainerCV

また、「上記フローの各項目がソースコードのどこに該当してるの?」と思いますよね。ソースコードに丁寧なコメントを残しておいたので、ソースコードとフローを見比べてみて下さい。

OpenCVと別ライブラリ(今回はChainerCV)を組み合わせるときは、画像の入出力をOpenCVで、中身のメインフローを別ライブラリで処理するサンドイッチの骨組みが便利!

Yolo_Chainer_Video.pyの使い方

パーサーで以下の項目を設定してから、実行します。

設定 記号 選択候補
Yoloのバージョン指定 –model YoloV3 or YoloV2
プロセッサ設定 –gpu CPUなら負数(”-1”など)
GPUなら”0”以上の数字
学習モデル指定 –pretrained-model voc0712など
カメラ・動画モード選択 末尾に設定 カメラなら”0”
動画ならファイルパス

※色付き文字はデフォルト設定

使用例

python Yolo_Chainer_Video.py –model yolo_v3 –gpu -1 –pretrained-model voc0712 動画ファイルパス

デフォルト設定で良い場合は、以下のようにカメラ・動画ファイルパスだけ選択します

python Yolo_Chainer_Video.py 0

初回だけは学習モデルのロードのため、オンライン状態で実行してください。学習モデルのロードに少し時間がかかります。

動作確認

Yolo_Chainer_Video.pyを動作確認した映像が以下です。

※この映像は20fpsで再生しています。

第8世代となるインテルCoreプロセッサ(Core i58250U)で動かしましたが、1fps(右上に表示)でした。リアルタイム感はないですね。。GPUマシンで動かしたいな~

【おまけ】Yolo_Chainer_Video.pyのカスタム例

Yolo_Chainer_Video.pyのカスタム例を少し紹介したいと思います。

box/labelの設定変更

くるる
くるる
boxの色なんか暗くない?

だそうです。言われてみれば。。

くるる
くるる
単色だけどChainerCVのサンプルソースの方が綺麗だね

「綺麗だね」・「綺麗だな~」を繰り返しながら、じーーーーと見つめてくる”くるる”ちゃん。可愛い。

はやぶさ
はやぶさ
分かった!単色にも切り替えられるようにします!

ソースコードの88~90行目がbox設定なので、この部分を少し いじって、92~93行目に単色モードを追加しました。

  • Draw box 1:デフォルト(検出対象ごとに色が変化)
  • Draw box 2:単色(緑)

好きな方を選んでコメントアウトしてください。

また、ソースコードの102~106行目がlabel設定なので、この部分も少し いじって、108~111行目に単色モードを追加しました。

  • Draw label 1:デフォルト(検出対象ごとに色が変化)
  • Draw label 2:単色(黒文字)

box/labelともに単色モードで動かしたときの映像が以下の通りです。

ときどきlabelが「イヌ」とか「猫」って表示される…別の学習モデルでも遊んでみたいな。。

出力結果の録画

くるるがyoutubeにアップした動画ファイルをじーーーーと見つめながら質問してくれた。

くるる
くるる
出力映像を1fpsから20fpsに変換して動画ファイルに保存って、どうやったの?
はやぶさ
はやぶさ
この前”くるる”ちゃんが遊びに来た時につくった動画保存ソフトを組み込んだんだよ
くるる
くるる
ふぇー。昔作ったソフトって役に立つんやね!
はやぶさ
はやぶさ
もちろん!シンプルな単機能ソフトは色んな所に組み込めるから便利だよ!
くるる
くるる
単機能を組み合わせるんだよね!覚えた!

”くるる”賢いなぁ~

Yolo_Chainer_Video.pyに動画保存機能を付けたい場合は、下記の記事を参考にカスタムしてみて下さい。

あわせて読みたい
PythonとOpenCVの動画保存ソフト
【OpenCV】動物大好きエンジニアがPythonで動画保存ソフトを作るすっーーーーーーう ぱさぱさ… トン! 僅かな着陸音がなければ、その可愛らしい生き物が再びこのサイトに来たことに気づかなかったかも...

最後に

本記事はChainerCV と Yolo で『カメラ・動画対応!リアルタイム物体検出ソフト』の作り方を丁寧に説明しました。

この記事書くの結構大変でした。。でも、コンピュータビジョン(『ロボットの眼』開発)という自分の専門分野だったので、妥協せずに書きました!

本記事で紹介したソフト『Yolo_Chainer_Video.py』をロボットや電子工作に組み込みました!って人が現れたらエンジニアとしては最高に嬉しい!!

『リアルタイム物体検出ソフト:Yolo_Chainer_Video.py』で遊んでみて下さいな!