Yolo v3目標檢測模型代碼使用

最近使用yolo作爲目標檢測的模型,此代碼使用的是keras與python,在環境配置問題上會很方便。該文檔主要是爲了留給自己實驗室的同學爲了能快速使用深度學習的目標檢測模型,主要講究應用,而不是研究yolo的內部結構。

我個人認爲keras框架的確簡單方便,但是也有很多的不方便,比如在此yolov3工程中我們就很難實現訓練一部分同時保存模型,而tensorflow就可以很好地解決。

如在運行過程中遇到問題,可以聯繫qq2389388826

 1. 環境說明


所需環境:python3+keras2.1.5+opencv-python

這裏省略環境的配置,需要看環境配置的請看我的第一篇博客安裝anaconda。

已知可運行系統:Ubuntu,Windows10

該項目原來的地址:https://github.com/qqwweee/keras-yolo3

我自己對此項目進行了修改,該博客將基於我的代碼倉庫進行解釋說明,地址:https://github.com/CExplorer/Yolo

此次的演示主要基於Windows10,因爲Windows10能運行的代碼Ubuntu一定能運行!

2. 試運行


首先下載倉庫的代碼到本地,下載權重文件yolov3.weights,地址:https://pjreddie.com/media/files/yolov3.weights,放在文件夾中,如圖所示:

接着,打開命令行,在這個Yolo文件夾的目錄中,運行代碼(注意,一定要注意在哪個路徑運行):

python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5

這個主要是生成h5文件,生成yolo的網絡結構以及他的參數,你會在model_data這個文件夾下看到一個叫yolo.h的文件。

接着先用這個官方現成的文件檢測一下圖像吧,我直接從網上下載了一張圖片放在了該目錄文件夾下,命名爲test.jpg,如下圖所示:

測試的圖像如圖所示:

打開yolo.py,修改第23行如下,保存

"model_path": 'model_data/yolo.h5'

然後直接運行yolo.py即可

python yolo.py

如果運行成功,在你的命令行中會要求你輸入圖片,這時候,輸入:

test.jpg

看,這樣就檢測到了圖片中的小狗與貓,但是我們如果是應用於機器一定是需要知道此圖像的相對座標的,已經打印在了命令行中:

 就是小狗和貓,讓後是左上角的座標和右下角的座標,這裏說說明下,圖像的座標原點是左上角,而不是我們習慣的左下角。

程序無限循環輸入圖,按ctrl+c結束程序。

3. 訓練自己的數據集


這裏需要一個標註的軟件,叫labelimg,可以直接利用pip安裝:

pip install labelimg

然後直接在命令行輸入labelimg即可出現。

標註數據的方法我在之前的博客中提到過,這裏不再細說,請到我的以前的博客閱讀,或者百度一下labelimg標註數據。

參考地址:https://blog.csdn.net/Exploer_TRY/article/details/81434985

不過,我想提醒下,1、標註的標籤用英文,別用中文!2、標註的標籤不要有空格,可以用  ‘_’  代替

爲了方便,就創建一個和該程序訓練的原始數據集一樣的文件夾目錄存放圖片和標註的xml文件,在Yolo目錄創建:VOCdevkit/VOC2007/,然後在VOC2007文件夾下創建Annotations(用於放標註的xml文件),ImageSets,JPEGImages(用於放需要訓練的圖片)三個文件夾。

然後在VOC2007文件夾下創建一個py文件:xml_convert.py:

import os
import random
 
trainval_percent = 0.2
train_percent = 0.8
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裏得到四個文本文件。

到這裏,我說明一下我製作的數據集,包括basketball,arm,hand,hoop,head,Outer_edge六個類,因此我們需要修改Yolo目錄下的文件voc_annotation.py

在voc_annotation.py中做出下面修改,如圖:

 然後運行voc_annotation.py

python voc_annotation.py

然後可以在Yolo文件夾下可以看到生成了3個txt文件:2007_test.txt,2007_train.txt,2007_val.txt。

還有就是需要修改參數文件yolo3.cfg,這個其實就是因爲類別變了,我們需要爲此調整網絡結構。

在這個文件中搜索yolo這個關鍵詞,有三次出現如圖:

畫線部分是需要修改的,重複修改三次。

filters後的255修改爲3*(5+你標註的類別數量),我這裏是6類,所以是3*(5+6)=33。懂一點yolo v3網絡結構的人知道,yolo v3有三個輸出,每一個輸出塊中,5層代表位置信息,而後面就是類別信息,有多少類,故這個公式就是這樣來的,不懂不要緊,按照我說的做就行,畢竟只是介紹應用,而不是講解yolo算法。 

classes是你標註的類別,我這有6類,所以改爲6。

random主要是改小顯存,需要改小的改爲0。

把三個部位全部修改,然後保存。

在model_data下創建my_classes.txt,裏面每一行寫上自己的類別。

然後在train.py文件中,修改 第19行爲:

classes_path = 'model_data/voc_classes.txt'

在Yolo文件夾下創建目錄logs/000/

然後運行train.py

注意:如果遇到  AttributeError: module 'keras.backend' has no attribute 'control_flow_ops' 說明你的keras版本過新,如何調整可以自己百度,這裏建議用舊版本keras,2.1.5。

安排上了,等訓練完就好。

訓練好後,就能在logs/000/文件夾下看到一個h5格式文件,就是我們訓練完模型的文件。

4. 測試訓練完的模型


這裏我將生成的文件yolo_weights.h5放在model_data文件夾下,看看自己訓練的數據效果。

修改yolo.py的23行與25行,定位到yolo_weight.h5和自己定義的my_classes.txt文件

測試圖片如下:

運行yolo.py查看效果:

已經可以檢測到了。

 

5. 關於如何導出其座標與類別


關於類別問題和座標,請見yolo.py文件的147行:

print(label, (left, top), (right, bottom))

沒錯,這個就是我們要找的關鍵信息了。

這裏解釋一下,label是一個字符串,是 “種類 概率”

因此判斷可以用label.split(' ')[0]來確認類別(所以要求標註不要有空格)

left和right,top和bottom導出時,最好加上int,因爲圖片索引一定是整數。

這裏我有導入到一個excel裏面,參考如下方式,具體實行請見reload_xls.py文件,不再解釋。

如果是提取數據在這導入到excel裏,如果是移植到機器人上,在這裏寫串口通信。

如果是做視頻實時檢測,請加入opencv的調用攝像頭文件或者讀取視頻方法,在網上有很多例子,需要理解請努力學習。

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