yolov3_keras的數據集製作和訓練

keras版本的訓練標籤用的是xml格式(PascalVOC),Darknet版本的訓練樣本需要轉換爲txt格式(YOLO)。

文中的Cutter2019文件夾全都改名爲VOCdevkit文件夾!!!!!!!!!

1.採集包含目標的圖像若干張

2.安裝labelImg

3.在keras-yolo3文件夾下新建Cutter2019文件夾

在Cutter2019文件夾內建立如下文件夾結構:
在這裏插入圖片描述
其中JPEGImages文件夾中放的是所有采集的圖像
在這裏插入圖片描述
其中Annotations文件夾中保存的是labelImg標註的XML文件

4.使用labelImg進行標註

4.1 格式選擇
因爲使用的是keras版本的yolov3,所以標註文件採用XML格式,即製作數據集時將YOLO格式改爲VOC格式,保存時自動生成XML文件。如果是darknet版本,就點擊紅框位置切換成YOLO格式,生成txt文本。
在這裏插入圖片描述4.2打開圖片
點擊Open Dir,選擇圖像所在目錄
在這裏插入圖片描述4.3 選擇標記文件位置
點擊change save dir,更改保存XML文件的位置
在這裏插入圖片描述4.4 圖片標註
“ctrl+鼠標滾輪”實現圖像的放大和縮小;

輸入法切換爲英文,然後按“W”,會出現下面的十字。然後按住鼠標左鍵,拖動,直到將全部目標包括在內,注意,選擇區域儘量小。放開鼠標就是下面的樣子,在文本框中輸入目標名稱,例如:cutter。
在這裏插入圖片描述在右上角就會多一個類別:cutter
在這裏插入圖片描述
然後依次點擊-save保存-Next Image下一張。如果標記後沒有點擊保存就點下一張會有提示彈出,所以不用擔心忘記保存。

一直重複:W - 鼠標選擇 - save - next image ;直到所有都標註完成。

5.數據集製作

5.1 添加文本文件
在ImageSets/Main/文件夾下添加trainval.txt,train.txt,val.txt,test.txt
在這裏插入圖片描述
5.2 製作數據集
在VOC2007下新建一個python文件makedataset.py
在這裏插入圖片描述
在文件中複製以下代碼:

import os
import random
 
trainval_percent = 0.1
train_percent = 0.9
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
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('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')
 
for i in list:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftest.write(name)
        else:
            fval.write(name)
    else:
        ftrain.write(name)
 
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

關於訓練集和驗證集的劃分比例應根據樣本數據確定,如果樣本較少,建議改爲0.1和0.9

然後運行該py文件。該代碼是讀取上面的xml文件中圖片名稱,並保存在ImageSets/Main目錄下的txt文件中。注意:此處txt中僅有圖片名稱。
train.txt中是訓練用到的圖像名稱,test.txt中是測試用到的圖像名稱。

5.3
在keras-yolo3-master文件夾中找到voc_annotation.py文件,將classes改爲自己的類別,需要運行voc_annotation.py:

	sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
	classes = ["cutter"]

生成如下三個文件
在這裏插入圖片描述

6.訓練

6.0聚類
將kmeans文件中的2012_train.txt都改成2007_train.txt,然後運行kmeans.py,會輸出聚類的結果,將結果改到model_data文件夾下的yolo_anchors中

在這裏插入圖片描述
6.1
在keras-yolo3-master文件夾中找到yolo3.cfg文件,搜索yolo,一共出現三次,對每個yolo塊都作如下修改:
filter=(5+classes)*3 根據自己的類別情況進行計算
classes 根據自己的分類數設置,我只識別一種,所以爲1
random 默認爲1,如果顯存小於4G建議改爲0

[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=1#只有刀具一類
num=1#一幅圖像中最多檢測出的物體個數
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1

所有的filters=255的值修改爲filters=18(計算方式爲(classes+5)*3),一共3處

[convolutional]
size=1
stride=1
pad=1
#filters=255
filters=18
activation=linear

6.2
在keras-yolo3-master/model_data文件夾中找到voc_classes.txt文件,改爲自己的類別,
在這裏插入圖片描述
6.3 訓練
以上所有準備工作全部完成後,就可以進行最後一步訓練了。
在keras-yolo3文件夾下建立文件夾目錄:logs/000,用於保存訓練生成的模型;
在這裏插入圖片描述
運行train.py函數報錯如下:
在這裏插入圖片描述之前裝的cuda10.1,版本太高了不匹配。提示需要安裝cuda9.0(以及對應的cudnn),因此在電腦上安裝多個版本的cuda庫。
下載cuda9:下載地址
安裝教程:CUDA 9.0+cuDNN v7.0.5 安裝
cuda版本切換教程:Windows系統下安裝多個版本cuda、cudnn,以及切換使用
在CMD中輸入nvcc -V 確認切換過來了

在這裏插入圖片描述繼續執行train.py
在這裏插入圖片描述又報錯cudnn的版本高了,根據報錯提示降低cudnn的版本,替換對應cuda文件夾中的文件即可,然後運行
在這裏插入圖片描述

7.測試

訓練過程中的h5模型參數都保存在了logs/000/文件夾下,如圖
在這裏插入圖片描述
利用新的模型參數來測試模型的訓練效果,在yolo文件中修改模型參數路徑和類別路徑
在這裏插入圖片描述

8.訓練過程中的問題

訓練過程意外停止,報錯資源耗盡:

ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[32,416,416,32]

第一個參數表示batch_size大小,第二個參數表示圖像的高,第三個參數表示圖像的長, 第四個參數表示某層卷積核的個數。

解決方法
1.batch_size 改小
2.增加顯存

9.結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章