[Python][人臉辨識]應用Deepface辨識臉部情緒

閱讀時間約 12 分鐘

本文主要應用deepface的正面(frontal)人臉檢測的預設模型,使用analyze 函數,用於分析一張人臉圖像的情感(emotion)。

在Colab上實現,若用其他平台需稍微修改程式碼。

Deepface

Deepface是一個輕量級的Python人臉辨識和臉部屬性分析(年齡、性別、情緒和種族)框架。它是一個混合人臉辨識框架,包含最先進的模型:VGG-Face、Google FaceNet、OpenFace、Facebook DeepFace、DeepID、ArcFace和DlibSFace。

Deepface是完全開源的程式碼,可以應用於個人及商業的環境並加以修改,且無任何侵權的疑慮。

github開源碼與其他模型參考網址


本文實驗結果圖

結果圖

結果圖

程式範例及檔案與模型連結

在colab上,上傳檔案

  • 請確保存在相應的字體文件 NotoSansTC-Bold.ttf,且路徑正確。
  • Haar 級聯分類器 haarcascade_frontalface_default.xml 需要在正確的路徑下
colab上傳檔案

colab上傳檔案

程式碼

import cv2
from deepface import DeepFace
import numpy as np

from google.colab.patches import cv2_imshow # 若是在非colab環境,請註解掉from PIL import Image,ImageFont, ImageDraw
from IPython.display import display
# 定義該情緒的中文字
text_obj={
'angry': '生氣',
'disgust': '噁心',
'fear': '害怕',
'happy': '開心',
'sad': '難過',
'surprise': '驚訝',
'neutral': '正常'
}

# 定義加入文字函式
def putText(x,y,text,size=20,color=(255,255,255)):
global img

font_path = "./NotoSansTC-Bold.ttf" # Adjust the font path if needed
font = ImageFont.truetype(font_path, size)

imgPil = Image.fromarray(img) # 轉換成 PIL 影像物件
draw = ImageDraw.Draw(imgPil) # 定義繪圖物件
draw.text((x, y), text, fill=color, font=font) # 加入文字
img = np.array(imgPil) # 轉換成 np.array

img = cv2.imread('1234.jpg') # 載入圖片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 將圖片轉成灰階
face_cascade = cv2.CascadeClassifier("./haarcascade_frontalface_default.xml") # 載入人臉模型
faces = face_cascade.detectMultiScale(gray) # 偵測人臉

for (x, y, w, h) in faces:
# 擴大偵測範圍,避免無法辨識情緒
x1 = x
x2 = x+w
y1 = y
y2 = y+h
face = img[y1:y2, x1:x2] # 取出人臉範圍
try:
emotion_result = DeepFace.analyze(face, actions=['emotion'],enforce_detection=False) # 辨識情緒
dominant_emotion = emotion_result[0]['dominant_emotion'] if emotion_result and 'dominant_emotion' in emotion_result[0] else None #避開錯誤,確保dominant_emotion一定回傳值

if dominant_emotion:
putText(x, y, text_obj[dominant_emotion]) # 放入文字
else:
print('Dominant emotion not found in the result.')

except Exception as e:
print(f'error : {e}')
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) # 利用 for 迴圈,抓取每個人臉屬性,繪製方框

cv2_imshow(img) #若是在非colab環境 請更改cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

程式碼解析

印出emotion_result來解析

在使用別人訓練好的模型及函式,都會先試著印出來看後續要怎麼處理得到的資料

print的第一行:可以得知是 emotion_result 一個list       

print的第二行:得知是一個list內含有字典       

print的第三行:既然知道是字典就來看所有key有包含哪些       

print的第四行:看起來'dominant_emotion'的值是預估情緒的結果       

將emotion_result[0]['dominant_emotion']印出,看起來得到想要的結果了

emotion_result  = DeepFace.analyze(face, actions=['emotion'],enforce_detection=False)  # 辨識情緒
print('emotion_result: 資料格式為',type(emotion_result))
print('emotion_result: 資料為',emotion_result)
print('emotion_result_dit 所有鍵為' ,emotion_result[0].keys())
print('emotion_result: 資料為: ',emotion_result[0]['dominant_emotion'])
raw-image

避開錯誤,確保dominant_emotion一定回傳值

先判斷 emotion_result不為空值,在判斷emotion_result[0]是否有'dominant_emotion'這個key,兩個條件都滿足回傳emotion_result[0]['dominant_emotion'],不滿足回傳空值

dominant_emotion = emotion_result[0]['dominant_emotion'] if emotion_result and 'dominant_emotion' in emotion_result[0] else None

這個寫法主要確保emotion_result[0]['dominant_emotion']存在,在去提取,避免引發錯誤,程式就不會往下執行

圖像寫入文字函式

def putText(x,y,text,size=20,color=(255,255,255)):
global img

