欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

darknet框架中YOLOv3對(duì)數(shù)據(jù)集進(jìn)行訓(xùn)練和預(yù)測(cè)詳解

 更新時(shí)間:2022年11月25日 16:47:16   作者:月照銀海似蛟龍  
這篇文章主要為大家介紹了darknet框架中YOLOv3對(duì)數(shù)據(jù)集進(jìn)行訓(xùn)練和預(yù)測(cè)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1. 下載darknet源碼

在命令窗口(terminal)中進(jìn)入你想存放darknet源碼的路徑,然后在該路徑下輸入依次輸入以下命令:

git clone https://github.com/pjreddie/darknet
cd darknet

上述命令首先從darknet的源碼地址復(fù)制一份源碼到本地,下載下來(lái)的是一個(gè)名為darknet的文件。然后進(jìn)入這個(gè)名為darknet的文件夾。

2. 修改darknet的Makefile文件

Note:如果不需要darknet在GPU上運(yùn)行,則略過(guò)此步驟,只需執(zhí)行make命令。 在命令窗口輸入以下命令打開(kāi)Makefile文件:

    vi Makefile

將Makefile文件開(kāi)頭的GPU=0改為GPU=1,如下所示:

GPU=1
CUDNN=0
OPENCV=0
OPENMP=0
DEBUG=0

修改完之后,需要執(zhí)行make命令才可以生效。

make

3. 準(zhǔn)備數(shù)據(jù)集

在./darknet/scripts文件夾下創(chuàng)建文件夾,命名為VOCdevkit,然后再在VOCdevkit文件夾下創(chuàng)建一系列文件夾,整個(gè)目錄結(jié)構(gòu)如下所示:

VOCdevkit
-VOC2019 # 這個(gè)文件夾的年份可以自己取
--Annotations # 在這個(gè)文件夾下存放所有的xml文件
--ImageSets
---Main # 在這個(gè)文件夾下新建兩個(gè)TXT文件
----train.txt
----val.txt
--JPEGImages # 在這個(gè)文件夾下存放所有的圖片文件

