YOLOv8 (https://github.com/ultralytics/ultralytics) はオープンソースの物体検出のためのアーキテクチャで,学習済みモデルも含まれています.ここでは Python で YOLOv8 を使った物体検出を行ってみよう.
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>
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 のサンプルコードとサンプルデータをダウンロードしますが,このステップは省略しても構いません.以降は 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 %
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 通り:ケネディ大統領暗殺地点のすぐ近く)
img_03.jpg (米国 Texas 州 Houston のジョンソン宇宙センター)
img_06.jpg (米国 Texas 州 Dallas の Reunion Tower からの眺め)
YOLOv8 では物体検出のための実行形式のプログラム (yolo) が提供されています.この yolo プログラムをコマンドラインインタフェース(CLI)で利用しても良いですし,Pythonで入力したコードを実行しても構いません.いずれにせよ,使用したいモデルを指定すると学習済みモデルが自動的にダウンロードされる仕組みになっています.これらの学習済みモデルでは80種類の物体の検出ができ,モデルのサイズによって検出の精度と演算に必要な負荷が異なります.いくつか試して適切なモデルを選ぶと良いでしょう.
モデル |
ファイルサイズ |
パラメータ数 |
---|---|---|
YOLOv8n | 6.2MB | 320万 |
YOLOv8s | 22MB | 1120万 |
YOLOv8m | 50MB | 2590万 |
YOLOv8l | 84MB | 4370万 |
YOLOv8x | 131MB | 6820万 |
まず,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
次に,同じ学習済みモデル (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
こちらは自動車の車列を列車であると認識しています.
img_06.jpg
次に,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 (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
人物が認識され,航空機がなぜか3機になってしまいました.
img_03.jpg
建物の屋上がトラックとして認識され,自動車が1台認識されました.
img_06.jpg
次はモデル 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
認識結果に大きな違いはありませんが,信頼度が変化しています.
img_03.jpg
列車の一部が正しく認識され,自動車が6台に増加しました.
img_06.jpg
次はモデル 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
(不要な)3機目の航空機の信頼度が0.27まで低下しました.
img_03.jpg
認識できた自動車が20台にまで増加しました.
img_06.jpg
次はモデル 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
img_03.jpg
img_06.jpg
デフォルト設定では信頼度 (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
クレーン作業員も認識されています.
img_03.jpg
自動車の数が大幅に増加しました.
img_06.jpg
実行時に save_crop=True
を指定すると切り抜き画像を保存することができます.結果は crops フォルダ以下に物体の種類ごとにサブフォルダが作成されその中に保存されます.
model = ultralytics.YOLO("yolov8x.pt")
results = model.predict(source="yolo_images", save=True, conf=0.1, save_crop=True)
入力画像は標準では幅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
非常に小さなバスやトラックも認識しています.
img_03.jpg
109台の自動車を認識しました.
img_06.jpg
検出した物体の結果を何らかの別の処理に引き渡したいような場合は,テキスト形式でも出力すると良いでしょう.このためには 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
さらに 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