0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

YOLOv7訓(xùn)練自己的數(shù)據(jù)集包括哪些

新機(jī)器視覺 ? 來源:新機(jī)器視覺 ? 2023-05-29 15:18 ? 次閱讀

YOLOv7訓(xùn)練自己的數(shù)據(jù)集整個過程主要包括:環(huán)境安裝—制作數(shù)據(jù)集—模型訓(xùn)練—模型測試—模型推理

一、準(zhǔn)備深度學(xué)習(xí)環(huán)境

本人的筆記本電腦系統(tǒng)是:Windows10

首先下載YOLOv7的代碼,手動下載zip或是git clone 遠(yuǎn)程倉庫,本人下載的是YOLOv7的0.1版本代碼:

https://github.com/WongKinYiu/yolov7

代碼文件夾中會有requirements.txt文件,里面描述了所需要的安裝包。

本文最終安裝的pytorch版本是1.8.1,torchvision版本是0.9.1,python是3.7.10,其他的依賴庫按照requirements.txt文件安裝即可。

18c028f6-fc80-11ed-90ce-dac502259ad0.png

二、 準(zhǔn)備自己的數(shù)據(jù)集

本人標(biāo)注的數(shù)據(jù)格式是VOC,而YOLOv7能夠直接使用的是YOLO格式的數(shù)據(jù),因此下面將介紹如何將自己的數(shù)據(jù)集轉(zhuǎn)換成可以直接讓YOLOv7進(jìn)行使用。

1、創(chuàng)建數(shù)據(jù)集

在YOLOv7文件夾中的data目錄下創(chuàng)建mydata文件夾(名字可以自定義),目錄結(jié)構(gòu)如下,將之前l(fā)abelImg標(biāo)注好的xml文件和圖片放到對應(yīng)目錄下

mydata

…images # 存放圖片

…xml # 存放圖片對應(yīng)的xml文件

…dataSet #之后會在Main文件夾內(nèi)自動生成train.txt,val.txt,test.txt和trainval.txt四個文件,存放訓(xùn)練集、驗證集、測試集圖片的名字(無后綴.jpg)

示例如下:

mydata文件夾下內(nèi)容如下:

18ddbd4e-fc80-11ed-90ce-dac502259ad0.png

image為VOC數(shù)據(jù)集格式中的JPEGImages,內(nèi)容如下:

18ea5c98-fc80-11ed-90ce-dac502259ad0.png

xml文件夾下面為.xml文件(標(biāo)注工具采用labelImage),內(nèi)容如下:

18fe56b2-fc80-11ed-90ce-dac502259ad0.png

dataSet 文件夾下面存放訓(xùn)練集、驗證集、測試集的劃分,通過腳本生成,可以創(chuàng)建一個split_train_val.py文件,代碼內(nèi)容如下:

# coding:utf-8
 
import os
import random
import argparse
 
parser = argparse.ArgumentParser()
# xml文件的地址,根據(jù)自己的數(shù)據(jù)進(jìn)行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='xml', type=str, help='input xml label path')
# 數(shù)據(jù)集的劃分,地址選擇自己數(shù)據(jù)下的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] + '
'
  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()

運行代碼后,在dataSet 文件夾下生成下面四個txt文檔:

191167fc-fc80-11ed-90ce-dac502259ad0.png

三個txt文件里面的內(nèi)容如下:

191c40aa-fc80-11ed-90ce-dac502259ad0.png

2、轉(zhuǎn)換數(shù)據(jù)格式

接下來準(zhǔn)備labels,把數(shù)據(jù)集格式轉(zhuǎn)換成yolo_txt格式,即將每個xml標(biāo)注提取bbox信息為txt格式,每個圖像對應(yīng)一個txt文件,文件每一行為一個目標(biāo)的信息,包括class, x_center, y_center, width, height格式。格式如下:

1939fd84-fc80-11ed-90ce-dac502259ad0.png

創(chuàng)建voc_label.py文件,將訓(xùn)練集、驗證集、測試集生成label標(biāo)簽(訓(xùn)練中要用到),同時將數(shù)據(jù)集路徑導(dǎo)入txt文件中,代碼內(nèi)容如下:

# -*- 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
    # 標(biāo)注越界修正
    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]) + '
')
 
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('mydata/%s.txt' % (image_set), 'w')
  for image_id in image_ids:
    list_file.write(abs_path + '/mydata/images/%s.jpg
' % (image_id))
    convert_annotation(image_id)
  list_file.close()

3、配置文件

1)數(shù)據(jù)集的配置

在YOLOv7目錄下的data文件夾下新建一個mydata.yaml文件(可以自定義命名),用來存放訓(xùn)練集和驗證集的劃分文件(train.txt和val.txt)

這兩個文件是通過運行voc_label.py代碼生成的,然后是目標(biāo)的類別數(shù)目和具體類別列表,mydata.yaml內(nèi)容如下:

1948e498-fc80-11ed-90ce-dac502259ad0.png

2) 選擇一個你需要的模型

