このまま実行すれば出来る。YOLO v11を使って、顔認識(face detection)を追加学習させてみよう。

YOLOのバージョン11で、これまでセットアップとアノテーションツールを使って学習データを自作する方法を書いてきました。そこで皆気づくでしょう。アノテーション、面倒くさいと。本記事では、既存の学習データを使って、追加学習していく方法を記載しようと思います。

おさらい

YOLOのセットアップ、自分で自分の画像をアノテーションして、YOLOの学習をさせる「labellmg」これらが基本になりますので、まだこれらを試したことがない方は、過去の記事を参照お願いします。

このまま実行すれば出来る。YOLO v11を使った物体認識の方法教えます。

YOLO v11 物体認識 アノテーションツール「labellmg」の使い方と追加学習。

手順

今回の手順は次の通りです。

  1. 追加学習に使う学習モデルのダウンロード
  2. ダウンロードしたモデルの分類を既存学習データと重複しないよう変更※後述
  3. 学習
  4. 動作確認

追加学習に使う学習モデルのダウンロード

いろいろなサイトがありますが、私は下記のサイトにお世話になっています。似たようなサイトはありますので、お好みでダウンロードしてください。

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)

結果は下記。しっかり顔認識できてますね!












コメント

タイトルとURLをコピーしました