vs2015+opencv440實現YOLOv4,並訓練自己的數據集(完全零基礎)

vs2015+opencv440實現YOLOv4,並訓練自己的數據集(完全零基礎)

最近因爲畢設需要,在研究深度學習目標檢測的一些算法,具體算法的對比和特點就不詳細說了,總之最終確定使用YOLOv4算法。作爲深度學習小白,從零開始記錄一下自己實現該算法的過程,並且方便自己將來使用。
目前網絡上也有很多關於Windows實現YOLOv4的教程,但是總感覺很凌亂,需要不斷對比才能找對真正可行的方法,因爲本文是一個總結文,希望能給之後學習的人一些幫助。文中用到了一些其他人的程序和圖片,我會全部標註原文鏈接,如有冒犯侵權請原作者聯繫我刪除。

一、環境介紹

對於從零開始的小白,我們需要安裝以下軟件或環境

  1. VS2015 ,VS2015是我們用到的編譯器,需要安裝C++和python環境,python只有在我們訓練自己的數據集時纔用到;
  2. opencv440,opencv440是我們用到的圖像處理庫,opencv從440開始支持了YOLOv4,所以不要下載更低版本;
  3. NVIDIA驅動程序 ,能夠讓我們更好地利用自己的顯卡;
  4. CUDA10.2 ,CUDA是NVIDIA推出的計算平臺,能夠基於NVIDIA顯卡架構使用GPU進行復雜的圖像運算;
  5. cuDNN,cuDNN是專門用於CUDA的神經網絡加速包,與CUDA配合使用 ;
  6. YOLOv4相關配置文件

二、環境的具體搭建

  1. VS2015
    可以直接到官網 vs下載地址下載最新的2019社區版(社區版是可以免費試用的),其實不同版本差異並不大,都可以使用。發現自己沒有網盤會員上傳不了vs2015安裝包,要是真的想用2015讀者可以自行查找一下。
    下載完成以後,點擊vs_community.exe程序安裝。
    選擇安裝路徑和自定義安裝
    在選擇功能中選擇 C++和python進行安裝。接下來耐心等待到安裝完成即可。



  2. opencv440
    鏈接:https://pan.baidu.com/s/1eUb8oJJS22YwXzWsySki1A
    提取碼:qdpt
    下載完成後,進行安裝,具體的安裝教程可以參考另外一位博主的文章,下面給出鏈接。opencv安裝與環境配置


  3. NVIDIA驅動程序+CUDA+cuDNN
    CUDA與cuDNN的安裝教程,參考文章。NVIDIA驅動程序CUDA+cuDNN安裝教程
  4. YOLOv4相關配置文件
    鏈接:https://pan.baidu.com/s/1oh36WVqsBmr3_oC7JGBxeg
    提取碼:erx3
    直接下載這麼相關文件。


三、官方模型權重測試

以上環境全部搭建成功以後,就可以進行代碼的測試了。在我們下載的YOLOv4相關配置文件中已經給出了測試要用到的代碼opencv4_yolov4.cpp。我們新建一個C++項目
在這裏插入圖片描述
將主程序替換成opencv4_yolov4.cpp,並在程序所在位置新建兩個文件夾model和image,如圖。在這裏插入圖片描述
直接點擊運行即可。
tips:
1.將模式修改爲release x64
2.每新建一個程序,若要使用opencv庫,都要重新在該程序中進行進行一次opencv環境的配置。





四、訓練自己的數據集

4.1 下載darknet-master

訓練自己的YOLOv4數據集的時候就需要用到原作者編寫的darknet-master了,這裏用到的是python編寫的,可以到原作者的github直接下載。darknet下載地址

4.2 Demo測試

接下來可以參考這篇文章darknet測試的第二、第三兩部分,完成簡單的demo測試。但是不參考他的第四部分,他的這一部分比較混亂,加下來我會單獨進行介紹。

4.3 標註自己的數據集

本文使用labelImg軟件進行標註,下載地址使用教程
標註完成後,我們得到一系列xml文件。
tips: 我們的圖片最好使用六位數字進行命名
在這裏插入圖片描述
在這裏插入圖片描述



4.4 訓練自己的數據集

4.4.1 創建文件目錄

