基于深度學(xué)習(xí)和OpenCV實現(xiàn)目標(biāo)檢測_第1頁
基于深度學(xué)習(xí)和OpenCV實現(xiàn)目標(biāo)檢測_第2頁
基于深度學(xué)習(xí)和OpenCV實現(xiàn)目標(biāo)檢測_第3頁
基于深度學(xué)習(xí)和OpenCV實現(xiàn)目標(biāo)檢測_第4頁
基于深度學(xué)習(xí)和OpenCV實現(xiàn)目標(biāo)檢測_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第基于深度學(xué)習(xí)和OpenCV實現(xiàn)目標(biāo)檢測目錄使用深度學(xué)習(xí)和OpenCV進行目標(biāo)檢測MobileNets:高效(深度)神經(jīng)網(wǎng)絡(luò)使用OpenCV進行基于深度學(xué)習(xí)的對象檢測使用OpenCV檢測視頻

使用深度學(xué)習(xí)和OpenCV進行目標(biāo)檢測

基于深度學(xué)習(xí)的對象檢測時,您可能會遇到三種主要的對象檢測方法:

FasterR-CNNs(Renetal.,2015)

YouOnlyLookOnce(YOLO)(Redmonetal.,2015)

SingleShotDetectors(SSD)(Liu等人,2015年)

FasterR-CNNs可能是使用深度學(xué)習(xí)進行對象檢測最“聽說”的方法;然而,該技術(shù)可能難以理解(特別是對于深度學(xué)習(xí)的初學(xué)者)、難以實施且難以訓(xùn)練。

此外,即使使用“更快”的R-CNN實現(xiàn)(其中“R”代表“區(qū)域提議”),算法也可能非常慢,大約為7FPS。

如果追求純粹的速度,那么我們傾向于使用YOLO,因為這種算法要快得多,能夠在TitanXGPU上處理40-90FPS。YOLO的超快變體甚至可以達到155FPS。

YOLO的問題在于它的準(zhǔn)確性不高。

最初由Google開發(fā)的SSD是兩者之間的平衡。該算法比FasterR-CNN更直接。

MobileNets:高效(深度)神經(jīng)網(wǎng)絡(luò)

在構(gòu)建對象檢測網(wǎng)絡(luò)時,我們通常使用現(xiàn)有的網(wǎng)絡(luò)架構(gòu),例如VGG或ResNet,這些網(wǎng)絡(luò)架構(gòu)可能非常大,大約200-500MB。由于其龐大的規(guī)模和由此產(chǎn)生的計算數(shù)量,諸如此類的網(wǎng)絡(luò)架構(gòu)不適合資源受限的設(shè)備。相反,我們可以使用Google研究人員的另一篇論文MobileNets(Howard等人,2017年)。我們稱這些網(wǎng)絡(luò)為“MobileNets”,因為它們專為資源受限的設(shè)備而設(shè)計,例如您的智能手機。MobileNet與傳統(tǒng)CNN的不同之處在于使用了深度可分離卷積。深度可分離卷積背后的一般思想是將卷積分成兩個階段:

3×3深度卷積。

隨后是1×1逐點卷積。

這使我們能夠?qū)嶋H減少網(wǎng)絡(luò)中的參數(shù)數(shù)量。問題是犧牲了準(zhǔn)確性——MobileNets通常不如它們的大哥們準(zhǔn)確…………但它們的資源效率要高得多。

使用OpenCV進行基于深度學(xué)習(xí)的對象檢測

MobileNetSSD首先在COCO數(shù)據(jù)集(上下文中的常見對象)上進行訓(xùn)練,然后在PASCALVOC上進行微調(diào),達到72.7%mAP(平均精度)。

因此,我們可以檢測圖像中的20個對象(背景類為+1),包括飛機、自行車、鳥、船、瓶子、公共汽車、汽車、貓、椅子、牛、餐桌、狗、馬、摩托車、人、盆栽植物、羊、沙發(fā)、火車和電視顯示器。

