前言

在前兩篇文章中我們分別利用已經訓練好的 Caffe 模型來判斷圖像中人物的性別年紀。而我們之前安裝的 OpenVINO,其實也提供了類似的功能,但是卻只要一個人工智慧網路就可以同時進行性別與年紀的判斷。在這篇文章中,我們就一起來看看如何利用支援 OpenVINO 的 OpenCV 來進行性別與年紀的判斷吧。

在之前的介紹中,我提到通常在進行性別或年紀的判斷前,需要先找出圖像中的臉孔。只是當時為了簡化程式的說明,所以我才直接使用了”大頭照”而省略了找出臉孔與切下臉孔的步驟。在這篇文章中,我們不再忽略這個步驟,將使用內建於 OpenCV 的 Haar Cascade 網路來進行臉孔的辨識。前面我們提到臉孔辨識有很多不同的選擇,而且嚴格說來都可以與性別或年紀辨識的網路任意搭配。然而使用 Haar Cascade 來進行臉孔辨識有一個額外的好處,至於是啥好處,在此就先賣個關子。

接下來,就讓我們開始動手吧。

執行範例程式

在這個 Python 範例程式中,我們僅使用到 OpenCV 這個額外的套件,而且必須是支援 OpenVINO 的特殊版本。

如果你還沒有安裝過 OpenVINO 與 OpenCV,雖然並非絕對必要,但是仍強烈建議在虛擬環境下安裝 OpenCV 與執行範例程式,而樹莓派下的安裝方法可參考之前的文章。在這裡,我沿用之前已經安裝過的樹莓派 Python 虛擬環境來執行此範例程式。不過這個程式不限於樹莓派的環境,包含 Windows 與 macOS 在內的作業系統,只要有安裝支援 OpenVINO 的 OpenCV 即可。

  1. 進入虛擬環境
  2. 建立所需目錄
  3. 啟用 OpenVINO 環境。
  4. 下載臉孔辨識的模型
  5. 下載訓練過的 IR 模型與網路定義 (For 樹莓派)


    下載訓練過的 IR 模型與網路定義 (For Windows 與 macOS)

  6. 下載範例程式
  7. 建立圖片目錄
  8. 下載或自行製作臉孔圖片至 images 目錄下,圖片大小在 250×250 左右。如果你之前已經下載過判斷性別用的圖片,在此可以直接使用。
  9. 利用下列指令執行範例程式 (使用 NCS/NCS2 神經運算棒)。

    或者利用下列指令執行範例程式 (無 NCS/NCS2 神經運算棒)。

程式執行後我們就可以依序看到各個圖片的判斷結果,如下圖就是其中一幅圖片的結果畫面。依據程式判斷的結果,此為 20 歲的女性面孔:

利用 OpenVINO 判斷性別與年紀

利用 OpenVINO 判斷性別與年紀

在我們實際說明程式之前,請再多看上述的圖片幾眼。注意到了嗎?圖片中標示的臉孔是一個正方形的區域,而我們之前利用 OpenVINO IR 模型所抓取的臉孔則是長方形。這可不是湊巧的結果,事實上使用 Haar Cascade 所標出的臉孔區域皆會是正方形,而這就是我之前提到使用 Haar Cascade 的額外好處之一。因為大多數的性別/年紀辨識網路的訓練資料也是使用正方形的圖片,因此當我們將 Haar Cascade 辨識出的臉孔資料送往這些網路時,只會等比例的縮放,而不會產生變形進而影響判斷的結果。不過這個特性在某些情境下可能並不是那麼適當,在使用前須先加以考量。

