[轉]7行Python代碼的人臉識別
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代碼的人臉識別