2023年6月26日 星期一

【vMaker Edge AI專欄 #06】 Intel OpenVINO 2023.0初體驗─如何快速在Google Colab運行人臉偵測

作者:Jack OmniXRI, 2023/06/12

話說二十多年前第一次到教練場學開車,當時是手排車,常常因換檔時離合器、排擋、油門控制不當就導致車子瞬間熄火,不然就是猛烈振動甚至暴衝,好在教練細心指導,才能讓車子平順前進。後來改開自排車後,突然覺得以前那些換擋技巧根本用不到,車子自己就會處理好這些換檔工作,我們只要會轉方向盤,會踩油門、剎車加上專心路況就能順利把車開上路到達目的地。如今在學習AI這台大車時也遇到類似問題,需要一個好的教練指導開發AI的每個步驟和細節,不然就得換一套方便的工具,讓我們能專心在開發應用程式而不需要了解太多AI的數學和原理,而其中 Intel OpenVINO Toolkit (以下簡稱OpenVINO) [1] 就是一套不錯的AI推論(Infernece)優化工具。

一般常見的AI應用有「電腦視覺」、「自然語言處理」、「資料分析」等,通常多半需要收集大量的資料,經過訓練特定的模型(或機器學習算法、神經網路等)才能應付各式AI應用的需求。訓練過程非常繁瑣且須依靠極高算力才能完成模型巨量權重(參數)的訓練。不過好在當完成模型訓練後,只需運行一次推論就能得到結果。如果還覺得模型太大或推論速度不夠快,此時可透過一些複雜程序來進行參數量化(如FP32變成INT8)或模型優化(如減枝、壓縮、蒸餾等),以達到又快又準的結果。而以上介紹的 OpenVINO 正是這樣的工具,它已幫大家把常用AI應用的模型都預訓練好了,如影像分類、物件偵測、人臉辨識、影像分割、姿態估測等,甚至現在流行的大型語言模型(LLM)及AI生成影像模型(AIGC),這樣大家就可輕鬆上手AI應用。

以下就以最常見的 「人臉辨識」 (只作人臉位置偵測,不作身份辨識)作為起手式,使用網頁版 Python 開發環境 Google Colab (Jupyter Notebook環境)直接安裝最新2023.0版的 OpenVINO 運行其 Notebooks 範例,來讓大家快速體驗一下AI應用帶來的好處。

1. 人臉辨識技術的演進

以電腦視覺進行「人臉辨識」已發展有數十年,如Fig. 1所示,從最早的統計式(特徵臉)再演進到模板式(VJ聯級法)、特徵式(主動形狀模型ASM)、外觀式(主動外觀模型AAM)。但這些方式通常只能辨識較正面且大小、位置差不多,光照均勻的人臉影像,若遇到各種拍攝角度、尺寸、光照、背景、表情、化妝、眼鏡、口罩等干擾因素時,辨識率就會急速下降,變得不夠實用。更多人臉辨識相關介紹可參考[2],這裡就不多作說明。

近年來深度學習(神經網路)技術及電腦硬體算力突飛猛進,所以透過巨量的人臉資料集進行模型訓練,就能得到較穩定實用的模型。不論是人臉偵測、身份辨識、表情、性別、年齡等都有單獨對應或整合式的模型可供使用。所以在人臉辨識上,除了可設計專用模型外,亦可當成普通物件來進行偵測。


Fig. 1 人臉辨識技術發展圖。[2] (OmniXRI整理製作,2023/06/12)

2. 如何在Colab上安裝OpenVINO

OpenVINO可支援多種作業系統(如Windows, Linux, macOS),多種安裝模式(如執行檔、APK、PyPl(pip install)、自行編譯、Docker等),甚至有提供雲端免安裝的 DevCloud版本。

在本文中,為了讓大家能更輕鬆的試用,只要找一台能上網的電腦,開啟文末提供的 Colab 範例(*.ipynb)點擊連結就能馬上安裝 OpenVINO 並運行人臉辨識範例。

如範例中所示,安裝 OpenVINO 非常簡單,只要下列指令就完成。由於預設只會安裝必要套件,所以只需40到60秒就能完成,不像以前透過APK方式安裝需要4到5分鐘。

#更新 pip !python -m pip install --upgrade pip # 開始安裝 OpenVINO開發者版最新版本,本文發佈時為2023.0版 !pip install openvino-dev

