YOLOv5模型訓練流程

此文章只是記錄使用,以便后續查看,不作為教程,剛接觸,可能有錯誤

YOLOv5模型訓練流程

一、數據集的準備

1.在源碼根目錄新建mydata文件夾,在此文件夾下新建imageslabels文件夾

目錄樹如下:

├───mydata
│   ├───images
│   └───labels

2.在images下放需要標記的所有圖片,然后使用labelimg進行圖片標記

3.打開labelimg,點擊菜單欄View下的Auto Save Mode使得勾選,點擊左邊狀態欄的PascalVOC切換為YOLO,再點擊左邊狀態欄的Change Save Dir選擇路徑為上面mydata下的labels文件夾,開始標記圖片。標記完成后剪切出labels文件夾下的classes.txt到mydata目錄下

4.根目錄新建datasets/defect(隨機,但后面路徑要一致)文件夾,在此文件夾下新建imageslabels文件夾,還需新建的文件

夾目錄樹如下:

├───datasets
│   └───defect
│       ├───images
│       │   ├───test
│       │   ├───train
│       │   └───val
│       └───labels
│           ├───test
│           ├───train
│           └───val

5.在根目錄新建data.py

# 將圖片和標注數據按比例切分為 訓練集和測試集
import shutil
import random
import os# 原始路徑
image_original_path = "./mydata/images/"
label_original_path = "./mydata/labels/"cur_path = os.getcwd()# 訓練集路徑
train_image_path = os.path.join(cur_path, "datasets/defect/images/train/").replace(os.sep, "/")
train_label_path = os.path.join(cur_path, "datasets/defect/labels/train/").replace(os.sep, "/")# 驗證集路徑
val_image_path = os.path.join(cur_path, "datasets/defect/images/val/").replace(os.sep, "/")
val_label_path = os.path.join(cur_path, "datasets/defect/labels/val/").replace(os.sep, "/")# 測試集路徑
test_image_path = os.path.join(cur_path, "datasets/defect/images/test/").replace(os.sep, "/")
test_label_path = os.path.join(cur_path, "datasets/defect/labels/test/").replace(os.sep, "/")# 訓練集目錄
list_train = os.path.join(cur_path, "datasets/defect/train.txt").replace(os.sep, "/")
list_val = os.path.join(cur_path, "datasets/defect/val.txt").replace(os.sep, "/")
list_test = os.path.join(cur_path, "datasets/defect/test.txt").replace(os.sep, "/")train_percent = 0.6
val_percent = 0.2
test_percent = 0.2def del_file(path):for i in os.listdir(path):file_data = path + "\\" + ios.remove(file_data)def mkdir():if not os.path.exists(train_image_path):os.makedirs(train_image_path)else:del_file(train_image_path)if not os.path.exists(train_label_path):os.makedirs(train_label_path)else:del_file(train_label_path)if not os.path.exists(val_image_path):os.makedirs(val_image_path)else:del_file(val_image_path)if not os.path.exists(val_label_path):os.makedirs(val_label_path)else:del_file(val_label_path)if not os.path.exists(test_image_path):os.makedirs(test_image_path)else:del_file(test_image_path)if not os.path.exists(test_label_path):os.makedirs(test_label_path)else:del_file(test_label_path)def clearfile():if os.path.exists(list_train):os.remove(list_train)if os.path.exists(list_val):os.remove(list_val)if os.path.exists(list_test):os.remove(list_test)def main():mkdir()clearfile()file_train = open(list_train, 'w')file_val = open(list_val, 'w')file_test = open(list_test, 'w')total_txt = os.listdir(label_original_path)num_txt = len(total_txt)list_all_txt = range(num_txt)num_train = int(num_txt * train_percent)num_val = int(num_txt * val_percent)num_test = num_txt - num_train - num_valtrain = random.sample(list_all_txt, num_train)# train從list_all_txt取出num_train個元素# 所以list_all_txt列表只剩下了這些元素val_test = [i for i in list_all_txt if not i in train]# 再從val_test取出num_val個元素,val_test剩下的元素就是testval = random.sample(val_test, num_val)print("訓練集數目:{}, 驗證集數目:{}, 測試集數目:{}".format(len(train), len(val), len(val_test) - len(val)))for i in list_all_txt:name = total_txt[i][:-4]srcImage = image_original_path + name + '.png'srcLabel = label_original_path + name + ".txt"if i in train:dst_train_Image = train_image_path + name + '.png'dst_train_Label = train_label_path + name + '.txt'shutil.copyfile(srcImage, dst_train_Image)shutil.copyfile(srcLabel, dst_train_Label)file_train.write(dst_train_Image + '\n')elif i in val:dst_val_Image = val_image_path + name + '.png'dst_val_Label = val_label_path + name + '.txt'shutil.copyfile(srcImage, dst_val_Image)shutil.copyfile(srcLabel, dst_val_Label)file_val.write(dst_val_Image + '\n')else:dst_test_Image = test_image_path + name + '.png'dst_test_Label = test_label_path + name + '.txt'shutil.copyfile(srcImage, dst_test_Image)shutil.copyfile(srcLabel, dst_test_Label)file_test.write(dst_test_Image + '\n')file_train.close()file_val.close()file_test.close()if __name__ == "__main__":main()

