機械学習

PyTorchでMobileNet SSDによるリアルタイム物体検出

PytorchでMobileNet SSDによるリアルタイム物体検出

こんにちは。

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

『深層学習による物体検出』が好きで色んな記事を書いてます↓

ChainerCVとYoloでリアルタイム物体検出
ChainerCVとYoloで『カメラ・動画対応!リアルタイム物体検出ソフト』を作るChainerファミリ一つChainerCVのYoloサンプルソースをカメラ・動画に対応できるよう改造した「リアルタイム物体検出ソフト」を開発した。その開発手順を紹介します。...
FCIS(インスタンス・セグメンテーション)
深層学習による画像処理の概要からChainerCVとFCISで『物体検出ソフト』を作るまで本記事ではChainerファミリーのChainerCVとFCIS(インスタンス・セグメンテーション)で『カメラ・動画対応!”高性能”物体検出ソフト』を作るための開発手順方法を「深層学習および画像処理の入門レベル」でも分かるように説明します。...

特に『リアルタイム物体検出』が好きです!だんだん欲が出てきて…

はやぶさ
はやぶさ
もっと速く!もっと精度良く!!物体検出をしたい!!!

ということで、今回は『MobileNet SSD』で遊んでみます。

初めにPyTorchの環境構築について書きましたので、不要な人は飛ばして下さい。

PyTorchの環境構築

今までChainerCVで『物体検出』をしてきましたが、今回はPyTorchを使います。

Chainerの環境構築については、下記の記事で紹介しています。

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

↑と同じ手順でPyTorchの環境構築もできます。簡単に手順を説明すると…

  1. Anacondaインストール
  2. 仮想環境 生成
  3. PyTorchインストール

❶と❷については上記の記事で説明済みなので、本記事では➌から説明します。

PyTorchインストール

PyTorchの公式サイトに以下の項目があります。

Pytorchのインストール

自分の使っているOSなどの環境に合わせて、各項目をクリックするとコマンドが表示されます。

例えば、上図はWindows/Anaconda/Python3.7/CPUの環境PyTorchをインストールするときのコマンドです。

このコマンドをターミナルに打ち込めばインストール完了です(PyTorchのサポート手厚いなぁ)

以降から「MobileNet」と「SSD」について簡単に説明します。

MobileNetとは

CNN(畳み込みニューラルネットワーク)のモデルには様々な種類があり、例えばVGGと呼ばれるモデルがあります。

VGGや更に複雑なモデル構造の場合、計算量が多いため、リソースに制約のある「組込み機器」では高速処理できない!という問題があります。

くるる
くるる
でもエッジディバイスでディープラーニングしたいのよねー

というフクロウ@kururu_owl やエンジニアは多いと思います。

もちろんFPGAやGPUに加え、メモリもたっぷり搭載したディバイスを使えば、VGGでも高速処理が可能です。

くるる
くるる
ただ、その場合は消費電力とかコストがねー

っていう新しい問題が発生します。そこで…

Google
Google
「組込み機器」向きの軽量なモデル構造で解決しよう!

と考え、GoogleがリリースしたのがMobileNetです!

MobileNetのスゴイところは、計算量が少ないのに精度が他のモデルと同等以上という点です。(精度については比較するモデル次第ですが…)

くるる
くるる
どうやって、モデルの軽量化を実現したの?

と思った人は、以下の参考資料を覗いてみて下さいな!

SSDとは

