天天看點

使用Python,Opencv檢測圖像,視訊中的貓使用Python,Opencv檢測圖像,視訊中的貓🐱

使用Python,Opencv檢測圖像,視訊中的貓🐱

這篇部落格将介紹如何使用Python,OpenCV庫附帶的預設Haar級聯檢測器來檢測圖像中的貓。同樣的技術也可以應用于視訊流。這些哈爾級聯由約瑟夫·豪斯(Joseph Howse)訓練并貢獻給OpenCV項目。

雖然哈爾級聯非常有用,但通常使用HOG+線性SVM,因為它更容易調整檢測器參數,更重要的是可以享受更低的假陽性檢測率。

在haarcscades目錄中(OpenCV存儲所有經過預訓練的Haar分類器以檢測各種對象、身體部位等模型)

  • haarcascade_frontalcatface.xml
  • haarcascade_frontalcatface_extended.xml

    這倆個模型用來檢測圖像中的“貓臉”;

1. 效果圖

單貓檢測圖效果圖如下:

使用Python,Opencv檢測圖像,視訊中的貓使用Python,Opencv檢測圖像,視訊中的貓🐱

多貓檢測效果圖如下:

可以看到有的并沒有檢測出來,優化可以用HOG+SVG檢測模型;

使用Python,Opencv檢測圖像,視訊中的貓使用Python,Opencv檢測圖像,視訊中的貓🐱

2. 原理

2.1 opecv預置的模型

使用OpenCV,Haar級聯檢測器進行面部、眼睛、嘴部檢測

使用Python,Opencv檢測圖像,視訊中的貓使用Python,Opencv檢測圖像,視訊中的貓🐱

傳奇人物約瑟夫·豪斯(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/

繼續閱讀