はじめに
YOLOv8で物体検出してみます。
また検出時にクラスやconfidenceの指定方法、モデルサイズによる推論速度の比較なども検証してみます。
環境
Python-3.8.12
torch-1.7.1+cu110
NVIDIA GeForce RTX 3090
試してみた
YOLOv8のインストール
pip install ultralytics
データセットの準備
こちらからデータを拝借
https://cocodataset.org/#download
1000枚の画像で試していきます。
まずはディテクション
from ultralytics import YOLO
# モデルの生成。モデルは自動でダウンロードされます。
model = YOLO("yolov8s.pt")
# 推論実行
results = model("./datasets/test2014/COCO_test2014_000000139819.jpg")
推論実行時に渡す引数はファイルパス、URL、cv2などで読み込んだ配列など様々なデータに対応しています。渡せるデータはこちらから確認できます。
cv2で読み込んだ場合は、BGRからRGBに変換してから利用するように注意が必要です。
結果はリストで返ってきます。
推論時に複数のデータを渡せば、結果もそれに応じて複数返ってきます。
中身は以下のようにして確認できます。
results[0].cpu().boxes.numpy().boxes
インスタンス毎に情報を持ち、左から順にバウンディングBOXの4座標、confidence score、クラスになります。
クラスは results[0].names から確認することもできます。
0はperson、38はtennis racketです。
推論時にクラスやconfidenceを指定することも可能です。
指定しない場合は、学習された全クラス、スコア0.25以上の物体が検出されるようです。
今度はperson、スコア0.6以上で推論実行してみます。
results = model(
"./datasets/test2014/COCO_test2014_000000139819.jpg",
classes = [0],
conf = 0.6
)
先ほどよりも結果が絞られました。
結果を元の画像に描画します。
モデルサイズ別に推論速度を比較する
物体検出モデルはサイズ別に5つのバリエーションが用意されています。
今回は1000枚の画像を使って、推論速度と物体の検出数を比較してみました。
先ほど同様、クラスはperson、スコアは0.6とします。
model_paths = [
"./model_data/yolov8n.pt",
"./model_data/yolov8s.pt",
"./model_data/yolov8m.pt",
"./model_data/yolov8l.pt",
"./model_data/yolov8x.pt",
]
performance_info = {}
img_files = glob.glob("./datasets/test2014/*.jpg")
for model_path in model_paths:
predict_time = 0
bbox_cnt = 0
model = YOLO(model_path)
for img_file in img_files[:1000]:
img = cv2.imread(img_file)
start = time.perf_counter()
results = model(
img[:,:,::-1],
classes = [0],
conf = 0.6,
)
predict_time += time.perf_counter() - start
result = results[0].cpu().boxes.numpy()
boxes = result.xyxy.astype(int)
bbox_cnt += len(boxes)
performance_info[os.path.basename(model_path)] = {
"time":predict_time,
"bbox_cnt":bbox_cnt,
}
結果はこちら
一番小さいNサイズと一番大きいXサイズを比べると速度が1.5倍かかってますが、検出数も1.5倍多い結果となりました。
今回は単純に速度と検出数で比較しましたが、いずれしっかりと精度を出して比べてみたいと思いました。
以上になります。
最後まで読んでいただき、ありがとうございました。