
隨著去年alphago 的震撼表現(xiàn),AI 再次成為科技公司的寵兒。AI涉及的領(lǐng)域眾多,圖像識(shí)別中的人臉識(shí)別是其中一個(gè)有趣的分支。百度的BFR,F(xiàn)ace++的開(kāi)放平臺(tái),漢王,訊飛等等都提供了人臉識(shí)別的API,對(duì)于老碼農(nóng)而言,自己寫一小段代碼,來(lái)看看一張圖片中有幾個(gè)人,沒(méi)有高大上,只是覺(jué)得好玩,而且只需要7行代碼。
import cv2
face_patterns = cv2.CascadeClassifier('/usr/local/opt/opencv3/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml')
sample_image = cv2.imread('/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('/Users/abel/201612_detected.png', sample_image);
第1行 引入 OpenCV
開(kāi)源是偉大的,使我們視野更開(kāi)闊,而且不用重復(fù)造輪子。這里沒(méi)有用PIL,再結(jié)合特定算法,而是直接使用了OpenCV(http://opencv.org)。OpenCV是一個(gè)基于BSD許可發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺(jué)庫(kù),可以運(yùn)行在Linux、Windows和Mac OS操作系統(tǒng)上,輕量而且高效,用C/C++編寫,同時(shí)提供了Python、Ruby、MATLAB等接口,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺(jué)方面的很多通用算法。
第2行 加載分類器 cv2.CascadeClassifier
CascadeClassifier是Opencv中做人臉檢測(cè)時(shí)候的一個(gè)級(jí)聯(lián)分類器,該類中封裝的是目標(biāo)檢測(cè)機(jī)制即滑動(dòng)窗口機(jī)制+級(jí)聯(lián)分類器的方式。數(shù)據(jù)結(jié)構(gòu)包括Data和FeatureEvaluator兩個(gè)主要部分。Data中存儲(chǔ)的是從訓(xùn)練獲得的xml文件中載入的分類器數(shù)據(jù);而FeatureEvaluator中是關(guān)于特征的載入、存儲(chǔ)和計(jì)算。這里采用的訓(xùn)練文件是OpenCV中默認(rèn)提供的haarcascade frontalface default.xml。至于Haar,LBP的具體原理,可以參考o(jì)pencv的相關(guān)文檔,簡(jiǎn)單地,可以理解為人臉的特征數(shù)據(jù)。
第3行 加載目標(biāo)圖片 imread
人臉識(shí)別系統(tǒng)一般分為:人臉圖像采集、人臉圖像預(yù)處理、人臉圖像特征提取以及匹配與識(shí)別。 簡(jiǎn)化起見(jiàn),之間讀入圖片,這是一張去年中生代北京閉門會(huì)的集體照。

第4行 多尺度檢測(cè) detectMultiScale
調(diào)用 CascadeClassifier 中的調(diào)detectMultiScale函數(shù)進(jìn)行多尺度檢測(cè),多尺度檢測(cè)中會(huì)調(diào)用單尺度的方法detectSingleScale。 參數(shù)說(shuō)明:
scaleFactor 是 圖像的縮放因子
minNeighbors 為每一個(gè)級(jí)聯(lián)矩形應(yīng)該保留的鄰近個(gè)數(shù),可以理解為一個(gè)人周邊有幾個(gè)人臉
minSize 是檢測(cè)窗口的大小
這些參數(shù)都是可以針對(duì)圖片進(jìn)行調(diào)整的,處理結(jié)果返回一個(gè)人臉的矩形對(duì)象列表。
第5行 和 第6行 為每個(gè)人臉畫一個(gè)框
循環(huán)讀取人臉的矩形對(duì)象列表,獲得人臉矩形的坐標(biāo)和寬高, 然后在原圖片中畫出該矩形框,調(diào)用的是OpenCV的rectangle 方法,其中矩形框的顏色等是可調(diào)整的。
第7行 保存檢測(cè)后的結(jié)果
萬(wàn)事具備了,調(diào)用imwrite,將檢測(cè)后的結(jié)果保存到指定的位置。結(jié)果圖如下:

神秘感不是這7行代碼,而是OpenCV中的相關(guān)實(shí)現(xiàn),OpenCV的中文網(wǎng)也是一個(gè)學(xué)習(xí)體會(huì)的好場(chǎng)所。
因此,7行代碼只是個(gè)噱頭,真正的核心是OpenCV。然后,安裝OpenCV環(huán)境的時(shí)候就是有一些坑,特別記錄一下。
基于Mac的OpenCV環(huán)境
建議使用Brew 安裝,如果沒(méi)有安裝brew,先執(zhí)行下面命令:
$/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
然后,指定目標(biāo)倉(cāng)庫(kù) $brew tap homebrew/science
安裝OpenCV3 $brew install opencv3
安裝速度取決于網(wǎng)絡(luò),安裝完畢需要綁定Python開(kāi)發(fā)環(huán)境,有多種土方法:
1)增加環(huán)境變量,將opencv 的site-packages 添加到PYTHONPATH中
2)使用ln 軟連接,將cv2.so 鏈接到python 環(huán)境的 site-packages中
3)直接cp cv2.so 到 python 環(huán)境的 site-packages 目錄下
更簡(jiǎn)單地是執(zhí)行如下命令:
echo /usr/local/opt/opencv3/lib/python2.7/site-packages >> /usr/local/lib/python2.7/site-packages/opencv3.pth