OpenCV計算機視覺技術(Python語言描述)(微課版)課件 第九章-目標檢測與識別_第1頁
OpenCV計算機視覺技術(Python語言描述)(微課版)課件 第九章-目標檢測與識別_第2頁
OpenCV計算機視覺技術(Python語言描述)(微課版)課件 第九章-目標檢測與識別_第3頁
OpenCV計算機視覺技術(Python語言描述)(微課版)課件 第九章-目標檢測與識別_第4頁
OpenCV計算機視覺技術(Python語言描述)(微課版)課件 第九章-目標檢測與識別_第5頁
已閱讀5頁,還剩64頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

目標檢測與識別Section目標檢測貓狗目標檢測在“圖像特征檢測”這一章節中,我們采取檢測圖像的主要特征的辦法,通過單應性來檢測這些圖像是否存在另一幅圖像中。而目標檢測與識別,即是通過遍歷檢測圖像各個區域是否有感興趣的對象,并在已檢測到對象的區域中對該對象進行識別。在該章節中,我們將首先從OpenCV進行行人檢測的探討,然后再利用相關的技術進行貓和狗的目標檢測與識別。目標檢測要實現目標檢測,我們需要了解到涉及該方面的技術——梯度直方圖(HistogramofOrientedGradient,HOG)、支持向量機與非極大值抑制。梯度直方圖是一種特征描述符,與“圖像分割”一章的各個特征描述符SIFT、Fast、ORB為相同類型。HOG在計算直方圖時并不是通過顏色值進行計算,而是通過圖像局部區域的梯度方向進行計算和統計,從而構建特征。如圖中,首先將圖像進行灰度化的預處理,是否進行灰度化處理其實對梯度計算影響并不是很大,彩色圖像也可以進行直接計算。在此為了簡單起見,從而進行灰度化處理,接著進行計算每一個像素點的梯度值,得到梯度圖,如圖右下角。

對梯度圖進行水平梯度與豎直梯度的計算,即可獲得水平梯度為150-70=80,豎直梯度為110-50=60。如圖左和圖右分別為處理過的水平梯度圖與豎直梯度圖。將水平梯度圖與豎直梯度圖進行壓縮。例如,創建一個64(8×8)個梯度向量的直方圖,然后創建各個方向的箱子(將180°切分為多個20°,則總共為180°/20°=9個箱子),這樣即可將64個梯度向量總結到僅9個值,如圖所示。將以上方法對圖像所有像素塊逐個進行壓縮后的梯度直方圖進行顯示,即可得到我們所需的HOG特征,如圖所示。HOG特征非常強大,它可以被用來和支持向量機分類器SVM結合進行目標檢測;也可以使用一個滑窗探測器在圖像上滑動檢測圖像各個區域,并計算各個區域的HOG特征;也可以使用圖像金字塔來處理圖像的縮放問題。支持向量機(SVM)用于解決支持分類和回歸問題。在此使用SVM對帶有標簽的訓練數據集進行分類,如圖所示為SVM示意圖,在一個超平面中對所有數據進行分類,實心球與空心球分別代表不同的類別,并且兩種類別的數據顯然是線性可分的,其中黑色實線為決策邊界,決策邊界則是對應著一個線性分類器,并為此兩種代表不同的類別進行分類。在大多數情況,大部分的數據并不是線性可分的,則在這種情況中SVM還使用了一種稱為KernalTrick(支持向量機的核函數)的技術進行數據的轉換。將原始空間中的向量作為輸入向量,并返回特征空間中向量的點積(內積)的函數稱為核函數。核函數通常表示為:K(x_i,x_j)=<f(x_i),f(x_j)>其中K()為核函數,xi和xj是n維的輸入值,<>為內積,f()是從n維到m維的映射。