SSDとはYoloと同じOne-stageの物体検出手法です(Two-stage detectorsもあるよ

深層学習による物体検出の概要については以下の記事で説明しています↓

ChainerCVとLight_Head_R-CNNによる物体検出
ChainerCVとLight-Head R-CNNで『カメラ・動画対応!物体検出ソフト』を作るChainerファミリーのChainerCVとLight-Head R-CNNによる『カメラ・動画対応!リアルタイム物体検出ソフト』の開発手順を説明します。深層学習による物体検出の概要も説明しています。...

色んな物体検出の手法がありますが…

くるる
くるる
SSDやYoloはリアルタイム物体検出に向いている手法なのだー

MobileNetベースSSDモデル

VGGMobileNetなどのモデルをベースにSSD用のネットワークを追加…

つまり、物体認識+物体検出用の層を追加することで、SSDモデルが完成します。

MobileNet SSD

↑のように前半MobileNet/後半SSDと完全に分かれているわけではなく…VGGMobileNetの層の間にも物体認識+物体検出用(SSD用)のネットワークを挿入することで、物体の大きさを考慮した検出を実現しています

なのでレゴブロックのようにベースモデルを気軽に付け替えたい!という場合には、ベースモデルだけではなく『MobileNetベースSSDモデル/VGGベースSSDモデル』などSSDモデルを付け替える必要があります。

くるる
くるる
深層学習による物体認識だけなら『MobileNet/VGG』モデルの付け替えで良いけど、物体検出やるなら『MobileNetベースSSD/VGGベースSSD』のモデルを付け替えないとダメなのかぁ
はやぶさ
はやぶさ
そうだね。ベースが『MobileNet/VGG』モデルなだけだからねー
はやぶさ
はやぶさ
上記のように『○○ベースSSDモデル』と書く場合もあれば、単に『SSDモデル』とだけ書く場合もあるからね。『SSD』モデルを付け替えないとね!
くるる
くるる
『VGGベースSSD』モデルは単に『SSD』モデルと呼ぶことが多いよね♪

くるるちゃんは今日も賢い(*・ω・)ノ♪

【実践】リアルタイム物体検出リアルタイム物体検出

簡単にですが『MobileNet-SSDによるリアルタイム物体検出』の概要を説明したので、次からは実装をしていきます。

まずは参考になりそうなソースコードがないか調査します…pytorch-ssdというドンピシャなのがありますね!感謝!!

今回はpytorch-ssdをベースに自分好みにカスタムしていきます。

最初はChainerCVで参考になりそうなソースコードを調査したのですが、『VGGベースSSD』しか見つからなかったので、今回はPytorchを採用しました。

動作手順

いつもは静止画のみに対応しているソースコードを動画にも対応させたりするのですが…pytorch-ssdは既に動画対応しているので、いきなり動かしてみます。

pytorch-ssdのREADME通りにやれば問題ないですね。

まずは以下のコマンドで「学習済みモデル」と「ラベル」をダウンロードします。

wget -P models https://storage.googleapis.com/models-hao/mobilenet-v1-ssd-mp-0_675.pth
wget -P models https://storage.googleapis.com/models-hao/voc-model-labels.txt

次に以下のコマンドで実行すればOK!

python run_ssd_live_demo.py mb1-ssd models/mobilenet-v1-ssd-mp-0_675.pth models/voc-model-labels.txt

…と説明してあるけど、以下のようなエラーが出ました。

from torchvision import transforms
ModuleNotFoundError: No module named ‘torchvision’

少し調べてみましたが、推論(物体検出を実行)するだけなら、上記のモジュールが不要だったので「~/pytorch-ssd-master/vison/transforms.py」の5行目をコメントアウトしました↓

これで実行できるはずです!

カスタム例

run_ssd_live_demo.pyのままでも十分素晴らしいけど…以下の点が気になりました。

  • 出力画面が大きい
  • バウンディングボックスの色(水色)
  • ラベルの表示位置(バウンディングボックスの内側)
  • ラベルのフォントサイズが小さい
  • ターミナルのみ処理速度を表示

好み問題ですが、以下のようにカスタムしたいと思います。

  • 出力画面は入力画像と同じサイズ
  • バウンディングボックスは緑色に変更
  • ラベルはバウンディングボックスの外側(左上付近)に表示
  • ラベルのフォントサイズを大きくする
  • 出力画像の左上にFPSを表示

カスタムしたソースコードはこちら↓

run_ssd_live_demo.pyをベースにカスタムしたので、run_ssd_live_demo_V2.pyという名前にしました。

動作確認

ファイル名が変わったので、以下のコマンドで実行します。

python run_ssd_live_demo_V2.py mb1-ssd models/mobilenet-v1-ssd-mp-0_675.pth models/voc-model-labels.txt

第8世代となるインテルCoreプロセッサ(Core i5-8250U)を使うと3~4fpsで動きました。GPU使えば、もっと高速に動くので『ロボットの眼』として使えそうです!!

くるる
くるる
↑の動画は、くるるが”エアー水浴び”してる様子だよー!冷感マットが気持ちよくて水かと思った!!

くるるちゃんは今日も可愛い(*・ω・)ノ♪

まとめ

本サイトで『深層学習による物体検出』の記事を公開しており、本記事が第4弾になります。

今までChainerCVを使ってきましたが、今回はPytorchを使いました。ChainerよりPytorchの方が参考資料が多いので助かりますね。(Chainer好きなんだけど、参考資料が少ない…)

リアルタイム物体検出するならYoloも良いけど、SSDも精度が良いですよ!『MobileNetベースSSD』なら処理速度も速い!!

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

くるる
くるる
『リアルタイム物体検出ソフト:run_ssd_live_demo_V2.py』で遊んでみてねー
以下 リアルタイム物体検出の記事まとめ
ChainerCVとYoloでリアルタイム物体検出
ChainerCVとYoloで『カメラ・動画対応!リアルタイム物体検出ソフト』を作るChainerファミリ一つChainerCVのYoloサンプルソースをカメラ・動画に対応できるよう改造した「リアルタイム物体検出ソフト」を開発した。その開発手順を紹介します。...
ChainerCVとLight_Head_R-CNNによる物体検出
ChainerCVとLight-Head R-CNNで『カメラ・動画対応!物体検出ソフト』を作るChainerファミリーのChainerCVとLight-Head R-CNNによる『カメラ・動画対応!リアルタイム物体検出ソフト』の開発手順を説明します。深層学習による物体検出の概要も説明しています。...
LINEスタンプ配信中!

フクロウのLINEスタンプ

当サイトのマスコットキャラクター

「フクロウのくるる」が

LINEスタンプになりました!

勉強で疲れたあなたに癒しをお届け☆

お迎え待ってます(*・ω・)ノ♪

今すぐお迎えする

40個セットがたったの50コインとお得です