1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

YOLOv8で物体検出モデルを試してみた

Posted at

はじめに

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

image.png
インスタンス毎に情報を持ち、左から順にバウンディング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
)

image.png
先ほどよりも結果が絞られました。
結果を元の画像に描画します。
image.png

モデルサイズ別に推論速度を比較する

物体検出モデルはサイズ別に5つのバリエーションが用意されています。
image.png

今回は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,
    }

結果はこちら
image.png
一番小さいNサイズと一番大きいXサイズを比べると速度が1.5倍かかってますが、検出数も1.5倍多い結果となりました。
今回は単純に速度と検出数で比較しましたが、いずれしっかりと精度を出して比べてみたいと思いました。

以上になります。
最後まで読んでいただき、ありがとうございました。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?