YOLOによる画像認識と機械学習の仕方


 

YOLOによる画像認識と機械学習の仕方

YOLO(You Only Look Once)は、画像や映像ストリーム内のオブジェクトをリアルタイムで検出するための強力なアルゴリズムです。最新バージョンであるYOLOv8は、その精度と速度がさらに向上し、オブジェクト検出と座標取得をより簡単に実現できます。この記事では、YOLOv8を使って画像認識と機械学習を行う方法を解説します。

準備

  1. Pythonのインストール: Pythonをまだインストールしていない場合は、公式ウェブサイトからダウンロードしてインストールしてください。
  2. YOLO CLIのインストール: コマンドプロンプトまたはターミナルで以下のコマンドを実行してYOLO CLIをインストールします。

pip install ultralytics

画像ファイルのオブジェクト検出と座標取得

以下のコードは、画像ファイルを読み込み、YOLOv8を使ってオブジェクトを検出し、その座標を取得する方法を示しています。
import cv2
from ultralytics import YOLO

# YOLOモデルの読み込み
model = YOLO(‘yolov8n.pt’) # 事前学習済みのモデルを使用

# 画像ファイルのパスを指定
image_path = ‘path_to_your_image.jpg’ # 自分の画像ファイルのパスに置き換えてください

# 画像の読み込み
image = cv2.imread(image_path)

# 画像が正しく読み込まれたかをチェック
if image is None:
print(“画像の読み込みに失敗しました。パスを確認してください。”)
else:
# 推論を実行(信頼度を0.1に設定)
results = model(image, conf=0.1)

# 画像のサイズを取得
imageWidth = results[0].orig_shape[0]
imageHeight = results[0].orig_shape[1]

# オブジェクト名とクラス、バウンディングボックスの情報を取得
names = results[0].names
classes = results[0].boxes.cls
boxes = results[0].boxes

# 検出結果をプロット
annotatedImage = results[0].plot()

# 検出されたオブジェクトの情報を出力
for box, cls in zip(boxes, classes):
name = names[int(cls)]
x1, y1, x2, y2 = [int(i) for i in box.xyxy[0]]
print(f”Object: {name} Coordinates: StartX={x1}, StartY={y1}, EndX={x2}, EndY={y2}”)

# バウンディングボックスの座標を画像に描画
cv2.putText(annotatedImage, f”{x1} {y1} {x2} {y2}”, (x1, y1 – 40), cv2.FONT_HERSHEY_PLAIN, 2.0, (0, 255, 0), 2, cv2.LINE_AA)

# 結果を表示
cv2.imshow(“YOLOv8 Inference”, annotatedImage)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 結果をファイルに保存
output_path = ‘output_image.jpg’
cv2.imwrite(output_path, annotatedImage)
print(f”検出結果を {output_path} に保存しました。”)

テストは、「馬が何頭か、走っている写真」を使うと、しっかりと認識しているのが確認されましたよ。すごい!!

このコードは、以下の手順で動作します。

  1. YOLOモデルの読み込み: yolov8n.pt は事前学習済みの軽量モデルです。必要に応じて、他のモデル(yolov8s.pt、yolov8m.pt、yolov8l.pt、yolov8x.pt)を使用できます。
  2. 画像ファイルの読み込み: image_path に画像ファイルのパスを指定してください。
  3. 推論の実行: results = model(image, conf=0.1) は、モデルを使用して画像内のオブジェクトを検出します。conf=0.1 は、信頼度しきい値を0.1に設定します。これは、検出されたオブジェクトの信頼度が0.1以上の場合のみ出力されることを意味します。
  4. 検出結果の処理: results オブジェクトには、検出されたオブジェクトの座標、クラス、信頼度などの情報が含まれています。
  5. 検出結果の表示: annotatedImage = results[0].plot() は、検出結果を画像上にプロットします。
  6. 検出結果の出力: 検出されたオブジェクトの名前と座標がコンソールに出力されます。
  7. 検出結果の保存: cv2.imwrite(output_path, annotatedImage) は、検出結果が描画された画像を output_image.jpg として保存します。

特定オブジェクトの検出

YOLOv8は、様々なオブジェクトを検出するために事前学習されていますが、特定のオブジェクトをより正確に検出するには、カスタムモデルのトレーニングが必要です。

私の場合は、特殊だったようで、学習が必要になりました。

カスタムモデルのトレーニング

  1. データセットの準備:
    • 画像認識させたい特定のオブジェクトを含む画像を多数集めます。画像にアノテーション(バウンディングボックス)を付けます。アノテーションツールには、LabelImgなどのツールを使用できます。データセットdatasetフォルダを以下のようなディレクトリ構造に整理します。

    Labellingは、簡単に使えます。たんなる画像のオブジェクトの範囲を指定するだけの単純なソフトです。写真ごとのオブジェクトの座標のテキストファイルを作ります。
    • images/train と images/val には、それぞれトレーニング用と検証用の画像を配置します。
    • labels/train と labels/val には、対応するアノテーションファイルを配置します。
  2. データセット設定ファイルの作成: data.yamlファイルの作成
  3. モデルのトレーニング:

学習用のデータセットファイル構成

dataset/
├── images/
│   ├── train/
│   └── val/
└── labels/
    ├── train/
    └── val/

以下は、data.yaml のファイル
path: your_path/dataset
train: images/train
val: images/val
# アノテーションで作成されたclasses.txtの内容を使って書いて下さい
nc: 3  # クラス数(アノテーションしたオブジェクト名の数)
names: ['ob_1', 'ob_2', 'ob_3']  # オブジェクト名に書き換えてください

