1. 程式人生 > >Python人臉識別技術

Python人臉識別技術

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

開源是偉大的,使我們視野更開闊,而且不用重複造輪子。這裡沒有用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環境的時候就是有一些坑,特別記錄一下。

基於Mac的OpenCV環境

建議使用Brew 安裝,如果沒有安裝brew,先執行下面命令:

$/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

然後,指定目標倉庫 $brew tap homebrew/science

安裝OpenCV3 $brew install opencv3

安裝速度取決於網路,安裝完畢需要繫結Python開發環境,有多種土方法:

1)增加環境變數,將opencv 的site-packages 新增到PYTHONPATH中

2)使用ln 軟連線,將cv2.so 連結到python 環境的 site-packages中

3)直接cp cv2.so 到 python 環境的 site-packages 目錄下

更簡單地是執行如下命令:

  echo /usr/local/opt/opencv3/lib/python2.7/site-packages >> /usr/local/lib/python2.7/site-packages/opencv3.pth
  mkdir -p /Users/hecom/.local/lib/python2.7/site-packages
  echo 'import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")' >> /Users/hecom/.local/lib/python2.7/site-packages/homebrew.pth

對於強迫症患者

可以全面安裝opencv的各種外掛,如3方外掛,視訊外掛等:

$brew install opencv3 --with-contrib --with-cuda --with-ffmpeg --with-tbb --with-qt5 

可能會遇到很多坑,如 
Error: You must ‘brew link texi2html’ before homebrew/science/opencv3 can be installed

當你執行 $brew link texi2html時又會遇錯: 
Error: Cowardly refusing to 'sudo brew link' 
You can use brew with sudo, but only if the brew executable is owned by root. 
However, this is both not recommended and completely unsupported so do so atyour own risk

說明brew 的許可權有問題, 需要解決: 
$sudo chown root:wheel ‘which brew’

在Ubuntu上OpenCV3的原始碼安裝

在Ubantu上安裝先要做一下準備活動

$ aptitude -f install
$ sudo apt-get update

然後安裝編譯環境: 
$sudo apt-get install build-essential

安裝依賴庫 
$sudo apt-get install cmake Git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev 
還要安裝python 依賴及其它依賴庫 
$sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

獲得opencv原始碼 
git clone https://github.com/Itseez/opencv.git

終於可以編譯安裝了:

$cd opencv
$cmake -D CMAKE_INSTALL_PREFIX=/home/opencv/build -D CMAKE_BUILD_TYPE=RELEASE   ..

最後,安裝python-opencv:

$sudo apt-get install python-opencv

OpenCV的Python環境簡單驗證

一行程式碼驗證OpenCV的Python環境是否成功:

$python -c “import cv2; print dir(cv2)”

如果輸出了很多cv2 的屬性和函式名的字典,就表示成功;否則的話,還需要繼續填坑。