點擊查看更多
點擊關閉

訪客計數

--- 次訪問

快速統計

15
專案
1
更新
1
活躍專案
3
已完成

本日名言

"你好啊,我是U.E.P,你叫我小U就可以了!"
— U.E.P
返回專案列表
已封存 2021年12月 - 2022年1月

FacePI - Azure 人臉辨識應用

基於 Microsoft Azure Face API 的桌面人臉辨識應用程式,透過 Python Tkinter 提供圖形化介面,整合 OpenCV 攝影機擷取、人臉偵測、人臉辨識與訓練功能,支援 PersonGroup 分組管理機制。

Python GUI OpenCV Azure API

專案簡介

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)
    1. 呼叫 OpenCV 拍攝 3 張照片
    2. 輸入姓名與描述
    3. 儲存至 traindatas/<userData>/<personname>/ 資料夾
    4. 建立 PersonGroup 與 Person
    5. 上傳人臉圖片至 Azure
    6. 執行訓練
  • 辨識流程 (Identify)
    1. 偵測圖片中的人臉(取得 faceId)
    2. 呼叫 Azure Identify API
    3. 比對 PersonGroup 中的人員
    4. 返回最佳匹配結果與信心度

核心功能

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)

  • 辨識流程
    1. 偵測人臉取得 faceId
    2. 比對 PersonGroup 中的訓練資料
    3. 返回候選人列表與信心度
  • 信心度評估
    • 0.7 以上:高度可信
    • 0.5 - 0.7:中等可信
    • 0.5 以下:低可信度
  • 未知人臉處理
    • 若無匹配結果,返回空陣列
    • 提示使用者該人臉未訓練

3. 人臉訓練 (Face Training)

  • 訓練步驟

    1. 攝影機拍攝 3 張人臉照片
    2. 輸入姓名與描述資訊
    3. 建立 PersonGroup(若不存在)
    4. 建立 Person 實體
    5. 上傳 3 張人臉圖片至 Azure
    6. 執行訓練(Train PersonGroup)
    7. 等待訓練完成(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 訓練流程

挑戰:如何設計完整的訓練流程?

解決方案

  1. 拍攝 3 張照片(OpenCV)
  2. 建立 PersonGroup(若不存在)
  3. 建立 Person(取得 personId)
  4. 上傳 3 張人臉圖片(Add Face)
  5. 執行訓練(Train)
  6. 查詢訓練狀態(Training Status)
  7. 等待訓練完成(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 開發
  • ✅ 實作完整的桌面應用程式