YOLOv5 は独自のデータセットをトレーニングします (非常に詳細)

 

 

目次

 1. ディープラーニング環境を準備する

2. 独自のデータセットを準備する

1. データセットを作成する

 2. データ形式の変換

 3. 設定ファイル

 3. モデルのトレーニング

1. 事前トレーニング済みモデルをダウンロードする

2. トレーニング

4. モデルのテスト

 5. モデル推論


YOLOv5 独自のデータセットをトレーニングするプロセス全体には主に次のものが含まれます: 環境のインストール ---- データセットの作成 ---- モデルのトレーニング ---- モデルのテスト ---- モデルの推論

 1. ディープラーニング環境を準備する

私のラップトップ システムは次のとおりです。 Windows 10 では、まずYOLOv5 オープン ソース Web サイト
にアクセスし 、zip または git clone リモート ウェアハウスを手動でダウンロードします。YOLOv5 の 5.0 バージョン コードをダウンロードしました。コード フォルダーに、要件を説明するrequirements.txt ファイルがあります。インストールパッケージ。

この記事でインストールされている pytorch の最終バージョンは1.8.1、torchvision のバージョンは0.9.1、および python のバージョンは3.7.10です。他の依存ライブラリは、requirements.txt ファイルに従ってインストールできます。

2. 独自のデータセットを準備する

YOLOv5 のトレーニング時に選択したデータ形式は VOC でした。そこで、以下では、独自のデータセットを YOLOv5 で直接使用できるデータセットに変換する方法を紹介します。

1. データセットを作成する

YOLOv5 フォルダー内のデータ ディレクトリの下に mydata フォルダーを作成します (名前はカスタマイズ可能)。ディレクトリ構造は次のとおりです。先ほどの labelImg でマークされた xml ファイルと画像を対応するディレクトリ mydata ...images # 画像を保存します...xml
#画像
を保存
対応する xml ファイル
...dataSet #train.txt、val.txt、test.txt、trainval.txt の 4 つのファイルが Main フォルダーに自動的に生成され、トレーニング セットの名前が格納されます。検証セット、およびテスト セットの画像 (拡張子 .jpg なし) は
次のとおりです。
mydata フォルダーの内容は次のとおりです。

  • 画像は VOC データセット形式の JPEGImages で、内容は次のとおりです。

  • xml フォルダーの下には .xml ファイルがあり (ラベル付けツールは labelImage を使用します)、内容は次のとおりです。 

  • トレーニング セット、検証セット、テスト セットの分割は、dataSet フォルダーの下に保存されます。スクリプト生成により、 split_train_val.pyファイルを作成できます。コードの内容は次のとおりです。
# coding:utf-8

import os
import random
import argparse

parser = argparse.ArgumentParser()
# xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='xml', type=str, help='input xml label path')
# 数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='dataSet', type=str, help='output txt label path')
opt = parser.parse_args()

trainval_percent = 1.0
train_percent = 0.9
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)
if not os.path.exists(txtsavepath):
    os.makedirs(txtsavepath)

num = len(total_xml)
list_index = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list_index, tv)
train = random.sample(trainval, tr)

file_trainval = open(txtsavepath + '/trainval.txt', 'w')
file_test = open(txtsavepath + '/test.txt', 'w')
file_train = open(txtsavepath + '/train.txt', 'w')
file_val = open(txtsavepath + '/val.txt', 'w')

for i in list_index:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        file_trainval.write(name)
        if i in train:
            file_train.write(name)
        else:
            file_val.write(name)
    else:
        file_test.write(name)

file_trainval.close()
file_train.close()
file_val.close()
file_test.close()
  •  コードを実行すると、次の 4 つの txt ドキュメントが dataSet フォルダーの下に生成されます。

  • 3 つの txt ファイルの内容は次のとおりです。 

 2. データ形式の変換

次に、ラベルを準備し、データセット形式を yolo_txt 形式に変換します。つまり、各 xml 注釈の bbox 情報を txt 形式に抽出します。各画像は txt ファイルに対応し、ファイルの各行にはターゲットに関する情報が含まれます。クラス、x_center、y_center、幅、高さの形式。形式は次のとおりです。

  •  voc_label.py ファイルを作成し、トレーニング セット、検証セット、テスト セットからラベル label (トレーニングで使用する)を生成し、データ セットのパスを txt ファイルにインポートします。コードの内容は次のとおりです。
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd

sets = ['train', 'val', 'test']
classes = ["a", "b"]   # 改成自己的类别
abs_path = os.getcwd()
print(abs_path)

def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return x, y, w, h