範例程式說明

  1. 首先我們一樣先載入程式所需的套件 (第 3-5 行),當中載入的 OpenCV (第 5 行) 套件需要支援 OpenVINO。
  2. 接著程式利用 argparse 套件讀入所需參數 (第 8~13 行):
    • xml: IR 模型的網路定義
    • bin: IR 模型的訓練結果
    • path: 存放推論用圖片的目錄
    • target: 是否使用 NCS/NCS2。當指定為 vpu 時,表示使用 NCS/NCS2 進行推論。
  3. 第 16 行定義模型的性別結果輸出。與之前使用的 Caffe 模型不同,這個模型的輸出為女生機率在前、男生機率在後。此外,這個模型的年紀推論也不是年紀區間,而是一個預測的數值,將此數值 * 100 就是網路所預測的年紀。
  4. 第 18 行載入網路定義與訓練結果。
  5. 第 20 行載入臉孔辨識的 Haar Cascade 網路,並指定為 face_cascade。
  6. 第 22~25 行根據 target 參數的內容決定是否啟用 NCS/NCS2 或單純使用 CPU 進行推論。
  7. 第 29 行定義函式 detect_age_and_gender_by_openvino,也就是此範例程式的重頭戲。
  8. 第 31~37 行使用臉孔識別網路 face_cascade 來找出圖片的所有臉孔 (位置)。
  9. 第 40 行針對所有偵測出的臉孔進行處理。
  10. 第 42 行使用綠色框線標示出辨識出的臉孔。
  11. 第 44 行則切下辨識出的臉孔。
  12. 因為  OpenCV 的 CNN 模組無法直接對圖片原始資訊進行處理,所以一樣透過 blobFromImage (第 46 行) 將圖片陣列轉為合適的格式,而此網路的 Spatial Dimension 則為 (62, 62)。隨後則將轉換過的資料輸入辨識網路 (第 47 行)。
  13. 第 49 行開始進行預測。之前我們一直使用 forward() 來取得推論結果,但是在這裡卻必須改用 forwardAndRetrieve()。原因在於性別與年紀為兩組不同的推論輸出,所以必須透過 forwardAndRetrieve 並指定輸出的名字,才能夠同時得到兩組的輸出結果。而 prob 與 age_conv3 分別為性別與年紀的輸出名稱,可以在原始文件中找到。如果我們依舊使用 forward() 來取得結果,將只會得到性別的推論。
  14. 第 51 行利用類似之前的方式取得代表性別的文字。
  15. 第 53 行計算推論的年紀。前面提到,網路輸出乘上 100 即為推測出的年紀。
  16. 第 57~61 行根據性別指定不同的文字顏色,並將性別與年紀標示在圖片中。
  17. 第 63 行回傳標示過的圖片。
  18. 第 67 行讀取參數 path 目錄下的所有檔案,並逐一加以處理。
  19. 第 68 行取得檔案名稱。
  20. 第 69 行載入圖片。
  21. 第 70 行呼叫年紀辨識的函式 detect_age_and_gender_by_openvino。
  22. 第 71 行用來顯示標示過的圖片。
  23. 第 72 行等待使用者按下鍵盤後才繼續執行程式。

推論結果

在此我們針對之前性別判斷的頭像圖片進行性別與年紀推論,其結果整理如下:

利用 OpenVINO 判斷性別與年紀結果

利用 OpenVINO 判斷性別與年紀結果

在這 20 張圖片中,性別的推論並無產生任何錯誤,效果相當不錯。至於年紀的部分,因為我們無法得知圖像中人物的正確年紀,因此無法做出明確的判斷,不過看起來似乎比之前的結果還要好上一些。

對了,我們在安裝 OpenVINO 時其實也使用過 OpenVINO 內建的臉孔辨識網路,而我們也提到其實可以使用不同的臉孔辨識網路來搭配不同的性別/年紀辨識網路。換句話說,我們可以將上述程式中的 Haar Cascade 網路替換成 OpenVINO 內建的臉孔辨識網路。而下圖就是程式修改後的推論結果,在性別方面的推論一樣沒有失誤,但年紀部分卻有所差距。我們只是改了臉孔辨識的網路,照理說只是影響臉孔判斷的正確性,怎麼會影響到後面網路對於年紀的判斷呢?因為不同網路切出來的臉孔大小其實是不一樣的,所以造成輸入到年紀辨識網路的資料也不一樣,自然會產生不一樣的推論結果。

利用 OpenVINO 進行臉孔辨識以及判斷性別與年紀結果

利用 OpenVINO 進行臉孔辨識以及判斷性別與年紀結果

有興趣的朋友可以自行嘗試修改或從這裡下載修改過的程式

Facebook 留言
Print Friendly, PDF & Email
Summary
如何利用 OpenVINO 判斷性別與年紀
Article Name
如何利用 OpenVINO 判斷性別與年紀
Description
在這篇文章中,我們將利用 OpenVINO 內建的性別與年紀辨識網路,搭配 Haar Cascade 網路來對影像中的人物進行性別與年紀推論。
Author
Publisher Name
Everlearn Studio
Publisher Logo