こんにちは。
今回は物体検出のモデルYOLOv5を使って騒音がすごい住んでいるマンション前の交通量を計ってみるために使い方を確認してみました。
YOLOv5とは
まず、今回参考にしたのはYOLOv5のこちらのレポジトリ。
YOLOv5はその名の通りYOLOというベースのモデルからバージョンアップしていったものになります。
2015年にワシントン大学のJoseph Redmon氏によって提案された元々のベース(YOLO)の論文はこちらになります。
[1506.02640] You Only Look Once: Unified, Real-Time Object Detection
まずベースのアイデアの説明の前に識別(class probability prediction)と物体検出の違いについて簡単に説明させてください。
識別は以前行ったVGG16画像識別のように画像内の特徴量を検出してその画像がなにに該当するのか近しいものを推測します。
一方、物体検出はその該当する物体が画像のどの部分にいるのかという追加のタスクが必要になります。
そこで簡単に思いつくのが識別を再帰的に画像の一部分に適応することで物体位置を検出するというスライディングウィンドウ法に代表されるような物体検出方法です。
しかし、こちらの方法では再帰的に識別処理を行わなければいけないので、計算負荷が大きくなってしまいリアルタイム性の高いアプリケーションには使用できません。
そこで、YOLOではその名前がYou Only Look Onceを示す通り、単一のNeural Networkで物体検出(物体の場所)と識別(物体が何か)を同時に行うことで一度の推定で物体検出を行おうというモデルになっています。
また、単一のNNとなっているので物体検出の最適化(損失)も一緒に評価できるので学習による物体検出性能の改善がしやすいというのも特徴となっています。
この論文をベースとしてv5までアップデートされています。
概要はこちらに説明があります。
また、YOLOv5はスマホアプリとしてもリリースされているんで簡単に試すことができます。
PyTorchで使ってみる
実際にYOLOv5を使ってみます。
PyTorchから直接モデルをしようできるので、公式のサンプルに従って以下のようにしました。
識別する画像は公式に従ってジダンです。(笑)
results.show()
リザルトのオブジェクトに対してshow()を行うと以下のようにラベリングされた画像を表示してくれます。
results.crop()
次にcrop()です。
物体の識別ごとに画像を切り出しくれます。
切り出した画像は実行ディレクトリにrunsというディレクトリが作られてその中に保存されます。
ディレクトリはこちら。
一点注意ですが、上記のshow()メソッドを一度使用してからcropするとラベルが残ってしまいます。
results.print()
次にprintメソッドです。
以下のように何を検出したのかと処理速度を表示してくれます。
image 1/1: 720x1280 2 persons, 2 ties
Speed: 232.0ms pre-process, 447.0ms inference, 6.0ms NMS per image at shape (1, 3, 384, 640)
results.pandas()
最後にpandasメソッドです。実際はpandasのxyxy[0]を参照しないと何がどこで検出されているかは分かりません。
複数画像を使うケースだと0番目以外も参照する必要があるのでしょうか。
恐らくこの物体検出モデルを応用していく上でもっとも使用すると思います。
xmin ymin xmax ymax confidence class name
0 743.290527 48.343781 1141.756470 720.000000 0.879860 0 person
1 441.989594 437.336670 496.585114 710.036255 0.675119 27 tie
2 123.051056 193.238037 714.690674 719.771301 0.666694 0 person
3 978.989807 313.579468 1025.302856 415.526184 0.261517 27 tie
このように検出した物体の位置、物体のクラスがpandasのデータフレームとして取得することができます。
次回はこのデータフレームを使って、実際に道路の動画から自動車を検出してみます。
イメージはこんな感じです。
以上、YOLOv5の簡単な使い方でした。