機械学習 PR

ChainerCVとLight-Head R-CNNで『カメラ・動画対応!物体検出ソフト』を作る

ChainerCVとLight_Head_R-CNNによる物体検出
記事内に商品プロモーションを含む場合があります

こんばんは。

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

YoloFCISによる『カメラ・動画対応!物体検出ソフト』を作って遊んだりしてます。

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

今回は、その第3弾!Light-Head R-CNNによる『カメラ・動画対応!物体検出ソフト』を作ってみたいと思います。

Light-Head R-CNNとは

『Light-Head R-CNN』について説明するには、先に『物体検出』そのものについて説明しておくと分かりやすいと思うので…

『物体検出』⇒『Light-Head R-CNNの順に概要を説明します。

画像処理で物体検出というと『移動物体検出』や〇/□などの形状をした物体を検出する『幾何学模様検出』も物体検出と呼ぶ場合があります。全てを説明するのは大変なので、本記事では『深層学習による物体検出』のみ簡単に説明します。

移動物体検出(物体追跡)に興味がある人は、下記の記事が参考になるかも!

ソフトウェア開発入門
【ソフトウェア開発入門チュートリアル】OpenCVとPythonで『物体追跡カメラ』を作るソフトウェア開発入門のチュートリアル記事を書きました。本記事では、OpenCVとPythonを使った『物体追跡カメラ』の開発を題材に、開発プロセス・設計・実装(コーディング)などのソフトウェア開発に関する知識を一通り学べる内容になっています。...

深層学習による物体検出の概要

深層学習による物体検出は大きく2つのフェーズで実現しています。

【第1フェーズ】:物体候補の抽出

深層学習による物体検出

【第1フェーズ】では、画像から物体候補(物体っでぽいもの)を抽出します。

ポイントは背景となる物体は無視している点です。

画像処理の基本的な考え方は『特徴を抽出すること』なので、壁・床・空・物体の一部分などの背景は特徴が少ないため抽出が難しい、あるいは抽出できても無視することが多いです。

このフェーズで注意すべき点は、抽出した物体候補の『名前』までは認識できていないことです。

  • 背景を無視して物体候補を抽出する
  • 第1フェーズでは抽出した物体候補の『名前』までは認識できない

【第2フェーズ】:物体認識

深層学習による物体検出

【第2フェーズ】では「抽出した物体候補が何の物体だったのか?」の物体認識を行います。

【第1フェーズ】で抽出した物体候補をCNN(畳み込みニューラルネットワーク)に入力して、認識率を算出します。

認識結果は学習済みラベル(物体の名称)に依存するため、”フクロウ”というラベルを事前に学習させていない場合は、そのラベルとの一致度(認識率)は算出されません。

学習済みラベルとの一致度が最も高いものを物体検出の最終出力結果としてラベルおよびバウンディングボックス(矩形の□)が描画されます。

また、一致度(認識率)に閾値を設定でき「50%以下の場合は学習済みのラベルと一致する物体はなかった!」としてバウンディングボックスを描画しないこともできます。

なお、一致度(認識率)の精度は採用する物体検出手法(CNN含む)に依存します。

  • 学習していないラベルとの一致度(認識率)は算出できない
  • 一致度(認識率)に閾値を設定することができる
  • 一致度(認識率)の精度は採用する物体検出手法に依存する

物体検出手法の種類 -One-stage/Two-stage detectors-

ここまでの説明で、物体検出は以下のフェーズで実現していることが分かると嬉しい!

  • 【第1フェーズ(ステージ)】:物体候補の抽出
  • 【第2フェーズ(ステージ)】:物体認識

(より詳細にフェーズ分けして説明している良質な本や記事もあります。あとで参考資料の説明もします。)

英語論文だと”Phase(フェーズ)”ではなく”Stage(ステージ)”と説明する場合があるので覚えておくと良いと思います(*・ω・)ノ♪

Two-stageで物体検出を行う代表的な手法は『R-CNN系』で、その中でもリアルタイム物体検出のFaster R-CNNは名前を聞いたことがある人も多いかも(?)

Two-stageの物体検出は、処理速度を改善したFaster R-CNNでも、まだ処理速度が遅いと言われていました。

そこで、第1ステージと第2ステージを一気にやるOne-stageの物体検出手法が誕生しました。その代表が『Yolo系』『SSD系』です。

