物体検出でお馴染みのYOLOシリーズの最新版「YOLOv8」について、動かしながら試していきます。

YOLOv8は2023年1月に公開された最新バージョンであり、速度と精度の面で限界を押し広げています。

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

これまでの投稿はこちら
第1回:YOLOv8を試してみる 〜導入からデモまで〜
第2回:推論の引数と座標とスコアの出力
第3回:YOLOv8でセグメンテーションを試してみる
第4回:YOLOv8における推論結果と座標について
第5回:マスク着用をリアルタイムに判定 〜オープンソースデータセットの学習と評価〜
第6回:物体検出のためのデータ収集
第7回:物体検出のためのアノテーション

今回の内容

・YOLOv8における座標

YOLOv8とは

YOLOv8は2023年1月に公開された最新バージョンであり、既存のオブジェクト検出器を上回り、速度と精度の面で限界を押し広げています。

物体検出だけでなく、セグメンテーションタスクや画像分類タスクでも利用することができます。

引用:https://github.com/ultralytics/ultralytics

YOLOv8のベンチマーク結果は以下となっています。

物体検出モデル

引用:https://github.com/ultralytics/ultralytics

セグメンテーションモデル

引用:https://github.com/ultralytics/ultralytics

なお、YOLOv8のライセンスは「GNU General Public License v3.0」となっています。

YOLOv8の導入

早速YOLOv8を使って動かしていきましょう。

ここからはGoogle colabを使用して実装していきます。

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

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

GPUの設定が終わったら、Googleドライブをマウントします。

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

公式よりcloneしてきます。

!git clone https://github.com/ultralytics/ultralytics
%cd ultralytics

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

ここではpipでインストールすることにします。

!pip install -r requirements.txt

以上で準備完了です。

YOLOv8を使えるようになりました。

物体検出の結果出力

まずは物体検出の実装を紹介します。

ここではこちらの画像を使用します。

説明の都合上、検出される物体が1つになるように「max_det=1」しています。

from ultralytics import YOLO
model = YOLO("yolov8x.pt") 
results = model('zidane.jpg',save=True,save_txt=True,max_det=1)

実行すると以下のような画像ファイルとテキストファイルが出力されます。

zidane.jpg
0 0.483203 0.633333 0.775781 0.711111

これらの値と座標の関係を見ていきます。

YOLOv8における座標

先ほど出力した結果を読み込むと以下のようになります。

import pandas as pd
df = pd.read_csv("runs/detect/predict/labels/zidane.txt",sep = ' ',header=None, names=['id', 'x1', 'y1', 'x2', 'y2'])
idx1y1x2y2
00.4832030.6333330.7757810.711111

「id」は検出対象に付与されているラベルとなります。今回は人間が検出されているため、id=0となっています。

他の少数は、上のようにx座標とy座標を表しており、画像のx方向・y方向の長さで割った値となっています。

そのため、元の座標の値を出力するためには、画像ののx方向・y方向の長さを掛ける必要があります。

まずは画像のx方向・y方向の長さの出力します。

from PIL import Image, ImageFilter
im = Image.open('zidane.jpg')
im.size

この画像はそれぞれ(1280, 720)のサイズであることがわかりました。

この値を先ほどの少数の値にそれぞれ掛けていきます。

for item in zip(df['x1'], df['y1'], df['x2'], df['y2'],df['id']):
  x_center = int(item[0]*im.size[0])
  y_center = int(item[1]*im.size[1])
  width = int(item[2]*im.size[0])
  height = int(item[3]*im.size[1])

  print(x_center,y_center,width,height)

# 618 455 992 511

「618,455 」は検出された領域の中心の座標、「992,511」はそれぞれ、X方向・Y方向の長さを表しています。

これらをまとめて表現すると、以下の通りとなります。

それぞれ以下のように左上と右下の座標に変換することができます。

 x_min = int(x_center - width/2)
 x_max = int(x_center + width/2)
 y_min = int(y_center - height/2)
 y_max = int(y_center + height/2)

 print(x_min,y_min,x_max,y_max)

# 121 199 1114 711

出力された値は以下のようになっています。

まとめ

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

2023年1月に公開された物体検出でお馴染みのYOLOシリーズの最新バージョンである「YOLOv8」について、動かしながら試してみました。

精度・推論速度ともに向上しており、非常に使いやすいものになっています。

物体検出の活用の幅がさらに広がりそうですね。

コメントを残す