以下は、トレーニング用のPythonコード。実行します。
from ultralytics import YOLO

# YOLOモデルをロードし、トレーニングを開始
model = YOLO('yolov8n.pt')
model.train(
    data='data.yaml', 
    epochs=100, 
    imgsz=640, 
    batch=4, 
    augment=True, 
    lr0=0.001
)

トレーニング時間は、結構かかります。
トレーニングが進行している間、表示されるエポックごとの進捗を確認し、終了までの時間を見積もってください。特にGPUを使用している場合は比較的早く完了するでしょう。
動画作成のレンダリングのような時間がかかります。それより数倍長く見積もって下さい。

トレーニング用のデータの配置を少し効率化

画像ファイルとアノテーションファイル、および学習用(train)と検証用(val)のファイルをdatasetに正しく入れるのは、少し面倒です。私は、まずは画像ファイルをtrainとvalに分けました。7-8割がtrain用がよいようです。残りがval用です。
それから、この画像ファイルを読み込んで、アノテーションファイルを配置するスクリプトを作りましたので、よかったお使い下さい。

import os
import shutil

# フォルダパスの設定
base_dir = os.path.dirname(os.path.abspath(__file__))  # スクリプトのあるディレクトリ
anoed_dir = os.path.join(base_dir, 'anoed')  # アノテーションフォルダはアノテーションテキストの入っているフォルダを指定して下さい
dataset_dir = os.path.join(base_dir, 'dataset')
images_train_dir = os.path.join(dataset_dir, 'images', 'train')
images_val_dir = os.path.join(dataset_dir, 'images', 'val')
labels_train_dir = os.path.join(dataset_dir, 'labels', 'train')
labels_val_dir = os.path.join(dataset_dir, 'labels', 'val')

# ラベルフォルダが存在しない場合は作成
os.makedirs(labels_train_dir, exist_ok=True)
os.makedirs(labels_val_dir, exist_ok=True)

def copy_annotation_files(images_dir, labels_dir):
    # 画像フォルダ内のすべての画像ファイルを取得
    for img_file in os.listdir(images_dir):
        if img_file.endswith(('.jpg', '.png', '.jpeg')):  # 画像ファイルを判別
            base_filename = os.path.splitext(img_file)[0]  # 拡張子を除いたファイル名を取得
            annotation_file = f"{base_filename}.txt"  # アノテーションファイル名

            src_annotation_path = os.path.join(anoed_dir, annotation_file)  # アノテーションファイルのパス
            dst_annotation_path = os.path.join(labels_dir, annotation_file)  # コピー先のパス

            if os.path.exists(src_annotation_path):
                shutil.copy(src_annotation_path, dst_annotation_path)  # ファイルをコピー
                print(f"Copied: {src_annotation_path} to {dst_annotation_path}")
            else:
                print(f"Warning: Annotation file {src_annotation_path} does not exist.")

# 画像とアノテーションファイルのコピー処理
copy_annotation_files(images_train_dir, labels_train_dir)
copy_annotation_files(images_val_dir, labels_val_dir)

print("All annotation files have been processed.")

まとめ

YOLOv8は、オブジェクト検出と座標取得を簡単に実現する強力なアルゴリズムです。カスタムモデルのトレーニングにより、特定のオブジェクトをより正確に検出できます。この記事で紹介した手順とコード例を参考にして、画像認識と機械学習に挑戦してみてください。

おまけ このすごい仕組みの貢献者たち

深層学習の発展に貢献した主な研究者たち

  • ジェフリー・ヒントン(Geoffrey Hinton):
    • 深層学習のパイオニアであり、ニューラルネットワークの逆伝播アルゴリズム(バックプロパゲーション)の発展に大きく貢献しました。
    • 彼の研究は、現代のディープニューラルネットワークの基礎を築きました。
    • 2012年には、彼のチームがAlexNetというディープラーニングモデルで画像認識コンペティションを勝ち取り、深層学習の優位性を示しました。
    • 下のヤン・ルカンの指導もしている
  • ヤン・ルカン(Yann LeCun):
    • 畳み込みニューラルネットワーク(CNN)の開発者の一人で、画像認識やコンピュータビジョンの分野で広く使われています。
    • 現在はFacebook AI Researchのディレクターとしても活躍しています。
  • ヨシュア・ベンジオ(Yoshua Bengio):
    • 深層学習の理論的な基礎を築き、多くの重要な技術の発展に寄与しました。
    • 特に、シーケンスデータの処理に優れた再帰型ニューラルネットワーク(RNN)や、生成モデルの分野で貢献しています。

これらの研究者たちは、2018年に「ディープラーニングの功績」に対して、チューリング賞を受賞しました。チューリング賞は「コンピュータ科学のノーベル賞」とも呼ばれる非常に権威のある賞です。

物体検出の分野

  • ヨセフ・レッドモン(Joseph Redmon):
    • YOLO(You Only Look Once)アルゴリズムの開発者です。YOLOは、リアルタイムの物体検出に革命をもたらしました。物体検出アルゴリズムが非常に高速で実用的になったのは、彼の研究のおかげです。

これらの研究者たちの努力と発見のおかげで、今日のAI技術はここまで進化しました。私たちは彼らの仕事に依存して、様々な分野でAIを活用しています。そして、これからも技術は進化を続け、さらに多くの課題が解決されていくでしょう。

WEBプログム、WEBデザインなどの制作については、以下を御覧ください。

WEBプログム、WEBデザインなどの制作