使用Python,Opencv檢測圖像,視訊中的貓🐱
這篇部落格将介紹如何使用Python,OpenCV庫附帶的預設Haar級聯檢測器來檢測圖像中的貓。同樣的技術也可以應用于視訊流。這些哈爾級聯由約瑟夫·豪斯(Joseph Howse)訓練并貢獻給OpenCV項目。
雖然哈爾級聯非常有用,但通常使用HOG+線性SVM,因為它更容易調整檢測器參數,更重要的是可以享受更低的假陽性檢測率。
在haarcscades目錄中(OpenCV存儲所有經過預訓練的Haar分類器以檢測各種對象、身體部位等模型)
- haarcascade_frontalcatface.xml
-
haarcascade_frontalcatface_extended.xml
這倆個模型用來檢測圖像中的“貓臉”;
1. 效果圖
單貓檢測圖效果圖如下:

多貓檢測效果圖如下:
可以看到有的并沒有檢測出來,優化可以用HOG+SVG檢測模型;
2. 原理
2.1 opecv預置的模型
使用OpenCV,Haar級聯檢測器進行面部、眼睛、嘴部檢測
傳奇人物約瑟夫·豪斯(Joseph Howse)對級聯進行了教育訓練,并将其貢獻給了OpenCV存儲庫,他撰寫了大量關于計算機視覺的教程、書籍和演講。
2.2 cv2.CascadeClassifer & detector.detectMultiScale
- cv2.CascadeClassifer從磁盤加載預先訓練好的Haar級聯檢測器:
- detectMultiScale對其進行預測:
# gray 灰階圖
# scaleFactor 檢測貓臉時使用的圖像金字塔的scaleFactor。更大的比例因子将提高檢測器的速度,但可能會損害陽性檢測精度。相反,較小的規模将減緩檢測過程,但會增加陽性檢測。然而,這種較小的尺度也會增加假陽性檢測率。
# minNeighbors參數控制給定區域中檢測到的邊界框的最小數量,以将該區域視為“貓臉”。此參數在修剪假陽性檢測時非常有用。
# minSize參數非常簡單。該值確定每個檢測到的邊界框至少為寬度x高度像素(在本例中為75 x 75)。
# 傳回值:矩形框清單,每一個是包含4個點的tuple
results = detector.detectMultiScale(
gray, scaleFactor=1.05, minNeighbors=5,
minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)
- 注意,Haar級聯按照您可能不喜歡的順序傳回邊界框。 在這種情況下,中間的貓實際上被标記為第三隻貓。可以通過根據邊界框的(x,y)坐标對邊界框進行排序來解決這個“問題”,以實作一緻的排序。
- 關于準确性的簡要說明:在.xml檔案的注釋部分,Joseph Howe詳細介紹了貓檢測器Haar cascades可以在有人臉的地方報告貓的臉。在這種情況下,他建議同時執行面部檢測和貓檢測,然後丢棄與面部邊界框重疊的任何貓邊界框。
2.3 haar級聯模型詳解
保羅·維奧拉(Paul Viola)和邁克爾·瓊斯(Michael Jones)于2001年首次發表了 《使用簡單特征的增強級聯快速目标檢測》(Rapid Object Detection using a Boosted Cascade of Simple Features),這部原創作品已成為計算機視覺領域被引用最多的論文之一。
- 該算法能夠檢測圖像中的對象,而不管它們的位置和大小。該探測器可以在現代硬體上實時運作。
- 維奧拉和瓊斯專注于訓練人臉檢測器;然而,該架構也可用于訓練檢測器以識别任意“物體”,如汽車、香蕉、路标等。
-
Haar級聯的最大問題是正确擷取detectMultiScale參數,特别是scaleFactor和minNeighbors。很多情況需要逐個圖像調整這兩個參數的情況,這在使用對象檢測器時遠遠不夠理想。
scaleFactor變量控制用于檢測圖像不同比例對象的圖像金字塔。如果scaleFactor太大,那麼将隻評估圖像金字塔的幾個層,這可能會導緻丢失位于金字塔層之間的比例的對象。
如果将scaleFactor設定得太低,則會計算許多金字塔層。這将有助于檢測圖像中的更多對象,但它(1)使檢測過程變慢,(2)大大提高了假陽性檢測率,這是哈爾級聯的著名之處。
-
為了優化它的問題:通常使用定向梯度直方圖+線性SVM檢測。
HOG+線性SVM架構參數通常更容易調整,最重要的是,HOG+線型SVM具有更小的假陽性檢測率。唯一的缺點是很難讓HOG+線性SVM實時運作。
3. 源碼
# 使用Python,OpenCV庫中的貓臉檢測器對圖檔進行貓臉檢測
# USAGE
# python cat_detector.py --image images/cat_01.jpg
# 導入必要的包
import argparse
import cv2
import imutils
# 建構指令行參數及解析
# -image 貓臉照片
# -cascade 模型檔案路徑
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
help="path to the input image")
ap.add_argument("-c", "--cascade",
default="haarcascade_frontalcatface_extended.xml",
help="path to cat detector haar cascade")
args = vars(ap.parse_args())
# 加載圖檔,轉化為灰階圖
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 加載貓臉級聯檢測器,然後檢測貓臉
detector = cv2.CascadeClassifier(args["cascade"])
# gray 灰階圖
# scaleFactor 檢測貓臉時使用的圖像金字塔的scaleFactor。更大的比例因子将提高檢測器的速度,但可能會損害陽性檢測精度。
# 相反,較小的規模将減緩檢測過程,但會增加陽性檢測。然而,這種較小的尺度也會增加假陽性檢測率。
# minNeighbors參數控制給定區域中檢測到的邊界框的最小數量,以将該區域視為“貓臉”。此參數在修剪假陽性檢測時非常有用。
# minSize參數非常簡單。該值確定每個檢測到的邊界框至少為寬度x高度像素(在本例中為75 x 75)。
rects = detector.detectMultiScale(gray, scaleFactor=1.3,
minNeighbors=10, minSize=(75, 75))
print(len(rects))
# 周遊貓臉,并繪制矩形框
for (i, (x, y, w, h)) in enumerate(rects):
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.putText(image, "Cat #{}".format(i + 1), (x, y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.55, (0, 0, 255), 2)
# 展示檢測到的貓臉🐱
cv2.imshow("Cat Faces", imutils.resize(image,width=600))
cv2.waitKey(0)
參考
- https://pyimagesearch.com/2016/06/20/detecting-cats-in-images-with-opencv/