この記事は下記のような方のお役に立てると思いますのでどうか最後までご覧になっていってください!
- 物体検出や物体検知って聞いたことあるけどどういう技術なのか知りたい
- 物体検出を試してみたい
- AI技術にとりあえず触れてみたい
- YOLOv3はやったことあるけど、YOLOv4はまだ試せてなかった
- YOLOv5ってあるの知らなかったので試してみよう
物体検出とは?
みなさん物体検出というのをご存知でしょうか? 聞いたことはないけど言葉から想像できるかもしれません
昨今のAI技術の発展により、画像データからその画像データ内に写っている人や動物、物などを検知して、その部分を長方形で囲ったり、その物体が何か(人なのか、犬なのかといった種類)を教えてくれたりするような技術です
物体検出のモデルがインプット画像に対して出力してくれるのがおもに下記3つです
- 物体を囲っている長方形(Bounding Boxといい、物体の位置や大きさを示すもの)
- 検知した物体がどういう種類の物体かどうかのラベルをクラスといいます
- 検知した際の精度(0〜100や0〜1などの数値でどれだけ正しそうかを表します)
Bounding Boxは、左上の座標とボックスの横幅、高さだったり、左上の座標と右下の座標だったりいろいろな表現方法がありますが、いずれもボックスの位置と大きさを特定するものです
クラスは物体検出のモデルごとにどのラベルに対応しているかは異なってきます
目的ごとにクラスを絞ってモデルを学習させて精度を上げるのが一般的でしょうか
検知精度は検知結果のもっともらしさで、閾値を設けてある一定以上の精度じゃないと検知結果にしないなどの調整をすることが可能です
下記は本記事でも取り上げる物体検知モデルの1つであるYOLOv4のでも動画です
このように物体を長方形で囲って、物体の種類と検知精度(何%正しそうか)を長方形の上の方に表示しています
もちろんプログラムを動かすマシンのスペックに依存する部分はありますが、こういった物体検出を動画やカメラの映像に対してリアルタイムで行えるようになってきています
単純に物体を検知するだけでは何が嬉しいのかわかりにくいのですが、これを応用した様々なビジネスやユースケースが期待されています
例えばロボットが物を認識する際にも応用されていたりします
AIっていうと何か難しい印象をもたれている方もいらっしゃいますが、とりあえず試してみるということであれば比較的簡単に試すことができます
「今回は物体検知をとりあえず実行する」というのを目標に説明していきます
そのため堅苦しいような理論や用語の解説は省いていますが、気になる方は、今回試してみるYOLOv3、YOLOv4の下記論文を参照してください
YOLOv5は論文があるわけではなく、そこまで劇的な改善ではなさそうなので利用時はご注意ください
https://arxiv.org/pdf/1804.02767.pdf
https://arxiv.org/pdf/2004.10934.pdf
世の中の物体検出(Object Detection)用のモデルはたくさんありますが、SSD、YOLOなどは、ITをかじったことのある方なら、もしかしたら一度は聞いたことがある方もいらっしゃるかもしれません
今回はYOLOの中から比較的新しくて有名なYOLOv3、YOLOv4、YOLOv5モデルを用いた物体検出の方法を紹介していきます
実験環境
今回物体検出を試す環境は以下のとおりですが同じである必要はありません
メモリはできれば8GB以上、GPUはNVIDIA、OSはUbuntuであれば同じように実行できるかと思いますが、何か差分があればご質問いただくか適宜お調べください
- PC
- メモリ 16GB
- NVIDIA GeForce 1070
- OS
- Ubuntu 18.04LTS
- 言語
- Python
- 使用ライブラリ
- git
事前準備
NVIDIAドライバ、CUDA、cuDNNなどのインストールは下記の記事を参考に行ってください
YOLOv4のときに使用するサンプル動画として下記にあるtest.mp4をダウンロードしておいてください
https://github.com/e96031413/OpenCV-YOLOv3-Python-Jacana/blob/master/videos/test.mp4
OSライブラリインストール(YOLOv4のところを試す方のみ)
libjasper-devをインストールするために必要なため、リポジトリの更新
$ sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu bionic-security main"
$ sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
下記のコマンドで必要なライブラリをインストールしてください
$ sudo apt-get install libjasper-dev
$ sudo apt-get install libpng12-dev
OpenCVインストール(YOLOv4のところを試す方のみ)
下記のシェルを使ってインストールしてください
$ git clone https://github.com/jayrambhia/Install-OpenCV
$ cd Install-OpenCV
$ sudo bash opencv_latest.sh
たまにエラー出てるのにインストール上手くいったりするので、わからなければエラー内容とともに質問していただければ、できる範囲でお答えいたします
Anacondaで作業環境を作成
下記作業は必須ではありませんが、環境を分けて管理した方がライブラリとかの管理がしやすいです
$ conda create -n objdetect python==3.7 anaconda
$ source activate objdetect
ライブラリインストール
下記のコマンドで必要なライブラリをインストールしてください
$ pip install opencv-python PyHamcrest torch torchvision
たぶん上記で足りると思いますが、何か途中で足りない!って言われたら都度インストールしましょう
YOLOv3による物体検出・物体検知
今回は下記のgithubで実行してみます
このgithub意外にもdarknet, keras-yolov3などいろいろありますが、そのあたりはいつか機会があれば紹介します
適当なディレクトリにてgit cloneを使って、githubからコードをcloneしてきましょう
$ git clone https://github.com/ultralytics/yolov3.git
$ cd yolov3
下記のコマンドを実行すると分析に必要なpytorchのモデル(xxxx.pt)がweightsディレクトリにダウンロードされます
$ bash weights/download_yolov3_weights.sh
いろいろxxxx.ptファイルがダウンロードされますが、デフォルトのままだとyolov3-spp-ultralytics.ptが使用されます
それではさっそく物体検知をサンプル画像に対して実行してみましょう
サンプル画像はdata/samples配下にあるbus.jpgとzidane.jpgです
$ python detect.py
オプションなどを指定していないので先ほどのサンプル画像に対して、先ほどダウンロードしてきたptファイルやcfg配下にあるコンフィグファイルを用いて実行されます
分析結果はoutputディレクトリに出力されます

