物体検出でお馴染みのYOLOシリーズの最新版「YOLOv8」について、動かしながら試していきます。
YOLOv8は2023年1月に公開された最新バージョンであり、速度と精度の面で限界を押し広げています。
Google colabを使用して簡単に最新の物体検出モデルを実装することができますので、ぜひ最後までご覧ください。
今回の内容
・YOLOv8における座標
YOLOv8とは
YOLOv8は2023年1月に公開された最新バージョンであり、既存のオブジェクト検出器を上回り、速度と精度の面で限界を押し広げています。
物体検出だけでなく、セグメンテーションタスクや画像分類タスクでも利用することができます。
YOLOv8のベンチマーク結果は以下となっています。
物体検出モデル
セグメンテーションモデル
なお、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)
実行すると以下のような画像ファイルとテキストファイルが出力されます。
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'])
id | x1 | y1 | x2 | y2 |
---|---|---|---|---|
0 | 0.483203 | 0.633333 | 0.775781 | 0.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」について、動かしながら試してみました。
精度・推論速度ともに向上しており、非常に使いやすいものになっています。
物体検出の活用の幅がさらに広がりそうですね。