在本節(jié)中,我們將使用OpenCV中的MobileNetSSD+深度神經(jīng)網(wǎng)絡(luò)(dnn)模塊來構(gòu)建我們的目標(biāo)檢測器。

打開一個新文件,將其命名為object_detection.py,并插入以下代碼:

importnumpyasnp

importcv2

if__name__=="__main__":

image_name='11.jpg'

prototxt='MobileNetSSD_totxt.txt'

model_path='MobileNetSSD_deploy.caffemodel'

confidence_ta=0.2

#初始化MobileNetSSD訓(xùn)練的類標(biāo)簽列表

#檢測,然后為每個類生成一組邊界框顏色

CLASSES=["background","aeroplane","bicycle","bird","boat",

"bottle","bus","car","cat","chair","cow","diningtable",

"dog","horse","motorbike","person","pottedplant","sheep",

"sofa","train","tvmonitor"]

COLORS=np.random.uniform(0,255,size=(len(CLASSES),3))

導(dǎo)入需要的包。

定義全局參數(shù):

image_name:輸入圖像的路徑。

prototxt:Caffeprototxt文件的路徑。

model_path:預(yù)訓(xùn)練模型的路徑。

confidence_ta:過濾弱檢測的最小概率閾值。默認(rèn)值為20%。

接下來,讓我們初始化類標(biāo)簽和邊界框顏色。

#loadourserializedmodelfromdisk

print("[INFO]loadingmodel...")

net=cv2.dnn.readNetFromCaffe(prototxt,model_path)

#加載輸入圖像并為圖像構(gòu)造一個輸入blob

#將大小調(diào)整為固定的300x300像素。

#(注意:SSD模型的輸入是300x300像素)

image=cv2.imread(image_name)

(h,w)=image.shape[:2]

blob=cv2.dnn.blobFromImage(cv2.resize(image,(300,300)),0.007843,

(300,300),127.5)

#通過網(wǎng)絡(luò)傳遞blob并獲得檢測結(jié)果和

#預(yù)測

print("[INFO]computingobjectdetections...")

net.setInput(blob)

detections=net.forward()

從磁盤加載模型。

讀取圖片。

提取高度和寬度(第35行),并從圖像中計算一個300x300像素的blob。

將blob放入神經(jīng)網(wǎng)絡(luò)。

計算輸入的前向傳遞,將結(jié)果存儲為detections。

#循環(huán)檢測結(jié)果

foriinnp.arange(0,detections.shape[2]):

#提取與數(shù)據(jù)相關(guān)的置信度(即概率)

#預(yù)測

confidence=detections[0,0,i,2]

#通過確?!爸眯哦取眮磉^濾掉弱檢測

#大于最小置信度

ifconfidenceconfidence_ta:

#從`detections`中提取類標(biāo)簽的索引,

#然后計算物體邊界框的(x,y)坐標(biāo)

idx=int(detections[0,0,i,1])

box=detections[0,0,i,3:7]*np.array([w,h,w,h])

(startX,startY,endX,endY)=box.astype("int")

#顯示預(yù)測

label="{}:{:.2f}%".format(CLASSES[idx],confidence*100)

print("[INFO]{}".format(label))

cv2.rectangle(image,(startX,startY),(endX,endY),

COLORS[idx],2)

y=startY-15ifstartY-1515elsestartY+15

cv2.putText(image,label,(startX,y),

cv2.FONT_HERSHEY_SIMPLEX,0.5,COLORS[idx],2)

#showtheoutputimage

cv2.imshow("Output",image)

cv2.imwrite("output.jpg",image)

cv2.waitKey(0)

循環(huán)檢測,首先我們提取置信度值。

如果置信度高于我們的最小閾值,我們提取類標(biāo)簽索引并計算檢測到的對象周圍的邊界框。

