數(shù)據(jù)和源碼見文末
1.任務(wù)概述
? ? ? ? 數(shù)據(jù)集使用的是東北大學(xué)收集的一個鋼材缺陷檢測數(shù)據(jù)集,需要檢測出鋼材表面的6種劃痕。同時,數(shù)據(jù)集格式是VOC格式,需要進行轉(zhuǎn)化,上傳的源碼中的數(shù)據(jù)集是經(jīng)過轉(zhuǎn)換格式的版本。
2.數(shù)據(jù)與標簽配置方法
? ? ? ? 在數(shù)據(jù)集目錄下,train文件夾下有訓(xùn)練集數(shù)據(jù)及YOLO標簽,valid文件夾下是驗證集數(shù)據(jù)及YOLO標簽。data.yaml是數(shù)據(jù)的配置文件,需要在訓(xùn)練和測試時進行指定。
?train目錄
valid目錄
? ? ? ? data.yaml是數(shù)據(jù)的配置文件,里面指定了訓(xùn)練集和驗證集數(shù)據(jù)的目錄,這里是使用的相對路徑,如果容易報錯的話,可以改為絕對路徑。nc是類別數(shù),names是類別名稱。?
?3.標簽轉(zhuǎn)換腳本
? ? ? ? 原始標注文件格式是voc格式,但是YOLO并不支持這種格式的文件。因此需要使用一個腳本對標簽進行轉(zhuǎn)換。
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
import glob
classes = ["crazing", "inclusion", "patches", "pitted_surface", "rolled-in_scale", "scratches"]
def convert(size, box):
dw = 1./size[0]
dh = 1./size[1]
x = (box[0] + box[1])/2.0
y = (box[2] + box[3])/2.0
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_name):
in_file = open('./ANNOTATIONS/'+image_name[:-3]+'xml')
out_file = open('./LABELS/'+image_name[:-3]+'txt','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'):
cls = obj.find('name').text
if cls not in classes:
print(cls)
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))
bb = convert((w,h), b)
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
wd = getcwd()
if __name__ == '__main__':
for image_path in glob.glob("./IMAGES/*.jpg"):
image_name = image_path.split('\\')[-1]
#print(image_path)
convert_annotation(image_name)
?4.YOLOv5的項目參數(shù)配置
? ? ? ? 我們只選取重要的參數(shù)進行詳細的說明
????????--weights是指定預(yù)訓(xùn)練權(quán)重。
????????--cfg指定模型,我們可以根據(jù)自己的需要,指定不同計算量的模型。
?????????--hyp是超參數(shù)的配置文件,一般不需要進行修改
? ? ? ? 進行訓(xùn)練,最重要的參數(shù)還有--epochs(訓(xùn)練的輪次),--batch-size(批量大?。?,--cos-lr是否使用余弦調(diào)度。
其中,參數(shù)我們可以在Anaconda的命令行中指定,也可以在Pycharm進行配置
以下只是示例,參數(shù)需要根據(jù)自己的需要進行指定?
?參數(shù)的含義:
--weights:初始權(quán)重
--cfg:模型配置文件
--data:數(shù)據(jù)配置文件
--hyp:學(xué)習(xí)率等超參數(shù)文件
--epochs:迭代次數(shù)
-imgsz:圖像大小
--rect:長方形訓(xùn)練策略,不resize成正方形,使用灰條進行圖片填充,防止圖片失真
--resume:恢復(fù)最近的培訓(xùn),從last.pt開始
--nosave:只保存最后的檢查點
--noval:僅在最后一次epochs進行驗證
--noautoanchor:禁用AutoAnchor
--noplots:不保存打印文件
--evolve:為x個epochs進化超參數(shù)
--bucket:上傳操作,這個參數(shù)是 yolov5 作者將一些東西放在谷歌云盤,可以進行下載
--cache:在ram或硬盤中緩存數(shù)據(jù)
--image-weights:測試過程中,圖像的那些測試地方不太好,對這些不太好的地方加權(quán)重
--single-cls:單類別標簽置0
--device:gpu設(shè)置
--multi-scale:改變img大小+/-50%,能夠被32整除
--optimizer:學(xué)習(xí)率優(yōu)化器
--sync-bn:使用SyncBatchNorm,僅在DDP模式中支持,跨gpu時使用
--workers:最大 dataloader 的線程數(shù) (per RANK in DDP mode)
--project:保存文件的地址
--name:保存日志文件的名稱
--exist-ok:對項目名字是否進行覆蓋
--quad:在dataloader時采用什么樣的方式讀取我們的數(shù)據(jù),1280的大圖像可以指定
--cos-lr:余弦學(xué)習(xí)率調(diào)度
--label-smoothing:
--patience:經(jīng)過多少個epoch損失不再下降,就停止迭代
--freeze:遷移學(xué)習(xí),凍結(jié)訓(xùn)練
--save-period:每x個周期保存一個檢查點(如果<1,則禁用)
--seed:隨機種子
--local_rank:gpu編號
--entity:可視化訪問信息
--quad:
四元數(shù)據(jù)加載器是我們認為的一個實驗性功能,它可能允許在較低 --img 尺寸下進行更高 --img 尺寸訓(xùn)練的一些好處。
此四元整理功能會將批次從 16x3x640x640 重塑為 4x3x1280x1280,這不會產(chǎn)生太大影響 本身,因為它只是重新排列批次中的馬賽克,
但有趣的是允許批次中的某些圖像放大 2 倍(每個四邊形中的 4 個馬賽克中的一個放大 2 倍,其他 3 個馬賽克被刪除)
配置好環(huán)境指定參數(shù)就可以進行訓(xùn)練了。文章來源:http://www.zghlxwxcb.cn/news/detail-460798.html
數(shù)據(jù)和源碼鏈接:https://pan.baidu.com/s/1EaJT5Rganfy-Ph5S1gvyQg?pwd=uu48?
提取碼:uu48?文章來源地址http://www.zghlxwxcb.cn/news/detail-460798.html
到了這里,關(guān)于基于YOLOV5的鋼材缺陷檢測的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!