—— 01 / overview
專案總覽
專案簡介
FacePI 是一個基於 Microsoft Azure Face API 的桌面人臉辨識應用程式,透過 Python Tkinter 提供圖形化介面,整合 OpenCV 攝影機擷取、人臉偵測、人臉辨識與訓練功能。專案採用 PersonGroup 分組管理機制,支援本地圖片與 URL 圖片兩種辨識模式,適用於門禁系統、考勤管理與身份驗證場景。
核心理念
- Azure Face API 整合:利用微軟雲端 AI 服務實現高精度人臉辨識
- 圖形化操作介面:Tkinter 主控台提供命令輸入與即時回饋
- PersonGroup 管理:支援多人臉訓練與分組管理
- 雙模式辨識:本地圖片檔案與網路 URL 圖片皆可辨識
我的職責
作為專案的唯一開發者,我負責:
系統架構設計
- 設計模組化類別架構:6 個核心類別(ClassWindow, ClassFacePI, ClassOpenCV, ClassPerson, ClassPersonGroup, ClassConfig)
- 實作 Tkinter GUI 主控台:命令行介面 + 即時輸出視窗
- 整合 OpenCV 攝影機擷取流程
- 設計 JSON 配置檔管理系統
Azure Face API 整合 (ClassFacePI.py - 123 行)
- 人臉偵測 (Detect):
- 本地圖片偵測:
detectLocalImage(imagepath) - URL 圖片偵測:
detectImageUrl(imageurl) - 返回人臉座標、年齡、性別等屬性
- 本地圖片偵測:
- 人臉辨識 (Identify):
identify(faceidkeys, personGroupId)- 比對 PersonGroup 中的人臉- 返回辨識結果與信心度(confidence)
- API 請求處理:
- HTTP/HTTPS 連線管理
- JSON 資料序列化與反序列化
- 錯誤處理與重試機制
OpenCV 攝影機整合 (ClassOpenCV.py - 106 行)
- 即時攝影機擷取:
show_opencv(hint)- 開啟攝影機視窗- 按下空白鍵拍照
- 自動儲存至
takenpictures/資料夾
- 人臉框選:
- Haar Cascade 分類器偵測人臉
- 綠色矩形框即時標示
- 提示訊息覆蓋顯示
PersonGroup 管理 (ClassPersonGroup.py - 59 行 + ClassPerson.py - 113 行)
- PersonGroup 操作:
create(personGroupId, name, userData)- 建立人臉群組train(personGroupId)- 訓練人臉模型getTrainingStatus(personGroupId)- 查詢訓練狀態list()- 列出所有群組
- Person 操作:
create(personGroupId, name, userData)- 新增人員addFace(personGroupId, personId, imagepath)- 加入人臉圖片list(personGroupId)- 列出群組中所有人員delete(personGroupId, personId)- 刪除人員
GUI 主控台開發 (ClassWindow.py - 290 行)
- Tkinter 視窗架構:
- 主控台輸出視窗(Console Output - 唯讀 Text 元件)
- 命令輸入視窗(Command Panel - Entry 元件)
- 動畫式文字輸出效果
- 命令系統:
sign_in- 註冊新人臉(拍攝 3 張照片)train- 訓練 PersonGroup 模型f_dt- 人臉偵測(本地圖片)f_id_local- 人臉辨識(本地圖片)f_id_url- 人臉辨識(URL 圖片)p_json- 列印 PersonGroup JSON 資料lol- 彩蛋命令
- 用戶互動:
- 即時回饋訊息
- 錯誤提示對話框
- 訓練資料輸入彈窗
配置管理 (ClassConfig.py - 28 行)
- JSON 配置讀寫:
- 儲存 Azure API Key 與 Endpoint
- 讀取配置:
readConfig() - 寫入配置:
writeConfig(api_key, host)
主程式邏輯 (MainProgram.py - 101 行)
- 訓練流程 (Train):
- 呼叫 OpenCV 拍攝 3 張照片
- 輸入姓名與描述
- 儲存至
traindatas/<userData>/<personname>/資料夾 - 建立 PersonGroup 與 Person
- 上傳人臉圖片至 Azure
- 執行訓練
- 辨識流程 (Identify):
- 偵測圖片中的人臉(取得 faceId)
- 呼叫 Azure Identify API
- 比對 PersonGroup 中的人員
- 返回最佳匹配結果與信心度
核心功能
1. 人臉偵測 (Face Detection)
本地圖片偵測:
- 上傳圖片至 Azure Face API
- 返回人臉座標、年齡、性別
- 支援多人臉偵測(一張圖片偵測多個人)
URL 圖片偵測:
- 提供圖片網址進行偵測
- 相同的屬性返回格式
輸出範例:
Detected 2 people(person). Person No.1: Gender: male, age: 25. Person No.2: Gender: female, age: 22.
2. 人臉辨識 (Face Identification)
- 辨識流程:
- 偵測人臉取得 faceId
- 比對 PersonGroup 中的訓練資料
- 返回候選人列表與信心度
- 信心度評估:
- 0.7 以上:高度可信
- 0.5 - 0.7:中等可信
- 0.5 以下:低可信度
- 未知人臉處理:
- 若無匹配結果,返回空陣列
- 提示使用者該人臉未訓練
3. 人臉訓練 (Face Training)
訓練步驟:
- 攝影機拍攝 3 張人臉照片
- 輸入姓名與描述資訊
- 建立 PersonGroup(若不存在)
- 建立 Person 實體
- 上傳 3 張人臉圖片至 Azure
- 執行訓練(Train PersonGroup)
- 等待訓練完成(Training Status: succeeded)
資料儲存結構:
traindatas/ ├── I am Bernie/ │ └── Bernie/ │ ├── pgid_20220108_194909.jpg │ ├── pgid_20220108_194915.jpg │ └── pgid_20220108_194921.jpg └── Actually Brian/ └── Eason/ ├── pgid_20220105_162515.jpg ├── pgid_20220105_162518.jpg └── pgid_20220105_162521.jpg
4. PersonGroup 管理
- 群組操作:
- 建立新群組
- 列出所有群組
- 訓練群組模型
- 查詢訓練狀態
- 人員操作:
- 新增人員至群組
- 為人員加入人臉圖片
- 刪除人員
- 列出群組中所有人員
5. OpenCV 攝影機擷取
- 即時預覽:
- 開啟攝影機即時畫面
- Haar Cascade 人臉偵測
- 綠色矩形框標示人臉
- 拍照功能:
- 按下空白鍵拍照
- 自動儲存至
takenpictures/ - 檔名格式:
pgid_YYYYMMDD_HHMMSS.jpg
- 提示訊息:
- 自訂提示文字顯示於畫面
- 例如:"Smile :)" 或 "(Picture No. 1)"
6. Tkinter GUI 主控台
- 命令行介面:
- 輸入命令執行功能
- 即時輸出結果至主控台
- 動畫式文字顯示效果
- 錯誤處理:
- 無效命令提示
- API 錯誤回饋
- 網路連線失敗警告
使用技術
開發框架
- Python 3.10:程式語言
- Tkinter:圖形介面框架(內建函式庫)
- OpenCV (cv2):攝影機擷取與影像處理
- Microsoft Azure Face API:雲端人臉辨識服務
Azure Face API
- Face - Detect:人臉偵測 API
- Face - Identify:人臉辨識 API
- PersonGroup:人臉群組管理
- Person:人員管理
- PersonGroup Person - Add Face:人臉圖片上傳
- PersonGroup - Train:訓練人臉模型
關鍵技術
- HTTP/HTTPS 請求:
http.client模組 - JSON 序列化:配置檔與 API 資料處理
- Haar Cascade 分類器:OpenCV 人臉偵測
- 檔案系統操作:圖片儲存與資料夾管理
開發工具
- Visual Studio Code:IDE
- Git:版本控制
專案狀態
當前版本:2.0 (功能完整)
- 2022/1/4:完成 FacePI ver 1.0
- 2022/1/6:完成 FacePI ver 2.0(自訂視窗介面)
功能完成度
- ✅ 已完成:
- 人臉偵測(本地與 URL)
- 人臉辨識(PersonGroup)
- 人臉訓練(3 張照片上傳)
- OpenCV 攝影機擷取
- Tkinter GUI 主控台
- PersonGroup 管理
- Person 管理
- JSON 配置系統
- 命令系統(7 種命令)
- 錯誤處理機制
- 📋 待改進:
- 批次訓練多人
- 訓練進度視覺化
- 辨識結果歷史記錄
- 更多 API 屬性支援(emotion, accessories)
開發挑戰與收穫
1. Azure Face API 整合
挑戰:如何正確呼叫 Azure Face API 並處理 JSON 回應?
解決方案:
- 使用
http.client.HTTPSConnection建立 HTTPS 連線 - 設定正確的 Headers(Content-Type, Ocp-Apim-Subscription-Key)
- 使用
urllib.parse.urlencode編碼 URL 參數 - JSON 回應解析:
json.loads(str(data, 'UTF-8'))
收穫:
- 學習 RESTful API 呼叫規範
- 掌握 HTTP/HTTPS 請求處理
- 理解 JSON 資料序列化
2. Tkinter 動畫文字效果
挑戰:如何實現打字機動畫效果(逐字顯示)?
解決方案:
- 遞迴函式設計:
c_print(text[1:], mode) - 使用
after(50, callback)延遲執行 - 控制 Text 元件狀態(NORMAL/DISABLED)
程式碼片段:
def c_print(self, text, mode='animated'):
if mode == 'animated':
self.CO['state'] = NORMAL
if len(text) > 0:
self.CO.insert(tk.END, text[0])
if len(text) > 1:
self.CO.after(50, self.c_print, text[1:], mode)
self.CO['state'] = DISABLED
收穫:
- 理解遞迴函式應用
- 掌握 Tkinter
after非同步呼叫 - 學習 GUI 動畫實作技巧
3. OpenCV 攝影機擷取
挑戰:如何整合 OpenCV 與 Tkinter?
解決方案:
- 使用
cv2.VideoCapture(0)開啟攝影機 - 迴圈讀取影格:
cap.read() - 偵測空白鍵:
cv2.waitKey(1) == 32 - 拍照後儲存並關閉視窗
收穫:
- 掌握 OpenCV 基本操作
- 理解影像處理流程
- 學習 Haar Cascade 人臉偵測
4. PersonGroup 訓練流程
挑戰:如何設計完整的訓練流程?
解決方案:
- 拍攝 3 張照片(OpenCV)
- 建立 PersonGroup(若不存在)
- 建立 Person(取得 personId)
- 上傳 3 張人臉圖片(Add Face)
- 執行訓練(Train)
- 查詢訓練狀態(Training Status)
- 等待訓練完成(succeeded)
收穫:
- 理解 Azure Face API 訓練架構
- 掌握非同步訓練流程
- 學習狀態查詢與等待機制
5. 模組化類別設計
挑戰:如何組織程式碼避免單檔案過大?
解決方案:
- 6 個核心類別獨立檔案
- 主程式
ControlPanel.py僅 8 行(呼叫 ClassWindow) - 類別職責分離:
- ClassWindow:GUI 邏輯
- ClassFacePI:API 呼叫
- ClassOpenCV:攝影機擷取
- ClassPerson/ClassPersonGroup:資料管理
- ClassConfig:配置管理
收穫:
- 掌握物件導向設計原則
- 理解單一職責原則(SRP)
- 學習模組化架構設計
專案亮點
技術創新
- ✅ Azure Face API 完整整合(Detect + Identify + Train)
- ✅ Tkinter 動畫文字效果
- ✅ OpenCV 攝影機即時擷取
- ✅ 模組化類別架構設計
教育價值
- ✅ 雲端 AI 服務實戰應用
- ✅ 桌面 GUI 開發完整流程
- ✅ RESTful API 呼叫實務
- ✅ 影像處理基礎入門
工程實務
- ✅ 6 個核心類別模組化設計
- ✅ JSON 配置檔管理
- ✅ 錯誤處理與用戶回饋
- ✅ 命令系統架構
學習成果
- ✅ 深入理解人臉辨識技術原理
- ✅ 掌握 Azure AI 服務使用
- ✅ 學習 Tkinter GUI 開發
- ✅ 實作完整的桌面應用程式