Python入門トップページ


YOLOv8 で物体検出をしてみよう

目次

  1. YOLOv8
  2. 仮想環境の構築 (Windows 編)
  3. 仮想環境の構築 (macOS 編)
  4. YOLOv8 サンプルコードのダウンロード
  5. ultralytics のインストール
  6. 動作確認
  7. 画像データの準備
  8. 学習済みモデルを用いた物体検出
    1. モデル YOLOv8n
      1. コマンドラインインタフェース(CLI)を利用した検出
      2. Pythonコードによる検出
    2. モデル YOLOv8s
    3. モデル YOLOv8m
    4. モデル YOLOv8l
    5. モデル YOLOv8x
  9. 信頼度の変更
  10. 切り抜き画像の保存
  11. サイズの変更
  12. テキストデータの保存

YOLOv8

YOLOv8 (https://github.com/ultralytics/ultralytics) はオープンソースの物体検出のためのアーキテクチャで,学習済みモデルも含まれています.ここでは Python で YOLOv8 を使った物体検出を行ってみよう.

目次に戻る

仮想環境の構築 (Windows 編)

YOLOv8 を利用するには,torch をはじめ様々なライブラリをインストールしなければなりません.Anaconda の base 環境にライブラリをインストールしても良いですが,バージョンの不一致などトラブルに見舞われる可能性もあります.したがってここでは YOLOv8 用の Python 仮想環境を構築して,その仮想環境にライブラリをインストールして YOLOv8 を利用することにします.

ここでは,Anaconda Prompt を用いて,仮想環境を構築してみます.Anaconda Navigator を GUI で操作して仮想環境を構築する方法はこちらを参照してください.まず,インストールされている Python の仮想環境を一覧で表示します.

(base) C:\Users\bk182005>conda env list ⏎
# conda environments:
#
base                  *  C:\ProgramData\Anaconda3


(base) C:\Users\bk182005>

Python 3.11 をベースにした仮想環境を作成し,その名前を py311yolov8 にします.

(base) C:\Users\bk182005>conda create -n py311yolov8 python=3.11 ⏎

(base) C:\Users\bk182005>

インストールされている Python の仮想環境を一覧で表示し,py311yolov8 が構築できていることを確認します.

(base) C:\Users\bk182005>conda env list ⏎
# conda environments:
#
base                  *  C:\ProgramData\Anaconda3
py311yolov8              C:\ProgramData\Anaconda3\envs\py311yolov8


(base) C:\Users\bk182005>

仮想環境 py311yolov8 を有効化します.

(base) C:\Users\bk182005>conda activate py311yolov8 ⏎

(py311yolov8) C:\Users\bk182005>

インストールされているライブラリを確認します.

(py311yolov8) C:\Users\bk182005>pip list ⏎
Package    Version
---------- -------
pip        23.1.2
setuptools 67.8.0
wheel      0.38.4

(py311yolov8) C:\Users\bk182005>

目次に戻る

仮想環境の構築 (macOS 編)

YOLOv8 を利用するには,torch をはじめ様々なライブラリをインストールしなければなりません.Anaconda の base 環境にライブラリをインストールしても良いですが,バージョンの不一致などトラブルに見舞われる可能性もあります.したがってここでは YOLOv8 用の Python 仮想環境を構築して,その仮想環境にライブラリをインストールして YOLOv8 を利用することにします.

M1 Mac に構築した Minforge 環境において,Python 3.11 をベースにした仮想環境を作成し,その名前を py311yolov8 にします.その後,作成した仮想環境を有効化します.

(base) rinsaka@MacStudio2022 ~ % conda create -n py311yolov8 python=3.11 ⏎
(base) rinsaka@MacStudio2022 ~ % conda activate py311yolov8 ⏎
(py311yolov8) rinsaka@MacStudio2022 ~ %

目次に戻る

YOLOv8 サンプルコードのダウンロード

ここでは,YOLOv8 のサンプルコードとサンプルデータをダウンロードしますが,このステップは省略しても構いません.以降は macOS での操作によって説明しますが,Windows であっても(次の1行目 cdコマンドのフォルダ区切り文字以外は)ほぼ同様です.なお,Documentsフォルダ内に python/yolo というフォルダが設置されているものとしてその中にダウンロードしています.任意のフォルダで作業しても構いません.YOLOv8 ソースコードのクローンを GitHub (https://github.com/ultralytics/ultralytics) から作成します.Git のインストールについてはここを参照してください.あるいは,GitHub のサイトから ZIP 形式でダウンロードして展開することも可能です.

(py311yolov8) rinsaka@MacStudio2022 ~ % cd Documents/python/yolo ⏎
(py311yolov8) rinsaka@MacStudio2022 yolo % git clone https://github.com/ultralytics/ultralytics.git ⏎
Cloning into 'ultralytics'...
remote: Enumerating objects: 10633, done.
remote: Counting objects: 100% (1494/1494), done.
remote: Compressing objects: 100% (653/653), done.
remote: Total 10633 (delta 934), reused 1269 (delta 825), pack-reused 9139
Receiving objects: 100% (10633/10633), 6.88 MiB | 6.94 MiB/s, done.
Resolving deltas: 100% (7102/7102), done.
(py311yolov8) rinsaka@MacStudio2022 yolo %

目次に戻る

ultralytics のインストール

YOLOv8 の実行に必要なライブラリをインストールするには次のようなコマンドを実行します.

(py311yolov8) rinsaka@MacStudio2022 ~ % pip install ultralytics ⏎

さらに,JupyterLab もインストールしておきます.

(py311yolov8) rinsaka@MacStudio2022 ~ % pip install jupyterlab ⏎

目次に戻る

動作確認

上のステップでクローンを作成すると ultralytics フォルダが作成されているはずなので,そのフォルダに移動します.

(py311yolov8) rinsaka@MacStudio2022 yolo % cd ultralytics ⏎

クローンを作成しない場合は任意のフォルダを作成してそのフォルダに移動するか,すでにあるフォルダに移動します.例えば,Documents フォルダに python フォルダがあり,その中に ultralytics フォルダを作成してそこに移動します.

(py311yolov8) rinsaka@MacStudio2022 ~ % cd Documents ⏎
(py311yolov8) rinsaka@MacStudio2022 Documents % cd python ⏎
(py311yolov8) rinsaka@MacStudio2022 python % mkdir ultralytics ⏎
(py311yolov8) rinsaka@MacStudio2022 python % cd ultralytics ⏎
(py311yolov8) rinsaka@MacStudio2022 ultralytics %

YOLOv8 が実行可能な環境が構築できているか動作確認を行います.まず,JupyterLab を起動します.

(py311yolov8) rinsaka@MacStudio2022 ultralytics % jupyter lab ⏎

Jupyterlabで新規ノートブックを作成し,次の2行のコードを入力して実行できれば OK です.

import ultralytics
ultralytics.checks()
Ultralytics YOLOv8.0.121 🚀 Python-3.11.4 torch-2.0.1 CPU
Setup complete ✅ (10 CPUs, 32.0 GB RAM, 877.2/926.4 GB disk)

目次に戻る

画像データの準備

上のステップでクローンを作成すると,ultralytics フォルダの中に examples フォルダがあります.この examples フォルダに zidane.jpg という画像ファイルとチュートリアルの tutorial.ipynb ファイルがあるので,これを実行しても良いでしょう.今回は examples フォルダの中に yolo_images サブフォルダを作成し,その中に物体検出を行いたい画像ファイルを設置します.ここでは,GitHub のサンプルデータ (https://github.com/rinsaka/sample-data-sets)にある yolo_images.zip をダウンロードして examples/yolo_images フォルダ内に展開します.中には20枚の写真 (img_01.jpg 〜 img_20.jpg) があります.そのうち3枚を確認します.

img_01.jpg (米国 Texas 州 Dallas の Elm 通り:ケネディ大統領暗殺地点のすぐ近く)
yolo_img01
img_03.jpg (米国 Texas 州 Houston のジョンソン宇宙センター)
yolo_img03
img_06.jpg (米国 Texas 州 Dallas の Reunion Tower からの眺め)
yolo_img06

目次に戻る

学習済みモデルを用いた物体検出

YOLOv8 では物体検出のための実行形式のプログラム (yolo) が提供されています.この yolo プログラムをコマンドラインインタフェース(CLI)で利用しても良いですし,Pythonで入力したコードを実行しても構いません.いずれにせよ,使用したいモデルを指定すると学習済みモデルが自動的にダウンロードされる仕組みになっています.これらの学習済みモデルでは80種類の物体の検出ができ,モデルのサイズによって検出の精度と演算に必要な負荷が異なります.いくつか試して適切なモデルを選ぶと良いでしょう.

モデル
ファイルサイズ
パラメータ数
YOLOv8n 6.2MB 320万
YOLOv8s 22MB 1120万
YOLOv8m 50MB 2590万
YOLOv8l 84MB 4370万
YOLOv8x 131MB 6820万

目次に戻る

モデル YOLOv8n

コマンドラインインタフェース(CLI)を利用した検出

まず,YOLOv8n のモデルとコマンドラインインタフェース (CLI) を使って物体検出を行います.このとき Jupyter Lab からプログラム (yolo) を実行するには,シェルコマンド ( ! ) を利用すると良いでしょう.あるいは,Windows の Anaconda Prompt や Mac のターミナルを使って実行しても構いません.このときは ! を入力せずに yolo predict ... から入力してください.まずは,yolo_images フォルダに格納された img01.jpg ファイルの物体を検出します.なお,Windowsの場合はフォルダの区切り文字に円マーク(バックスラッシュ)2個を,macOS や Linux の場合は / を使用してください.

Windows の場合!yolo predict model=yolov8n.pt source='yolo_images\\img01.jpg'
Downloading https:\github.com\ultralytics\assets\releases\download\v0.0.0\yolov8n.pt to yolov8n.pt...

  0%|          | 0.00/6.23M [00:00<?, ?B/s]
 62%|######2   | 3.89M/6.23M [00:00<00:00, 40.8MB/s]
100%|##########| 6.23M/6.23M [00:00<00:00, 47.3MB/s]
Ultralytics YOLOv8.0.124  Python-3.11.3 torch-2.0.1+cpu CPU
YOLOv8n summary (fused): 168 layers, 3151904 parameters, 0 gradients

image 1/1 C:\Users\bk182005\Documents\python\ultralytics\examples\yolo_images\img01.jpg: 480x640 7 cars, 1 truck, 5 traffic lights, 95.7ms
Speed: 3.0ms preprocess, 95.7ms inference, 1.0ms postprocess per image at shape (1, 3, 480, 640)
Results saved to runs\detect\predict
macOS の場合!yolo predict model=yolov8n.pt source='yolo_images/img01.jpg'
Downloading https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.pt to yolov8n.pt...
100%|██████████████████████████████████████| 6.23M/6.23M [00:00<00:00, 59.9MB/s]
Ultralytics YOLOv8.0.121 🚀 Python-3.11.4 torch-2.0.1 CPU
YOLOv8n summary (fused): 168 layers, 3151904 parameters, 0 gradients

image 1/1 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img01.jpg: 480x640 7 cars, 1 truck, 5 traffic lights, 47.2ms
Speed: 2.0ms preprocess, 47.2ms inference, 0.7ms postprocess per image at shape (1, 3, 640, 640)
Results saved to runs/detect/predict

最初に実行したときに学習済みモデルファイルが自動的にダウンロードされることに注意してください.さらに,上の実行結果を見ると,img01.jp からは7台の自動車,1台のトラック,5台の交通信号機が検出されたことがわかります.結果の最後の行には出力されたフォルダ名 runs/detect/predict が表示されているので,そのフォルダのファイルを確認します.

自動車や交通信号機などが検出できています.

img_01.jpg
yolov8-01n-img01

次に,同じ学習済みモデル (yolov8n) を用いて yolo_images フォルダに格納された20枚の写真について連続して物体を認識します.この場合はフォルダ名のみを source に指定します.今回はダウンロード済みのモデルが使用されます.認識結果は連番で新たなフォルダが自動的に作成されて出力されることに注意してください.2回めの実行であるので predict2 というフォルダが runs/detect/ フォルダに作成されています.

!yolo predict model=yolov8n.pt source='yolo_images'
Ultralytics YOLOv8.0.121 🚀 Python-3.11.4 torch-2.0.1 CPU
YOLOv8n summary (fused): 168 layers, 3151904 parameters, 0 gradients

image 1/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img01.jpg: 480x640 7 cars, 1 truck, 5 traffic lights, 47.4ms
image 2/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img02.jpg: 480x640 1 car, 1 train, 44.1ms
image 3/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img03.jpg: 480x640 2 airplanes, 43.7ms
image 4/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img04.jpg: 480x640 1 airplane, 5 trucks, 41.9ms
image 5/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img05.jpg: 480x640 4 bottles, 1 cup, 2 bowls, 1 sandwich, 1 carrot, 1 dining table, 43.5ms
image 6/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img06.jpg: 480x640 1 train, 43.3ms
image 7/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img07.jpg: 384x640 8 persons, 2 cars, 1 horse, 4 cows, 37.6ms
image 8/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img08.jpg: 480x640 3 persons, 2 cars, 1 bus, 45.1ms
image 9/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img09.jpg: 480x640 4 persons, 1 airplane, 45.6ms
image 10/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img10.jpg: 480x640 7 persons, 2 trucks, 44.2ms
image 11/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img11.jpg: 640x480 1 fire hydrant, 1 toothbrush, 45.4ms
image 12/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img12.jpg: 480x640 1 airplane, 43.7ms
image 13/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img13.jpg: 384x640 (no detections), 37.4ms
image 14/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img14.jpg: 480x640 2 trains, 1 truck, 44.6ms
image 15/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img15.jpg: 480x640 1 car, 44.8ms
image 16/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img16.jpg: 480x640 1 car, 42.8ms
image 17/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img17.jpg: 480x640 11 cars, 45.6ms
image 18/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img18.jpg: 480x640 1 person, 6 cars, 44.4ms
image 19/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img19.jpg: 480x640 1 car, 3 traffic lights, 42.4ms
image 20/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img20.jpg: 480x640 1 person, 8 cars, 1 clock, 42.0ms
Speed: 1.8ms preprocess, 43.5ms inference, 0.4ms postprocess per image at shape (1, 3, 640, 640)
Results saved to runs/detect/predict2

認識結果を確認します.2機の飛行機が認識されています.ただし,スペースシャトルの信頼度(確信度)は0.33であり,それほど高くはありません.

img_03.jpg
yolov8-01n-img03

こちらは自動車の車列を列車であると認識しています.

img_06.jpg
yolov8-01n-img06

目次に戻る

Pythonコードによる検出

次に,Pythonのコードを入力して,物体検出を行なってみます.次のように,僅か3行のコードで物体検出を実行することができます.必要に応じて学習済みモデルが自動的にダウンロードされ,検出結果も同じように runs/detect/ フォルダ以下に出力されます.

import ultralytics
model = ultralytics.YOLO("yolov8n.pt")
results = model.predict(source="yolo_images", save=True)
image 1/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img01.jpg: 480x640 7 cars, 1 truck, 5 traffic lights, 49.6ms
image 2/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img02.jpg: 480x640 1 car, 1 train, 48.1ms
image 3/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img03.jpg: 480x640 2 airplanes, 44.0ms
...(中略)...
Speed: 1.8ms preprocess, 45.4ms inference, 0.5ms postprocess per image at shape (1, 3, 640, 640)
Results saved to runs/detect/predict3

結果は results というリストに格納されています.

type(results)
list

results[0]
ultralytics.yolo.engine.results.Results object with attributes:

boxes: ultralytics.yolo.engine.results.Boxes object
keypoints: None
keys: ['boxes']
masks: None
names: {0: 'person', 1: 'bicycle', 2: 'car', 3: 'motorcycle', 4: 'airplane', 5: 'bus', 6: 'train', 7: 'truck', 8: 'boat', 9: 'traffic light', 10: 'fire hydrant', 11: 'stop sign', 12: 'parking meter', 13: 'bench', 14: 'bird', 15: 'cat', 16: 'dog', 17: 'horse', 18: 'sheep', 19: 'cow', 20: 'elephant', 21: 'bear', 22: 'zebra', 23: 'giraffe', 24: 'backpack', 25: 'umbrella', 26: 'handbag', 27: 'tie', 28: 'suitcase', 29: 'frisbee', 30: 'skis', 31: 'snowboard', 32: 'sports ball', 33: 'kite', 34: 'baseball bat', 35: 'baseball glove', 36: 'skateboard', 37: 'surfboard', 38: 'tennis racket', 39: 'bottle', 40: 'wine glass', 41: 'cup', 42: 'fork', 43: 'knife', 44: 'spoon', 45: 'bowl', 46: 'banana', 47: 'apple', 48: 'sandwich', 49: 'orange', 50: 'broccoli', 51: 'carrot', 52: 'hot dog', 53: 'pizza', 54: 'donut', 55: 'cake', 56: 'chair', 57: 'couch', 58: 'potted plant', 59: 'bed', 60: 'dining table', 61: 'toilet', 62: 'tv', 63: 'laptop', 64: 'mouse', 65: 'remote', 66: 'keyboard', 67: 'cell phone', 68: 'microwave', 69: 'oven', 70: 'toaster', 71: 'sink', 72: 'refrigerator', 73: 'book', 74: 'clock', 75: 'vase', 76: 'scissors', 77: 'teddy bear', 78: 'hair drier', 79: 'toothbrush'}
orig_img: array([[[ 39,  48,  57],
        [ 40,  49,  58],
        [ 41,  50,  59],
        ...,
        ...(中略)...
        ...,
        [ 19,  17,  17],
        [ 19,  17,  17],
        [ 19,  17,  17]]], dtype=uint8)
orig_shape: (1536, 2048)
path: '/Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img01.jpg'
probs: None
save_dir: 'runs/detect/predict3'
speed: {'preprocess': 1.886129379272461, 'inference': 49.637794494628906, 'postprocess': 0.6499290466308594}

結果の一つひとつは ultralytics.yolo.engine.results.Results というデータ形式になっていることが確認できます.

type(results[0])
ultralytics.yolo.engine.results.Results

例えば,names 属性を取得してみます.この names 属性にある80種類の物体が学習済みモデルでは認識可能です.

results[0].names
{0: 'person',
  1: 'bicycle',
  2: 'car',
  3: 'motorcycle',
  4: 'airplane',
  5: 'bus',
  6: 'train',
  7: 'truck',
  ...(中略)...
  76: 'scissors',
  77: 'teddy bear',
  78: 'hair drier',
  79: 'toothbrush'}

目次に戻る

モデル YOLOv8s

次はモデル YOLOv8s (small) を使ってみます.

model = ultralytics.YOLO("yolov8s.pt")
results = model.predict(source="yolo_images", save=True)
Downloading https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8s.pt to yolov8s.pt...
100%|██████████████████████████| 21.5M/21.5M [00:00<00:00, 29.0MB/s]

image 1/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img01.jpg: 480x640 8 cars, 1 truck, 5 traffic lights, 73.2ms
image 2/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img02.jpg: 480x640 2 cars, 1 train, 1 bench, 73.2ms
image 3/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img03.jpg: 480x640 1 person, 3 airplanes, 71.0ms
...(中略)...
image 20/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img20.jpg: 480x640 1 person, 11 cars, 1 clock, 72.5ms
Speed: 1.8ms preprocess, 68.9ms inference, 0.5ms postprocess per image at shape (1, 3, 640, 640)
Results saved to runs/detect/predict4

認識された自動車が7台から8台に増えました.

img_01.jpg
yolov8-02s-img01

人物が認識され,航空機がなぜか3機になってしまいました.

img_03.jpg
yolov8-02s-img03

建物の屋上がトラックとして認識され,自動車が1台認識されました.

img_06.jpg
yolov8-02s-img06

目次に戻る

モデル YOLOv8m

次はモデル YOLOv8m (medium) を使ってみます.

model = ultralytics.YOLO("yolov8m.pt")
results = model.predict(source="yolo_images", save=True)
Downloading https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8m.pt to yolov8m.pt...
100%|███████████████████████████| 49.7M/49.7M [00:00<00:00, 57.3MB/s]

image 1/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img01.jpg: 480x640 8 cars, 6 traffic lights, 141.3ms
image 3/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img03.jpg: 480x640 1 person, 3 airplanes, 119.7ms
image 6/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img06.jpg: 480x640 6 cars, 1 train, 1 truck, 123.1ms
...
Speed: 1.8ms preprocess, 123.7ms inference, 0.5ms postprocess per image at shape (1, 3, 640, 640)
Results saved to runs/detect/predict5

検出された信号機が1つ増加し,上ではトラックとして認識されていた中央のSUVが自動車として認識されました.

img_01.jpg
yolov8-03m-img01

認識結果に大きな違いはありませんが,信頼度が変化しています.

img_03.jpg
yolov8-03m-img03

列車の一部が正しく認識され,自動車が6台に増加しました.

img_06.jpg
yolov8-03m-img06

目次に戻る

モデル YOLOv8l

次はモデル YOLOv8l (large) を使ってみます.

model = ultralytics.YOLO("yolov8l.pt")
results = model.predict(source="yolo_images", save=True)
Downloading https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8l.pt to yolov8l.pt...
100%|████████████████████████████████| 83.7M/83.7M [00:01<00:00, 51.6MB/s]

image 1/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img01.jpg: 480x640 8 cars, 2 trucks, 7 traffic lights, 216.0ms
image 3/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img03.jpg: 480x640 1 person, 3 airplanes, 208.0ms
image 6/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img06.jpg: 480x640 20 cars, 2 trains, 1 truck, 219.1ms
...
Speed: 1.7ms preprocess, 208.1ms inference, 0.5ms postprocess per image at shape (1, 3, 640, 640)
Results saved to runs/detect/predict6

認識できた信号機が1つ増えました.

img_01.jpg
yolov8-04l-img01

(不要な)3機目の航空機の信頼度が0.27まで低下しました.

img_03.jpg
yolov8-04l-img03

認識できた自動車が20台にまで増加しました.

img_06.jpg
yolov8-04l-img06

目次に戻る

モデル YOLOv8x

次はモデル YOLOv8x (xlarge) を使ってみます.

model = ultralytics.YOLO("yolov8x.pt")
results = model.predict(source="yolo_images", save=True)
Downloading https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8x.pt to yolov8x.pt...
100%|████████████████████████████████| 131M/131M [00:03<00:00, 45.0MB/s]

image 1/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img01.jpg: 480x640 10 cars, 1 bus, 1 truck, 9 traffic lights, 292.8ms
image 3/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img03.jpg: 480x640 1 person, 4 airplanes, 262.9ms
image 6/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img06.jpg: 480x640 20 cars, 1 bus, 2 trains, 1 truck, 268.1ms
...
Speed: 1.6ms preprocess, 263.2ms inference, 0.5ms postprocess per image at shape (1, 3, 640, 640)
Results saved to runs/detect/predict7
img_01.jpg
yolov8-05x-img01
img_03.jpg
yolov8-05x-img03
img_06.jpg
yolov8-05x-img06

目次に戻る

信頼度の変更

デフォルト設定では信頼度 (conf) が 0.25 以上になった物体を検出結果として出力します.このしきい値を変更することもできます.例えばしきい値を 0.1 として実行します.

model = ultralytics.YOLO("yolov8x.pt")
results = model.predict(source="yolo_images", save=True, conf=0.1)
image 1/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img01.jpg: 480x640 12 cars, 1 bus, 1 truck, 13 traffic lights, 272.1ms
image 3/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img03.jpg: 480x640 2 persons, 5 airplanes, 263.4ms
image 6/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img06.jpg: 480x640 58 cars, 3 buss, 2 trains, 2 trucks, 261.6ms
...
Speed: 1.6ms preprocess, 259.3ms inference, 0.5ms postprocess per image at shape (1, 3, 640, 640)
Results saved to runs/detect/predict8

Python コードで実行する場合は次のようになります.

自動車と信号機の数が大幅に増加しました.

img_01.jpg
yolov8-06conf-img01

クレーン作業員も認識されています.

img_03.jpg
yolov8-06conf-img03

自動車の数が大幅に増加しました.

img_06.jpg
yolov8-06conf-img06

目次に戻る

切り抜き画像の保存

実行時に save_crop=True を指定すると切り抜き画像を保存することができます.結果は crops フォルダ以下に物体の種類ごとにサブフォルダが作成されその中に保存されます.

model = ultralytics.YOLO("yolov8x.pt")
results = model.predict(source="yolo_images", save=True, conf=0.1, save_crop=True)
yolov8-07crop

目次に戻る

サイズの変更

入力画像は標準では幅640ピクセルに変換されますが,そのサイズを変更することができます.例えばオリジナルの画像の幅 2048ピクセルに指定してみると,より小さな物体も検出できるようになります.その一方で検出に必要な計算時間も大幅に長くなります.

model = ultralytics.YOLO("yolov8x.pt")
results = model.predict(source="yolo_images", save=True, conf=0.1, save_crop=True, imgsz=2048)
image 1/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img01.jpg: 1536x2048 3 persons, 14 cars, 2 trucks, 18 traffic lights, 4436.0ms
image 3/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img03.jpg: 1536x2048 4 persons, 5 airplanes, 1 bus, 1 truck, 3912.5ms
image 6/20 /Users/rinsaka/Documents/python/ultralytics/examples/yolo_images/img06.jpg: 1536x2048 1 person, 109 cars, 6 buss, 1 train, 15 trucks, 3852.7ms
...
Speed: 7.1ms preprocess, 3856.1ms inference, 1.2ms postprocess per image at shape (1, 3, 2048, 2048)
Results saved to runs/detect/predict10

Python コードで実行する場合は次のようになります.

自動車や信号機の数がさらに増加しました.

img_01.jpg
yolov8-08size-img01

非常に小さなバスやトラックも認識しています.

img_03.jpg
yolov8-08size-img03

109台の自動車を認識しました.

img_06.jpg
yolov8-08size-img06

目次に戻る

テキストデータの保存

検出した物体の結果を何らかの別の処理に引き渡したいような場合は,テキスト形式でも出力すると良いでしょう.このためには save_txt=True オプションを追加します.

model = ultralytics.YOLO("yolov8x.pt")
results = model.predict(source="yolo_images", save=True, save_txt=True)

この結果,labels フォルダに画像ごとのテキストファイルが作成されます.例えば,img01.txtは次のような結果になります.結果には「物体の種類」「中心のX座標」「中心のY座標」「幅」「高さ」が出力されています.

2 0.0597295 0.848841 0.118902 0.137281    # 左下の自動車(白)
2 0.929129 0.873379 0.140903 0.251879     # 右下の自動車(白)
2 0.205338 0.826466 0.13389 0.106518      # 左下の自動車(黒)
9 0.600272 0.435413 0.0369495 0.103853    # 中央の信号機(右)
9 0.400526 0.425723 0.0352713 0.104557    # 中央の信号機(左)
9 0.761121 0.693376 0.0115767 0.0351916
...
2 0.579639 0.819341 0.0223608 0.0325178
9 0.608359 0.768275 0.00760484 0.0201745

なお,物体の種類(2が自動車,9が信号機であること)は次の方法で確認できます.

print(results[0].names[2])
print(results[0].names[9])
car
traffic light
img_01.jpg
yolov8-10txt-img01-grid

さらに save_conf=True を追加すると,信頼度も出力できます.出力結果を確認すると信頼度の高い順にソートされていることも分かりました.

model = ultralytics.YOLO("yolov8x.pt")
results = model.predict(source="yolo_images", save=True, save_txt=True, save_conf=True)
2 0.0597295 0.848841 0.118902 0.137281 0.933986    # 左下の自動車(白)
2 0.929129 0.873379 0.140903 0.251879 0.933091     # 右下の自動車(白)
2 0.205338 0.826466 0.13389 0.106518 0.90504       # 左下の自動車(黒)
9 0.600272 0.435413 0.0369495 0.103853 0.881146    # 中央の信号機(右)
9 0.400526 0.425723 0.0352713 0.104557 0.781478    # 中央の信号機(左)
9 0.761121 0.693376 0.0115767 0.0351916 0.762984
...
2 0.579639 0.819341 0.0223608 0.0325178 0.354249
9 0.608359 0.768275 0.00760484 0.0201745 0.305319
img_01.jpg
yolov8-10txt-img01-grid

目次に戻る