加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 01、人臉表情數(shù)據(jù)準備
    • 02、基于ResNet神經(jīng)網(wǎng)絡的人臉表情識別
  • 推薦器件
  • 相關推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

基于深度學習的人臉表情識別

05/22 08:37
2251
閱讀需 14 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

人臉表情識別是通過神經(jīng)網(wǎng)絡從圖像中提取表情特征,并將表情歸為某一類別的學習任務,是分類任務的一種實際應用。它能夠更準確地理解用戶的情感狀態(tài),并提供個性化服務。目前,人臉表情識別技術(shù)已經(jīng)應用于眾多領域,如智能交互、虛擬現(xiàn)實等。隨著技術(shù)的不斷發(fā)展,深度學習模型將持續(xù)優(yōu)化,不斷提高識別準確率和效率,并與其他技術(shù)結(jié)合,如增強學習、遷移學習等,進一步提升性能,為人機交互帶來更好的體驗。

01、人臉表情數(shù)據(jù)準備

在本文中,我們使用JAFFE(The Japanese Female Facial Expression)數(shù)據(jù)集。該數(shù)據(jù)集發(fā)布于1998年,是一個小型的人臉圖像數(shù)據(jù)集,共包含213張圖片。JAFFE數(shù)據(jù)集選取了10名日本女學生,每個人根據(jù)指示在實驗環(huán)境下做出7種表情,包括:憤怒(Angry,AN)、厭惡(Disgust,DI)、恐懼(Fear,F(xiàn)E)、高興(Happy,HA)、悲傷(Sad,SA)、驚訝(Surprise,SU)以及中性(Neutral,NE)。

創(chuàng)建項目文件夾后,假設將下載好的數(shù)據(jù)集放入該項目文件夾中,目錄地址為"./jaffe"。根據(jù)實驗的需要,我們先對數(shù)據(jù)集進行簡單的劃分,劃分后的地址為"./data/jaffe",后續(xù)訓練則使用該劃分后的目錄地址。

首先導入所需要的工具包:

import os
import wandb
import random
import shutil
import torch
import torch.nn as nn
import torchvision.transforms as transforms
from torchvision.datasets import ImageFolder
from torch.utils.data import DataLoader

下面對數(shù)據(jù)集進行劃分。數(shù)據(jù)集按照4:1的比例分別組成互斥的訓練集train和測試集test。訓練集和測試集的圖片都按照類別分類存儲在不同文件夾中,七個不同的類對應七個不同的文件夾。每個類別的圖片在訓練集和測試集中的比例都是4:1,以保持數(shù)據(jù)分布的一致性。詳細代碼如下:

# 對應其中類別
classes = ['NE','HA','AN','DI','FE','SA','SU']
folder_names = ['train', 'test']

# 未劃分的數(shù)據(jù)集地址
src_data_folder = "./jaffe"

# 劃分后的數(shù)據(jù)集保存地址
target_data_folder = "./data/jaffe"

# 劃分比例
train_scale = 0.8

# 在目標目錄下創(chuàng)建訓練集和驗證集文件夾
for folder_name in folder_names:
folder_path = os.path.join(target_data_folder, folder_name)
os.mkdir(folder_path)

# 在folder_path目錄下創(chuàng)建類別文件夾
????for class_name in classes:
class_folder_path = os.path.join(folder_path, class_name)
os.mkdir(class_folder_path)

# 獲取所有的圖片
files = os.listdir(src_data_folder)
data = [file for file in files if file.endswith('tiff') and not file.startswith('.')]

# 隨機打亂圖片順序
random.shuffle(data)

# 統(tǒng)計保存各類圖片數(shù)量
class_sum = dict.fromkeys(classes, 0)
for file in data:
class_sum[file[3:5]] += 1

# 記錄訓練集各類別圖片的個數(shù)
class_train = dict.fromkeys(classes, 0)

# 記錄測試集各類別圖片的個數(shù)
class_test = dict.fromkeys(classes, 0)

# 遍歷每個圖片劃分
for file in data:

# 得到原圖片目錄地址
????src_img_path = os.path.join(src_data_folder, file)

# 如果訓練集中該類別個數(shù)未達劃分數(shù)量,則復制圖片并分配進入訓練集
????if class_train[file[3:5]] < class_sum[file[3:5]]*train_scale:
target_img_path = os.path.join(os.path.join(target_data_folder, 'train'), file[3:5])
shutil.copy2(src_img_path, target_img_path)
class_train[file[3:5]] += 1

# 否則,進入測試集
????else:
target_img_path = os.path.join(os.path.join(target_data_folder, 'test'), file[3:5])
shutil.copy2(src_img_path, target_img_path)
class_test[file[3:5]] += 1

# 輸出標明數(shù)據(jù)集劃分情況
for class_name in classes:
print("-"?* 10)
print("{}類共{}張圖片,劃分完成:".format(class_name, class_sum[class_name]))
print("訓練集:{}張,測試集:{}張".format(class_train[class_name], class_test[class_name]))

使用上述代碼劃分好的數(shù)據(jù)集格式如圖1所示:

圖1 數(shù)據(jù)集劃分后的格式

