rohaniのブログ

ゆるっと自然言語処理奴。ときどき工作系バイト。

物体検出システム YOLOv3 で自分で撮った写真の物体を検出してみた

YOLOv3とは

YOLOv3はワシントン大学のJosephさんが作った物体検出プログラム。 入力画像中のどの部分に何が写っているかを検出してくれる。

本人の公式ページから、YOLOv3...ひいては、Darknetについて調べてみた。

pjreddie.com

ジョセフさんのページは英語なんだけど読んでいてとても楽しい。この記事では平易に紹介するけれど、原文ではいたるところに小さな笑いを提供してくれているので、英語に抵抗がない人は是非原文を読んでほしい。 (ちなみに私は英語と聞くと嫌悪感がこみ上げるタイプだが、ことプログラミング関係の資料を見ている場合においてのみアレルギーの発生を抑えられる特異体質である。日常英語は無理)

Darknetとは

Darknet is an open source neural network framework written in C and CUDA. It is fast, easy to install, and supports CPU and GPU computation.
出典:Darknet: Open Source Neural Networks in C

DarknetはC言語とCUDAで書かれたオープンソースのNNフレームワーク。 早くて、インストールが簡単で、CPUでもGPUでも動かせる。

Darknet is easy to install with only two optional dependancies: OpenCV if you want a wider variety of supported image types. CUDA if you want GPU computation. Both are optional so lets start by just installing the base system. I've only tested this on Linux and Mac computers. If it doesn't work for you, email me or something?   出典:Installing Darknet

DarknetはOpenCVとCUDAと連携させることが可能。 OpenCVCMYKで保存されたJPEGなどに対応したい時必要で、CUDAはGPUでの計算を行い時に必要。 これらはオプションなので無くても大丈夫。作者はLinuxMacでの動作を確認している。

YOLOv3とは

You only look once (YOLO) is a state-of-the-art, real-time object detection system. YOLOv3 is extremely fast and accurate. In mAP measured at .5 IOU YOLOv3 is on par with Focal Loss but about 4x faster. Moreover, you can easily tradeoff between speed and accuracy simply by changing the size of the model, no retraining required!
出典:YOLO: Real-Time Object Detection

YOLOはリアルタイムに物体検出ができる最先端のシステム。
検出領域と正解領域がIOU(Intersection over Union)という評価尺度で0.5ぐらい重なっていた時を「検出できた」としてモデルの精度を評価したとき、
どのぐらい正確に検出できたかをmAP(mean Average Precision)という評価尺度で見ると、 (Focal Lossっていう損失関数で学習された)RetinaNetというモデルと同じぐらいの精度を出しながら、4倍も速く計算することができる!
さらに、モデルのサイズを変えるだけで、速さと正確さのトレードオフを調整することが可能である。

一言でまとめると、YOLOv3は有名どころのモデルと比較しても非常に速く正確に物体検出できるモデルである。

ここまでの参考文献

アーカイブに上がっているpaper↓と、先に紹介したページを参考にした。

YOLOv3: An Incremental Improvement

画像処理の知識が足りなかったので、幾つかQiita記事を参考にさせて頂いた。

画像処理分野での評価指標(mAPやIoU)については、こちらの記事物体検出における学習モデル評価方法(Python3) - Qiitaが分かりやすかった。

IoU=0.5の重なりぐらいってどのぐらいよ?という疑問には、こちらの記事IoUの0.1~0.9を図にしてみた - Qiitaが的確な答えを示してくれている。

Focal Lossについては、こちらの記事[論文紹介] Focal Loss for Dense Object Detection - Qiitaで論文解説がされている。

親切な画像処理界隈の皆様に圧倒的感謝。。。

YOLOv3で物体検出を試してみる

導入手順

今回は、OpenCVGPUのオプションは付けず、一番簡単な「入力画像から物体検出するデモ」をやってみた。

公式ページ YOLO: Real-Time Object Detection の手順通りに進めることで、つつがなく環境構築できた。

(一応流れとしては、git cloneしてmakeコマンドでコンパイルし、wgetを用いてYOLOv3の学習済みモデルの重みをインストールした後、付属のサンプル画像を入力として与えて検出命令./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpgを実行する、といった感じ)

特にエラーが出ることもなく、検出結果が出力された。

f:id:ojho0318:20190606233451j:plain
デモの出力画像

遊んでみた

付属のサンプルを試すだけではつまらないので、手持ちの写真の中の物体を検出してもらう。

食卓

Predicted in 17.710057 seconds.
cake: 77%
bowl: 100%
bowl: 97%
bowl: 94%
cup: 97%
bottle: 97%
cup: 94%
bowl: 100%

f:id:ojho0318:20190606235700j:plain

土鍋はケーキに化けてしまった。笑

浜辺

Predicted in 17.947153 seconds.
horse: 57%
person: 94%
person: 92%
person: 91%
person: 89%
person: 85%
person: 94%
person: 80%
person: 73%
person: 61%
person: 53%
person: 83%

f:id:ojho0318:20190607000305j:plain

手前の方の人間は検出することができている。 幻の馬も検出されているが、確信度57%なので外れ値の範囲だろう。

チーズの陳列棚

Predicted in 19.384650 seconds.
refrigerator: 97%

f:id:ojho0318:20190607000851j:plain

確かに冷蔵庫っぽいかもしれないけれども...

チーズは検出できなかった。(学習データにチーズが無いのかもしれない)

鮮魚市場

Predicted in 20.209571 seconds.
person: 99%
car: 91%

f:id:ojho0318:20190607001132j:plain

...車と人も写り込んでいたことに気づかなかったので、ちょっとびっくりした。

魚は検出してもらえなかった。

感想

インストールがとても簡単(コマンド3つくらい)で、私のノートパソコンでも検出し終わるのに20秒かからず、何も調整しなくても手持ちの写真の中の物をある程度検出してくれた。

人の検出精度は高そうなので、人がどの辺りに何人いるかササッと調べたいときとかに使えるかも。

webカメラを使ってのリアルタイム物体検出もそのうち試してみたい。

試そうとしたが、opencv4(現在brew installすると標準でついてくるやつ)ではIplimage型が未定義ですというエラーに引っかかり断念。cv:matとやらに書き換えればできそうなのだけれど、c++は勉強不足なのできびしかった。 むしろ、Pytorchを入れてtorch版darknetとopencv-pythonの連携で試したほうが有意義そう。