執行代碼。
注意:根據圖片的后綴不同,修改代碼中.png,根據路徑不同修改路徑
至此,數據集準備完成。

二、配置訓練參數

1.在yolov5-master/data下新建my.yaml

# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
# COCO 2017 dataset http://cocodataset.org by Microsoft
# Example usage: python train.py --data coco.yaml
# parent
# ├── yolov5
# └── datasets
#     └── coco  ← downloads here (20.1 GB)# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: E:\1_Work\0802\yolov5-master\datasets\defect  # dataset root dir
train: images/train  # train images (relative to 'path') 118287 images
val: images/val  # val images (relative to 'path') 5000 images
test: images/test  # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794# Classes
nc: 3
names: ["piaochong", "qicao", "changchong"]

注意:修改對應的path,train,val,test路徑
nc為標記的類別數量
names為類別名稱,在之前的classes.txt中復制

2.在yolov5-master/models下復制yolov5s.yaml文件重命名為yolov5s_test.yaml,修改nc類別數量

# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license# Parameters
nc: 3  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
anchors:- [10,13, 16,30, 33,23]  # P3/8- [30,61, 62,45, 59,119]  # P4/16- [116,90, 156,198, 373,326]  # P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2[-1, 1, Conv, [128, 3, 2]],  # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]],  # 3-P3/8[-1, 6, C3, [256]],[-1, 1, Conv, [512, 3, 2]],  # 5-P4/16[-1, 9, C3, [512]],[-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32[-1, 3, C3, [1024]],[-1, 1, SPPF, [1024, 5]],  # 9]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]],  # cat backbone P4[-1, 3, C3, [512, False]],  # 13[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]],  # cat backbone P3[-1, 3, C3, [256, False]],  # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]],  # cat head P4[-1, 3, C3, [512, False]],  # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]],  # cat head P5[-1, 3, C3, [1024, False]],  # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

3.修改train.py:

修改項解釋
--weightsdefault=ROOT / ‘yolov5s.pt’預訓練權重,在官方Github下載
--cfgdefault=‘models/yolov5s_test.yaml’加載模型,之前復制修改的文件
--datadefault=ROOT / ‘data/my.yaml’配置文件
--epochsdefault=2訓練批次
--batch-sizedefault=2每批次的輸入數據量

修改完成之后運行即可開始訓練。

三、檢驗訓練的模型的推理效果

修改detect.py文件:

修改項解釋
--weightsdefault=ROOT / ‘best.pt’為訓練完成后在runs/train/exp/weights下的best.pt文件
--sourcedefault=ROOT / ‘datasets/defect/images/test’測試數據目錄

執行文件即可
結果在yolov5-master/runs/detect/exp下。
注意:如果生成的圖片沒有框,可以降低置信度排查錯誤,即detect.py文件中的–conf-thres,–iou-thres。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40207.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40207.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40207.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鏈表---

題目描述 一個學校里老師要將班上 N 個同學排成一列,同學被編號為 1~N,他采取如下的方法: 先將 11 號同學安排進隊列,這時隊列中只有他一個人; 2~N 號同學依次入列,編號為 i 的同學入列方式為&#xff…

2023骨傳導耳機推薦,適合運動骨傳導耳機推薦

相信很多人跟我一樣,隨著現在五花八門的耳機品種增多,選耳機的時候真是眼花繚亂,尤其還是網購,只能看,不能試,所以選擇起來比較困難, 作為一個運動達人,為了讓大家在購買耳機時少走彎…

〔012〕Stable Diffusion 之 中文提示詞自動翻譯插件 篇

? 目錄 🎈 翻譯插件🎈 下載谷歌翻譯🎈 谷歌翻譯使用方法🎈 谷歌翻譯使用效果 🎈 翻譯插件 在插件列表中搜索 Prompt Translator可以看到有2個插件選項:一個是基于谷歌翻譯 〔推薦〕、一個基于百度和deepl…

jvm從入門到精通

jvm 1.jvm與java體系結構???????

奧威BI財務數據分析方案:借BI之利,成就智能財務分析

隨著智能技術的發展,各行各業都走上借助智能技術高效運作道路,財務數據分析也不例外。借助BI商業智能技術能夠讓財務數據分析更高效、便捷、直觀立體,也更有助于發揮財務數據分析作為企業經營管理健康晴雨表的作用。隨著BI財務數據分析經驗的…

【RP2040】香瓜樹莓派RP2040之新建工程

本文最后修改時間:2022年09月05日 11:02 一、本節簡介 本節介紹如何新建一個自己的工程。 二、實驗平臺 1、硬件平臺 1)樹莓派pico開發板 ①樹莓派pico開發板*2 ②micro usb數據線*2 2)電腦 2、軟件平臺 1)VS CODE 三、版…

