天天看點

使用 OpenCV 識别圖檔中的貓咪

你知道 opencv 可以識别在圖檔中小貓的臉嗎?而且是拿來就能用,不需要其它的庫之類的。

之前我也不知道。

下面,我将會展示如何使用 opencv 的貓咪檢測器在圖檔中識别小貓的臉。同樣的,該技術也可以用在視訊流中。

<a target="_blank"></a>

haarcascade_frontalcatface.xml

haarcascade_frontalcatface_extended.xml

這兩個 haar cascade 檔案都将被用來在圖檔中檢測小貓的臉。實際上,我使用了相同的 cascades 分類器來生成這篇博文頂端的圖檔。

下面,我将會展示給你如何使用 howse 的 haar cascades 分類器來檢測圖檔中的小貓。

讓我們開始使用 opencv 來檢測圖檔中的貓咪。建立一個叫 cat_detector.py 的檔案,并且輸入如下的代碼:

<code># import the necessary packages</code>

<code>import argparse</code>

<code>import cv2</code>

<code></code>

<code># construct the argument parse and parse the arguments</code>

<code>ap = argparse.argumentparser()</code>

<code>ap.add_argument("-i", "--image", required=true,</code>

<code>help="path to the input image")</code>

<code>ap.add_argument("-c", "--cascade",</code>

<code>default="haarcascade_frontalcatface.xml",</code>

<code>help="path to cat detector haar cascade")</code>

<code>args = vars(ap.parse_args())</code>

第 2 和第 3 行主要是導入了必要的 python 包。6-12 行用于解析我們的指令行參數。我們僅要求一個必需的參數 <code>--image</code> ,它是我們要使用 opencv 檢測貓咪的圖檔。

我們也可以(可選的)通過 <code>--cascade</code> 參數指定我們的 haar cascade 分類器的路徑。預設使用<code>haarcascades_frontalcatface.xml</code>,假定這個檔案和你的 <code>cat_detector.py</code> 在同一目錄下。

注意:我已經打包了貓咪的檢測代碼,還有在這個教程裡的樣本圖檔。你可以在博文原文的 “下載下傳” 部分下載下傳到。如果你是剛剛接觸 python+opencv(或者 haar cascade),我建議你下載下傳這個 zip 壓縮包,這個會友善你跟着教程學習。

接下來,就是檢測貓的時刻了:

<code># load the input image and convert it to grayscale</code>

<code>image = cv2.imread(args["image"])</code>

<code>gray = cv2.cvtcolor(image, cv2.color_bgr2gray)</code>

<code># load the cat detector haar cascade, then detect cat faces</code>

<code># in the input image</code>

<code>detector = cv2.cascadeclassifier(args["cascade"])</code>

<code>rects = detector.detectmultiscale(gray, scalefactor=1.3,</code>

<code>minneighbors=10, minsize=(75, 75))</code>

在 15、16 行,我們從硬碟上讀取了圖檔,并且進行灰階化(這是一個在将圖檔傳給 haar cascade 分類器之前的常用的圖檔預處理步驟,盡管不是必須的)

20 行,從硬碟加載 haar casacade 分類器,即貓咪檢測器,并且執行個體化 <code>cv2.cascadeclassifier</code> 對象。

在 21、22 行通過調用 <code>detector</code> 的 <code>detectmultiscale</code> 方法使用 opencv 完成貓臉檢測。我們給<code>detectmultiscale</code> 方法傳遞了四個參數。包括:

圖檔 <code>gray</code>,我們要在該圖檔中檢測貓臉。

<code>minneighbors</code> 參數控制了檢定框的最少數量,即在給定區域内被判斷為貓臉的最少數量。這個參數可以很好的排除誤報false-positive結果。

最後,<code>minsize</code> 參數不言自明。這個值描述每個檢定框的最小寬高尺寸(機關是像素),這個例子中就是 75*75

<code>detectmultiscale</code> 函數會傳回 <code>rects</code>,這是一個 4 元組清單。這些元組包含了每個檢測到的貓臉的 (x,y) 坐标值,還有寬度、高度。

最後,讓我們在圖檔上畫下這些矩形來辨別貓臉:

<code># loop over the cat faces and draw a rectangle surrounding each</code>

<code>for (i, (x, y, w, h)) in enumerate(rects):</code>

<code>cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)</code>

<code>cv2.puttext(image, "cat #{}".format(i + 1), (x, y - 10),</code>

<code>cv2.font_hershey_simplex, 0.55, (0, 0, 255), 2)</code>