在YOLOv7目錄下的cfg/deploy文件夾下是模型的配置文件,這邊提供yolov7、yolov7-d6、yolov7-e6、yolov7-e6e、yolov7x等多個版本,假設(shè)采用yolov7x.yaml,只用修改一個參數(shù),把nc改成自己的類別數(shù),需要取整(可選) 如下:

1953b396-fc80-11ed-90ce-dac502259ad0.png

至此,自定義數(shù)據(jù)集已創(chuàng)建完畢,接下來就是訓(xùn)練模型了。

三、模型訓(xùn)練

1、下載預(yù)訓(xùn)練模型

在YOLOv7的GitHub開源網(wǎng)址上下載對應(yīng)版本的模型

19653850-fc80-11ed-90ce-dac502259ad0.png

2、訓(xùn)練

在正式開始訓(xùn)練之前,需要對train.py進(jìn)行以下修改:

197b27b4-fc80-11ed-90ce-dac502259ad0.png

以上參數(shù)解釋如下:

epochs:指的就是訓(xùn)練過程中整個數(shù)據(jù)集將被迭代多少次,顯卡不行你就調(diào)小點。

batch-size:一次看完多少張圖片才進(jìn)行權(quán)重更新,梯度下降的mini-batch,顯卡不行你就調(diào)小點。

cfg:存儲模型結(jié)構(gòu)的配置文件

data:存儲訓(xùn)練、測試數(shù)據(jù)的文件

img-size:輸入圖片寬高,顯卡不行你就調(diào)小點。

之后運行訓(xùn)練命令如下:

python train.py --img 640 --batch 32 --epoch 300 --data data/mydata.yaml --cfg cfg/deploy/yolov7x.yaml --weights weights/yolov7x.pt --device '0' 

四、模型測試

評估模型好壞就是在有標(biāo)注的測試集或者驗證集上進(jìn)行模型效果的評估,在目標(biāo)檢測中最常使用的評估指標(biāo)為mAP。在test.py文件中指定數(shù)據(jù)集配置文件和訓(xùn)練結(jié)果模型,如下:

19880d8a-fc80-11ed-90ce-dac502259ad0.png

通過下面的命令進(jìn)行模型測試:

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

模型測試效果如下:

19b9c71c-fc80-11ed-90ce-dac502259ad0.png

五、模型推理

最后,模型在沒有標(biāo)注的數(shù)據(jù)集上進(jìn)行推理,在detect.py文件中指定測試圖片和測試模型的路徑

其他參數(shù)(img_size、置信度object confidence threshold、IOU threshold for NMS)可自行修改,如下:

19cbc908-fc80-11ed-90ce-dac502259ad0.png

使用下面的命令,其中,weights使用最滿意的訓(xùn)練模型即可,source則提供一個包含所有測試圖片的文件夾路徑即可。

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

測試完畢后,每個測試圖片會在指定的inference/output輸出文件夾中生成結(jié)果圖片文件,如下:

19d8608c-fc80-11ed-90ce-dac502259ad0.png

審核編輯:彭靜

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3112

    瀏覽量

    48660
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4722

    瀏覽量

    68234
  • 數(shù)據(jù)集
    +關(guān)注

    關(guān)注

    4

    文章

    1200

    瀏覽量

    24619

原文標(biāo)題:YOLOv7訓(xùn)練自己的數(shù)據(jù)集(超詳細(xì))

