YOLOのバージョン11で、これまでセットアップとアノテーションツールを使って学習データを自作する方法を書いてきました。そこで皆気づくでしょう。アノテーション、面倒くさいと。本記事では、既存の学習データを使って、追加学習していく方法を記載しようと思います。
おさらい
YOLOのセットアップ、自分で自分の画像をアノテーションして、YOLOの学習をさせる「labellmg」これらが基本になりますので、まだこれらを試したことがない方は、過去の記事を参照お願いします。
このまま実行すれば出来る。YOLO v11を使った物体認識の方法教えます。
YOLO v11 物体認識 アノテーションツール「labellmg」の使い方と追加学習。
手順
今回の手順は次の通りです。
- 追加学習に使う学習モデルのダウンロード
- ダウンロードしたモデルの分類を既存学習データと重複しないよう変更※後述
- 学習
- 動作確認
追加学習に使う学習モデルのダウンロード
いろいろなサイトがありますが、私は下記のサイトにお世話になっています。似たようなサイトはありますので、お好みでダウンロードしてください。
Kaggle: Your Machine Learning and Data Science Community
サイトに飛ぶとこんな画面が見えると思います。

登録しないとダウンロードできないので、右上の「Register」ボタンから登録。
Googleアカウントか、メアドで登録してください。

登録完了すると、こんな感じの画面が出ます。

左の赤枠の「Datasets」を押すと下のような画面になります。

検索の仕方はいろいろありますが、例えば「face detection yolo」と検索。↓のような感じにデータセットが見つかります。

赤枠で囲っているデータセットをクリック
学習データを選ぶ時のポイントは、前の記事で書いたような下のフォルダ構成になっている物を選ぶと、変換する手間がなくなり、便利です。
images
|_ train
|_val
labels
|_ train
|_val

右上の「Download」ボタンからダウンロード
ダウンロードしたモデルの分類を既存学習データと重複しないよう変更
ダウンロードすると「archive」という名前のzipがダウンロードできるので、解凍。するとこのような構成になっています。

この中の「labels」フォルダに.txtが入っており、アノテーションされたファイルなのですが、クラスがすべて「0」になっています。(下記の先頭の番号)多分ダウンロードするモデルごとに異なるので、自分の好きなクラス番号へ変換。
0 0.4925668843338214 0.468515625 0.2945589999999999 0.239375
今回は追加学習の為、もともと80種の分類がされている物は残し、クラス番号80にします。
手で変換していたら日が暮れてしまうので、下記のコードで一括変換。
file_pathの部分を変換したいファイルが入っているパスに書き換えてご使用ください
import glob
import os
file_path = r"D:\Myprogram\Yolo\ultralytics-main\ultralytics-main\datasets\archive\labels\val\*"
files = glob.glob(file_path)
def update_class_number(filename):
with open(filename, "r", encoding="utf-8") as file:
lines = file.readlines()
updated_lines = []
for line in lines:
parts = line.strip().split()
if len(parts) >= 5:
class_number = int(parts[0])
# クラス番号が0だったら80に変換
if class_number == 0:
updated_class_number = 80
x1, y1, x2, y2 = map(float, parts[1:])
updated_line = f"{updated_class_number} {x1} {y1} {x2} {y2}\n"
updated_lines.append(updated_line)
else:
updated_lines.append(line)
else:
updated_lines.append(line)
with open(filename, "w", encoding="utf-8") as file:
file.writelines(updated_lines)
file_not_found = False
for file in files:
filename = file
try:
update_class_number(filename)
# 確認表示
with open(filename, "r", encoding="utf-8") as file:
first_line = file.readline().strip()
print(f"filename: {filename} , {first_line}")
except FileNotFoundError:
print(f"{filename} が見つかりませんでした")
file_not_found = True
exit()
これで準備完了
学習
それでは学習していきます。必要なファイルは、実行するPythonファイルと、yamlファイル。
yamlファイルは下記を使用。1行目のパスは先ほどの学習モデルを格納したパスへ変更してください。
80番目のクラスをfaceとして追加
path: D:\Myprogram\Yolo\ultralytics-main\ultralytics-main\datasets\archive\images
train: train # train images (relative to 'path')
val: val # val images (relative to 'path')
# Classes
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
80: face #追加
学習を実行するコードは下記。上記yamlファイルのパスを指定。
今回は追加学習なので、yolo11x.ptに追加します。
from ultralytics import YOLO
if __name__ == '__main__':
# ベースとするモデル
model = YOLO('yolo11x.pt')
results = model.train(
data=r'D:\Myprogram\Yolo\ultralytics-main\ultralytics-main\facedetect.yaml',
epochs=100,
imgsz=512,
device=0
)
上のコードを実行すると、このように動き始めます。
引数の詳細説明は今回は割愛しますが、imgsz=512は読み込む画像ファイルのサイズを512×512に変換。device=0はGPUを使用。の意味ですので、お使いのPCに合わせて変更する必要があります。

私が使っているGPUはNVIDIA Geforce RTX 4070 SUPERですが、こんな感じで頑張っています。

後は学習が完成するまで待ちますが、epochs=100, imgsz=512, だと私のGPUでは、約5日かかりました。もう少しサイズやエポック数を減らしてもよいですね。
学習が終わるとこんな画面になります。

結果は「Results」のところにパスが書かれているので、確認。

そのフォルダをみるとこんな感じになっています。

weightsフォルダの中には次に2つのファイルがあります。できていれば完成。
best.pt:学習中の最も性能が高い学習モデル
last.pt : 学習の最後の学習モデル
動作確認
学習で出来上がった「best.pt」を実行して、動作を確認します。私の環境の場合は、次のパスへコピー。
「D:\Myprogram\Yolo\ultralytics-main\ultralytics-main」
今回、顔認識させる画像は「Stable Diffusion」で生成します。「Stable Diffusion」に関しては次の記事を参照お願いします。(もちろんテスト用画像はどんな画像でもよいので、ご自身の手持ちのものをご使用ください)
このまま実行すれば出来る! Stable diffusionの導入手順を簡単に説明します。
【Stable Diffusion】Kohya GUIの導入方法、コピー機LoRAの作り方を簡単に説明します。
StableDiffusion 自分のイラストを追加学習させる方法を簡単に紹介します
生成した画像は下記。

次のコードを実行します。
from ultralytics import YOLO
# Load a model
source = "testimage.png"
model = YOLO("best.pt") # load an official model
# Predict with the model
results = model.predict(source, save=True, imgsz=512, conf=0.5)
結果は下記。しっかり顔認識できてますね!

コメント