nx上darknet的使用-目標檢測-自定義訓練與制作預訓練模型

目錄

1??訓練yolov4-tiny

1.1??文件準備

1.1.1??Annotations

1.1.2??JPEGImages

1.1.3??labels

1.1.4??trained_models

1.1.5??classes.name

1.1.6??create_labels_txt.py

1.1.7??custom_training.data

1.1.8??get_labels.py

1.1.9??get_train_val.py

1.1.10??train.txt

1.1.11??val.txt

1.1.12??yolov4-tiny.cfg

1.1.13??yolov4-tiny.conv.29

1.1.14??yolov4-tiny-test.cfg

1.2??訓練過程

1.3??訓練結果

2??制作預訓練模型


1??訓練yolov4-tiny

首先在darknet創建一個文件夾custom_training

文件夾中包含這些文件

我們從左往右來講,在文章的最后有識別效果,如果想先看效果的可以拉下去,看完再拉上來

1.1??文件準備

1.1.1??Annotations

獲取方式:標注軟件標注圖像后獲得

這里面放的都是標注好的xml文件,使用不同的標注軟件標注結果可能略有不同,但xml的文件格式都是一樣的,我們打開一個看一下

下面這個xml是一個圖中只有一個框子的

下面這個是一個圖中有多個框子的

1.1.2??JPEGImages

獲取方式:把標注的圖像放進去

這里面放的都是被標注的圖片,注意要與標注文件對應(比如0.jpg與0.xml)

1.1.3??labels

獲取方式:由create_labels_txt.py轉換xml文件獲得

這個文件夾中都是放的xml轉換過來的項目專用的txt文件(我們后面有一個文件專門轉換它),由于是轉換過來的,所以自然也是與圖像一一對應的

我們打開一個看一下

下面這個是一個框的情況,發現里面有5個數,這5個數的含義依次是

  1. 標簽號,從0開始
  2. 標注框的中心點x坐標 除 圖像寬度 的比值
  3. 標注框的中心點y坐標 除 圖像高度 的比值
  4. 標注框的寬度 除 圖像寬度 的比值
  5. 標注框的高度 除 圖像高度 的比值

我們下面再看一個多個框的情況

有幾個框就有幾行,最后不要有換行符

1.1.4??trained_models

創建一個空的文件夾就行了,這個文件夾是專門放訓練好的模型文件的,沒訓練之前文件夾中是空的

在訓練之后每1000個batch會自動保存一次,我訓練了4000個batch,現在里面是這樣的

后面要用的話用 yolov4-tiny_final.weights就可以了

1.1.5??classes.name

獲取方式:用記事本寫一個文件,后綴為.name就可以了

這里面寫的是所有標注的標簽,有幾個就寫幾個,標簽用換行符隔開,最后一行末尾沒有換行符

我再舉個例子

這里的順序要與后續create_labels_txt.py的順序一致

如果你不知道有多少標簽,后面可以通過get_labels.py來查詢

1.1.6??create_labels_txt.py

獲取方式:一個py文件

文件中的內容是這樣的

import xml.etree.ElementTree as ET
import os
import rewith open('classes.names','r') as f:classes = f.read().splitlines()p = re.compile(r'(.*)\.')
for i in os.listdir('Annotations'):i = p.findall(i)[0]xml_file = '/home/nvidia/darknet/custom_training/Annotations/{}.xml'.format(i)tree = ET.parse(xml_file)root = tree.getroot()for size in root.iter('size'):width = int(size.find('width').text)height = int(size.find('height').text)all_content = ''for obj in root.iter('object'):cls = obj.find('name').textcls_id = classes.index(cls)xmlbox = obj.find('bndbox')xmin = int(xmlbox.find('xmin').text)ymin = int(xmlbox.find('ymin').text)xmax = int(xmlbox.find('xmax').text)ymax = int(xmlbox.find('ymax').text)x = (xmin+xmax)/2/widthy = (ymin+ymax)/2/heightw = (xmax-xmin)/widthh = (ymax-ymin)/heightone_content = '{} {:.4f} {:.4f} {:.4f} {:.4f}'.format(cls_id,x,y,w,h)all_content = all_content + one_content + '\n'all_content = all_content.strip('\n')file = open('./labels/{}.txt'.format(i),'w')print(all_content,file=file,flush=True)

有幾個參數需要隨著數據集變動

  • classes 這個是訓練的標簽,需要與classes.name的內容一致,注意順序也要一致
  • xml_file 放的是Annotations中xml的文件,我這里放的絕對路徑,也可以放相對路徑
  • xmin,ymin,ymin,ymax 我不確定所有的標注文件是否都是這四個點(有的可能是直接給寬度),如果你的xml文件中寫的是別的,那么你就對應改一下

  • cls_id 這個是labels中產生txt的第一個內容
  • x,y,w,h 這四個就是labels中產生的txt的后四個內容

