物体検出・物体検知を実行してみよう【YOLOv3, YOLOv4, YOLOv5対応】(2020年8月)

プログラミング・数学・英会話
スポンサーリンク

この記事は下記のような方のお役に立てると思いますのでどうか最後までご覧になっていってください!

  • 物体検出や物体検知って聞いたことあるけどどういう技術なのか知りたい
  • 物体検出を試してみたい
  • 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で実行してみます

ultralytics/yolov3
YOLOv3 in PyTorch > ONNX > CoreML > iOS. Contribute to ultralytics/yolov3 development by creating an account on 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を用いて動かしてみましょう

AlexeyAB/darknet
YOLOv4 - Neural Networks for Object Detection (Windows and Linux version of Darknet ) - AlexeyAB/darknet

先ほどと同様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を利用します

ultralytics/yolov5
YOLOv5 in PyTorch > ONNX > CoreML > iOS. Contribute to ultralytics/yolov5 development by creating an account on 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物体検出、姿勢推定などに応用されるモデルについてもまとめてみました!

dデータ分析、AI系でのおすすめ書籍

今回取り上げていないSSDによる物体検知、姿勢推定、GAN、BERT・・・etc のあまり他の書籍では取り上げられていない技術がPytorchでのソースコード付で載っていて、日本語の書籍では貴重な一冊ですね

私みたいにディープラーニングをしっかりと数式で理解したい人向けにおすすめです

誰もが認める入門本! この本を批判している人はまずいない気がします

ぼんやり理解していた理論部分がしっかりと基本から学べます

Pythonの基礎から、ライブラリの使い方、データ分析に必要な手法一通りの基礎を学べる良書です

Pythonをやったことがない人や、Pythonはやったことあるけどデータ分析はまったくの初心者などの方はまずこの一冊をやっておいて損はありませんね

たまに引用する教科書的にも使えます

網羅性という意味では一番かもしれません

この本で全体像を把握してから、興味ある部分に紹介されている参考文献をたどるという感じです

参考文献もかなり妥当なものを紹介してくれていると感じました

全体の手法をしっておくと、業務で取り組む問題で選択できる手法の幅が広がります

まだまだ紹介しきれていない良書たちがありますが、今回はこんなところまで

ほとんどこの界隈の書籍は目を通しているつもりですので、こういうのを勉強したいんだけど、おすすめな書籍があるか?といったご質問も受け付けております

コメント

Copied title and URL