<code># show the detected cat faces</code>

<code>cv2.imshow("cat faces", image)</code>

<code>cv2.waitkey(0)</code>

給我們這些框(比如,rects)的資料,我們在 25 行依次周遊它。

在 26 行,我們在每張貓臉的周圍畫上一個矩形。27、28 行展示了一個整數,即圖檔中貓咪的數量。

最後,31,32 行在螢幕上展示了輸出的圖檔。

為了測試我們的 opencv 貓咪檢測器,可以在原文的最後,下載下傳教程的源碼。

然後,在你解壓縮之後,你将會得到如下的三個檔案/目錄:

cat_detector.py:我們的主程式

haarcascade_frontalcatface.xml: 貓咪檢測器 haar cascade

images:我們将會使用的檢測圖檔目錄。

到這一步,執行以下的指令:

<code>$ python cat_detector.py --image images/cat_01.jpg</code>

使用 OpenCV 識别圖檔中的貓咪

圖 1. 在圖檔中檢測貓臉,甚至是貓咪部分被遮擋了。

注意,我們已經可以檢測貓臉了,即使它的其餘部分是被遮擋的。

試下另外的一張圖檔:

<code>python cat_detector.py --image images/cat_02.jpg</code>

使用 OpenCV 識别圖檔中的貓咪

圖 2. 使用 opencv 檢測貓臉的第二個例子,這次貓臉稍有不同。

這次的貓臉和第一次的明顯不同,因為它正在發出“喵嗚”叫聲的當中。這種情況下,我們依舊能檢測到正确的貓臉。

在下面這張圖檔的結果也是正确的:

<code>$ python cat_detector.py --image images/cat_03.jpg</code>

使用 OpenCV 識别圖檔中的貓咪

圖 3. 使用 opencv 和 python 檢測貓臉

我們最後的一個樣例就是在一張圖中檢測多張貓臉:

<code>$ python cat_detector.py --image images/cat_04.jpg</code>

圖 4. 在同一張圖檔中使用 opencv 檢測多隻貓

注意,haar cascade 傳回的檢定框不一定是以你預期的順序。這種情況下,中間的那隻貓會被标記成第三隻。你可以通過判斷他們的 (x, y) 坐标來自己排序這些檢定框。

在這個 xml 檔案中的注釋非常重要,joseph hower 提到了這個貓臉檢測器有可能會将人臉識别成貓臉。

這種情況下,他推薦使用兩種檢測器(人臉 &amp; 貓臉),然後将出現在人臉識别結果中的結果剔除掉。

這個算法能夠識别圖檔中的對象,無論它們的位置和比例。而且最令人感興趣的或許是它能在現有的硬體條件下實作實時檢測。

在他們的論文中,viola 和 jones 關注在訓練人臉檢測器;但是,這個架構也能用來檢測各類事物,如汽車、香蕉、路标等等。

haar cascades 最大的問題就是如何确定 <code>detectmultiscale</code> 方法的參數正确。特别是 <code>scalefactor</code> 和<code>minneighbors</code> 參數。你很容易陷入一張一張圖檔調參數的坑,這個就是該對象檢測器很難被實用化的原因。

換句話說,如果 <code>scalefactor</code> 參數過低,你會檢測過多的金字塔圖層。這雖然可以能幫助你檢測到更多的對象。但是他會造成計算速度的降低,還會明顯提高誤報率。haar cascades 分類器就是這樣。

上述的 hog + 線性 svm 架構的參數更容易調優。而且更好的誤報率也更低,但是唯一不好的地方是無法實時運算。

使用 OpenCV 識别圖檔中的貓咪

圖 5. 在 pyimagesearch gurus 課程中學習如何建構自定義的對象識别器。

如果你對學習如何訓練自己的自定義對象識别器感興趣,請務必要去了解下 pyimagesearch gurus 課程。

在這個課程中,我提供了 15 節課,覆寫了超過 168 頁的教程,來教你如何從 0 開始建構自定義的對象識别器。你會掌握如何應用 hog + 線性 svm 架構來建構自己的對象識别器來識别路标、面孔、汽車(以及附近的其它東西)。

盡管 haar cascades 相當有用,但是我們也經常用 hog + 線性 svm 替代。因為後者相對而言更容易使用,并且可以有效地降低誤報率。

原文釋出時間為:2016-07-21

本文來自雲栖社群合作夥伴“linux中國”

繼續閱讀