前言:
由於參加了一個小比賽,所以參考了一下GitHub上的代碼,借用了CSDN上
mind_programmonkey大佬的數據集,寫出了一個口罩識別程序,代碼實現途中,發現了許多問題,所以寫下這篇博客,希望對其他人有所幫助。。
由於我只是一名學生,掌握知識有限,所以也是從零開始,對一些小白應該會有所幫助,也歡迎大佬指點。
聯系方式:wx:yuanxi154
需要數據集、權重、和我訓練好的模型可以加我
一、環境要求
- Python: 3.7.4
- Tensorflow-GPU 1.14.0
- Keras: 2.2.4
- 備注:我環境是用anaconda配置的,具體方法百度,不過可能因為牆的原因,配置會報很多錯誤
二、數據集
VOC格式數據集(需要數據集聯系我)
xml標簽和圖片相對應
注意:這種名稱的圖片和xml標簽會報錯(本來我是隨便找個數據集的,結果發現會報錯,具體什么原因我也不知道)
正確格式:
三、准備權重
首先,我們需要下載yolov3事先已經訓練好的權重,yolov3.weights
下載方法百度
四、代碼實現
(1)前期准備:
原版的話就是GitHub上qqwwee
的代碼:https://github.com/qqwweee/keras-yolo3
我修改后的代碼我也上傳至GitHub上:https://github.com/god-yx/facemask
由於GitHub不能存在空文件夾,所以我們需要先創建兩個文件夾logs和VOCdevkit/VOC2007的三個子文件夾
logs用於存放訓練好的模型
VOCdevkit用於存放數據集
VOC2007底下需要創建三個子文件夾Annotations、ImageSets、JPEGImages
ImageSets需要再創建Main子文件夾
Annotations:用於存放xml標簽
ImageSets:存放數據集列表文件,由voc2yolo3.py文件生成
JPEGImages:存放圖片
完成后效果圖:
(2)權重轉換
由於我們用的keras框架,所以我們需要把下載的權重給轉換一下
轉換的位置在
python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5
python convert.py yolov3-tiny.cfg yolov3-tiny.weights model_data/yolov3-tiny.h5
復制代碼直接粘貼回車就好,轉換成功就會出現上面圖中的信息。
(3)利用voc2yolo3.py
文件生成對應的txt。
運行voc2yolo3.py
之后會在ImageSets/Main生成如下txt文件(位置不要錯)
(4)運行根目錄voc_annotation.py
運行前需要將voc_annotation
文件中classes改成你自己的classes(xml文件對應的標簽)
我們就會生成這樣的一個文件,2007_train.txt
,這里面 每一行對應其圖片位置及其真實框的位置
(5)修改model_data里面的yolo_anchors.txt
和tiny_yolo_anchors.txt
這里非常重要,因為如果不修改的話,就會出現很多問題。
這里我們利用kmeans.py
來生成。
k=9,生成yolo_anchors;k=6,生成tiny_yolo_anchors.txt
(6)修改標簽
接着我們來到model_data里面的voc_classes.txt
文件中需要將classes改成你自己的classes
。不要有第三行
(7)訓練
然后來到train.py
中,通過修改anchor_path
,從而選擇使用yolov3
訓練還是yolov3-tiny
訓練
如果是用我的代碼,可以不用改,否則:
運行train.py
即可開始訓練,訓練好的模型會存放在logs下。
訓練過程
五,測試
修改根目錄下yolo.py
文件,修改model_path
,anchors_path
,classes_path
替換成·自己的路徑
運行predict_img.py,在輸入框輸入圖片路徑進行測試。
運行yolo_video.py,打開攝像頭進行測試。
測試本地視頻:
運行yolo_video.py
此外對應的yolo.py文件174行改為vid = cv2.VideoCapture(“視頻路徑+視頻名+視頻后綴名”);
六、注意:
一張圖片最多只能識別20個對象的問題:
-
1.訓練時,要在yolo3文件夾下面的utils.py里,修改get_random_data()函數,有一個默認參數是max_boxes=20,改成很大的數值就行了。
-
2.檢測時,要在yolo3文件夾下面的model.py里,修改yolo_eval()函數,有一個默認參數是max_boxes=20,改成很大的數值就行了。
七:常見問題
這里匯總我測試代碼時出現的幾個問題:
(1)File "h5py\_objects.pyx", line 54, in h5py._objects.with_phil.wrapper
File "h5py\_objects.pyx", line 55, in h5py._objects.with_phil.wrapper
File "h5py\h5f.pyx", line 88, in h5py.h5f.open
OSError: Unable to open file (unable to open file: name = './raw', errno = 13, error message = 'Permission denied', flags = 0, o_flags = 0)
這里我的問題是由於版本問題,新的版本對語法有所改變
(2)提示Mismatch between model and given anchor and class sizes
這里是由於第五步的時候修改的有問題;
(3)測試的時候沒有窗口,或者識別很多窗口
還是第五步的時候出問題了
還有一些問題記不清楚了,如果有問題歡迎留言討論