然后,提取框的(x,y)坐標(biāo),我們將很快使用它來繪制矩形和顯示文本。

接下來,構(gòu)建一個包含CLASS名稱和置信度的文本標(biāo)簽。

使用標(biāo)簽,將其打印到終端,然后使用之前提取的(x,y)坐標(biāo)在對象周圍繪制一個彩色矩形。

通常,希望標(biāo)簽顯示在矩形上方,但如果沒有空間,我們會將其顯示在矩形頂部下方。

最后,使用剛剛計算的y值將彩色文本覆蓋到圖像上。

運行結(jié)果:

使用OpenCV檢測視頻

打開一個新文件,將其命名為video_object_detection.py,并插入以下代碼:

video_name='12.mkv'

prototxt='MobileNetSSD_totxt.txt'

model_path='MobileNetSSD_deploy.caffemodel'

confidence_ta=0.2

#initializethelistofclasslabelsMobileNetSSDwastrainedto

#detect,thengenerateasetofboundingboxcolorsforeachclass

CLASSES=["background","aeroplane","bicycle","bird","boat",

"bottle","bus","car","cat","chair","cow","diningtable",

"dog","horse","motorbike","person","pottedplant","sheep",

"sofa","train","tvmonitor"]

COLORS=np.random.uniform(0,255,size=(len(CLASSES),3))

#loadourserializedmodelfromdisk

print("[INFO]loadingmodel...")

net=cv2.dnn.readNetFromCaffe(prototxt,model_path)

#initialzethevideostream,allowthecameratosensortowarmup,

#andinitlaizetheFPScounter

print('[INFO]startingvideostream...')

vs=cv2.VideoCapture(video_name)

fps=30#保存視頻的FPS,可以適當(dāng)調(diào)整

size=(600,325)

fourcc=cv2.VideoWriter_fourcc(*'XVID')

videowrite=cv2.VideoWriter('output.avi',fourcc,fps,size)

time.sleep(2.0)

定義全局參數(shù):

video_name:輸入視頻的路徑。

prototxt:Caffeprototxt文件的路徑。

model_path:預(yù)訓(xùn)練模型的路徑。

confidence_ta:過濾弱檢測的最小概率閾值。默認(rèn)值為20%。

接下來,讓我們初始化類標(biāo)簽和邊界框顏色。

加載模型。

初始化VideoCapture對象。

設(shè)置VideoWriter對象以及參數(shù)。size的大小由下面的代碼決定,需要保持一致,否則不能保存視頻。

接下就是循環(huán)視頻的幀,然后輸入到檢測器進行檢測,這一部分的邏輯和圖像檢測一致。代碼如下:

#loopovertheframesfromthevideostream

whileTrue:

ret_val,frame=vs.read()

ifret_valisFalse:

break

frame=imutils.resize(frame,width=1080)

print(frame.shape)

#grabtheframedimentionsandconvertittoablob

(h,w)=frame.shape[:2]

blob=cv2.dnn.blobFromImage(cv2.resize(frame,(300,300)),0.007843,(300,300),127.5)

#passtheblobthroughthenetworkandobtainthedetectionsandpredictions

net.setInput(blob)

detections=net.forward()

#loopoverthedetections

foriinnp.arange(0,detections.shape[2]):

#extracttheconfidence(i.e.,probability)associatedwith

#theprediction

confidence=detections[0,0,i,2]

#filteroutweakdetectionsbyensuringthe`confidence`is

#greaterthantheminimumconfidence

ifconfidenceconfidence_ta:

#extracttheindexoftheclasslabelfromthe

#`detections`,thencomputethe(x,y)-coordinatesof

#theboundingboxfortheobject

idx=int(detections[0,0,i,1])

box=detections[0,0,i,3:7]*np.array([w,h,w,h])

(startX,startY,endX,endY)=box.astype("int")

#drawthepredictio

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論