文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    YOLOV7網(wǎng)絡(luò)架構(gòu)解讀

    繼美團(tuán)發(fā)布YOLOV6之后,YOLO系列原作者也發(fā)布了YOLOV7。
    的頭像 發(fā)表于 11-29 10:00 ?1740次閱讀
    <b class='flag-5'>YOLOV7</b>網(wǎng)絡(luò)架構(gòu)解讀

    maixcam部署yolov5s 自定義模型

    部分不一樣。 獲得自定義訓(xùn)練得到的yolov5s onnx模型 準(zhǔn)備自定義數(shù)據(jù)(博主用的是VOC數(shù)據(jù)
    發(fā)表于 04-23 15:43

    CV之YOLOv3:深度學(xué)習(xí)之計算機(jī)視覺神經(jīng)網(wǎng)絡(luò)Yolov3-5clessses訓(xùn)練自己數(shù)據(jù)全程記錄

    CV之YOLOv3:深度學(xué)習(xí)之計算機(jī)視覺神經(jīng)網(wǎng)絡(luò)Yolov3-5clessses訓(xùn)練自己數(shù)據(jù)
    發(fā)表于 12-24 11:51

    使用YOLOv3訓(xùn)練BDD100K數(shù)據(jù)之開始訓(xùn)練

    (三)使用YOLOv3訓(xùn)練BDD100K數(shù)據(jù)之開始訓(xùn)練
    發(fā)表于 05-12 13:38

    怎樣使用PyTorch Hub去加載YOLOv5模型

    在Python>=3.7.0環(huán)境中安裝requirements.txt,包括PyTorch>=1.7。模型和數(shù)據(jù)從最新的 YOLOv5版本自動下載。簡單示例此示例從
    發(fā)表于 07-22 16:02

    YOLOv6中的用Channel-wise Distillation進(jìn)行的量化感知訓(xùn)練

    預(yù)測任務(wù)很有價值?! ∽髡邔σ恍┟芗念A(yù)測任務(wù)進(jìn)行了實驗,包括語義分割和目標(biāo)檢測。實驗表明提出的方法大大優(yōu)于最先進(jìn)的蒸餾方法,并且在訓(xùn)練期間需要更少的計算成本。特別是,在COCO 數(shù)據(jù)
    發(fā)表于 10-09 16:25

    yolov7 onnx模型在NPU上太慢了怎么解決?

    ://github.com/WongKinYiu/yolov7/releases下載yolov7-tiny.pt ,并重命名yolov7tiny.pt2.將yolov7tiny.pt轉(zhuǎn)
    發(fā)表于 04-04 06:13

    無法使用MYRIAD在OpenVINO trade中運行YOLOv7自定義模型怎么解決?

    無法確定如何將 YOLOv7 模型的重量(.pt 文件)轉(zhuǎn)換為OpenVINO?中間表示 (IR) 并推斷有 MYRIAD 的 IR。 分辨率 轉(zhuǎn)換使用此 GitHub* 存儲庫
    發(fā)表于 08-15 08:29

    深度解析YOLOv7的網(wǎng)絡(luò)結(jié)構(gòu)

    最近,Scaled-YOLOv4的作者(也是后來的YOLOR的作者)和YOLOv4的作者AB大佬再次聯(lián)手推出了YOLOv7,目前來看,這一版的YOLOv7是一個比較正統(tǒng)的YOLO續(xù)作,
    的頭像 發(fā)表于 09-14 11:16 ?7462次閱讀

    一文徹底搞懂YOLOv8【網(wǎng)絡(luò)結(jié)構(gòu)+代碼+實操】

    從上面可以看出,YOLOv8 主要參考了最近提出的諸如 YOLOX、YOLOv6、YOLOv7 和 PPYOLOE 等算法的相關(guān)設(shè)計,本身的創(chuàng)新點不多,偏向工程實踐,主推的還是 ultralytics 這個框架本身。
    的頭像 發(fā)表于 06-15 17:15 ?1.2w次閱讀
    一文徹底搞懂<b class='flag-5'>YOLOv</b>8【網(wǎng)絡(luò)結(jié)構(gòu)+代碼+實操】

    yolov5和YOLOX正負(fù)樣本分配策略

    整體上在正負(fù)樣本分配中,yolov7的策略算是yolov5和YOLOX的結(jié)合。因此本文先從yolov5和YOLOX正負(fù)樣本分配策略分析入手,后引入到YOLOv7的解析中。
    發(fā)表于 08-14 11:45 ?2165次閱讀
    <b class='flag-5'>yolov</b>5和YOLOX正負(fù)樣本分配策略

    使用OpenVINO優(yōu)化并部署訓(xùn)練好的YOLOv7模型

    在《英特爾銳炫 顯卡+ oneAPI 和 OpenVINO 實現(xiàn)英特爾 視頻 AI 計算盒訓(xùn)推一體-上篇》一文中,我們詳細(xì)介紹基于英特爾 獨立顯卡搭建 YOLOv7 模型的訓(xùn)練環(huán)境,并完成了 YOLOv7 模型
    的頭像 發(fā)表于 08-25 11:08 ?1424次閱讀
    使用OpenVINO優(yōu)化并部署<b class='flag-5'>訓(xùn)練</b>好的<b class='flag-5'>YOLOv7</b>模型

    詳細(xì)解讀YOLOV7網(wǎng)絡(luò)架構(gòu)設(shè)計

    YOLOV7提出了輔助頭的一個訓(xùn)練方法,主要目的是通過增加訓(xùn)練成本,提升精度,同時不影響推理的時間,因為輔助頭只會出現(xiàn)在訓(xùn)練過程中。
    發(fā)表于 11-27 10:45 ?724次閱讀
    詳細(xì)解讀<b class='flag-5'>YOLOV7</b>網(wǎng)絡(luò)架構(gòu)設(shè)計

    PyTorch如何訓(xùn)練自己數(shù)據(jù)

    數(shù)據(jù)。本文將深入解讀如何使用PyTorch訓(xùn)練自己數(shù)據(jù),
    的頭像 發(fā)表于 07-02 14:09 ?1177次閱讀

    如何訓(xùn)練自己的AI大模型

    訓(xùn)練AI大模型之前,需要明確自己的具體需求,比如是進(jìn)行自然語言處理、圖像識別、推薦系統(tǒng)還是其他任務(wù)。 二、數(shù)據(jù)收集與預(yù)處理 數(shù)據(jù)收集 根據(jù)任務(wù)需求,收集并準(zhǔn)備好足夠的
    的頭像 發(fā)表于 10-23 15:07 ?373次閱讀