註:安裝後會出部份紅字錯誤訊息,如下所示
ERROR: pip’s dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. google-colab 1.0.0 requires pandas~=1.5.3, but you have pandas 1.3.5 which is incompatible.
主要是因 Colab 要求的套件版本和 OpenVINO 安裝的不同,本範例沒有使用到這些模組,可暫時忽略這項錯誤,繼續執行下面範例。

3. 使用OpenVINO進行人臉辨識

在 OpenVINO 中已有許多預訓練好的模型和範例程式,其中以 Notebooks 最為方便,只要在電腦上安裝好 Python 並架好一個虛擬環境,再下載 Notebooks 安裝 Jupyter Lab 就能玩到數十種範例,完整安裝方式及範例內容可參考[3]。

不過這些範例雖然也是 *.ipynb 但由於很多相對路徑及設定不同,所以無法直接在 Colab 上運行。這裡為了方便大家快速上手,不用在本機端安裝就可測試,所以參考了 Notebooks 中的 Hello Object Detectio [4] 進行修改,使其可在 Colab 上運行。

另外由於不同模型輸出格式略有不同,而本範例僅適用輸出格式為 [image_id, label, conf, x_min, y_min, x_max, y_max] ,所以目前可支援模型名稱如下所示。

  • face-detection-0200
  • face-detection-0202
  • face-detection-adas-0001
  • face-detection-retail-0004
  • face-detection-retail-0005
  • face-detection-retail-0044

接下來就開始說明完整執行步驟。首先要先下載及轉換模型及測試用的圖檔。模型名稱(–name)可替換成上述任一名稱。測試用的圖檔來源及名稱可自訂,但記得後續推論時輸入影像名稱要記得更換。

!omz_downloader --name face-detection-adas-0001 !omz_converter --name face-detection-adas-0001 !wget -N https://raw.githubusercontent.com/OmniXRI/OpenVINO2022_on_Colab_Samples/main/data/face_ring.jpg

接下來準備好必要的函式庫,載入及編譯模型,載入原始圖檔並轉成指定格式(尺寸、矩陣順序、色彩格式),就能進行推論。完成後會得到物件框(即人臉)的外框資訊,包含人臉數量、影像編號、標籤名稱、置信度、物件框左上角座標 [image_id, label, conf, x_min, y_min, x_max, y_max] 。最後再把這些資訊畫回影像上就完成。如下範例程式所示。

如果不想了解程式運作方式的朋友可直接跳過,直接享受找到人臉的結果就可以了。

# 引入必要函式庫 import cv2 import matplotlib.pyplot as plt import numpy as np from openvino.runtime import Core # 載入及編譯模型 ie = Core() # 讀入模型並編譯 model = ie.read_model(model="intel/face-detection-adas-0001/FP32/face-detection-adas-0001.xml") # 在Colab上裝置名稱只能選CPU compiled_model = ie.compile_model(model=model, device_name="CPU") # 建立輸出入層定義 input_layer_ir = compiled_model.input(0) output_layer_ir = compiled_model.output(0) # 載入待測試影像並轉換格式 # 讀入待測試影像並將BGR格式轉換為RGB格式以滿足 MobileNet 模型需求 image = cv2.imread(filename="face_ring.jpg") # N,C,H,W = 批次數量, 影像通道數, 影像高及寬 N, C, H, W = input_layer_ir.shape # 調整影像尺寸至模型指定輸入尺寸 resized_image = cv2.resize(image, (W, H)) # # 擴展輸入陣列維度 input_image = np.expand_dims(resized_image.transpose(2, 0, 1), 0) # 顯示待測試影像並將色彩格式由BGR變成RGB plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)); # 進行推論,取得偵測到的物件(人臉)資訊 boxes = compiled_model([input_image])[output_layer_ir] # 定義「轉換結果到影像」函式 # 對每一個偵測的物件描述包括 [x_min, y_min, x_max, y_max, conf] 外框的左上角及右下角座標及置信度 # 輸入參數包含原始BGR格式影像、已縮放尺寸之影像、已偵測到的人臉資訊、最低接受門檻及置信度顯示 def convert_result_to_image(bgr_image, resized_image, boxes, threshold=0.3, conf_labels=True): # 定義色彩名稱及數值 colors = {"red": (255, 0, 0), "green": (0, 255, 0)} # 取得原始影像尺寸並計算長寬縮放比 (real_y, real_x), (resized_y, resized_x) = bgr_image.shape[:2], resized_image.shape[:2] ratio_x, ratio_y = real_x / resized_x, real_y / resized_y # 將原始BGR格式影像轉換成RGB格式 rgb_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2RGB) # 重覆處理物件外框資訊 for box in boxes[0][0]: # 確認取得之物件外框其置信度是否已高於門檻 conf = box[2] if conf > threshold: # 若是則將物件外框浮點數座標轉換成實際繪圖的整數座標 # 若座標在影像最高處則略微調低以利繪圖及可視。 (x_min, y_min, x_max, y_max) = [ int(max(corner_position * resized_y * ratio_y, 10)) if idx % 2 else int(corner_position * resized_x * ratio_x) for idx, corner_position in enumerate(box[3:]) ] # 繪製物件外框(綠色,線粗3pt) rgb_image = cv2.rectangle(rgb_image, (x_min, y_min), (x_max, y_max), colors["green"], 3) # 若要顯示置信度,則繪製文字到圖上(紅字,0.8倍文字大小) if conf_labels: rgb_image = cv2.putText( rgb_image, f"{conf:.2f}", (x_min, y_min - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, colors["red"], 1, cv2.LINE_AA, ) return rgb_image # 呼叫函式,繪製物件(人臉)的外框,可選擇性的開啟顯示置信度訊息(conf_labels=True/False)。 plt.figure(figsize=(10, 6)) plt.axis("off") plt.imshow(convert_result_to_image(image, resized_image, boxes, conf_labels=True));


