yolov5使用手冊


1. 根目錄下建立makeTxt,並運行

import os
import random

trainval_percent = 0.9
train_percent = 0.9
xmlfilepath = 'data/Annotations'
txtsavepath = 'data/ImageSets'
total_xml = os.listdir(xmlfilepath)

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

ftrainval = open('data/ImageSets/trainval.txt', 'w')
ftest = open('data/ImageSets/test.txt', 'w')
ftrain = open('data/ImageSets/train.txt', 'w')
fval = open('data/ImageSets/val.txt', 'w')

for i in list:
name = total_xml[i][:-4] + '\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()


2.根目錄下新建voc_label並運行
# xml解析包
import xml.etree.ElementTree as ET
import pickle
import os
# os.listdir() 方法用於返回指定的文件夾包含的文件或文件夾的名字的列表
from os import listdir, getcwd
from os.path import join

sets = ['train', 'test', 'val']
classes = ["person", "manFace", "sign", "sheep", "deer", "cattle", "horse", "sunGod", "tiger"]


# 進行歸一化操作
def convert(size, box): # size:(原圖w,原圖h) , box:(xmin,xmax,ymin,ymax)
dw = 1. / size[0] # 1/w
dh = 1. / size[1] # 1/h
x = (box[0] + box[1]) / 2.0 # 物體在圖中的中心點x坐標
y = (box[2] + box[3]) / 2.0 # 物體在圖中的中心點y坐標
w = box[1] - box[0] # 物體實際像素寬度
h = box[3] - box[2] # 物體實際像素高度
x = x * dw # 物體中心點x的坐標比(相當於 x/原圖w)
w = w * dw # 物體寬度的寬度比(相當於 w/原圖w)
y = y * dh # 物體中心點y的坐標比(相當於 y/原圖h)
h = h * dh # 物體寬度的寬度比(相當於 h/原圖h)
return (x, y, w, h) # 返回 相對於原圖的物體中心點的x坐標比,y坐標比,寬度比,高度比,取值范圍[0-1]


# year ='2012', 對應圖片的id(文件名)
def convert_annotation(image_id):
'''
將對應文件名的xml文件轉化為label文件,xml文件包含了對應的bunding框以及圖片長款大小等信息,
通過對其解析,然后進行歸一化最終讀到label文件中去,也就是說
一張圖片文件對應一個xml文件,然后通過解析和歸一化,能夠將對應的信息保存到唯一一個label文件中去
labal文件中的格式:calss x y w h  同時,一張圖片對應的類別有多個,所以對應的bunding的信息也有多個
'''
# 對應的通過year 找到相應的文件夾,並且打開相應image_id的xml文件,其對應bund文件
in_file = open('data/Annotations/%s.xml' % (image_id), encoding='utf-8')
# 准備在對應的image_id 中寫入對應的label,分別為
# <object-class> <x> <y> <width> <height>
out_file = open('data/labels/%s.txt' % (image_id), 'w', encoding='utf-8')
# 解析xml文件
tree = ET.parse(in_file)
# 獲得對應的鍵值對
root = tree.getroot()
# 獲得圖片的尺寸大小
size = root.find('size')
# 如果xml內的標記為空,增加判斷條件
if size != None:
# 獲得寬
w = int(size.find('width').text)
# 獲得高
h = int(size.find('height').text)
# 遍歷目標obj
for obj in root.iter('object'):
# 獲得difficult ??
# difficult = obj.find('difficult').text
# labelimage標記的difficult是大寫
difficult = obj.find('Difficult').text
# 獲得類別 =string 類型
cls = obj.find('name').text
# 如果類別不是對應在我們預定好的class文件中,或difficult==1則跳過
if cls not in classes or int(difficult) == 1:
continue
# 通過類別名稱找到id
cls_id = classes.index(cls)
# 找到bndbox 對象
xmlbox = obj.find('bndbox')
# 獲取對應的bndbox的數組 = ['xmin','xmax','ymin','ymax']
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
float(xmlbox.find('ymax').text))
print(image_id, cls, b)
# 帶入進行歸一化操作
# w = 寬, h = 高, b= bndbox的數組 = ['xmin','xmax','ymin','ymax']
bb = convert((w, h), b)
# bb 對應的是歸一化后的(x,y,w,h)
# 生成 calss x y w h 在label文件中
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')


# 返回當前工作目錄
wd = getcwd()
print(wd)

for image_set in sets:
'''
對所有的文件數據集進行遍歷
做了兩個工作:
    1.將所有圖片文件都遍歷一遍,並且將其所有的全路徑都寫在對應的txt文件中去,方便定位
    2.同時對所有的圖片文件進行解析和轉化,將其對應的bundingbox 以及類別的信息全部解析寫到label 文件中去
     最后再通過直接讀取文件,就能找到對應的label 信息
'''
# 先找labels文件夾如果不存在則創建
if not os.path.exists('data/labels/'):
os.makedirs('data/labels/')
# 讀取在ImageSets/Main 中的train、test..等文件的內容
# 包含對應的文件名稱
image_ids = open('data/ImageSets/%s.txt' % (image_set)).read().strip().split()
# 打開對應的2012_train.txt 文件對其進行寫入准備
list_file = open('data/%s.txt' % (image_set), 'w')
# 將對應的文件_id以及全路徑寫進去並換行
for image_id in image_ids:
list_file.write('data/images/%s.jpg\n' % (image_id))
# 調用 year = 年份 image_id = 對應的文件名_id
convert_annotation(image_id)
# 關閉文件
list_file.close()

# os.system(‘comand’) 會執行括號中的命令,如果命令成功執行,這條語句返回0,否則返回1
# os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt")
# os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")
3.修改配置文件

首先在data目錄下,復制一份coco.yaml文件並將其重命名為cat.yaml,放在data目錄下,並對cat.yaml中的參數進行配置。

其中train,val,test后面分別為訓練集和測試集圖片的路徑, nc為數據集的類別數,我這里只分了兩類,names為類別的名稱。這幾個參數均按照自己的實際需求來修改
4.修改網絡配置文件yolov5s.yaml

接着在models目錄下的yolov5s.yaml文件進行修改,這里取決於你使用了哪個模型就去修改對於的文件,該項目中使用的是yolov5s模型

5.train.py中設置參數




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM