文章目錄
- 基于openface實現的技術方案
- windows環境下使用
- 1. 安裝依賴軟件
- 2. 下載OpenFace代碼
- 3. 編譯OpenFace
- 4. 提取面部動作單元
- 5.==選擇提取目標方案==
- liunx環境下使用
- 安裝與配置
- 使用 OpenFace 提取面部動作單元
- 應用場景
- 基于py-feat實現的方案
- 1. 從HuggingFace下載模型并設置`Detector`
- 2. 處理單張圖像
- 3. 處理`Fex`輸出結果
- 4. 保存和加載檢測結果
- 5. 可視化檢測結果
- 6. 檢測單張圖像中的多張人臉
- 7. 處理多張圖像
- py-feat 與 OpenFace 對比分析
- 一、雙方均支持的 AU(共16項)
- 二、僅 OpenFace 支持的 AU(共1項)
- 三、僅 Py-Feat 支持的 AU(共4項)
- 四、技術選擇建議
基于openface實現的技術方案
【免費下載】 OpenFace 開源項目使用教程
openface的導出數據說明
面部關鍵點檢測
面部標志和頭部姿態跟蹤
面部動作單元識別
注視跟蹤
面部特征提取(對齊的人臉和HOG特征)
windows環境下使用
【環境配置】Windows10上的OpenFace安裝與使用
Windows系統下的Openface安裝及使用–親測有效
openface在windows環境下使用的步驟
在Windows上使用OpenFace提取面部動作單元,主要步驟包括安裝相關依賴、下載OpenFace代碼、編譯項目以及運行和調用等:
1. 安裝依賴軟件
- Visual Studio :OpenFace基于C++開發,編譯需要Visual Studio提供編譯環境。建議安裝Visual Studio 2015及以上版本,安裝時確保勾選了“使用C++的桌面開發”相關組件。
- CMake:用于生成Visual Studio的項目文件。從CMake官網(https://cmake.org/download/)下載Windows安裝包,安裝過程中勾選“Add CMake to the system PATH for all users”選項,以便在命令行中直接使用CMake。
- Python:如果后續希望通過Python調用OpenFace的功能,需要安裝Python。從Python官網(https://www.python.org/downloads/windows/)下載合適版本的Python安裝包,安裝時勾選“Add Python to PATH”。之后可通過
pip
安裝相關依賴庫,比如openface
庫 (pip install openface
)。
2. 下載OpenFace代碼
訪問OpenFace的GitHub倉庫(https://github.com/TadasBaltrusaitis/OpenFace),點擊綠色的“Code”按鈕,選擇“Download ZIP”將代碼下載到本地,然后解壓到合適的目錄,比如C:\OpenFace
。
3. 編譯OpenFace
- 打開命令提示符:按下
Win + R
組合鍵,輸入cmd
并回車,打開命令提示符窗口。 - 進入OpenFace目錄:使用
cd
命令進入OpenFace解壓后的目錄,例如cd C:\OpenFace
。 - 創建構建目錄:在OpenFace目錄下創建一個用于存放編譯文件的目錄,比如
build
,執行命令mkdir build
,然后進入該目錄cd build
。 - 生成Visual Studio項目文件:執行
cmake -G "Visual Studio 15 2017 Win64"..
(這里假設使用的是Visual Studio 2017 64位版本,若版本不同,需要相應修改Visual Studio
后的數字,例如Visual Studio 2019對應Visual Studio 16 2019 Win64
)。CMake會根據系統環境和OpenFace代碼生成對應的Visual Studio項目文件。 - 編譯項目:生成項目文件后,會在
build
目錄下找到OpenFace.sln
解決方案文件。雙擊打開該文件,在Visual Studio中,選擇“Release”配置和合適的目標平臺(通常為x64
),然后點擊“生成”菜單中的“生成解決方案”,等待編譯完成。編譯成功后,會在build\Release
目錄下生成可執行文件。
4. 提取面部動作單元
- 處理單張圖片:進入編譯生成的可執行文件所在目錄(
build\Release
),在命令提示符中執行類似如下命令:
FaceLandmarkImg.exe -f "C:\test.jpg" -aus
其中-f
后面指定要處理的圖片路徑,-aus
表示提取面部動作單元。執行后,命令行中會輸出每個面部動作單元的強度值。
- 處理視頻文件:如果要處理視頻,使用如下命令:
FaceLandmarkVidMulti.exe -f "C:\test_video.mp4" -aus
工具會逐幀處理視頻,并將面部動作單元強度值的結果保存到一個與視頻同名、后綴為.csv
的文件中,保存在與視頻相同的目錄下 。
- 通過Python調用:如果已經安裝了
openface
庫,可以使用以下示例代碼來提取面部動作單元:
import openface# 加載模型(確保模型文件路徑正確,可根據實際安裝情況調整)
align = openface.AlignDlib("models/dlib/shape_predictor_68_face_landmarks.dat")
net = openface.TorchNeuralNet("models/openface/nn4small2v1.t7", 96)# 讀取圖像
img = openface.load_image("C:\test.jpg")
bb = align.getLargestFaceBoundingBox(img)
alignedFace = align.align(96, img, bb, landmarkIndices=openface.AlignDlib.OUTER_EYES_AND_NOSE)# 提取面部動作單元
aus = net.forward_aus(alignedFace)
print(aus)
5.選擇提取目標方案
command 中沒有指定就是提取所有特征
import subprocess
import os
# https://blog.csdn.net/bj233/article/details/113737268
# OpenFace 二進制文件路徑
openface_executable = "../../FeatureExtraction.exe"# 輸入圖像或視頻路徑
input_path = "video.mp4" # 可以是圖片文件或視頻文件
output_csv = "video_raw_2Dfp.csv"# 構建命令行調用
# command = [
# openface_executable,
# "-f", input_path, # 輸入文件
# "-of", output_csv # 輸出 CSV 文件路徑
# ]
# 構建命令行調用
command = [openface_executable,"-f", input_path, # 輸入文件# "-aus", # 提取 AU# "-gaze", # 提取 AU# "-pose", # 提取 AU"-of", output_csv, # 輸出 CSV 文件路徑-2Dfp 以像素為單位輸出2D界標;# "-2Dfp",# 以像素為單位輸出2D界標;# '-3Dfp', # 以毫米為單位輸出3D特征;# '-pdmparams', # 輸出剛性和非剛性形狀參數;# '-pose', # 輸出頭姿勢(位置和旋轉);# '-aus', # 輸出面部動作單元;# '-gaze', # 輸出注視和相關特征(眼睛界標的2D和3D位置);# '-hogalign', # 輸出提取的HOG特征文件;# '-simalign', # 輸出被跟蹤人臉的相似度對齊圖像;# '-nobadaligned', # 如果輸出相似對齊的圖像,請勿從檢測失敗或不可靠的幀中輸出(從而節省一些磁盤空間);# '-tracked', # 輸出具有檢測到的特征的視頻;
]# 執行命令
try:subprocess.run(command, check=True)print(f"AU 數據提取完成,輸出文件位于:{output_csv}")
except subprocess.CalledProcessError as e:print(f"OpenFace 調用失敗:{e}")
liunx環境下使用
OpenFace 是一款用于面部行為分析的開源工具包,它能夠通過提取面部動作單元(Facial Action Units,AUs)來量化面部表情的變化。面部動作單元是由心理學家制定的一套用于描述面部肌肉運動的標準,不同的動作單元組合可以表示各種復雜的面部表情,比如微笑、皺眉等。以下是使用 OpenFace 提取面部動作單元的相關內容:
安裝與配置
- 安裝依賴:OpenFace 基于 C++ 編寫,同時依賴一些其他庫。在 Linux 系統下,一般需要安裝 CMake、OpenCV、Boost 等庫。以 Ubuntu 系統為例,可以使用以下命令安裝部分依賴:
sudo apt-get install build-essential cmake git libopencv-dev
- 下載 OpenFace:從 OpenFace 的 GitHub 倉庫(https://github.com/TadasBaltrusaitis/OpenFace)下載代碼。
git clone https://github.com/TadasBaltrusaitis/OpenFace.git
cd OpenFace
- 編譯:進入 OpenFace 目錄后,使用 CMake 生成編譯文件,然后進行編譯。
mkdir build
cd build
cmake..
make -j4 # -j4表示使用4個線程進行編譯,可根據CPU核心數調整
使用 OpenFace 提取面部動作單元
- 運行命令行工具:編譯完成后,可以使用
FaceLandmarkImg
等可執行文件來處理圖像。假設我們有一張圖片test.jpg
,要提取其面部動作單元,可以使用以下命令:
./FaceLandmarkImg -f test.jpg -aus
-f
參數指定輸入圖像的路徑,-aus
參數表示要提取面部動作單元。運行后,OpenFace 會檢測圖像中的人臉,定位面部關鍵點,并輸出每個面部動作單元的強度值。輸出結果通常會顯示在命令行中,格式類似于:
AU01_r: 0.02
AU02_r: 0.01
AU04_r: 0.00
...
其中,AUXX_r
表示右側面部的第 XX 個動作單元,后面的數值表示該動作單元的強度,范圍一般在 0 到 1 之間,數值越大表示該動作單元對應的面部肌肉運動越明顯。
2. 處理視頻文件:除了處理單張圖像,也可以處理視頻。例如,要處理名為 test_video.mp4
的視頻,可以使用以下命令:
./FaceLandmarkVidMulti -f test_video.mp4 -aus
FaceLandmarkVidMulti
工具會逐幀處理視頻,同樣輸出每幀圖像中面部動作單元的強度值。輸出結果默認會保存到一個文本文件中,文件名為輸入視頻文件名加上后綴 .csv
,可以用 Excel 等工具打開查看和分析。
3. 結合編程使用:OpenFace 也提供了 API,可以在 C++、Python 等編程語言中調用。以 Python 為例,通過 openface
庫(需要額外安裝,pip install openface
)可以實現如下功能:
import openface# 加載模型
align = openface.AlignDlib("models/dlib/shape_predictor_68_face_landmarks.dat")
net = openface.TorchNeuralNet("models/openface/nn4small2v1.t7", 96)# 讀取圖像
img = openface.load_image("test.jpg")
bb = align.getLargestFaceBoundingBox(img)
alignedFace = align.align(96, img, bb, landmarkIndices=openface.AlignDlib.OUTER_EYES_AND_NOSE)# 提取面部動作單元
aus = net.forward_aus(alignedFace)
print(aus)
上述代碼首先加載了面部關鍵點檢測模型和用于提取面部動作單元的神經網絡模型,然后讀取圖像,檢測并對齊人臉,最后提取面部動作單元的值并打印出來。
應用場景
- 情緒分析:通過面部動作單元的組合和強度,可以推斷出人的情緒狀態,比如開心、生氣、驚訝等,可應用于市場調研、用戶體驗分析等領域,了解用戶對產品或內容的情感反應。
- 人機交互:在智能客服、智能駕駛等場景中,根據用戶的面部表情實時調整交互方式,提供更加個性化和人性化的服務。
- 心理學研究:幫助心理學家量化和分析人類的面部表情行為,研究情緒表達的機制和規律。
基于py-feat實現的方案
py-feat官網教程
https://github.com/cosanlab/py-feat
可視化檢測結果
py-feat
是一個用于面部動作單元(Facial Action Units,AUs)檢測的Python庫,它基于深度學習模型,可以方便地從圖像或視頻中提取面部動作單元信息。
1. 從HuggingFace下載模型并設置Detector
Detector
類作用:整合了預訓練的人臉檢測、情緒識別、姿態估計等模型,提供便捷的高層API(如detector.detect()
)。- 模型下載:首次初始化
Detector
時,Py-Feat會自動從HuggingFace倉庫下載所需的預訓練模型權重并保存到本地,后續使用將直接調用已保存的模型。 - 初始化代碼:
from feat import Detector detector = Detector() # 使用默認模型 # 可指定模型,如:detector = Detector(emotion_model='svm')
- 默認模型:包括face_model=img2pose、landmark_model=mobilefacenet、au_model=xgb、emotion_model=resmasknet等。
2. 處理單張圖像
- 準備圖像:Py-Feat提供了測試圖像
single_face.jpg
,可通過以下代碼加載并顯示:from feat.utils.io import get_test_data_path from feat.plotting import imshow import os test_data_dir = get_test_data_path() single_face_img_path = os.path.join(test_data_dir, "single_face.jpg") imshow(single_face_img_path)
- 檢測圖像:使用
detect()
方法處理圖像,返回Fex
類實例(一種基于pandas DataFrame的子類):single_face_prediction = detector.detect(single_face_img_path, data_type="image")
3. 處理Fex
輸出結果
Fex
實例包含豐富的檢測數據,可通過便捷屬性或pandas方法訪問:
- 常用屬性:
faceboxes
:人臉框信息(位置、寬度、高度、得分)aus
:動作單元(AU)強度值emotions
:情緒概率(憤怒、厭惡、恐懼、快樂、悲傷、驚訝、中性)poses
:頭部姿態(俯仰角、翻滾角、偏航角等)identities
:人臉標識
- 示例:
single_face_prediction.faceboxes # 查看人臉框信息 single_face_prediction.emotions # 查看情緒識別結果
4. 保存和加載檢測結果
- 保存結果:使用
to_csv()
方法將Fex
實例保存為CSV文件:single_face_prediction.to_csv("output.csv", index=False)
- 加載結果:使用
read_feat()
函數從CSV文件加載為Fex
實例:from feat.utils.io import read_feat input_prediction = read_feat("output.csv")
- 實時保存:檢測時通過
save
參數實時保存結果(低內存模式):fex = detector.detect(inputs=single_face_img_path, data_type="image", save='detections.csv')
5. 可視化檢測結果
- 靜態可視化:使用
plot_detections()
方法生成matplotlib圖像,展示人臉框、動作單元、情緒等:figs = single_face_prediction.plot_detections(poses=True) # 包含姿態信息 # 可選參數:faces='aus'(使用標準化AU模板可視化)、muscles=True(顯示肌肉運動)
- 交互式可視化:使用
iplot_detections()
方法生成plotly交互式圖像,可切換顯示不同檢測結果:single_face_prediction.iplot_detections(bounding_boxes=True, emotions=True)
6. 檢測單張圖像中的多張人臉
Detector
會自動識別單張圖像中的多張人臉,Fex
實例中每行對應一張人臉:
- 示例:
multi_face_image_path = os.path.join(test_data_dir, "multi_face.jpg") multi_face_prediction = detector.detect(multi_face_image_path, data_type="image") figs = multi_face_prediction.plot_detections(add_titles=False) # 可視化所有人臉
7. 處理多張圖像
- 批量處理:向
detect()
方法傳入圖像路徑列表,可批量處理多張圖像。通過batch_size
設置批量大小(需注意圖像尺寸一致性,可配合output_size
調整尺寸):img_list = [single_face_img_path, multi_face_image_path] mixed_prediction = detector.detect(img_list, batch_size=1, data_type="image") # 串行處理 # 批量處理示例:detector.detect(img_list, batch_size=5, output_size=512)
- 結果篩選:使用pandas方法篩選特定圖像的結果:
# 篩選第一張圖像的結果 figs = mixed_prediction.loc[0].plot_detections() # 按圖像路徑篩選 img_name = mixed_prediction["input"].unique()[1] axes = mixed_prediction.query("input == @img_name").plot_detections()
py-feat 與 OpenFace 對比分析
OpenFace 和 Py-Feat 各自支持的 AU 列表如下
一、雙方均支持的 AU(共16項)
AU 編號 | 面部動作單元名稱 | 技術實現差異 | 典型應用場景 |
---|---|---|---|
AU01 | 內眉上揚(內側眉弓提升) | OpenFace:通過眉弓幾何變形檢測;Py-Feat:CNN 直接識別眉部肌肉激活 | 驚訝、悲傷表情分析 |
AU02 | 外眉上揚(外側眉弓提升) | OpenFace:依賴 HOG 特征+SVM 分類;Py-Feat:多模態特征融合(圖像+幾何) | 驚訝、疑惑表情分析 |
AU04 | 皺眉(降眉肌收縮) | OpenFace:計算眉間距變化率;Py-Feat:面部關鍵點運動軌跡分析 | 憤怒、專注表情分析 |
AU05 | 上瞼提升(上眼瞼抬起) | OpenFace:檢測眼瞼高度與眼球暴露比例;Py-Feat:CNN 直接回歸眼瞼激活概率 | 驚訝、恐懼表情分析 |
AU06 | 臉頰提升(顴大肌收縮) | OpenFace:檢測顴骨區域形變;Py-Feat:結合面部紋理與關鍵點位移 | 微笑、愉悅表情分析 |
AU07 | 眼瞼收緊(眼輪匝肌收縮) | OpenFace:分析眼周皺紋特征;Py-Feat:注意力機制聚焦眼周區域 | 厭惡、用力表情分析 |
AU09 | 鼻子皺起(提上唇鼻翼肌) | OpenFace:檢測鼻翼擴張程度;Py-Feat:多尺度特征融合識別鼻翼運動 | 厭惡、輕蔑表情分析 |
AU10 | 上唇提升(上唇提肌) | OpenFace:計算上唇與鼻翼距離變化;Py-Feat:語義分割定位上唇區域 | 厭惡、不屑表情分析 |
AU12 | 嘴角上揚(顴大肌/笑肌) | OpenFace:分析嘴角角度與水平位移;Py-Feat:結合面部紋理與關鍵點坐標變化 | 微笑、大笑表情分析 |
AU14 | 唇角緊縮(三角肌收縮) | OpenFace:檢測嘴角內側運動;Py-Feat:CNN 分類器判斷嘴角形態 | 勉強微笑、苦澀表情分析 |
AU15 | 嘴角下拉(降口角肌) | OpenFace:計算嘴角垂直位移;Py-Feat:時序分析嘴角運動軌跡 | 悲傷、不滿表情分析 |
AU17 | 下唇抬起(降下唇肌) | OpenFace:檢測下唇高度變化;Py-Feat:語義分割識別下唇區域 | 思考、嚴肅表情分析 |
AU20 | 嘴角水平拉伸(頰肌收縮) | OpenFace:分析嘴角水平位移;Py-Feat:結合面部紋理與關鍵點距離變化 | 緊張、驚恐表情分析 |
AU23 | 嘴唇收緊(口輪匝肌) | OpenFace:計算唇部厚度與寬度比例;Py-Feat:CNN 直接檢測唇部形態 | 憤怒、決心表情分析 |
AU25 | 嘴唇微張(下頜下降) | OpenFace:分析上下唇距離;Py-Feat:語義分割定位唇部區域 | 驚訝、說話狀態分析 |
AU26 | 嘴唇大張(下頜下降+張開) | OpenFace:檢測下頜角度變化;Py-Feat:3D 面部重建計算下頜運動 | 驚訝、恐懼、大喊表情分析 |
二、僅 OpenFace 支持的 AU(共1項)
AU 編號 | 面部動作單元名稱 | OpenFace 檢測邏輯 | 為何 Py-Feat 未集成 | 典型應用場景 |
---|---|---|---|---|
AU45_r | 眨眼/眼瞼快速閉合 | 基于 HOG 特征檢測眼周區域快速形變,結合時序分析判斷眨眼頻率與幅度 | 深度學習模型對“快速動作”捕捉精度稍低;Py-Feat 側重靜態/慢動態 AU | 疲勞檢測、注意力分析、謊言識別 |
三、僅 Py-Feat 支持的 AU(共4項)
AU 編號 | 面部動作單元名稱 | Py-Feat 檢測邏輯 | 為何 OpenFace 未集成 | 典型應用場景 |
---|---|---|---|---|
AU11 | 提上唇鼻翼肌(鼻唇溝加深) | CNN 模型直接識別鼻唇溝區域紋理變化,結合關鍵點位移計算肌肉收縮程度 | 傳統幾何特征難以量化鼻唇溝細微變化 | 冷笑、輕蔑等復雜表情分析 |
AU24 | 嘴唇壓緊(口輪匝肌收縮) | 基于語義分割的唇部形態分析,結合時序關鍵點運動軌跡判斷肌肉收縮狀態 | 與 AU23(嘴唇收緊)區分度較低,傳統模型易混淆 | 憤怒、焦慮表情分析 |
AU28 | 唇部伸展(唇拉伸肌) | 深度學習模型分析唇部水平拉伸比例,結合面部紋理判斷是否為非自愿性唇部運動 | 屬于較罕見 AU,傳統數據集覆蓋不足 | 痛苦、不適表情分析 |
AU43 | 閉眼(眼瞼完全閉合) | 注意力機制聚焦眼周區域,通過 CNN 分類器判斷眼瞼閉合狀態 | 與 AU45(眨眼)邏輯重疊,OpenFace 合并處理 | 睡眠狀態檢測、疲勞分析 |
四、技術選擇建議
-
優先選 OpenFace 的場景:
- 需要檢測 眨眼頻率(AU45),如駕駛疲勞監測、視頻會議注意力分析;
- 部署環境算力有限,需純 CPU 實時運行(OpenFace 單幀處理速度比 Py-Feat 快 30%+)。
-
優先選 Py-Feat 的場景:
- 需要分析 復雜社交表情(如冷笑 AU11、焦慮 AU24),或研究微表情(如 AU28 唇部非自愿伸展);
- 需要 可視化與量化結合(如熱力圖標記 AU 激活區域、DataFrame 輸出強度值),適合心理學實驗分析。