def convert_annotation(image_id):
    in_file = open('data/mydata/xml/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('data/mydata/labels/%s.txt' % (image_id), 'w')
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)
    for obj in root.iter('object'):
        # difficult = obj.find('difficult').text
        difficult = obj.find('Difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
             float(xmlbox.find('ymax').text))
        b1, b2, b3, b4 = b
        # 标注越界修正
        if b2 > w:
            b2 = w
        if b4 > h:
            b4 = h
        b = (b1, b2, b3, b4)
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

wd = getcwd()
for image_set in sets:
    if not os.path.exists('data/mydata/labels/'):
        os.makedirs('data/mydata/labels/')
    image_ids = open('data/mydata/dataSet/%s.txt' % (image_set)).read().strip().split()
    list_file = open('paper_data/%s.txt' % (image_set), 'w')
    for image_id in image_ids:
        list_file.write(abs_path + '/mydata/images/%s.jpg\n' % (image_id))
        convert_annotation(image_id)
    list_file.close()

 3. 設定ファイル

1) データセットの構成
yolov5 ディレクトリの data フォルダーに新しい mydata.yaml ファイルを作成し (名前はカスタマイズ可能)、トレーニング セットの分割ファイル (train.txt と val.txt) を格納します。検証セット。voc_label.py コードを実行して 2 つのファイルが生成され、ターゲットのカテゴリの数と特定のカテゴリのリストが生成されます。mydata.yaml の内容は次のとおりです。

2) 必要なモデルを選択します。yolov5
ディレクトリの下のモデル フォルダーがモデルの構成ファイルです。s、m、l、x のバージョンがここで提供され、徐々に増加します (アーキテクチャが増加するにつれて、トレーニング時間が長くなります)増加)、yolov5x.yaml が使用されていると仮定すると、変更する必要があるパラメーターは 1 つだけで、nc は独自のカテゴリーの数に変更され、次のように四捨五入する必要があります (オプション)。

 ここまででカスタム データセットが作成されました。次のステップはモデルをトレーニングすることです。

 3. モデルのトレーニング

1. 事前トレーニング済みモデルをダウンロードする

YOLOv5 の GitHub オープン ソース Web サイトからモデルの対応するバージョンをダウンロードします。

2. トレーニング

トレーニングを正式に開始する前に、train.py に次の変更を加える必要があります。

上記のパラメータは次のように説明されます:
エポック: トレーニング プロセス中にデータ セット全体が反復される回数を指します。グラフィック カードが動作していない場合は、値を小さく調整できます。
バッチサイズ: 重みが更新される前に一度に表示される画像の数。勾配降下法を使用したミニバッチ。グラフィックス カードが良好でない場合は、より小さく調整できます。
cfg: モデル構造を保存するための設定ファイル データ
: トレーニングおよびテスト データを保存するためのファイル
img-size: 入力画像の幅と高さ。グラフィック カードが十分でない場合は、より小さく調整できます。

次に、次のようにトレーニング コマンドを実行します。

python train.py --img 640 --batch 32 --epoch 300 --data data/mydata.yaml --cfg models/yolov5x.yaml --weights weights/yolov5x.pt --device '0,1' 

4. モデルのテスト

モデルの品質を評価することは、ラベル付けされたテスト セットまたは検証セットに対するモデルの効果を評価することであり、ターゲット検出で最も一般的に使用される評価指標は mAP です。次のように、test.py ファイルでデータセット構成ファイルとトレーニング結果モデルを指定します。

次のコマンドを使用してモデルをテストします。

python test.py  --data data/mydata.yaml --weights runs/exp1/weights/best.pt --augment

 モデルテストの結果は次のとおりです。

 5. モデル推論

最後に、モデルはラベルのないデータ セットに対して推論を実行し、detect.py ファイルでテスト イメージとテスト モデルのパスを指定します。その他のパラメーター (img_size、信頼オブジェクトの信頼しきい値、NMS の IOU しきい値) は自分で変更できます。 、 次のように:

次のコマンドを使用します。ここで、重みは最も満足のいくトレーニング モデルを使用でき、ソースはすべてのテスト画像を含むフォルダー パスを提供できます。

 python detect.py --weights runs/exp1/weights/best.pt --source inference/images/ --device 0,1

テストが完了すると、各テスト イメージは、次のように、指定された推論/出力の出力フォルダーに結果イメージ ファイルを生成します。

私がトレーニングしたデータセットはマスクデータセットであり、検出後の効果は次の図に示されています。

おすすめ

転載: blog.csdn.net/qq_40716944/article/details/118188085