[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


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




119會員
201內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
發表第一個留言支持創作者!
螃蟹_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
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
在樹莓派安裝OpenCV的紀錄。板子是樹莓派3B(沒有+),系統raspbian bullseye 32bit灌到USB隨身碟。
Thumbnail
#安裝 OpenCV 相關套件 pip install opencv-python pip install opencv-contrib-python pip install matplotlib
Haar Cascade classifier OpenCV 官方 Github:https://github.com/opencv/opencv/tree/4.x/data 人臉特徵模型:haarcascade_frontalface_default.xml 資料來源: https://steam
Thumbnail
OpenCV 讀取圖片 原碼:https://reurl.cc/3354ZL 成果: OpenCV 本身有提供讀取圖檔的函數可用,讀取圖檔,只要呼叫 cv2.imread 即可將圖片讀取進來,以 cv2.imread 讀進來的資料,會儲存成一個 NumPy 的陣列。 將圖片讀取進來之後,可使用 c
opencv is use BGR color matplotlib is use RGB color 顯示圖片 opencv matplotlib
Thumbnail
初稿 作者: Stan Ht. Wu (stanwu 吳信典) 想像一下,如果整台電腦裝瀏覽器就好了?這樣多輕鬆啊!人生就是要斷捨離,什麼都不裝,就用瀏覽器就好了,您看連寫方格子的文章也是直接用瀏覽器耶!! 用瀏覽器基本上是最符合懶人原則,為什麼呢?因為從頭到尾根本不需要切換應用程式,存檔案放在雲端
Thumbnail
OpenCart 官方的 3.0.3.7 版於上周釋出,除了修正許多 3.0.x 版累積的小問題,也更新了 twig 套件解決了 PHP 7.4 的相容問題,所以 OpenCart 台灣電商技術團隊,也以 OpenCart 3.0.3.7 版為基礎,加上了在地優化及實用模組,推出台灣優化版。
Thumbnail
綠界科技雖然為 OpenCart 電商系統推出了可直接安裝使用的金流擴充模組,但其設計的模組架構,並不算完全符合 OpenCart 金流模組的架構規則,包含後臺編輯不同付款方式時的設定,無法獨立分開設定,前台的金流選擇,更是被設計成兩段式的模式,非常不符合台灣消費者慣用的習性。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
在樹莓派安裝OpenCV的紀錄。板子是樹莓派3B(沒有+),系統raspbian bullseye 32bit灌到USB隨身碟。
Thumbnail
#安裝 OpenCV 相關套件 pip install opencv-python pip install opencv-contrib-python pip install matplotlib
Haar Cascade classifier OpenCV 官方 Github:https://github.com/opencv/opencv/tree/4.x/data 人臉特徵模型:haarcascade_frontalface_default.xml 資料來源: https://steam
Thumbnail
OpenCV 讀取圖片 原碼:https://reurl.cc/3354ZL 成果: OpenCV 本身有提供讀取圖檔的函數可用,讀取圖檔,只要呼叫 cv2.imread 即可將圖片讀取進來,以 cv2.imread 讀進來的資料,會儲存成一個 NumPy 的陣列。 將圖片讀取進來之後,可使用 c
opencv is use BGR color matplotlib is use RGB color 顯示圖片 opencv matplotlib
Thumbnail
初稿 作者: Stan Ht. Wu (stanwu 吳信典) 想像一下,如果整台電腦裝瀏覽器就好了?這樣多輕鬆啊!人生就是要斷捨離,什麼都不裝,就用瀏覽器就好了,您看連寫方格子的文章也是直接用瀏覽器耶!! 用瀏覽器基本上是最符合懶人原則,為什麼呢?因為從頭到尾根本不需要切換應用程式,存檔案放在雲端
Thumbnail
OpenCart 官方的 3.0.3.7 版於上周釋出,除了修正許多 3.0.x 版累積的小問題,也更新了 twig 套件解決了 PHP 7.4 的相容問題,所以 OpenCart 台灣電商技術團隊,也以 OpenCart 3.0.3.7 版為基礎,加上了在地優化及實用模組,推出台灣優化版。
Thumbnail
綠界科技雖然為 OpenCart 電商系統推出了可直接安裝使用的金流擴充模組,但其設計的模組架構,並不算完全符合 OpenCart 金流模組的架構規則,包含後臺編輯不同付款方式時的設定,無法獨立分開設定,前台的金流選擇,更是被設計成兩段式的模式,非常不符合台灣消費者慣用的習性。