通過調(diào)用torchvision.transforms模塊,對上述劃分的數(shù)據(jù)集進行預處理,并使用ImageFolder數(shù)據(jù)加載器加載數(shù)據(jù)。ImageFolder是一個通用的圖像數(shù)據(jù)加載器,它可以加載如上述格式般分類存儲的數(shù)據(jù),并對圖像類別進行預處理操作。按照分類后文件夾的順序返回從0到n(n為類別數(shù)量)的索引,該索引就是各類別文件夾中圖像的分類標簽。代碼如下:

# 數(shù)據(jù)加載及預處理
transform_train = transforms.Compose([
transforms.Resize(32),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
transform_test = transforms.Compose([
transforms.Resize(32),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
# 加載數(shù)據(jù)
train_set = ImageFolder(
root="./data/jaffe/train",
transform=transform_train
)
test_set = ImageFolder(
root="./data/jaffe/test",
transform=transform_test
)
train_loader = DataLoader(
train_set, batch_size=8, shuffle=True)
test_loader = DataLoader(
test_set, batch_size=8, shuffle=False)

02、基于ResNet神經(jīng)網(wǎng)絡的人臉表情識別

(一)網(wǎng)絡定義

在本文中,使用ResNet-18網(wǎng)絡進行訓練。因為JAFFE數(shù)據(jù)集中只有七個類別,所以輸出層只需要七個神經(jīng)元,即num_classes等于7。

# ResNet-18生成方法
def ResNet-18(num_classes = 1000):
model = ResNet(BasicBlock, [2, 2, 2, 2], num_classes)
return model

net = ResNet-18(num_classes=7)

網(wǎng)絡也可以調(diào)用Pytorch中torchvision.models模塊中集成的ResNet網(wǎng)絡,通過簡單的調(diào)用就可以使用,效果與上述代碼是相同的。在調(diào)用torchvision.models模塊中的ResNet網(wǎng)絡時,輸出層的num_classes參數(shù)也需要設置為7。代碼如下:

from torchvision.models import ResNet-18
net = ResNet-18(num_classes = 7)

(二)整體訓練流程在模型的訓練過程中,使用PyTorch中的nn.CrossEntropyLoss()計算損失,使用Adam優(yōu)化器對網(wǎng)絡參數(shù)進行優(yōu)化。以下是人臉表情識別任務的訓練代碼:

if __name__ == "__main__":
# 定義訓練使用的設備
????device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
net = ResNet-18(num_classes=7)
train(net, train_loader, test_loader, device, l_r=0.00003, num_epochs=30)

更多內(nèi)容,敬請關注下方圖書!

▊《深度學習與人工智能實戰(zhàn)

張重生 編著

本書按照知識由淺入深、循序漸進的規(guī)律編寫而成。內(nèi)容分為三大部分,第一部分是Python和PyTorch編程基礎,介紹常用的函數(shù)及其用法;第二部分是初級深度學習算法與技術(shù),含基礎卷積神經(jīng)網(wǎng)絡的實現(xiàn),目標識別、人臉表情識別等實戰(zhàn);第三部分是高級深度學習算法和技術(shù),含孿生神經(jīng)網(wǎng)絡、度量學習、蒸餾學習、目標檢測、圖像分割、圖像生成等技術(shù)及實戰(zhàn)。本書的附錄還提供了常用PyTorch函數(shù)速查手冊。本書根據(jù)深度學習技術(shù)的特點,將內(nèi)容劃分為數(shù)據(jù)準備、神經(jīng)網(wǎng)絡模型實現(xiàn)、損失函數(shù)實現(xiàn)、整體訓練流程和效果展示五部分。這種章節(jié)內(nèi)容安排方式邏輯清楚,可操作性強、更易理解。

撰? 稿? 人:楊健亭責任編輯: 李馨馨審? 核? 人:曹新宇

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
ATXMEGA128A4U-CU 1 Microchip Technology Inc IC MCU 8BIT 128KB FLASH 49VFBGA

ECAD模型

下載ECAD模型
$5.69 查看
STM32H743ZIT6 1 STMicroelectronics High-performance and DSP with DP-FPU, Arm Cortex-M7 MCU with 2MBytes of Flash memory, 1MB RAM, 480 MHz CPU, Art Accelerator, L1 cache, external memory interface, large set of peripherals

ECAD模型

下載ECAD模型
$22.21 查看
ATXMEGA128A4U-MHR 1 Atmel Corporation RISC Microcontroller, 16-Bit, FLASH, AVR RISC CPU, 32MHz, CMOS, PQCC44, 7 X 7 MM, 1 MM HEIGHT, 0.50 MM PITCH, GREEN, PLASTIC, MO-220VKKD-3, VQFN-44
$4.48 查看

相關推薦

電子產(chǎn)業(yè)圖譜

“工控有得聊”是機械工業(yè)出版社“機工工控”“機工通信”品牌旗下專業(yè)資訊和服務平臺,致力于幫助讀者在電氣、通信、自動化領域里,緊跟前沿資訊,掌握核心技術(shù),快速提升專業(yè)素養(yǎng)。工業(yè)知識服務平臺,分享熱點資訊、精選深度技術(shù)文章、發(fā)布最新書訊。

微信公眾號