この記事でできること
- YOLOv8で検出した物体をクラス別に自動切り出し
- 切り出し画像の保存場所とフォルダ構成を理解
- 再学習・データセット作成への活用方法が分かる
なぜ検出結果を crop するのか?
YOLOv8の検出結果を切り出す処理は、単なる可視化ではなく、再学習用データセットの作成やアノテーション作業の省力化に使われます。
- 検出結果をそのまま学習データとして再利用したい
- 人物・動物など特定クラスだけを集めたい
- 大量画像から必要な部分だけを抽出したい
このような用途では、save_crop=True による自動切り出しが非常に有効です。
インストール
!pip install ultralytics
検出と切り出し
コードは以下の2 行だけあれば動きます。save_crop=Trueを指定するだけで、自動で切り出しが行われます。
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
results = model("input.jpg", save_crop=True)
モデルや入力画像を変更する場合
学習済みモデルや入力画像を変更したい場合は、以下のように指定します。
model = YOLO("best.pt") # 独自学習モデル
results = model("images/*.jpg", save_crop=True)
複数画像をまとめて処理した場合でも、クラス別に自動で切り出し画像が保存されます。
切り出し画像の保存場所
実行後、切り出し画像は自動的に以下のフォルダに保存されます。
runs/detect/フォルダ以下に、実行ごとに連番のフォルダ(例: predict、predict2)が作成され、その中のcrops/に格納されます。
出力例
runs/
└ detect/
└ predict/
├ labels/
└ crops/
├ person/
├ dog/
└ cat/
切り出し画像を表示する
保存された画像をまとめて表示するためのコード例です。globを使って、連番のpredict*フォルダ全体から画像ファイルを検索しています。
import glob
import matplotlib.pyplot as plt
from PIL import Image
# Paths to cropped images (folder name changes depending on run: predict, predict2, etc.)
paths = glob.glob("runs/detect/predict/crops/*/*.jpg")
# Layout settings (example: display in 8 columns)
cols = 8
rows = (len(paths) + cols - 1) // cols
plt.figure(figsize=(5, 2 * rows))
for i, p in enumerate(paths):
img = Image.open(p)
plt.subplot(rows, cols, i + 1)
plt.imshow(img)
plt.axis("off")
plt.title(p.split("/")[-2]) # Display class name as title
plt.tight_layout()
plt.show()
分割した画像
よくある質問:座標だけ取得したい場合
画像を切り出さずに、バウンディングボックスの座標 \(x_1, y_1, x_2, y_2\) だけを取得したい場合は、save_crop=Trueを指定せずにresultsオブジェクトから情報を取得します。
results = model("input.jpg")
for box in results[0].boxes:
print(box.xyxy) # x1, y1, x2, y2
まとめ
YOLOv8では save_crop=True を指定するだけで、
検出した物体をクラス別に自動で切り出し、画像として保存できます。
この機能は、再学習用データセットの作成や、 大量画像からの特徴抽出など、実務でも非常に役立ちます。
検出 → 切り出し → 再学習という流れを作ることで、 YOLOv8をより実践的に活用できるようになります。


0 件のコメント:
コメントを投稿