このシリーズでは物体検出でお馴染みの「YOLOv5」を用いて、物体検出の実装を基礎から学ぶことができます。

環境構築から学習の方法、さらに活用方法までをまとめています。

Google colabを使用して簡単に物体検出のモデルを実装することができますので、ぜひ最後までご覧ください。

第5回目はPyTorch hubによる物体検出テスト結果の出力方法と自作モデルのテスト方法について紹介します。

PyTorch hubを使ったYOLOv5による物体検出を試してみましょう。

今回の内容

・Torch hubのまとめ

・Torch hubの機能であるYouTube動画から物体検出する方法

YOLOv5の導入

Google colabを立ち上げて、早速実装していきましょう。

まずはGPUを使用できるように設定をします。

「編集」タブから「ノートブックの設定」の中の「ハードウェア アクセラレータ」を「GPU」に設定。

Google ドライブのファイルにアクセスするため、マウントします。

from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive

今回初めてYOLOv5を使用する方はクローンしましょう。

すでに前回クローンしている方は実行不要です。

!git clone https://github.com/ultralytics/yolov5

必要なライブラリをインポートします。

%cd yolov5/
!pip install -qr requirements.txt

以上で準備は終了です。

YOLOv5のためのTorch hubの基本操作(テスト)

PyTorch hubを使用することで、yolov5による物体検出を簡単に実装することができます。

公式は以下のリンクからご確認下さい。

まずはPyTorch hubによる物体検出を試してみましょう。

モデルと画像を指定するだけで簡単に実装できます。

画像はパスを指定するか、URLを指定しましょう。

import torch

# モデル
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
# 画像
img = 'https://i0.wp.com/tt-tsukumochi.com/wp-content/uploads/2022/01/drive.jpg?w=2078&ssl=1'
# Inference
results = model(img)

この結果に対する処理方法を順番に紹介します。

テスト結果の出力

まずはテスト結果を表示します。

results.print()  

# image 1/1: 768x1024 7 persons, 3 trains, 1 traffic light
# Speed: 273.3ms pre-process, 75.8ms inference, 1.6ms NMS per image at shape (1, 3, 480, 640)

検出された対象の検出数とラベル名が表示されます。

検出にかかった速度も見ることができます。

テスト結果を保存

テスト結果を保存します。

デフォルトでは「runs/detect」フォルダの中に「exp」フォルダが作成され、結果が保存されます。

results.save()
# Saved 1 image to runs/detect/exp

テスト結果を保存(保存先を指定)

出力先を指定して保存することもできます。

results.save(save_dir='runs/detect/car')
# Saved 1 image to runs/detect/car

テスト結果の表形式出力

結果を表形式で出力します。

results.xyxy[0] 
results.pandas().xyxy[0]
index xmin ymin xmax ymax confidence class name
0 875.2473754882812 327.3222351074219 1737.8250732421875 1120.9964599609375 0.9310059547424316 6 train
1 439.28424072265625 410.6086120605469 924.3189697265625 996.1290893554688 0.922091543674469 6 train
2 1856.3125 629.8081665039062 1901.7957763671875 747.9683227539062 0.7349188923835754 0 person
3 1907.376953125 628.1093139648438 1950.151611328125 746.6908569335938 0.7252894639968872 0 person
4 1955.5526123046875 630.6196899414062 1985.5224609375 726.0067749023438 0.7032561898231506 0 person
5 1926.7708740234375 564.2162475585938 2047.1478271484375 680.9027709960938 0.44237130880355835 6 train
6 1859.0142822265625 629.9708251953125 1952.890869140625 744.4647827148438 0.3407197594642639 0 person
7 1795.2630615234375 695.3111572265625 1834.2845458984375 742.4089965820312 0.3037204444408417 28 suitcase
8 1819.098876953125 629.0570678710938 1848.3270263671875 706.0908813476562 0.2795644700527191 0 person
9 1799.7734375 630.826171875 1827.2406005859375 691.7291259765625 0.26140284538269043 0 person

xmin,ymin,xmax,ymaxはそれぞれ物体の枠線の座標を表しています。

画像の左上が原点(0,0)である事に注意しましょう。

confidenceは検出の確信度であり、0~1の間で1に近いほど機械が自信を持って判定していることになります。

テスト結果のCSVファイル出力

上記の結果一覧をCSVファイルで出力することができます。

results.pandas().xyxy[0].to_csv('result.csv')

テスト結果の切り抜き画像を保存

まずは先ほどのテスト結果をご覧ください。

この結果から検出された物体を切り抜くことができます。

crops = results.crop(save=True)

「train」のクロップ画像を表示します。

テストの設定

テスト時の設定を変更することができます。

model.conf = 0.25  # NMS confidence threshold
      iou = 0.45  # NMS IoU threshold
      agnostic = False  # NMS class-agnostic
      multi_label = False  # NMS multiple labels per box
      classes = None  # (optional list) filter by class, i.e. = [0, 15, 16] for COCO persons, cats and dogs
      max_det = 1000  # maximum number of detections per image
      amp = False  # Automatic Mixed Precision (AMP) inference

results = model(imgs, size=320)  # custom inference size

YOLOv5のためのTorch hubの基本操作(その他)

デバイスの設定

モデル読み込み時にうまくいかなった際、既存のキャッシュを破棄しPyTorchHubから最新のYOLOv5バージョンを強制的にダウンロードすることで読み込みができるようになる場合があります。

model = torch.hub.load('ultralytics/yolov5', 'yolov5s', force_reload=True)  # force reload

モデルは作成後に任意のデバイスに転送できます

model.cpu()  # CPU
model.cuda()  # GPU
model.to(device)  # i.e. device=torch.device(0)

Youtube動画のテスト

図のようにYouTube上にある動画に対して物体検出を行ないます。

まずはソースとなる動画をご覧ください。

こちらの動画に対して物体検出を実装してみましょう。

以下のように動画のURLを引数に取ります。

!python detect.py --source 'https://youtu.be/igh_evKnkFk'

処理が終わると動画として保存されます。

YouTube動画の物体検出ができました。

動画内の解析やデータ収集に役立ちそうですね。

なお、モデルや確信度閾値を指定することもできます。

!python detect.py --source 'https://youtu.be/igh_evKnkFk' --weights best.pt --conf 0.5

まとめ

最後までご覧いただきありがとうございました。

今回はPyTorch hubによる物体検出テスト結果の出力方法について紹介しました。

次回の記事ではYOLOv5の活用方法を紹介していきます。

ぜひ、ご覧ください。

コメントを残す