One-stageなので処理速度の問題は解消され、かつFaster R-CNNと同等程度の高い精度を実現する手法もあります。

各物体検出手法をもっと勉強したい!という人は、以下の記事を参考にすると良いと思います。

Light-Head R-CNNの概要

上記した通り、Two-stageの物体検出は処理速度が遅いという問題があり、高性能なGPUを使えない環境だと、リアルタイム物体検出が可能なYoloなどのOne-stageの物体検出を採用するしかありませんでした。

しかし、Faster R-CNNを改良し、演算コストを抑えたLight-Head R-CNNというTwo-stageの物体検出が考案されました。

Light_Head_R-CNNの性能

出展:Light-Head R-CNN: In Defense of Two-Stage Object Detector

Light-Head R-CNNTwo-stageの物体検出ですが、YoloやSSDなどのOne-stageの物体検出と同等以上の高速性と精度を実現したとのことです。

Light-Head R-CNNの詳細を知りたい!という人は上図の出展を覗いてみて下さい。

Light-Head R-CNNによる物体検出ソフトの開発手順

環境構築から開発手順まで冒頭で紹介した以下の記事で説明済みなので…

ChainerCVとYoloでリアルタイム物体検出
ChainerCVとYoloで『カメラ・動画対応!リアルタイム物体検出ソフト』を作るChainerファミリ一つChainerCVのYoloサンプルソースをカメラ・動画に対応できるよう改造した「リアルタイム物体検出ソフト」を開発した。その開発手順を紹介します。...

まだ環境構築が済んでいない人は、↑の記事を一読して頂けると嬉しいです。

LH_R-CNN_Chainer_Video.py開発

今回ベースとなるソフトはchainer-light-head-rcnnから取得できます。

exampleフォルダ内の”demo.py”とYoloの記事で作った『物体検出ソフト』を組み合わせて、以下のソースコード”LH_R-CNN_Chainer_Video.pyを作りました。

※LH_R-CNN_Chainer_Video.pyはexampleフォルダに保存しました。

LH_R-CNN_Chainer_Video.pyのポイント解説

Yoloの記事で作った『物体検出ソフト』と↑のソースコードの構造がほとんど同じなので…異なる点のみ説明します。

Yoloの記事で作った『物体検出ソフト』の場合はVOCデータセットによる学習済みモデルをロードして物体検出を行ったので、ラベル数が20種でした。

一方、今回作ったソフトがCOCOデータセットによる学習済みモデルをロードして物体検出を行うので、ラベル数を80種に変更する必要があります。

ChainerCVは、VOC/COCO両方のラベル定義を用意しているので、それをimportするだけで、VOC/COCO用のラベルを使うことができます。

コードの9行目のimportでCOCO用ラベルを使うことができます

ただし、ChainerCVのバージョン次第では、importできない可能性があります。そんなときは、COCO用のラベル定義を手書きします。

コードの14~94行目がCOCO用ラベルの定義を手書きしたものです。別のデータセット(オリジナル含む)を使う場合にも、このやり方で対応できます。

あとchainer-light-head-rcnnを取得したときに”light_head_rcnn”というフォルダがあると思うので、それを”example”フォルダに移動してください。

要するに、”light_head_rcnn”フォルダとLH_R-CNN_Chainer_Video.pyの階層を揃えてほしい。理由は以下のコードの”light_head_rcnn”パス設定の都合です。

コードの11~12行目がlight_head_rcnnのimport

LH_R-CNN_Chainer_Video.pyの使い方

”LH_R-CNN_Chainer_Video.py”の使い方もYoloの記事で作った『物体検出ソフト』とほとんど同じですが、一応デフォルト設定時での起動は以下の通りです。

デフォルト設定での起動例

python LH_R-CNN_Chainer_Video.py 動画ファイルパス

動画ファイルパスのところを”0”にするとUSBカメラやノートPC内蔵カメラの映像を使って『物体検出』を実行します。

デフォルト以外の学習済みモデルやラベル定義を変更することも可能ですが、コードの修正が必要になります。

動作確認

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

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

第8世代となるインテルCoreプロセッサ(Core i5–8250U)で動かしましたが、1fps以下でした。(右上にfpsを表示させているが整数値しか表示しない仕様)