核函數的本質作用為將低維空間的線性不可分類問題,選用恰當的核函數將可以轉化為高維空間的線性可分,進而可以在高維空間找到分類的最優邊界(超平面),如圖所示。在機器學習中,有幾類常用的核函數用于SVM分類器的訓練,并且在OpenCV的SVM中也自帶有這幾類核函數:非極大值抑制(Non-MaximumSuppression,NMS),其作用就是抑制不是極大值的元素,也是對圖像數據的局部最大搜索。如圖所示的行人檢測中,滑動探測器經過滑動提取HOG特征,并且經過分類器分類識別后,每個窗口就會得到一個分數,但是滑動探測器有可能會導致圖像中有些窗口與其他窗口存在包含的情況。所以在這時候就需要用到NMS來選取那些鄰域里分數最高的窗口,并且抑制住其他分數低的窗口。OpenCV中具有自帶的HOG特征提取函數為HOGDescriptor()函數。以下將以該函數完成行人的檢測,并對行人進行標記框選。效果如圖。程序中首先創建一個OpenCV自帶的HOGDescriptor()函數,并且采用OpenCV自帶的已經訓練好的SVM分類器進行圖像檢測。在進行圖像檢測時,將圖像進行預處理比例縮放,之后采用detectMultiScale()函數進行圖像行人檢測,再對檢測完成后的結果進行非極大值抑制處理(此處采用了imutils庫中的非極大值抑制處理函數進行處理),在處理完成后將檢測結果進行可視化。用于提取圖像的HOG特征的實例:第一個參數,tuple類型的winSize,表示遍歷圖像的每個滑動探測器窗口的大小。第二個參數,tuple類型的blockSize,表示每個滑動探測器窗口里的塊大小。第三個參數,tuple類型的blockStride,表示每個塊的滑動增量。第四個參數,tuple類型的cellSize,表示每個塊中的胞元大小。第五個參數,tuple類型的nbins,表示每個胞元中統計梯度的方向數目。cv2.HOGDescriptor().setSVMDetector(_svmdetector)->None第一個參數,numpy.ndarray類型的_svmdetector,表示設置SVM分類器cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins)第一個參數,numpy.ndarray類型的img,表示進行檢測的圖像。第二個參數,float類型的hisThreshold,表示控制HOG特征與SVM最優超平面間的最大距離,當距離小于閾值時則判定為目標。第三個參數,tuple類型的winStride,表示HOG滑窗探測器窗口的滑動增量。cv2.HOGDescriptor().detectMultiScale(img,hitThreshold,winStride,padding,scale,finalThreshold,useMeanshiftGrouping)->foundLocations,foundWeights第四個參數,tuple類型的padding,表示對圖像的邊緣添加像素。第五個參數,float類型的scale,表示對圖像金字塔的層數控制,參數越小,層數越多。第六個參數,float類型的finalThreshold,表示檢測結果的聚類參數。cv2.HOGDescriptor().detectMultiScale(img,hitThreshold,winStride,padding,scale,finalThreshold,useMeanshiftGrouping)->foundLocations,foundWeights第七個參數,bool類型的useMeanshiftGrouping,表示是否應用meanshift來消除重疊,默認為false。第一個返回的參數,numpy.ndarray類型的foundLocations,表示檢測到的目標的位置。第二個返回的參數,numpy.ndarray類型的foundWeights,表示檢測到的目標的權重。cv2.HOGDescriptor().detectMultiScale(img,hitThreshold,winStride,padding,scale,finalThreshold,useMeanshiftGrouping)->foundLocations,foundWeights貓狗目標檢測通過目標檢測這一小節中,我們了解了HOG特征描述符、支持向量機、非極大值抑制的內容,并且通過簡單的行人檢測程序,了解了如何使用以上內容相結合并對行人進行檢測。接下來,我們將利用以上內容完成一個貓狗目標檢測的項目程序。我們將從訓練自己的貓狗模型,并使用該模型實現進行對貓狗的檢測。在該目標檢測程序中,我們將對貓和狗進行識別與檢測。由于目標檢測中的目標類型是沒有限制的,貓和狗的類型有非常多,為了使目標檢測結果能夠足夠準確,而我們需要一個足夠大的數據集供我們程序進行訓練。該程序我們使用了網上現成的數據集進行訓練與測試:在我們將程序分為貓狗識別模塊和貓狗檢測模塊,先分別獲取貓和狗的HOG特征保存在各自的特征文件夾中,再使用SVM進行訓練并保存訓練參數,最后使用該已訓練好的SVM模型進行測試。其中detector.py為貓狗檢測模塊,train_and_test.py為貓狗識別模塊,obtain_hog.py為貓狗數據集HOG特征提取模塊,hog.py為HOG特征描述符模塊。test、train文件夾中分別用于存放貓狗的HOG特征,作為貓狗識別程序中訓練與測試的數據。DataSets用于存放貓狗的數據集。貓狗識別模塊從DataSets文件夾中提供的素材進行貓狗數據采集,并將采集到的貓狗數據進行HOG特征提取,并將各個貓狗數據的HOG特征存儲到test與train文件夾中,再對HOG特征進行SVM訓練。在進行貓狗識別時,我們需要對貓狗進行HOG特征的提取,才可以進行貓狗的識別。首先我們需要對HOG特征描述符模塊的代碼進行了解。HOG特征提取HOG特征提取HOG特征提取HOG特征提取在HOG特征描述符模塊中,hog_clf()函數為HOGDescriptor的初始化函數,computeHog()函數為HOG特征描述符的計算。該模塊用于貓狗識別模塊和貓狗檢測模塊的HOG特征描述符操作。第一個參數,numpy.ndarray類型的roi,表示需要計算HOG特征描述符的圖像。第二個參數,tuple類型的winStride,表示HOG滑窗探測器窗口的滑動增量,必須為HOGDescriptor的blockStride的倍數。HOG特征提取cv2.HOGDescriptor().compute(img,winStride,padding,locations)->descriptors第一個參數,numpy.ndarray類型的roi,表示需要計算HOG特征描述符的圖像。第二個參數,tuple類型的winStride,表示HOG滑窗探測器窗口的滑動增量,必須為HOGDescriptor的blockStride的倍數。HOG特征提取cv2.HOGDescriptor().compute(img,winStride,padding,locations)->descriptors對HOG特征描述符模塊完成了解后,我們現在對HOG特征提取模塊進行了解。HOG特征提取HOG特征提取HOG特征提取HOG特征提取HOG特征提取程序中首先判斷數據特征文件與模型文件是否存在,如果存在則清空文件,保證每次運行程序時能夠重新提取數據的特征。cv2_read_images()函數以OpenCV讀取數據集文件與數據標簽存入到列表中,并對其進行批量灰度化處理與提取HOG特征描述符,最后使用joblib庫進行貓狗數據HOG特征描述符的存儲,該操作方便后續訓練模型而進行讀取數據,節省了訓練模型時再次提取HOG特征描述符的時間。HOG特征提取在貓狗數據的HOG特征完成提取后,在貓狗識別模塊中對HOG特征描述符進行模型訓練。訓練模型訓練模型訓練模型訓練模型訓練模型訓練模型程序中首先使用joblib庫讀取訓練集特征文件夾中所有文件,并創建SVM模型對其所有訓練集的HOG特征進行訓練。訓練完畢后保存模型并對模型進行預測,提取測試集特征文件夾中所有文件,使用訓練好的SVM模型進行預測并返回預測結果,最后計算預測結果準確率并輸出。訓練模型用于創建SVM實例:第一個參數,int類型的kernelType,表示設置/獲取SVM核函數類型,SVM核函數類型如“OpenCVSVM核函數類型表”,默認值為cv2.ml.SVM_RBF。訓練模型cv2.ml.SVM_create().setKernel(kernelType)->None訓練模型訓練模型在SVM核函數中,不同的核函數則需要對參數進行調整,以達到線性可分,參數修改的函數如“OpenCVSVM核函數的參數相關函數”。第一個參數,int類型的val,表示設置SVM類型,SVM類型如“OpenCVSVM類型”,默認值為cv2.ml.SVM_C_SVC。訓練模型cv2.ml.SVM_create().setType(val)->None訓練模型在SVM類型中,對不同SVM類型的優化問題的參數進行調整,以優化SVM,參數修改的函數如“OpenCVSVM優化問題的參數相關函數”。訓練模型第一個參數,numpy.ndarray類型的samples,數據的類型為numpy.float32,表示訓練樣本。第二個參數,int類型的layout,表示訓練樣本的類型,訓練樣本的類型包括如“OpenCV訓練樣本類型枚舉”。第三個參數,numpy.ndarry類型的responses,表示訓練樣本對應的結果標簽。第一個返回的參數,bool類型的retval,表示模型訓練是否完成。訓練模型cv2.ml.SVM_create().train(samples,layout,responses)-> retval訓練模型第一個參數,str類型的filename,表示模型保存的路徑與模型文件名。cv2.ml.SVM_create().predict(samples,results,flags)->retval,results第一個參數,numpy.ndarray類型的samples,表示輸入樣本,數據格式必須和訓練樣本一致。第二個參數,numpy.ndarray類型的results,輸出的結果,表示輸入樣本的每個樣本的測試結果,默認值為None。訓練模型cv2.ml.SVM_create().save(filename)->None第三個參數,int類型的flags,表示可選返回結果類型,當參數設置為cv2.ml.STAT_MODEL_RAW_OUTPUT時,返回參數results將為預測的評分,默認值為None。第一個返回的參數,float類型的retval,不采用。第二個返回的參數,numpy.ndarray類型的results,表示輸出對應樣本的預測結果。訓練模型cv2.ml.SVM_create().save(filename)->None貓狗檢測模塊利用訓練模型中已訓練好的SVM模型進行加載,并使用該模型對貓狗圖像進行HOG特征提取并進行預測與貓狗區域定位,如圖9-8所示。貓狗檢測貓狗檢測貓狗檢測貓狗檢測貓狗檢測貓狗檢測貓狗檢測程序中首先加載需要進行檢測的圖像,并對其進行縮放與灰度處理,然后使用SVM_load()函數加載訓練完成的SVM模型,并初始化HOGDescriptor()函數,使用getSupportVectors()函數與getDecisionFunction()函數獲取SVM模型的支持向量與決策函數系數從而設置HOG的SVM分類器。完成設置后,對圖像采用detectMultiScale()函數進行圖像檢測,再進行非極大值抑制處理,最后在處理完成后將檢測結果進行可視化。第一個參數,str類型的filepath,表示需要加載的SVM模型的文件路徑。第一個返回的參數,cv2.ml_SVM類型的retval,表示加載完畢的SVM模型的實

溫馨提示

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

評論

0/150

提交評論