關(guān)于SSD目標(biāo)檢測(cè)模型的人臉口罩識(shí)別
最近學(xué)習(xí)了SSD算法,了解了其基本的實(shí)現(xiàn)思路,并通過SSD模型訓(xùn)練自己的模型。
基本環(huán)境
- torch1.2.0
- Pillow8.2.0
- torchvision0.4.0
- CUDA版本可查看自己電腦,這里使用CUDA10.0
- visual studio 2019
- scipy1.2.1
- numpy1.17.0
- matplotlib3.1.2
- opencv_python4.1.2.30
- tqdm4.60.0
- h5py2.10.0
安裝
建議創(chuàng)建一個(gè)虛擬環(huán)境,本文使用到的是在Pycharm環(huán)境下
打開pytorch的官方安裝方法:
https://pytorch.org/get-started/previous-versions/
但是可以先進(jìn)入:
https://download.pytorch.org/whl/torch_stable.html
找到自己需要下載自己需要的即可。
找到自己的下載路徑,然后再命令窗口定位,再使用
pip install +下載好的whl文件即可
再安裝相關(guān)依賴包需要先激活環(huán)境,進(jìn)行安裝。
同時(shí)安裝CUDA和visual studio 2019可參考網(wǎng)上教程,這里不細(xì)講。
數(shù)據(jù)集的準(zhǔn)備
本文使用VOC格式進(jìn)行訓(xùn)練,
訓(xùn)練前將標(biāo)簽文件放在VOCdevkit文件夾下的VOC2007文件夾下的Annotation中,文件格式為xml。
圖片文件放在VOCdevkit文件夾下的VOC2007文件夾下的JPEGImages中,格式為jpg,如下圖所示。
數(shù)據(jù)集處理
整個(gè)項(xiàng)目的文件如下(里面包含一些個(gè)人測(cè)試的代碼):
第一步需要運(yùn)行voc_annotation.py,并更改其代碼里面的一些參數(shù)(annotation_mode、classes_path、trainval_percent、train_percent、VOCdevkit_path都可以修改,但也可以只修改以下內(nèi)容即可):
需要修改model_data文件里面的voc_classes.txt內(nèi)容,例如本例中修改如下:
即可生成訓(xùn)練用的2007_train.txt以及2007_val.txt。
圖片處理
本例統(tǒng)一輸入進(jìn)來的圖片是300*300大小的3通道圖片。
- 對(duì)輸入進(jìn)來的圖片進(jìn)行判斷是否為RGB,如果不是則進(jìn)行轉(zhuǎn)RGB
- 對(duì)圖像進(jìn)行統(tǒng)一大小裁剪,為防止圖片失真,在其添加上灰條。
- 對(duì)圖片進(jìn)行數(shù)據(jù)增強(qiáng),通過翻轉(zhuǎn),隨機(jī)選取等操作。
模型訓(xùn)練
訓(xùn)練文件train.py中也要修改部分參數(shù)
classes_path一定要對(duì)應(yīng)自己的分類文件,以及自己權(quán)重文件的位置。經(jīng)過多次epochs后,權(quán)值會(huì)生成在logs文件夾。
在訓(xùn)練開始前還需要更改其他py文件的內(nèi)容:
在summary.py文件中:
m=SSD300(7,‘vgg’).to(device)中7代表的是分類的個(gè)數(shù),這里需要修改為2,因?yàn)橹槐纠环譃榱?類。
下面(3,300,300)代表輸入的是300*300大小的3通道圖片。
運(yùn)行train.py文件進(jìn)行模型訓(xùn)練,若出現(xiàn)out of memory問題,可以減小每次訓(xùn)練的batch_size的大小。
模型預(yù)測(cè)
模型預(yù)測(cè)先要去修改ssd.py文件中的model_path(在自己保存權(quán)值的logs文件當(dāng)中選取一個(gè)權(quán)值文件,放到model_data文件夾中,并修改下面的路徑,其次classes_path也要進(jìn)行對(duì)應(yīng)的修改:
這里單獨(dú)調(diào)用攝像頭進(jìn)行預(yù)測(cè),相關(guān)代碼如下所示:
import time import cv2 import numpy as np from PIL import Image from ssd import SSD #口罩識(shí)別模型 if __name__ == "__main__": ssd = SSD() video_path = 0 video_save_path = "" video_fps = 25.0 # 指定測(cè)量fps的時(shí)候,圖片檢測(cè)的次數(shù) test_interval = 100 capture=cv2.VideoCapture(video_path) if video_save_path!="": fourcc = cv2.VideoWriter_fourcc(*'XVID') size = (int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)), int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))) out = cv2.VideoWriter(video_save_path, fourcc, video_fps, size) ref, frame = capture.read() if not ref: raise ValueError("未能正確讀取攝像頭(視頻),請(qǐng)注意是否正確安裝攝像頭(是否正確填寫視頻路徑)。") fps = 0.0 while(True): t1 = time.time() # 讀取某一幀 ref, frame = capture.read() if not ref: break # 格式轉(zhuǎn)變,BGRtoRGB frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB) # 轉(zhuǎn)變成Image frame = Image.fromarray(np.uint8(frame)) # 進(jìn)行檢測(cè) frame = np.array(ssd.detect_image(frame)) # RGBtoBGR滿足opencv顯示格式 frame = cv2.cvtColor(frame,cv2.COLOR_RGB2BGR) fps = ( fps + (1./(time.time()-t1)) ) / 2 print("fps= %.2f"%(fps)) frame = cv2.putText(frame, "fps= %.2f"%(fps), (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) cv2.imshow("video",frame) if video_save_path!="": out.write(frame) if cv2.waitKey(10) & 0xff==ord('q'): break capture.release() cv2.destroyAllWindows()
效果圖如下
未戴口罩
戴口罩
整體來說效果還是不錯(cuò)的。
后續(xù)
后面我又去找了其他數(shù)據(jù)集進(jìn)行訓(xùn)練,對(duì)其進(jìn)行不同的圖片處理以及模型的改進(jìn),達(dá)到的效果還不錯(cuò)。但是圖片格式為jpeg的,因此在代碼當(dāng)中添加了對(duì)圖片類型的判斷,但是若不添加代碼,則需要更改文件
get_map.py中:
后綴為對(duì)應(yīng)的圖片類型,還有在voc_annotation.py代碼中有一處也需要修改圖片后綴名。
其次自己寫了一個(gè)簡(jiǎn)易版的GUI界面,使其輸出各坐標(biāo),以及害蟲的分類
效果圖如下:
但在模型對(duì)小目標(biāo)檢測(cè)方面還是存在一點(diǎn)問題,正在嘗試提高其精度。
建議還是要先去學(xué)習(xí)下SSD模型的基本算法思路,理解起來更加清楚、明白.
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫的示例
本篇文章主要介紹了Python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08python中l(wèi)ambda與def用法對(duì)比實(shí)例分析
這篇文章主要介紹了python中l(wèi)ambda與def用法對(duì)比,實(shí)例分析了lambda與def的區(qū)別與使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04python json.loads兼容單引號(hào)數(shù)據(jù)的方法
今天小編就為大家分享一篇python json.loads兼容單引號(hào)數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12django-rest-framework解析請(qǐng)求參數(shù)過程詳解
這篇文章主要介紹了django-rest-framework解析請(qǐng)求參數(shù)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07