font_path = "./NotoSansTC-Bold.ttf" # Adjust the font path if needed
font = ImageFont.truetype(font_path, size)

imgPil = Image.fromarray(img) # 轉換成 PIL 影像物件
draw = ImageDraw.Draw(imgPil) # 定義繪圖物件
draw.text((x, y), text, fill=color, font=font) # 加入文字
img = np.array(imgPil) # 轉換成 np.array
  1. 參數說明:
    • x: 文字的起始橫座標。
    • y: 文字的起始縱座標。
    • text: 要加入的文字內容。
    • size: 文字的大小,預設為 20。
    • color: 文字的顏色,以 RGB 格式表示,預設為白色 (255, 255, 255)。
  2. 全域變數:
    • img: 一個全域變數,代表圖像。這裡的函式假設 img 已經被定義並且可被修改。修改後的圖像將被存回這個全域變數。
  3. 字型設定:
    • font_path: 字型文件的路徑,這裡使用 "./NotoSansTC-Bold.ttf"。你可能需要根據你的系統或文件結構調整路徑。
    • font: 使用 ImageFont.truetype 從指定的字型文件中創建字型物件,並指定字型大小。
  4. 圖像轉換:
    • imgPil: 使用 Image.fromarray 將 Numpy 陣列 (這裡是 img) 轉換為 PIL 影像物件。
    • draw: 使用 ImageDraw.Draw 定義一個可以在圖像上繪製的物件。
  5. 文字繪製:
    • draw.text: 在圖像上的指定位置 ((x, y)) 繪製指定的文字 (text),使用指定的顏色 (fill=color) 和字型 (font=font)。
  6. 圖像轉換回 Numpy 陣列:
    • img = np.array(imgPil): 最後,使用 np.array 將 PIL 影像物件轉換回 Numpy 陣列,這樣修改後的圖像就能夠儲存在 img 這個全域變數中。



其他預估

預估年紀

因預測的人臉有八個所以有八個結果

result = DeepFace.analyze("1234.jpg", actions=["age"])
# print("預估年紀:", result["age"])
for age in result:
print('預估年紀',result[0]['age'])
raw-image

預估性別

result = DeepFace.analyze("1234.jpg", actions=["gender"])
for sex in result:
print('預估性別',sex['gender'])
raw-image


喜歡的話,在點愛心,加入會員追蹤作者,會持續更新分享,謝謝大家




