OpenCV行人檢測_OpenCV

來源:互聯網
上載者:User

註:本文翻譯自:Pedestrian Detection OpenCV。

你知道OpenCV裡面已經內建的行人檢測方法嗎。在OpenCV裡面,有一個預先訓練好了的HOG+線性SVM模型,能夠對映像和視頻中的行人進行檢測。如果你還不熟悉方向梯度長條圖HOG和線性SVM方法,我建議你閱讀方向梯度長條圖和物體檢測這篇文章,在這篇文章中,我對該架構分了6步進行討論。

如果你已經熟悉了這個過程,或者你僅僅只是想看看OpenCV行人檢測的代碼,那麼現在就開啟一個新檔案,並將它命名為detect.py,開始我們的編程之旅吧:

 1 # import the necessary packages 2 from __future__ import print_function 3 from imutils.object_detection import non_max_suppression 4 from imutils import paths 5 import numpy as np 6 import argparse 7 import imutils 8 import cv2 9 10 # construct the argument parse and parse the arguments11 ap = argparse.ArgumentParser()12 ap.add_argument("-i", "--images", required=True, help="path to images directory")13 args = vars(ap.parse_args())14 15 # initialize the HOG descriptor/person detector16 hog = cv2.HOGDescriptor()17 hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

第2-8行匯入一些我們必要的包,我們匯入print_function確保我們的代碼同時在Python2.7和Python3上相容,這樣可以使得我們的代碼能夠在OpenCV2.4.X和OPenCV3上都能夠工作,然後,從我的imutils包中我們匯入non_max_suppression函數。

如果你還沒有安裝imutils,可以通過pip來安裝:

$ pip install imutils

如果你已經安裝了imutils,你需要把它更新到最新版(v0.3.1),在這個版本裡面,包含了non_max_suppression函數的實現,以及其它一些微小的更新:

$ pip install --upgrade imutils

我已經在我的PyImageSearch部落格上在兩次講到過非極大抑制(non-maxima suppression)方法,一次是在Python非極大抑制用於物體檢測,一篇是在用Python實現更快的非極大抑制,無論是哪一種情形,非極大抑制的宗旨都是擷取多個重疊的邊框(bounding box),並且將他們減少至僅有一個邊框。

圖1:左圖有很多檢測錯誤的邊框;右圖採用非極大抑制後,使得我們可以抑制那些重疊的地區,將正確的邊框留下來。

非極大抑制方法可以減少在進行行人檢測過程中的假陽率。

第11-13行處理我們命令列傳入的參數,這裡,我們只需要一個切換--images,用它來傳入待檢測行人的映像目錄。

最後,第16行和17行初始化我們的行人檢測器。首先,我們調用hog = cv2.HOGDescriptor()來初始化方向梯度長條圖描述子,然後,我們調用setSVMDetector來設定支援向量機(Support Vector Machine)使得它成為一個預先訓練好了的行人檢測器。

到了這裡,我們的OpenCV行人檢測器已經完全載入了,我們只需要把它應用到一些映像上:

 1 # import the necessary packages 2 from __future__ import print_function 3 from imutils.object_detection import non_max_suppression 4 from imutils import paths 5 import numpy as np 6 import argparse 7 import imutils 8 import cv2 9 10 # construct the argument parse and parse the arguments11 ap = argparse.ArgumentParser()12 ap.add_argument("-i", "--images", required=True, help="path to images directory")13 args = vars(ap.parse_args())14 15 # initialize the HOG descriptor/person detector16 hog = cv2.HOGDescriptor()17 hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())18 19 # loop over the image paths20 for imagePath in paths.list_images(args["images"]):21  # load the image and resize it to (1) reduce detection time22  # and (2) improve detection accuracy23  image = cv2.imread(imagePath)24  image = imutils.resize(image, width=min(400, image.shape[1]))25  orig = image.copy()26 27  # detect people in the image28  (rects, weights) = hog.detectMultiScale(image, winStride=(4, 4),29      padding=(8, 8), scale=1.05)30 31  # draw the original bounding boxes32  for (x, y, w, h) in rects:33      cv2.rectangle(orig, (x, y), (x + w, y + h), (0, 0, 255), 2)34 35  # apply non-maxima suppression to the bounding boxes using a36  # fairly large overlap threshold to try to maintain overlapping37  # boxes that are still people38  rects = np.array([[x, y, x + w, y + h] for (x, y, w, h) in rects])39  pick = non_max_suppression(rects, probs=None, overlapThresh=0.65)40 41  # draw the final bounding boxes42  for (xA, yA, xB, yB) in pick:43      cv2.rectangle(image, (xA, yA), (xB, yB), (0, 255, 0), 2)44 45  # show some information on the number of bounding boxes46  filename = imagePath[imagePath.rfind("/") + 1:]47  print("[INFO] {}: {} original boxes, {} after suppression".format(48      filename, len(rects), len(pick)))49 50  # show the output images51  cv2.imshow("Before NMS", orig)52  cv2.imshow("After NMS", image)53  cv2.waitKey(0)

在第20行我們對我們的--images目錄下的映像進行迴圈,這篇博文中使用的例子樣本是從INRIA Person Dataset這個很流行的人物庫上抽取的,更具體的說,是從GRAZ-01子集中抽取出來的,這些圖片存放在源碼目錄下面了。

第23-25行載入磁碟中的映像,並且將映像裁剪到最大寬度為400個像素,之所以降低我們的映像維度(其實就是之所以對我們的映像尺寸進行裁剪)主要有兩個原因: 減小映像的尺寸可以減少在影像金字塔中滑窗的數目,如此可以降低檢測的時間,從而提高整體檢測的輸送量。 調整映像的尺寸能夠整體提高行人檢測的精度,也就是假陽率。