【C++】一文帶你初識C++繼承

食用指南:本文在有C基礎的情況下食用更佳 🍀本文前置知識: C類 ??今日夜電波:napori—Vaundy 1:21 ━━━━━━?💟──────── 3:23 …

CSS中的calc()函數有什么作用?

聚沙成塔每天進步一點點 ? 專欄簡介? CSS中的calc()函數及其作用? 作用? 示例1. 動態計算寬度:2. 響應式布局:3. 自適應字體大小:4. 計算間距: ? 寫在最后 ? 專欄簡介 前端入門之旅:探索Web開發的奇妙世界 記得點…

KCC@廣州開源讀書會廣州開源建設討論會

親愛的開源讀書會朋友們, 在下個周末我們將舉辦一場令人激動的線下讀書會,探討兩本引人入勝的新書《只是為了好玩》和《開源之迷》。作為一個致力于推廣開源精神和技術創新的社區,這次我們還邀請了圈內大咖前來參與,會給大家提供一…

軟件測試技術之單元測試—工程師 Style 的測試方法(3)

如何設計單元測試? 單元測試設計方法 單元測試用例,和普通測試用例的設計,沒有太多不同,常見的就是等價類劃分、邊界值分析等。而測試用例的設計其實也是開發者應該掌握的基本技能。 等價類劃分 把所有輸入劃分為若干分類&…

[UE4][C++]使用qrencode動態生成二維碼

一、使用CMake編譯x64版本qrencode 下載地址 GitHub - fukuchi/libqrencode: A fast and compact QR Code encoding libraryA fast and compact QR Code encoding library. Contribute to fukuchi/libqrencode development by creating an account on GitHub.https://github.…

2023/08/13_______JVM(CG)垃圾回收 算法(復制算法,標記清除,標記清除壓縮)

JVM GC算法 復制算法 1,每一次GC都會將伊甸(Eden)活的對象移到幸存區中:一旦Eden區被GC后 就會是空 只要有內容就是from區 誰空誰是to區 內存會從 伊甸->幸存區to->幸存from(這個時候to和from交換區域&#xf…

EXPLAIN使用分析

系列文章目錄 文章目錄 系列文章目錄一、type說明二、MySQL中使用Show Profile1.查看當前profiling配置2.在會話級別修改profiling配置3.查看profile記錄4.要深入查看某條查詢執行時間的分布 一、type說明 我們只需要注意一個最重要的type 的信息很明顯的提現是否用到索引&…

kafka線上問題優化

如何防止消息丟失 生產者: 使用同步發送把ack設成1或者all(非0,0可能會出現消息丟失的情況),并且設置同步的分區數>2 消費者:把自動提交改成手動提交 如何防止重復消費 在防止消息丟失的方案中&#…

leetcode 力扣刷題 數組交集(數組、set、map都可實現哈希表)

數組交集 349. 兩個數組的交集排序+雙指針數組實現哈希表unordered_setunordered_map 350. 兩個數組的交集Ⅱ排序 雙指針數組實現哈希表unordered_map 349. 兩個數組的交集 題目鏈接:349. 兩個數組的交集 題目內容如下,理解題意&#xff1a…

梯度爆炸和梯度消失的原因以及解決方法

文章目錄 1、原因:2、解決方法 1、原因: 梯度消失和梯度爆炸的根本原因是因為在反向傳播過程中,使用鏈式法則計算時,累積相乘效應導致梯度過大或者過小主要原因有: 1)激活函數:例如sigmoid或者…

聊聊火車的發展

目錄 1.火車的概念 2.火車的發展歷史 3.火車對戰爭的影響 4.火車對人們出行造成的影響 1.火車的概念 火車是一種由機械動力驅動的陸上交通工具,通常用來運輸人員和貨物。它由一列或多列的連接在一起的車廂組成,有軌道作為其行駛的基礎,并通…

重建與突破,探討全鏈游戲的現在與未來

全鏈游戲(On-Chain Game)是指將游戲內資產通過虛擬貨幣或 NFT 形式記錄上鏈的游戲類型。除此以外,游戲的狀態存儲、計算與執行等皆被部署在鏈上,目的是為用戶打造沉浸式、全方位的游戲體驗,超越傳統游戲玩家被動控制的…

mysql面試

基礎篇 通用語法及分類 DDL: 數據定義語言,用來定義數據庫對象(數據庫、表、字段)DML: 數據操作語言,用來對數據庫表中的數據進行增刪改DQL: 數據查詢語言,用來查詢數據庫中表的記錄DCL: 數據控制語言,用…

php正則替換文章的圖片

要使用正則表達式替換文章中的圖片鏈接,可以按照以下步驟進行操作: 1. 獲取文章內容:首先,你需要獲取包含圖片鏈接的文章內容。你可以從文件中讀取文章,或者從數據庫中檢索文章內容。 2. 使用正則表達式匹配圖片鏈接…