リアルタイム感はないですね…GPUマシンで動かさないと本領発揮しないのかもなぁ

(GPUマシンほしい…)

スポンサーリンク

まとめ

本サイトでChianerCVで『カメラ・動画対応!物体検出ソフト』を作るシリーズを紹介しており

本記事が、その第3弾!Light-Head R-CNNによる『カメラ・動画対応!物体検出ソフト』の開発手順を説明しました。

本サイトでは、このシリーズ以外にも画像処理に関する記事(チュートリアル多め)が多数あるので、本サイトの記事を読んで…

画像処理に興味をもった!
勉強になった!参考になった!

と思ってくれる人が少しでもいると最高に嬉しい(*・ω・)ノ♪

はやぶさ
はやぶさ
理系応援ブロガー”はやぶさ”@Cpp_Learningは頑張る理系を応援します!

(完)

おまけ -くるるとはやぶさの”ほのぼの劇場”-

以降は技術的な内容が少ない”ただの茶番”なので、お時間ある人だけ読んで頂ければと思います。

にゃーん

小さな笑い声が聞こえる。まるで笑いを堪えているようだ。

その声の正体は、最近LINEスタンプを作った人気フクロウの”くるる”@kururu_owl です。

フクロウのLINEスタンプ

(スタンプで得た収入は参考書代など、本サイトの運営に役立てますので、投げ銭感覚でスタンプを購入してくれると嬉しいです!)

くるる
くるる
はやぶー!動画見た?

すごいニコニコしながら声をかけてくれた!今にも笑いが吹き出しそうである。

はやぶさ
はやぶさ
見た見た!

私もニコニコが止まらない!

くるる
くるる
にゃーん♪
はやぶさ
はやぶさ
にゃーん♪

この後10分ほど1人と1羽で大爆笑!今日も平和だ。

誤認識の考察

動作確認の動画を見た人は気づいたと思うが”くるる”の写真やイラストが”猫”と認識されたのだ。

AIの気持ちになって考えてみると、

  • 猫のような耳(実際には羽角と呼ばれる羽)
  • 猫のようなヒゲ
  • 猫のようなサイズ
  • 猫のような毛色

正面から見たフクロウ…より正確にはアフリカオオコノハズクの”くるる”を正面から見ると、猫と同じ特徴を抽出できるため『猫に違いない!』と誤認識したのだろう。

一方、横から見た本人は常に『鳥』と認識していた。おそらく、羽/翼/嘴といった鳥の特徴を抽出できたため、誤認識しなかったと考えている。

深層学習による演算はブラックボックスと言われているが、AIの気持ちになって

  • どんな特徴を抽出しているか?
  • 何故その特徴を抽出したのか?

などを考えてみると…少しは誤認識の理由が分かるかもしれませんね(*・ω・)ノ♪

ラベルの色分け と 研究者の仕事

ようやく笑いが収まった”くるる”が喋りだした。

くるる
くるる
そういえば、今回はラベルの色分けをしなかったんだね!

ChianerCVで『カメラ・動画対応!物体検出ソフト』を作るシリーズ第1弾・第2弾のときはラベル毎にバウンディングボックスの色変更するモードを実装していた。

しかし、今回は単色モードのみにしている。実は今回、Light-Head R-CNNを採用したのは…

「YoloやSSD並みにリアルタイム物体検出が本当にできるのか?」を確認したい!という好奇心があったからです。

まぁ結果は上記した通りでしたが…(GPUだと、どんな結果になるのか気になる!)

なので、確認したかった処理速度と精度を確認できれば、ラベル毎の色分けは後回しでも良いかなぁと思い…結局やりませんでした。

少し気になりますが、本質から遠い部分は後回しにして、私は次のリサーチを開始します。

私の普段の仕事もこんな感じです。あまり品質の高いソフトを作り込まず、必要事項が確認できるコードを仕上げ、脈無しと判断したら、すぐに次に進む。

品質の高いソフトを開発するのは、最後の最後です。

仕事の進め方も少しは参考になるのかな?

さてと…次は何の記事を書こうかなぁ~

(おまけ 完)

PICK UP BOOKS

  • 数理モデル入門
    数理モデル
  • Jetoson Nano 超入門
    Jetoson Nano
  • 図解速習DEEP LEARNING
    DEEP LEARNING
  • Pythonによる因果分析
    Python