真正對映像中的行人進行檢測的代碼是在第28行和29行,通過調用detectMultiScale的hog描述子方法。這個detectMultiScale方法構造了一個尺度scale=1.05的影像金字塔,以及一個分別在x方向和y方向步長為(4,4)像素大小的滑窗。

視窗的大小固定在32*128像素大小,這個設定是按照 seminal Dalal和Triggs論文來設定的。detectMultiScale函數會返回一個2-元組的rects,或者是映像中每一個行人的邊框座標(x,y),以及由SVM在每一次檢測中返回的weights置信值(我們一般也成為分數,譯者注)。

scale的尺度設定得越大,在影像金字塔中層的數目就越少,相應的檢測速度就越快,但是尺度太大會導致行人出現漏檢;同樣的,如果scale設定得太小,將會急劇的增加影像金字塔的層數,這樣不僅耗費計算資源,而且還會急劇地增加檢測過程中出現的假陽數目(也就是不是行人的被檢測成行人)。這表明,scale是在行人檢測過程中它是一個重要的參數,需要對scale進行調參。我會在後面的文章中對detectMultiScale中的每個參數做些調研。

第32行和33行擷取我們的初始邊框,並將它們在映像上框出來。

不過,你將會看到在一些映像上有的行人框出來的框,有很多重疊的邊框,如上面1圖所示。

針對這種情況,我們有兩種選擇。一種選擇是檢測一個邊框是否完全包含了另一個邊框(你可以看看OpenV中的一些實現例子)。另外一種選擇是應用非極大抑制方法,通過設定一個閾值來抑制那些重疊的邊框,這就是第38行和39行所乾的事。

注意:如果你想瞭解更多HOG架構和非極大抑制,我推薦你閱讀方向梯度長條圖和物體檢測。在那篇博文中,你可以查看Python非極大抑制用於物體檢測,以及後面更新的Malisiewicz方法。

在應用非極大抑制後,我們在第42行和43行畫出最終的邊框,在第46-48行中我們展示映像的一些基本資料,以及檢測到的邊框數目,在第51-53行,在螢幕最終顯示我們輸入的映像。 行人檢測結果

為了看看我們寫的行人檢測指令碼的實際效果,我們只需要執行下面命令:

$ python detect.py --images images

下圖是一張行人檢測的結果圖:

圖2:檢測效果

上圖我們檢測到了站在警車旁的單個行人。

圖3:在前景和背景中分別檢測到了1個人

上面我們可以看到在前景中的男人被檢測到了,同時背景中推著嬰兒車的女人也檢測到了。

圖4:一個展示為什麼用非極大抑制很重要的例子

圖4的例子展示了為什麼用非極大抑制很重要。detectMultiScale函數除了將正確的邊框檢測出來外,還把兩個邊框邊框檢測出來了,這兩個錯誤的邊框將映像中的行人覆蓋了。通過使用非極大抑制,我們可以抑制錯誤的邊框,只留下正確檢測的邊框。

圖5:另一個展示非極大抑制效果的例子

我們再一次可以看到,有很多錯誤的邊框被檢測出來了,通過使用非極大抑制,我們可以抑制錯誤的邊框,只留下正確檢測的邊框。

圖6:在一個購物中心檢測行人

圖6在一個購物中心進行行人檢測,圖中,有兩個人正向網路攝影機走進,另外一個人正遠離網路攝影機,不管是哪種情形,我們的HOG檢測方法都能夠準確的檢測出行人。在non_maxima_suppression函數中較大的overlapThresh能夠確保那些部分重疊了的邊框不會被抑制。

圖7:在模糊圖片中檢測行人

老實說,我對上面圖片的檢測結果有點兒驚訝,因為一般而言HOG描述子在移動模糊的圖片上檢測效果不是很好,不過在這幅映像上,我們卻將行人檢測出來了。

圖8:在室外街道上檢測行人

這裡有另外一個多個重疊邊框的例子,不過因為我們的overlapThresh設定得比較大,所以這些邊框沒有被抑制,從而能夠將正確的檢測結果留下來。

圖9:檢測一張具有4個成員的家庭的圖片

圖9的例子展示了HOG+SVM行人檢測器的多功能性,我們不僅能夠檢測到成年的男人,也能夠檢測到那三個小孩(注意:該檢測器不能檢測到躲藏在他老爸後面的小孩)。

圖10:對路標標識進行行人檢測

我將圖10放在最後是因為我發覺這非常的有趣,我們可以很清楚的看到這隻是一個路標標識,標識表示行人穿越道,然而,HOG+SVM檢測器將它們在圖中框出來了,實際上它們卻並不是行人。 總結

在這篇博文中,我們已經學到了怎樣使用OpenCV的庫以及Python來進行行人檢測。

實際上OpenCV庫已經內建了一個預先訓練好了的HOG+線性SVM檢測器的模型,它是基於Dalal和Triggs論文裡的方法來自動的實現映像中行人的檢測。

雖然HOG的方法比Haar counter-part的精度要高,不過它仍需要對detectMultiScale進行合理的設定。在後面的博文中,我會對detectMultiScale中的每一個參數做一個調研,已經怎樣調參的細節,並陳述在精度和效能之間的折中。

不管怎麼說,我都希望你喜歡這篇博文。我正打算在後面給出更多的關於物體檢測的教程,如果你希望這些教程出來後能夠獲得及時的通知,你可以考慮訂閱我的部落格。

我已經在PyImageSearch Gurus course裡麵包含了HOG+線性SVM的物體檢測方法,你可以看看。

from: http://yongyuan.name/blog/pedestrian-detection-opencv.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.