首先在D:\darknet-master\build\darknet目錄下新建一個myData文件夾
在這裏插入圖片描述
在myData文件夾下,新建Annotations、Images、ImageSets文件夾,在ImageSets下新建Main文件夾,並在myData下放入之前下載的預訓練文件yolov4.conv.137。
在這裏插入圖片描述
在Images文件中存放我們的圖片文件,在Annotations文件夾中存放圖片對應的xml文件。



4.4.2 劃分數據集

接下來在myData文件夾下新建test.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()

運行後,我們在ImageSets/Main下得到train.txt,val.txt,test.txt和trainval.txt四個文件。裏面分別包含了:訓練集、驗證集、測試集、訓練+驗證集對應的圖片的名稱。
在這裏插入圖片描述

4.4.3 轉變數據集格式

接下來,我們將labelImg標註得到的xml格式轉變爲YOLO使用的txt格式。在D:\darknet-master\build\darknet路徑下新建my_labels.py文件,代碼如下

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

# 源代碼sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
sets = [('myData', 'train'), ('myData', 'test')]  # 改成自己建立的myData

classes = ["mopian"]  # 改成自己的類別


def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    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(year, image_id):
    in_file = open('myData/Annotations/%s.xml' % (image_id))  # 源代碼VOCdevkit/VOC%s/Annotations/%s.xml
    out_file = open('myData/labels/%s.txt' % (image_id), 'w')  # 源代碼VOCdevkit/VOC%s/labels/%s.txt
    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'):
        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('myData/labels/'):  # 改成自己建立的myData
        os.makedirs('myData/labels/')
    image_ids = open('myData/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
    list_file = open('myData/%s_%s.txt' % (year, image_set), 'w')
    for image_id in image_ids:
        list_file.write('%s/myData/Images/%s.png\n' % (wd, image_id))
        convert_annotation(year, image_id)
    list_file.close()

運行該程序,會在myData目錄下生成一個labels文件夾一個myData_train.txt和myData_test.txt文件。將lavels文件夾下的txt文件全部複製到Images文件夾中。labels文件夾中txt是標註的類別和位置信息,具體含義如下:在這裏插入圖片描述

4.4.4 修改配置文件

修改voc.data和yolov4-custom.cfg文件,這兩個是配置文件:在D:\darknet-master\build\darknet\x64\cfg下複製yolov4-custom.cfg文件到myData文件夾下,並改名爲my_yolov4.cfg。在D:\darknet-master\build\darknet\x64\cfg下複製voc.data文件到myData文件夾下,並改名爲my_data.data。
在這裏插入圖片描述
修改my_yolov4.cfg文件,(可以用記事本打開),在修改規則如下
在這裏插入圖片描述
文件中還有幾處需要修改的,在文檔中搜索 [YOLO],共有三處,在這三處下面,將filters修改爲 (classes+5)×3,將classes修改成你自己的類別數目。如下:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
接下來修改my_data.data文件,修改原則如下







classes= 3 ##改爲自己的分類個數
##下面都改爲自己的路徑
train  = /home/XXX/darknet/myData/myData_train.txt  
names = /home/XXX/darknet/myData/myData.names #稍後需要創建這個文件
backup = /home/XXX/darknet/myData/weights

下面在myData文件夾下創建myData.names文件,輸入你自己的類別名
在這裏插入圖片描述
到這裏全部的準備工作進行完畢,接下來進行訓練。
在D:\darknet-master\build\darknet\x64目錄下執行cmd命令(注意修改成自己的文件路徑)


darknet.exe detector train D:\darknet-master\build\darknet\myData\my_data.data D:\darknet-master\build\darknet\myData\my_yolov4.cfg D:\darknet-master\build\darknet\myData\yolov4.conv.137

在這裏插入圖片描述

4.4.5 測試自己的權重文件

生成的權重文件會保存在weights文件夾中,訓練完成之後,可用如下代碼進行測試,在D:\darknet-master\build\darknet\x64目錄下執行cmd命令

./darknet detect D:\darknet-master\build\darknet\myData\my_yolov4.cfg D:\darknet-master\build\darknet\myData\weights/my_yolov3.weights 1.jpg

得到結果。

參考文章

https://blog.csdn.net/qq_45445740/article/details/108293324
https://blog.csdn.net/qq_45445740/article/details/108253155
https://www.cnblogs.com/answerThe/p/11481564.html

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