avatar-img
128會員
209內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
有別於上一篇for迴圈[Python基礎]流程控制for迴圈,while迴圈則常常被說是無限迴圈,若未到達跳脫的條件,是不會停止的。 在日常生活中,我們也常常用到這個概念,例如泡奶粉,要一直攪拌到粉都溶解了為止,其中的一直跟為止就等於while迴圈概念一樣,一直做到某個條件滿足了被觸發才停止。
大部分在求物件的寬度及高度,都會想到用OpenCV的findContours函式來做,從找到的輪廓中來計算物件的面積,周長,邊界框等屬性,從而得到物體的寬度與高度 [OpenCV應用][Python]利用findContours找出物件邊界框求出寬度及高度 本文將用不同的方法,利用Numpy
本文將利用OpenCV的findContours函式,從找到的輪廓中來計算物件的面積,周長,邊界框等屬性,從而得到物體的寬度與高度。 一般來說,我們在進行輪廓檢測時,會先進行圖像二值化,將對象轉換為白色,背景為黑色。這樣,在找到輪廓後,輪廓的點就會以白色表示,背景為黑色。 結果圖 從圖中綠色框
在日常中,常有重複性相當高的事情,不斷地重複在做,重複的事做久就會慢慢變成是一個習慣,這個習慣就會讓人下意識地完成一些事情。 習慣是一種自動化的行為模式,這些行為模式在重複進行的過程中變得固定且容易自動化。 在Python程式語言中,for迴圈就類似這種概念
在人生中總是會遇到許多選擇,做了不同的選擇產生的結果也會不一樣,大多時候都是在為了要吃什麼在抉擇,小孩才做選擇大人全部都要,全部都要何嘗也不是一個選擇。 在Python程式語言中也有選擇的語法,就是If Else,如果是就做什麼,不是就做什麼,有別於其他程式語言,他不一定要有else,可以只有If
在日常中我們都會將很多事物定上了一個標籤,例如將商品標記價格,替孩子取姓名,公司上冠上職稱等等。 在Python中也有這種方法,就是字典的形式{ 'name' : 'crab', 'apple', 1000 }去呈現
有別於上一篇for迴圈[Python基礎]流程控制for迴圈,while迴圈則常常被說是無限迴圈,若未到達跳脫的條件,是不會停止的。 在日常生活中,我們也常常用到這個概念,例如泡奶粉,要一直攪拌到粉都溶解了為止,其中的一直跟為止就等於while迴圈概念一樣,一直做到某個條件滿足了被觸發才停止。
大部分在求物件的寬度及高度,都會想到用OpenCV的findContours函式來做,從找到的輪廓中來計算物件的面積,周長,邊界框等屬性,從而得到物體的寬度與高度 [OpenCV應用][Python]利用findContours找出物件邊界框求出寬度及高度 本文將用不同的方法,利用Numpy
本文將利用OpenCV的findContours函式,從找到的輪廓中來計算物件的面積,周長,邊界框等屬性,從而得到物體的寬度與高度。 一般來說,我們在進行輪廓檢測時,會先進行圖像二值化,將對象轉換為白色,背景為黑色。這樣,在找到輪廓後,輪廓的點就會以白色表示,背景為黑色。 結果圖 從圖中綠色框
在日常中,常有重複性相當高的事情,不斷地重複在做,重複的事做久就會慢慢變成是一個習慣,這個習慣就會讓人下意識地完成一些事情。 習慣是一種自動化的行為模式,這些行為模式在重複進行的過程中變得固定且容易自動化。 在Python程式語言中,for迴圈就類似這種概念
在人生中總是會遇到許多選擇,做了不同的選擇產生的結果也會不一樣,大多時候都是在為了要吃什麼在抉擇,小孩才做選擇大人全部都要,全部都要何嘗也不是一個選擇。 在Python程式語言中也有選擇的語法,就是If Else,如果是就做什麼,不是就做什麼,有別於其他程式語言,他不一定要有else,可以只有If
在日常中我們都會將很多事物定上了一個標籤,例如將商品標記價格,替孩子取姓名,公司上冠上職稱等等。 在Python中也有這種方法,就是字典的形式{ 'name' : 'crab', 'apple', 1000 }去呈現
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
近期在GitHub排行榜上竄紅的Deep Live Cam,憑藉其強大的AI換臉直播功能,引爆了科技圈的熱烈討論。這款軟體只需一張照片,就能讓你在線上會議、開實況、直播帶貨時,以任何人的面孔示人,為直播市場投下了一顆震撼彈。 什麼是 Deep Live Cam? 簡單來說,Deep Live C
Thumbnail
創建虛擬角色想要賦予生動表情,或是讓歷史人物更變得栩栩如生,利用 AI 模型即可將靜態人物照片變成擁有表情的動態影像。LivePortrait AI 模型可以分析影片中的人物表情,並將其套用至靜態照片,產生具有與影片人物相同表情的動態人像。
Thumbnail
最近家裡安裝了電子鎖,由於我的指紋老是無法辨識成功,所以最後選擇有「人臉辨識」功能的產品。在這篇文章中,將介紹人臉辨識技術的基本原理和安全性,以及如何避免應用軟體漏洞的風險。
Thumbnail
DeepSwapper 是一個免費的線上AI換臉工具,可以輕鬆實現出色的換臉效果,提供DeepSwapper的操作方法和實測範例,實測結果展示了戴眼鏡的照片、各種角度和正面照都能完美呈現。
Thumbnail
「臉部表情」是角色形象中最有表現力的元素之一,透過豐富多樣的表情關鍵字,像是微笑、傷心、大笑等,就可以讓圖像中的角色表現出更豐富的內在情感,與讀者建立情感聯繫。
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
近期在GitHub排行榜上竄紅的Deep Live Cam,憑藉其強大的AI換臉直播功能,引爆了科技圈的熱烈討論。這款軟體只需一張照片,就能讓你在線上會議、開實況、直播帶貨時,以任何人的面孔示人,為直播市場投下了一顆震撼彈。 什麼是 Deep Live Cam? 簡單來說,Deep Live C
Thumbnail
創建虛擬角色想要賦予生動表情,或是讓歷史人物更變得栩栩如生,利用 AI 模型即可將靜態人物照片變成擁有表情的動態影像。LivePortrait AI 模型可以分析影片中的人物表情,並將其套用至靜態照片,產生具有與影片人物相同表情的動態人像。
Thumbnail
最近家裡安裝了電子鎖,由於我的指紋老是無法辨識成功,所以最後選擇有「人臉辨識」功能的產品。在這篇文章中,將介紹人臉辨識技術的基本原理和安全性,以及如何避免應用軟體漏洞的風險。
Thumbnail
DeepSwapper 是一個免費的線上AI換臉工具,可以輕鬆實現出色的換臉效果,提供DeepSwapper的操作方法和實測範例,實測結果展示了戴眼鏡的照片、各種角度和正面照都能完美呈現。
Thumbnail
「臉部表情」是角色形象中最有表現力的元素之一,透過豐富多樣的表情關鍵字,像是微笑、傷心、大笑等,就可以讓圖像中的角色表現出更豐富的內在情感,與讀者建立情感聯繫。
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。