上述文件及文件夾創(chuàng)建好之后,下面來(lái)對(duì)我們的數(shù)據(jù)集生成train.txt和val.txt,這兩個(gè)文件中存放訓(xùn)練圖像和測(cè)試圖像的文件名(不含.jpg后綴)。 新建一個(gè)creat_train_val_txt.py文件(名字可以自己隨便?。?,然后將以下代碼復(fù)制進(jìn)去(注意相應(yīng)路徑的修改)

#coding:utf-8
import os
from os import listdir, getcwd
from os.path import join
if __name__ == '__main__':           # 只有在文件作為腳本文件直接執(zhí)行時(shí)才執(zhí)行下面代碼  
    source_folder='/home/tukrin/zhl/darknet/scripts/VOCdevkit/VOC2019/JPEGImages/'           #圖片保存的路徑
    dest='/home/tukrin/zhl/darknet/scripts/VOCdevkit/VOC2019/ImageSets/Main/train.txt'          #寫(xiě)有圖片的名字的路徑
    dest2='/home/tukrin/zhl/darknet/scripts/VOCdevkit/VOC2019/ImageSets/Main/val.txt'           #寫(xiě)有圖片的名字的路徑
    file_list=os.listdir(source_folder)  #獲取各圖片的名稱       
    train_file=open(dest,'a')     #追加寫(xiě)打開(kāi)              
    val_file=open(dest2,'a')       #追加寫(xiě)打開(kāi)    
    count = 0              
    for file_obj in file_list:  
        count += 1                
        file_path=os.path.join(source_folder,file_obj) #路徑拼接  指向 圖片文件的路徑
        file_name,file_extend=os.path.splitext(file_obj) #分離文件名與擴(kuò)展名 file_name為去掉擴(kuò)展名的圖片名稱 
        # file_num=int(file_name) 
        if(count<800):                     
            train_file.write(file_name+'\n')  #寫(xiě)入去掉擴(kuò)展名的文件名名稱  前800個(gè)作為 訓(xùn)練集數(shù)據(jù)
        else :
            val_file.write(file_name+'\n')    #寫(xiě)入去掉擴(kuò)展名的文件名名稱   后面的作為  驗(yàn)證集數(shù)據(jù)
    train_file.close() #關(guān)閉文件
val_file.close()   #關(guān)閉文件

制作好creat_train_val_txt.py文件后,在命令行執(zhí)行該文件:

python creat_train_val_txt.py

執(zhí)行完畢之后可以看到剛剛我們新建的train.txt和val.txt文件中被寫(xiě)進(jìn)了我們的數(shù)據(jù)集圖片的文件名。

4. 修改voc_label.py

打開(kāi)scripts文件夾下的 voc_label.py 文件,修改信息:#要修改的地方 共三處

import xml.etree.ElementTree as ET 
import pickle
import os
from os import listdir, getcwd
from os.path import join
#要修改的地方
sets=[('2019', 'train'), ('2019', 'val')]  # 此處的2019對(duì)應(yīng)前面新建文件夾時(shí)的2019,train和val對(duì)應(yīng)兩個(gè)TXT文件的文件名
#要修改的地方
classes =["car", "people"] # 此處為數(shù)據(jù)集的類別名稱,一定要與xml文件中的類別名稱一致,有幾類就寫(xiě)幾類
def convert(size, box):#size是圖片的尺寸 box是矩形的四個(gè)點(diǎn)
    dw = 1./size[0] # 歸一化的時(shí)候就是使用寬度除以整個(gè)image_size的寬度
    dh = 1./size[1] # 歸一化的時(shí)候就是使用高度除以整個(gè)image_size的高度
    x = (box[0] + box[1])/2.0 # 使用(xmin+xmax)/2得到x的中心點(diǎn)
    y = (box[2] + box[3])/2.0 # 使用(ymin+ymax)/2得到y(tǒng)的中心點(diǎn)
    w = box[1] - box[0] # 然后寬度就是使用xmax-xmin計(jì)算得到
    h = box[3] - box[2] # 然后高度就是使用ymax-ymin計(jì)算得到
    x = x*dw# 歸一化
    w = w*dw# 歸一化
    y = y*dh# 歸一化
    h = h*dh# 歸一化
    return (x,y,w,h)
def convert_annotation(year, image_id):
    in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))
    out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')#此時(shí)文件是如何形成的?    open的時(shí)候自動(dòng)建立
    root = tree.getroot()#獲得root節(jié)點(diǎn)  
    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
        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))
        bb = convert((w,h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
wd = getcwd()
for year, image_set in sets:
    if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):#如果沒(méi)有存在這個(gè)文件
        os.makedirs('VOCdevkit/VOC%s/labels/'%(year))#創(chuàng)建這個(gè)路徑 來(lái)存放txt標(biāo)簽
    image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()#此時(shí)文件是如何形成的? 通過(guò)另一個(gè)腳本文件與圖片名稱生成的
    list_file = open('%s_%s.txt'%(year, image_set), 'w')#這個(gè)文件可能是自己建的? open的時(shí)候自動(dòng)建立
    for image_id in image_ids:
        list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
        convert_annotation(year, image_id)
    list_file.close()
#要修改的地方
os.system("cat 2019_train.txt 2019_val.txt > train.txt") # 此處是將兩個(gè)txt連接成一個(gè)txt,如果你訓(xùn)練時(shí)不用val.txt中的數(shù)據(jù),可以注釋掉這句話。
 # os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")# 另外,刪除另外一條os.system(...)語(yǔ)句。

保存修改后,運(yùn)行該文件:

python voc_label.py

執(zhí)行完畢之后,會(huì)生成2018_train.txt、2018_val.txt、train.txt 三個(gè)文件,如下圖:

在labels文件夾下會(huì)生成圖片對(duì)應(yīng)的txt形式的圖片標(biāo)注信息

5. 下載預(yù)訓(xùn)練模型

為了加速訓(xùn)練過(guò)程,可以在darknet官網(wǎng)上下載預(yù)訓(xùn)練模型,在該預(yù)訓(xùn)練模型上再進(jìn)行訓(xùn)練。 在命令窗口輸入以下命令:

wget https://pjreddie.com/media/files/darknet53.conv.74 

文件保存在script文件夾下即可

6. 修改./darknet/cfg/voc.data文件

classes= 2  # 你的數(shù)據(jù)集的類別數(shù)
train  =  /home/tukrin/zhl/darknet/scripts/2019_train.txt  # 第4步中生成的txt文件路徑
valid  =  /home/tukrin/zhl/darknet/scripts/2019_val.txt  # 第4步中生成的txt文件路徑
names  =  /home/tukrin/zhl/darknet/data/voc.names # voc.names 的文件路徑
backup =  /home/tukrin/zhl/darknet/backup/  #backup文件夾的路徑 訓(xùn)練的權(quán)重將保存在這

7. 修改./darknet/data/voc.name文件

將voc.name文件做如下修改:

car
people

內(nèi)容為你的數(shù)據(jù)集的類別名稱,注意和xml文件中的類別名稱一致。

8. 修改./darknet/cfg/yolov3-voc.cfg文件

該文件為網(wǎng)絡(luò)結(jié)構(gòu)文件。 首先修改開(kāi)頭處如下:

[net]
# Testing
# batch=1
# subdivisions=1
# Training
batch=64
subdivisions=16

即,將訓(xùn)練模式打開(kāi),將測(cè)試模式的語(yǔ)句注釋掉。

其中subdivisions為將一個(gè)batch(此處為64)分成多大的小batch。如果訓(xùn)練時(shí)提示超出內(nèi)存,則可以相應(yīng)的改小這兩個(gè)參數(shù)的值。

接著視情況修改開(kāi)頭處的超參數(shù)(學(xué)習(xí)率,迭代次數(shù)等):

width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
learning_rate=0.001
burn_in=1000
max_batches = 50200 # 迭代次數(shù)
policy=steps
steps=40000,45000 # 在指定迭代次數(shù)時(shí)進(jìn)行學(xué)習(xí)率衰減
scales=.1,.1  # 學(xué)習(xí)率衰減率 此處是0.1

然后再該文件的底部部分,找到如下語(yǔ)句進(jìn)行如下修改:

......
[convolutional]
size=1
stride=1
pad=1
filters=21 ....................# 修改為 3 * (類別數(shù) + 5),此處類別數(shù)為2,所以設(shè)置為 3*(2+5)=21
activation=linear
[yolo]
mask = 6,7,8
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=2 .....................# 修改類別數(shù)
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1
......
[convolutional]
size=1
stride=1
pad=1
filters=21 .....................# 同上
activation=linear
[yolo]
mask = 3,4,5
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=2 .....................# 同上
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1
......
[convolutional]
size=1
stride=1
pad=1
filters=21 .....................# 同上
activation=linear
[yolo]
mask = 0,1,2
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=2 .....................# 同上
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1

有三處[yolo]的上面的[convolutional]的filters要改 和[yolo]的classes要改開(kāi)始訓(xùn)練

9. 開(kāi)始訓(xùn)練

在 ./darknet 目錄下,在命令窗口中執(zhí)行以下命令,其中 -gpus 0, 1 用來(lái)指定參與訓(xùn)練的GPU編號(hào),可以省略。填0 或1

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg scripts/darknet53.conv.74 -gpus 0,1

10.訓(xùn)練終止后繼續(xù)訓(xùn)練方法

假如訓(xùn)練由于意外情況,如顯存不夠終止了,可以通過(guò)加載中間權(quán)重文件,進(jìn)而繼續(xù)訓(xùn)練 中間權(quán)重文件在backup文件夾中

把9步權(quán)重文件的路徑換為backup中文件即可

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_900.weights -gpus 0,1

backup里文件保存規(guī)則: 訓(xùn)練1000次之前每100次保存一次。所以上面圖片出現(xiàn)了100~900的權(quán)重中間文件。 訓(xùn)練1000次之后每10000次保存一次。 yolov3-voc.backup 會(huì)保持100整數(shù)倍的訓(xùn)練結(jié)果。 所以在1000次之后想繼續(xù)訓(xùn)練的話應(yīng)該加載 yolov3-voc.backup文件。注意此文件不能作為檢查模型使用。

以上就是darknet框架中YOLOv3對(duì)數(shù)據(jù)集進(jìn)行訓(xùn)練和預(yù)測(cè)詳解的詳細(xì)內(nèi)容,更多關(guān)于darknet YOLOv3數(shù)據(jù)集訓(xùn)練預(yù)測(cè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python 實(shí)現(xiàn)順序高斯消元法示例

    Python 實(shí)現(xiàn)順序高斯消元法示例

    今天小編就為大家分享一篇Python 實(shí)現(xiàn)順序高斯消元法示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • 理解深度學(xué)習(xí)之深度學(xué)習(xí)簡(jiǎn)介

    理解深度學(xué)習(xí)之深度學(xué)習(xí)簡(jiǎn)介

    這篇文章主要是關(guān)于深度學(xué)習(xí)的簡(jiǎn)介,對(duì)大家學(xué)習(xí)了解機(jī)器深度學(xué)習(xí)有一定的幫助,以后會(huì)持續(xù)更新本系列,希望能為大家?guī)?lái)一些收貨,讓我們一起來(lái)看看下面的文章吧
    2021-04-04
  • Python的類成員變量默認(rèn)初始值的坑及解決

    Python的類成員變量默認(rèn)初始值的坑及解決

    這篇文章主要介紹了Python的類成員變量默認(rèn)初始值的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Python學(xué)習(xí)筆記之函數(shù)的參數(shù)和返回值的使用

    Python學(xué)習(xí)筆記之函數(shù)的參數(shù)和返回值的使用

    這篇文章主要介紹了Python學(xué)習(xí)筆記之函數(shù)的參數(shù)和返回值的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Python中關(guān)于set的基本用法

    Python中關(guān)于set的基本用法

    這篇文章主要介紹了Python中關(guān)于set的基本用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Python編程基礎(chǔ)之函數(shù)和模塊

    Python編程基礎(chǔ)之函數(shù)和模塊

    這篇文章主要為大家介紹了Python函數(shù)和模塊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • 使用pyhon繪圖比較兩個(gè)手機(jī)屏幕大小(實(shí)例代碼)

    使用pyhon繪圖比較兩個(gè)手機(jī)屏幕大小(實(shí)例代碼)

    這篇文章主要介紹了使用pyhon繪圖比較兩個(gè)手機(jī)屏幕大小,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • python處理csv數(shù)據(jù)的方法

    python處理csv數(shù)據(jù)的方法

    這篇文章主要介紹了python處理csv數(shù)據(jù)的方法,實(shí)例分析了Python處理csv數(shù)據(jù)的技巧,需要的朋友可以參考下
    2015-03-03
  • Python爬蟲(chóng)實(shí)現(xiàn)簡(jiǎn)單的爬取有道翻譯功能示例

    Python爬蟲(chóng)實(shí)現(xiàn)簡(jiǎn)單的爬取有道翻譯功能示例

    這篇文章主要介紹了Python爬蟲(chóng)實(shí)現(xiàn)簡(jiǎn)單的爬取有道翻譯功能,結(jié)合實(shí)例形式分析了Python基于urllib庫(kù)實(shí)現(xiàn)的爬蟲(chóng)爬取有道翻譯相關(guān)定義與數(shù)據(jù)交互功能操作技巧,需要的朋友可以參考下
    2018-07-07
  • 利用python/R語(yǔ)言繪制圣誕樹(shù)實(shí)例代碼

    利用python/R語(yǔ)言繪制圣誕樹(shù)實(shí)例代碼

    圣誕節(jié)快到了,分別用R和Python繪制了圣誕樹(shù)祝你們圣誕節(jié)快樂(lè),所以下面這篇文章主要給大家介紹了關(guān)于如何利用python/R繪制圣誕樹(shù)的相關(guān)資料,需要的朋友可以參考下
    2021-12-12

最新評(píng)論