如果按照我寫的結構放置文件的話,直接運行就可以了

1.1.7??custom_training.data

獲取方式:用記事本寫,后綴改為data,最后一行末尾沒有換行符

這里的信息的含義如下,注意所有路徑都是絕對路徑

字段含義
classes類別總數
traintrain.txt的絕對路徑,train.txt我們后面會提到
validval.txt的絕對路徑,val.txt我們后面會提到
namesclasses.name的絕對路徑
backuptrained_models的絕對路徑,注意后面要再加一個斜杠

1.1.8??get_labels.py

原理是用python的set()變量,set()變量中的元素不重復,訪問xml中的name,將所有的內容添加的set中

1.1.9??get_train_val.py

這個是用來輔助創建train.txt與val.txt的

import osa = 0
train_txt = open('train.txt','w')
val_txt = open('val.txt','w')
for i in os.listdir('JPEGImages'):a = a + 1if a < 15712: #trainprint('/home/nvidia/darknet/custom_training/JPEGImages/' + i,file=train_txt,flush=True)else: #testprint('/home/nvidia/darknet/custom_training/JPEGImages/' + i,file=val_txt,flush=True)

6065是我當前有7581張圖片,我想選擇其中的80%(6065張)作為訓練圖片,其余的作為測試圖片

1.1.10??train.txt

獲取方式:筆記本搞

這里放的是訓練圖像的絕對路徑

1.1.11??val.txt

獲取方式:筆記本搞

這里放的是所有測試圖像的絕對路徑,方法與train.txt相同,讓其余圖像作為測試圖像

1.1.12??yolov4-tiny.cfg

獲取方式:在darkent的cfg中有,復制過來

yolov4-tiny.cfg與其余的yolo模型修改起來差不多,我比較常用yolov4-tiny.cfg與yolov4-custom.cfg,這兩個cfg文件在這個文件夾中都有,tiny速度快但精度差,custom精度高但速度慢,下面說幾個經常改的參數

  • batch與subdivisions

訓練模型時可能會出現CUDA爆掉的情況,這個時候我們需要修改batch與subdivisions,batch是會影響訓練結果的,太小是不行的,subdivisions的意思是把batch分成多少份,我下面這種圖就是batch為64,然后把batch再分成64份一點一點兒給,這樣就不會出現CUDA爆掉的問題了

  • width與height

這個并不是圖像的寬與高,這個實際上是模型的輸入大小,寬和高必須為32的倍數

你的模型寬高越大,訓練時間越長,模型越精準,預測的更慢

你的模型寬高越小,訓練時間越短,模型越不精準,預測的更快

  • learning_rate

learning_reate是學習速率,我們在訓練的過程中可能會出現loss為NaN的情況,這個時候就不用再訓練了,這個情況叫梯度爆炸或梯度消失,這個時候可以嘗試改一下學習率

  • max_batches與steps

在幫助文檔中建議 max_batches的值設置為(種類數)*2000

step有兩個值,第一個值是max_batches的80%,第二個值是max_batches的90%

  • classes與filters

classes是訓練的類別數量,比如你要識別5種不同的東西classes就給5,識別7種類別不同的東西就給7

filters計算公式為(種類數+5)*3,我下面圖片種類數為2,所以這里的filters是21

在yolov4-custom.cfg中一共有三處,在yolv4-tiny.cfg有兩處,都要改

1.1.13??yolov4-tiny.conv.29

獲取方式:從我上面的網盤鏈接中搞,或者用這個github鏈接?https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.conv.29

這個鏈接是在項目?GitHub - AlexeyAB/darknet: YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet )?中的這里

1.1.14??yolov4-tiny-test.cfg

獲取方式:把yolov4-tiny.cfg復制過來,然后改一些東西

只改batch,把下面的batch注釋掉

這個其實你改不改都行,在測試的時候直接使用yolv4-tiny.cfg進行使用就行

1.2??訓練過程

在darkent路徑下打開終端,之后輸入

./darknet detector train custom_training/custom_training.data custom_training/yolov4-tiny.cfg custom_training/yolov4-tiny.conv.29

輸入之后終端的情況是這樣的

而且會出現一個圖,這里會記錄我們每一個batch的loss情況

訓練接觸后會顯示模型已保存,我大致訓練了兩個小時左右

我的loss情況是這樣的