これだけだと面白みにかけるので、もしカメラのある方はパソコンにカメラを接続して下記のコマンドを実行してみてください
$ python detect.py --source 0
こうするとカメラの映像に対してリアルタイムで物体検知を実行してくれます
もしくは好きな画像ファイルを持っていきてsourceで指定した0の部分を好きなファイルのパスに置き換えても良いです
$ python detect.py --source data/samples/sample.jpg
混雑中の日本のストリートでの結果です
めちゃくちゃたくさんの人が検知されていますね!

YOLOv4による物体検出・物体検知
YOLOv4の方はせっかくなので先ほどと変えて、darknetと言われるこちらも有名なgithubを用いて動かしてみましょう
先ほどと同様githubからクローンしてきます
$ git clone https://github.com/AlexeyAB/darknet.git
$ cd darknet
まずはcfgファイルとweightsファイルをダウンロードします
これらのファイルはモデルのネットワーク構成に関わる情報や学習してチューニングされたパラメータ情報が入ったファイルだと思っていただければ良いです
$ wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights
$ mv yolov4.weights weights/.
$ wget https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov4.cfg
$ mv yolov4.cfg cfg/.
Makefileを編集します
$ vi Makefile
GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
AVX=0
OPENMP=0
LIBSO=1
openCVのインストールなどが上手く言っている場合は、makeが上手くいくはずです
$ make
事前準備のときにダウンロードしておいたtest.mp4をdarknetディレクリにコピーしてください
その後、darknetディレクトリにて下記コマンドでtest.mp4に対する物体検知の結果がoutput.mp4に出力されます
$ python darknet_video.py --input test.mp4 --out_filename out.mp4
下記が出力結果です
上手く鳥が検知されていますね
YOLOv5による物体検出・物体検知
事前準備
他のYOLOv3、YOLOv4の場合と若干必要なライブラリバージョンが異なるのでAnacondaで別の環境をつくります
いったん下記コマンドで以下の環境から抜けます
$ conda deactivate
つづいて新たな環境を作成して、その環境に切り替えます
$ conda create -n yolov5 python==3.7 anaconda
$ source activate yolov5
物体検出の実行
YOLOv5ではYOLOv3のときと同じ作者のgithubを利用します
同様の方法でgithubからクローンしましょう
$ git clone https://github.com/ultralytics/yolov5.git
$ cd yolov5
必要なライブラリをインストールします
$ pip install PyHamcrest
$ pip install -r requirements.txt --user
いろんなgithubをクローンしてきたときにrequirements.txtがあれば基本上記の2つ目のコマンドで必要ファイルをインストールすることになりますので覚えておきましょう
元のbaseとなる環境の方に他のバージョンのライブラリがインストールされているとConflictを起こすことがあります
そのときはライブラリを一度アンインストールするなどして試してください
$ pip uninstall [アンインストールしたいライブラリ名]
必要なモデルファイル(xxxx.pt)をダウンロードします
$ bash weights/download_weights.sh
実行方法はYOLOv3のときと基本は同じです
カメラを使ったリアルタイム検知を試すには下記を実行してみましょう!
$ python detect.py --source 0
weightsファイルをデフォルトのものから変更した場合は下記のようにすればOKです
$ python detect.py --weights weights/yolov5x.pt --source 0
最後に
物体検出の基本となるYOLOについてYOLOv3、YOLOv4、YOLOv5を取り上げてみました
今回はすでに学習済みのモデルをそのまま利用しましたが、もちろん独自に学習することもできます
そのあたりについても、いずれ本ブログで紹介できればと思います
本ブログでは、引き続き以下のような技術についてもいずれ紹介していきたいと思いますので、よろしければまた見に来てください
- 画像分類 (Image Classification)
- 物体検出 (Object Detection)
- 物体トラッキング (Object Tracking)
- 姿勢推定 (Pose Estimation)
- 自然言語処理 (Natural Language Processing)
- 3次元再構成 (3D Reconstruction)
- …etc
HRNetという姿勢推定、セマンティックセグメンテーション、画像分類などに応用されるモデルについてもまとめてみました!OpenPoseと違って無料で使えて、精度も良いのでおすすめです
また、CenterNetという2D/3D物体検出、姿勢推定などに応用されるモデルについてもまとめてみました!
データ分析、AI系でのおすすめ書籍
今回取り上げていないSSDによる物体検知、姿勢推定、GAN、BERT・・・etc のあまり他の書籍では取り上げられていない技術がPytorchでのソースコード付で載っていて、日本語の書籍では貴重な一冊ですね
私みたいにディープラーニングをしっかりと数式で理解したい人向けにおすすめです
誰もが認める入門本! この本を批判している人はまずいない気がします
ぼんやり理解していた理論部分がしっかりと基本から学べます
Pythonの基礎から、ライブラリの使い方、データ分析に必要な手法一通りの基礎を学べる良書です
Pythonをやったことがない人や、Pythonはやったことあるけどデータ分析はまったくの初心者などの方はまずこの一冊をやっておいて損はありませんね
たまに引用する教科書的にも使えます
網羅性という意味では一番かもしれません
この本で全体像を把握してから、興味ある部分に紹介されている参考文献をたどるという感じです
参考文献もかなり妥当なものを紹介してくれていると感じました
全体の手法をしっておくと、業務で取り組む問題で選択できる手法の幅が広がります
まだまだ紹介しきれていない良書たちがありますが、今回はこんなところまで
ほとんどこの界隈の書籍は目を通しているつもりですので、こういうのを勉強したいんだけど、おすすめな書籍があるか?といったご質問も受け付けております
コメント