建設(shè)摩托車官網(wǎng)旗艦店寶雞seo排名
YOLOv5屏蔽區(qū)域檢測(cè)以及選擇區(qū)域檢測(cè)
- 前期準(zhǔn)備
- labelme選擇mask區(qū)域
- 代碼改動(dòng)
前期準(zhǔn)備
思路就是通過一個(gè)mask掩膜,對(duì)我們想要屏蔽或者選擇的區(qū)域進(jìn)行遮擋處理,在推理的時(shí)候,將有mask掩膜的圖像輸入,將最后的結(jié)果顯示在原始圖像上,即完成了屏蔽區(qū)域檢測(cè)。
labelme選擇mask區(qū)域
標(biāo)注好我們想檢測(cè)的區(qū)域之后,我這里將標(biāo)注區(qū)域命名成了mask,然后我們點(diǎn)擊保存導(dǎo)出json文件:
然后我們?cè)俅蜷_終端,cd到j(luò)son所在的文件夾路徑下,輸入如下命令:
labelme_json_to_dataset xxx.json
這里有的兄弟會(huì)遇到一些報(bào)錯(cuò),主要原因還是環(huán)境的版本問題,可以在網(wǎng)上查到,替換一下對(duì)應(yīng)版本的庫就行了。
我們就會(huì)在這個(gè)路徑下獲得一個(gè)文件夾:
打開文件夾之后會(huì)看到里面有這么五個(gè)文件,我們需要的就是label.png,其他的不用管:
到這里,我們的前期準(zhǔn)備工作就完成了。
代碼改動(dòng)
打開yolov5的項(xiàng)目,進(jìn)入utils/datasets.py中,在代碼的開頭加上讀取我們導(dǎo)出的label.png的代碼:
讀入我們導(dǎo)出的mask圖片文件,然后將其轉(zhuǎn)成灰度圖,然后使用opencv的閾值函數(shù),將大于0的像素值全部變成255,其余的都為0,得到一張mask的二值圖。
然后我們?cè)倏吹統(tǒng)olov5自帶的推理代碼中,即detect.py文件。看到代碼中的數(shù)據(jù)加載部分:
我們這里是對(duì)圖像進(jìn)行推理,因此我們加載的是圖像,不進(jìn)入webcam中,因此我們加載推理數(shù)據(jù)的方法是LoadImages這個(gè)類,cltr+左鍵進(jìn)入這個(gè)類中,在這個(gè)位置下加入以下代碼:
這段代碼主要實(shí)現(xiàn)了兩個(gè)功能,其中flag參數(shù)決定了我們是否使用mask掩膜對(duì)目標(biāo)進(jìn)行遮擋檢測(cè),reverse參數(shù)決定了我們是進(jìn)行選擇區(qū)域檢測(cè)還是屏蔽區(qū)域檢測(cè)(其實(shí)這兩者是一個(gè)取反的操作)。
這里我的參數(shù)是flag=1,reverse=0,因此此時(shí)如果我運(yùn)行程序的話,我們會(huì)看到的結(jié)果是只對(duì)我們剛才框定的mask區(qū)域的目標(biāo)進(jìn)行檢測(cè),而對(duì)其他地方并不會(huì)檢測(cè):
可以看到,和我們預(yù)想的一樣。
我們?cè)賹?shù)改成flag=1, reverse=1,看看結(jié)果:
此時(shí)我們檢測(cè)的區(qū)域是除了mask區(qū)域的以外區(qū)域,沒問題。
那么最后我們將兩個(gè)參數(shù)都設(shè)置為0:
沒有任何問題!
后面我也會(huì)使用openvino和tensorRT在c++進(jìn)行推理部署,實(shí)現(xiàn)選擇區(qū)域或屏蔽區(qū)域檢測(cè)的功能,歡迎大家關(guān)注。