最終loss是0.1498左右

1.3??訓練結果

在darknet下打開終端后輸入

./darknet detector test custom_training/custom_training.data custom_training/yolov4-tiny-test.cfg custom_training/trained_models/yolov4-tiny_final.weights custom_training/JPEGImages/000001.jpg

最后的圖片路徑你可以自定義,輸入之后終端是這樣的

之后會出現一個小圖像

把它放大后的效果是這樣的

2??制作預訓練模型

我們先說層這個概念,在訓練的開始你可以看到你選用的模型一共有多少層。

你可以將訓練好的模型作為預訓練模型,比如

./darknet partial ./custom_training/yolov3-tiny.cfg ./custom_training/yolov3-tiny_final.weights ./yolov3-tiny.conv.15 15
  • ./darknet partial[訓練模型用到的cfg位置] [訓練好的模型文件位置] [要生成的預訓練模型文件位置] [保留網絡層數權重]

之后就在執行代碼的位置就會得到 yolov3-tiny.conv.15 這個預訓練模型文件?

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

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

相關文章

python制作甘特圖的基本知識(附Demo)

目錄 前言1. matplotlib2. plotly 前言 甘特圖是一種常見的項目管理工具&#xff0c;用于表示項目任務的時間進度 直觀地看到項目的各個任務在時間上的分布和進度 常用的繪制甘特圖的工具是 matplotlib 和 plotly 主要以Demo的形式展示 1. matplotlib 功能強大的繪圖庫&a…

內網對抗-基石框架篇單域架構域內應用控制成員組成用戶策略信息收集環境搭建

知識點&#xff1a; 1、基石框架篇-單域架構-權限控制-用戶和網絡 2、基石框架篇-單域架構-環境搭建-準備和加入 3、基石框架篇-單域架構-信息收集-手工和工具1、工作組(局域網) 將不同的計算機按照功能分別列入不同的工作組。想要訪問某個部門的資源&#xff0c;只要在“網絡…

Electron運行報錯:Error Cannot find module ‘node_moduleselectroncli.js‘

Electron運行報錯&#xff1a;Error: Cannot find module ‘node_modules\electron\cli.js’ 顧名思義&#xff0c;命令行執行Electron .時候&#xff0c;會優先從項目目錄查找對應依賴&#xff0c;如果是報錯顯示是找不到項目目錄下的依賴&#xff0c;我們可以從安裝在全局的…

DAMA學習筆記(五)-數據存儲和操作

1.引言 數據存儲與操作包括對存儲數據的設計、實施和支持&#xff0c;最大化實現數據資源的價值&#xff0c;貫穿于數據創建/獲取到處置的整個生命周期。 數據存儲與操作包含兩個子活動&#xff08;圖6-1&#xff09;。 圖6-1 語境關系圖&#xff1a;數據存儲與操作 (1) 數據庫…

記錄vite項目中Cornerstone的兼容問題(持續更新)

&#x1f50e; 在vite項目中打包提示錯誤 ESM integration proposal for Wasm" is not supported currently. ?? 問題描述 Error: Could not load /home/xxx/xxx/node_modules/icr/polyseg-wasm/dist/ICRPolySeg.wasm (imported by node_modules/icr/polyseg-wasm/di…

js ES6 part3

Number 是內置構造函數&#xff0c;用來創建數值 const price 12.345console.log(price.toFixed(2))//保留兩位小數 12.35 綜合案例購物車 <body><div class"list"><!-- <div class"item"><img src"https://yanxuan-item…

【代碼隨想錄】【算法訓練營】【第66天】 [卡碼95]城市間貨物運輸II [卡碼96]城市間貨物運輸III

前言 思路及算法思維&#xff0c;指路 代碼隨想錄。 題目來自 卡碼網。 day 66&#xff0c;周五&#xff0c;ding ding~ [卡碼95] 城市間貨物運輸II 題目描述 卡碼95 城市間貨物運輸II 解題思路 前提&#xff1a; 思路&#xff1a; 重點&#xff1a; 代碼實現 C語言 …

數據結構(Java):隊列Queue集合力扣面試OJ題

1、隊列 1.1 隊列的概念 隊列是一個特殊的線性表&#xff0c;只允許在一端&#xff08;隊尾&#xff09;進行插入數據操作&#xff0c;在另一端&#xff08;對頭&#xff09;進行刪除數據。隊列具有先進先出FIFO(First In First Out)的特性。 入隊&#xff1a;數據只能從隊尾…

有獎競猜!斗牛士軍團與法蘭西騎士的終極之戰,誰將笑傲歐洲之巔?

