画像認識AI YOLOv8解説シリーズ目次
YOLOv8 タスクとモード
まず、YOLOv8には3つの「タスク」と6つの「モード」という概念があります。
- 検出 (Detection)
- 分類 (Classification)
- 範囲検出 (Segmentation)
- 姿勢検出 (Pose)
※ OBBがありますが、これは上記の技術を合わせた検出とも言うことができ、ひとまず置いておきます。
- トレーニングモード (Model Training)
- バリデーションモード (Model Validation)
- 推論モード
- エクスポートモード (Model Export)
- トラッキングモード
- ベンチマークモード (Model Benchmarking)
モデル「トレーニング」モードで特定のシーンに特化したモデルを作り、エクスポートモードで使いたいフレームワークに合わせたモデルにして出力することができます。デフォルトはPyTorchなのですが、ONNXフォーマットなどにすることができます。
解析の際に使うのは、推論モードとトラッキングモードになります。
推論モード (Predict) でのパラメータ
トラッキングについては別記事で扱います。
推論モードはYOLOv8利用の基本とも言えるモードで、モデルを用いてメディアを分析する際に使用することになります。
モデルを読み込み、メディアを指定して実行すると、結果が得られます。
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
results = model("https://ultralytics.com/images/bus.jpg")
print(results)
model()内で指定できるパラメータについては、以下に記載があります。(同じ内容だと思いますが)
https://docs.ultralytics.com/usage/cfg/?h=#predict-settings
https://docs.ultralytics.com/modes/predict/#inference-arguments
推論用パラメータ
例ですが以下のようなパラメータがあります。
パラメータ | デフォルト値 | 説明 |
---|---|---|
max_det | 300 | 検出する数の上限を指定する。デフォルトで300。 |
classes | None (設定無) | 検出する対象を指定する。 print(results)としたときに出るが、初期の判定可能対象は以下。 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’ |
視覚化用パラメータ
例ですが以下のようなパラメータがあります。
パラメータ | デフォルト値 | 説明 |
---|---|---|
save | False | 結果を保存するパラメータだが、デフォルトで保存しないようになっている。 |
show_boxes | True | 検出対象を枠で囲む設定。デフォルトで枠を出すようになっている。 |
パラメータを設定して推論実行する
結果ファイルを保存する save=True
以下のコードを実行すると、アノテーション画像もしくは動画が保存されます。
デフォルトでFalseなsaveを、Trueにしています。保存先、保存フォルダ名を指定します。
from ultralytics import YOLO
model = YOLO("yolov8x.pt")
# ファイルは適切なものを用意してください
result = model("/content/umineko-live.mp4",save=True,project="/content/",name="yolov8-save")
以下、YouTubeにてライブ配信をしてらっしゃるウミネコ商店さまの店内カメラ映像を拝借しました。
https://www.youtube.com/@uminekoshouten
- 投入したコンテンツ
- 得られたコンテンツ
冷蔵庫の横の棚が冷蔵庫であるとされているなど、少し変な点もあります。
検出対象を指定する classes=list
以下のコードを実行します。人間は0番、猫は15番となっているのでそれらを指定します。
list[int]形式です。
from ultralytics import YOLO
model = YOLO("yolov8x.pt")
classes = [0,15]
result = model("/content/umineko-org.mp4",save=True,project="/content/",name="classes", classes=classes)
検出数を指定する max_det=int
以下のコードを実行します。デフォルトは300となっていますが、今回は3件まで検出するようにします。
from ultralytics import YOLO
model = YOLO("yolov8x.pt")
classes = [0,15]
result = model("/content/umineko.png",save=True,project="/content/",name="max_det", classes=classes,max_det=3)
ラベルに書いてあるスコアが高い順に残すようになっています。例えば max_det=1 とすると、最もスコアが高い対象だけが残ります。
ボックスの線の太さを変化させる line_width=int
以下のコードを実行します。枠の線の太さを変えます。
from ultralytics import YOLO
model = YOLO("yolov8x.pt")
classes = [0,15]
result = model("/content/umineko.png",save=True,project="/content/",name="max_det", classes=classes,line_width=100)
ラベルとボックスの線を消す
show_labels=False としてコードを実行します。これでラベルが消えます。
from ultralytics import YOLO
model = YOLO("yolov8x.pt")
classes = [0,15]
# ラベルを消す
result = model("/content/umineko.png",save=True,project="/content/",name="max_det", classes=classes,show_labels=False)
ボックスの線を書かない方法はこちら。
show_boxes=False としてコードを実行します。ラベルだけ残すというのは出来ないようです。
from ultralytics import YOLO
model = YOLO("yolov8x.pt")
classes = [0,15]
# ボックスを削除する
result = model("/content/umineko.png",save=True,project="/content/",name="max_det", classes=classes,show_boxes=False)