1. 程式人生 > >[轉]7行Python代碼的人臉識別

[轉]7行Python代碼的人臉識別

scale 說明 cascade pre 寬高 -c ade alphago 滑動窗口

https://blog.csdn.net/wireless_com/article/details/64120516

隨著去年alphago 的震撼表現,AI 再次成為科技公司的寵兒。AI涉及的領域眾多,圖像識別中的人臉識別是其中一個有趣的分支。百度的BFR,Face++的開放平臺,漢王,訊飛等等都提供了人臉識別的API,對於老碼農而言,自己寫一小段代碼,來看看一張圖片中有幾個人,沒有高大上,只是覺得好玩,而且只需要7行代碼。

import cv2

face_patterns = cv2.CascadeClassifier(r‘/usr/local/opt/opencv3/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml‘)

sample_image = cv2.imread(r‘/Users/abel/201612.jpg‘)

faces = face_patterns.detectMultiScale(sample_image,scaleFactor=1.1,minNeighbors=5,minSize=(100, 100))

for (x, y, w, h) in faces:
    cv2.rectangle(sample_image, (x, y), (x+w, y+h), (0, 255, 0), 2)

cv2.imwrite(r‘/Users/abel/201612_detected.png‘, sample_image);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

第1行 引入 OpenCV

開源是偉大的,使我們視野更開闊,而且不用重復造輪子。這裏沒有用PIL,再結合特定算法,而是直接使用了OpenCV(http://opencv.org)。OpenCV是一個基於BSD許可發行的跨平臺計算機視覺庫,可以運行在Linux、Windows和Mac OS操作系統上,輕量而且高效,用C/C++編寫,同時提供了Python、Ruby、MATLAB等接口,實現了圖像處理和計算機視覺方面的很多通用算法。

第2行 加載分類器 cv2.CascadeClassifier

CascadeClassifier是Opencv中做人臉檢測時候的一個級聯分類器,該類中封裝的是目標檢測機制即滑動窗口機制+級聯分類器的方式。數據結構包括Data和FeatureEvaluator兩個主要部分。Data中存儲的是從訓練獲得的xml文件中載入的分類器數據;而FeatureEvaluator中是關於特征的載入、存儲和計算。這裏采用的訓練文件是OpenCV中默認提供的haarcascade_frontalface_default.xml。至於Haar,LBP的具體原理,可以參考opencv的相關文檔,簡單地,可以理解為人臉的特征數據。

第3行 加載目標圖片 imread

人臉識別系統一般分為:人臉圖像采集、人臉圖像預處理、人臉圖像特征提取以及匹配與識別。 簡化起見,之間讀入圖片,這是一張去年中生代北京閉門會的集體照。
技術分享圖片

第4行 多尺度檢測 detectMultiScale

調用 CascadeClassifier 中的調detectMultiScale函數進行多尺度檢測,多尺度檢測中會調用單尺度的方法detectSingleScale。
參數說明:

  • scaleFactor 是 圖像的縮放因子
  • minNeighbors 為每一個級聯矩形應該保留的鄰近個數,可以理解為一個人周邊有幾個人臉
  • minSize 是檢測窗口的大小

這些參數都是可以針對圖片進行調整的,處理結果返回一個人臉的矩形對象列表。

第5行 和 第6行 為每個人臉畫一個框

循環讀取人臉的矩形對象列表,獲得人臉矩形的坐標和寬高, 然後在原圖片中畫出該矩形框,調用的是OpenCV的rectangle 方法,其中矩形框的顏色等是可調整的。

第7行 保存檢測後的結果

萬事具備了,調用imwrite,將檢測後的結果保存到指定的位置。結果圖如下:
技術分享圖片

神秘感不是這7行代碼,而是OpenCV中的相關實現,OpenCV的中文網也是一個學習體會的好場所。

因此,7行代碼只是個噱頭,真正的核心是OpenCV。然後,安裝OpenCV環境的時候就是有一些坑,特別記錄一下。

[轉]7行Python代碼的人臉識別