痛快看球&#xff0c;暢玩游戲&#xff0c;AGON愛攻帶你進入酣暢淋漓的足球世界&#xff01; 7月15日&#xff0c;綠茵賽場硝煙再起&#xff0c;兩支身披榮光的王者之師&#xff0c;一路過關斬將&#xff0c;最終會師決賽。一場萬眾矚目的巔峰對決即將拉開帷幕&#xff0c;究竟…

linux UDP通訊:接口函數示例

一、主要用的接口&#xff1a; //服務器端 1. socket() 創建套接字 2. bind() 綁定套接字 與TCP區別開來&#xff0c;沒有listen()、accept()建立連接的過程 3. 通信 recvfrom() sendto() 4. close //客戶端 1. socket() 創建套接字 與TCP區別開來&#xff0c;沒有connect()建立…

數據結構——排序算法(冒泡、快速、選擇、插入)

文章目錄 1. 概念 2. 十大排序算法 3. 冒泡排序 4. 冒泡代碼實現 5. 快速排序 6. 快速代碼實現 7. 選擇排序 8. 選擇代碼實現 9. 插入排序 10. 插入代碼實現 1. 概念 排序&#xff08;Sort&#xff09;是將無序的記錄序列&#xff08;或稱文件&#xff09;調整成有序…

LabVIEW前面板占滿整個屏幕(轉)

希望在運行一個LabVIEW程序時&#xff0c;它的前面板能夠占據整個屏幕&#xff0c;且不顯示Windows的任務欄或其他任何的LabVIEW菜單選項。怎樣才能實現這一功能&#xff1f; 您可以通過手動配置或編程的方式實現該功能。 手動配置VI屬性 您可以通過以下操作&#xff0c;將…

導入項目,JAVA文件是咖啡杯圖標

問題 從圖中可以看到&#xff0c;JAVA文件是咖啡杯圖標 原因 項目沒有識別為MAVEN項目 解決辦法 進入pom.xml文件&#xff0c;右鍵點擊Add as Maven Project即可

在Ubuntu 16.04上安裝和保護MongoDB的方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 簡介 MongoDB 是一個免費且開源的面向文檔的數據庫。它被歸類為 NoSQL 數據庫&#xff0c;因為它不依賴于傳統的基于表的關系型數據庫結…

Spring MVC入門3

看完這篇博客你能學到什么 理解JSON的使用理解注解PathVariable理解解注解RequestPart理解cookie和Session的基本概念理解cookie和Session的區別 如果想真正掌握&#xff0c;還需要自己勤加練習。 正文 JSON JSON概念 JSON&#xff1a;JavaScript Object Notation 【JavaS…

【YOLOv8】 用YOLOv8實現數字式工業儀表智能讀數(一)

上一篇圓形表盤指針式儀表的項目受到很多人的關注&#xff0c;咱們一鼓作氣&#xff0c;把數字式工業儀表的智能讀數也研究一下。本篇主要講如何用YOLOV8實現數字式工業儀表的自動讀數&#xff0c;并將讀數結果進行輸出&#xff0c;若需要完整數據集和源代碼可以私信。 目錄 &…

gin源碼分析

一、高性能 使用sync.pool解決頻繁創建的context對象&#xff0c;在百萬并發的場景下能大大提供訪問性能和減少GC // ServeHTTP conforms to the http.Handler interface. // 每次的http請求都會從sync.pool中獲取context&#xff0c;用完之后歸還到pool中 func (engine *Engin…

在C++中怎樣使用C庫

在C中使用C庫是一個相對直接的過程&#xff0c;因為C是從C發展而來的&#xff0c;并且與C高度兼容。這意味著你可以直接在C代碼中使用C庫函數、頭文件和變量&#xff0c;而無需進行特殊轉換。以下是一些基本的步驟和注意事項&#xff0c;用于在C中使用C庫&#xff1a; 1. 包含…

c語言位操作符相關題目之交換兩個數的值

文章目錄 一、題目二、方法11&#xff0c;思路2&#xff0c;代碼實現 三、方法21&#xff0c;思路2&#xff0c;代碼實現 四、方法31&#xff0c;思路2&#xff0c;代碼實現 總結 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 一、題目 實現兩個變量的…

淺談PostCSS

1. 背景 css的預處理器語言&#xff08;比如 sass&#xff0c; less&#xff0c; stylus&#xff09;的擴展性不好&#xff0c;你可以使用它們已有的功能&#xff0c;但如果想做擴展就沒那么容易。 sass是很常用的css預處理器語言&#xff0c;在webpack中要使用它&#xff0c;…