Fig. 2 人臉辨識(物件偵測)結果。(OmniXRI整理製作,2023/06/12)

人臉偵測結果如Fig. 2所示,可看出即使是人臉旋轉很大角度、有不同表情甚至戴墨鏡也能順利被檢出,相較傳統的 OpenCV Haar 聯級法(Cascase)只能接受小幅度的旋轉有很大改善。如果想了解OpenCV作法的朋友可以參考[5]。

本文完整範例如下連結,直接點擊就能啟動。進入 Colab 後,點擊選單<執行階段>中的<全部執行>就能執行範例。
https://colab.research.google.com/github/OmniXRI/OpenVINO2022_on_Colab_Samples/blob/main/OpenVINO_Face_Detection_on_Colab_2.ipynb

註:如果執行完出現結果影像一直閃爍情況,將游標移至影像上點擊一下即解決。另外如果想要備份這份範例,方便自己進行修改測試,要先登入自己的 Google 帳號,再點擊選單<檔案>中的<在雲端硬碟中儲存複本>,即完成備份。

小結

以上人臉辨識(物件偵測)只是AI應用的一個簡單起手式,透過本文大家可了解到如何透過簡單的 Python 程式加上 OpenVINO的助力,就可輕鬆完成AI應用程式的開發。如果還想要測試更多的Colab + OpenVINO範例,可參考延伸閱讀[A]。相信有了這些基礎,後續學習上會更加順手。

參考文獻

[1] Intel, “OpenVINO Document”
https://docs.openvino.ai/2023.0/home.html

[2] 許哲豪, "【課程簡報】Edge AI社聚#1 身份辨識防疫技術交流 ─ Edge AI人臉辨識技術剖析 "
https://omnixri.blogspot.com/2021/02/edge-ai1-edge-ai.html

[3] Intel, “Learn OpenVINO - Interactive Tutorials (Python) - OpenVINO notebooks documentation”
https://docs.openvino.ai/2023.0/notebooks/notebooks.html

[4] Intel, “OpenVINO Notebooks - Hello Object Detection”
https://docs.openvino.ai/2022.3/notebooks/004-hello-detection-with-output.html

[5] 許哲豪, “OpenCV Haar 聯級法(Cascase)人臉辨識Colab範例”
https://colab.research.google.com/github/OmniXRI/NTUST_EdgeAI_2022/blob/main/Ch7_Implementations/Ch7-3_Face_Recognition/Ch7-3-1_OpenCV_Face_Detection/OpenCV_Haar_Face_Dtection.ipynb

延伸閱讀

[A] 許哲豪, “Intel OpenVINO 2022.x運行於Google Colab之範例分享”
https://omnixri.blogspot.com/2023/05/intel-openvino-2022xgoogle-colab.html

本文同步發表在【台灣自造者 vMaker】

 

沒有留言:

張貼留言

【頂置】簡報、源碼、系列文快速連結區

常有人反應用手機瀏覽本部落格時常要捲很多頁才能找到系列發文、開源專案、課程及活動簡報,為了方便大家快速查詢,特整理連結如下,敬請參考! Edge AI Taiwan 邊緣智能交流區 全像顯示與互動交流區 台科大(NTUST) 人工智慧與邊緣運算實務 開南大學...