国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Pytorch實現(xiàn)基于深度學習的面部表情識別(最新,非常詳細)

這篇具有很好參考價值的文章主要介紹了Pytorch實現(xiàn)基于深度學習的面部表情識別(最新,非常詳細)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、項目背景

基于深度學習的面部表情識別
(Facial-expression Recognition)

數(shù)據集cnn_train.csv包含人類面部表情的圖片的label和feature。
在這里,面部表情識別相當于一個分類問題,共有7個類別。
其中l(wèi)abel包括7種類型表情:
Pytorch實現(xiàn)基于深度學習的面部表情識別(最新,非常詳細)
一共有28709個label,即包含28709張表情包。
每一行就是一張表情包4848=2304個像素,相當于4848個灰度值(intensity)(0為黑, 255為白)
本項目同時支持GPU與CPU上運行。

二、數(shù)據預處理

1、標簽與特征分離

對原數(shù)據進行處理,分離后分別保存為cnn_label.csv和cnn_data.csv

# cnn_feature_label.py
# ###一、將原始數(shù)據的label和feature(像素)數(shù)據分離
import pandas as pd

# 源數(shù)據路徑
path = '../datasets/originalData/cnn_train.csv'
# 讀取數(shù)據
df = pd.read_csv(path)
# 提取feature(像素)數(shù)據 和 label數(shù)據
df_x = df[['feature']]
df_y = df[['label']]
# 將feature和label數(shù)據分別寫入兩個數(shù)據集
df_x.to_csv('../datasets/cnn_data.csv', index=False, header=False)
df_y.to_csv('../datasets/cnn_label.csv', index=False, header=False)

Pytorch實現(xiàn)基于深度學習的面部表情識別(最新,非常詳細)

2、數(shù)據可視化

對特征進一步處理,也就是將每個數(shù)據行的2304個像素值合成每張48*48的表情圖,最后做成24000張表情包。

# face_view.py
# ###二、數(shù)據可視化,將每個數(shù)據行的2304個像素值合成每張48*48的表情圖。
import cv2
import numpy as np

# 放圖片的路徑
path = '../images'
# 讀取像素數(shù)據
data = np.loadtxt('../datasets/cnn_data.csv')

# 按行取數(shù)據并寫圖
for i in range(data.shape[0]):
    face_array = data[i, :].reshape((48, 48))  # reshape
    cv2.imwrite(path + '//' + '{}.jpg'.format(i), face_array)  # 寫圖片

Pytorch實現(xiàn)基于深度學習的面部表情識別(最新,非常詳細)

3、分割訓練集和測試集

Step1:劃分一下訓練集和驗證集。一共有28709張圖片,我取前24000張圖片作為訓練集,其他圖片作為驗證集。新建文件夾cnn_train和cnn_val,將0.jpg到23999.jpg放進文件夾cnn_train,將其他圖片放進文件夾cnn_val.

# cnn_picture_label.py
# ###三、表情圖片和類別標注,
# 1.取前24000張圖片作為訓練集放入cnn_train,其他圖片作為驗證集放入cnn_val
# 2.對每張圖片標記屬于哪一個類別,存放在dataset.csv中,分別在剛剛訓練集和測試集執(zhí)行標記任務。

# #因為cpu訓練太慢,我只取前2000張做訓練,400張做測試!!,手動刪除兩個文件夾重dataset.csv的多余行數(shù)據
import os
import pandas as pd


def data_label(path):
    # 讀取label文件
    df_label = pd.read_csv('../datasets/cnn_label.csv', header=None)
    # 查看該文件夾下所有文件
    files_dir = os.listdir(path)
    # 存放文件名和標簽的列表
    path_list = []
    label_list = []
    # 遍歷所有文件,取出文件名和對應的標簽分別放入path_list和label_list列表
    for file_dir in files_dir:
        if os.path.splitext(file_dir)[1] == '.jpg':
            path_list.append(file_dir)
            index = int(os.path.splitext(file_dir)[0])
            label_list.append(df_label.iat[index, 0])
    # 將兩個列表寫進dataset.csv文件
    path_s = pd.Series(path_list)
    label_s = pd.Series(label_list)
    df = pd.DataFrame()
    df['path'] = path_s
    df['label'] = label_s
    df.to_csv(path + '\\dataset.csv', index=False, header=False)


def main():
    # 指定文件夾路徑
    train_path = '../datasets/cnn_train'
    val_path = '../datasets/cnn_val'
    data_label(train_path)
    data_label(val_path)


if __name__ == '__main__':
    main()

Pytorch實現(xiàn)基于深度學習的面部表情識別(最新,非常詳細)

Step2:對每張圖片標記屬于哪一個類別,存放在dataset.csv中,分別在剛剛訓練集和測試集執(zhí)行標記任務。
Pytorch實現(xiàn)基于深度學習的面部表情識別(最新,非常詳細)

Step3:重寫Dataset類,它是Pytorch中圖像數(shù)據集加載的一個基類,需要重寫類來實現(xiàn)加載上面的圖像數(shù)據集

# rewrite_dataset.py
# ###四、重寫類來實現(xiàn)加載上面的圖像數(shù)據集。
import bisect
import warnings

import cv2
import numpy as np
import pandas as pd
import torch
import torch.utils.data as data


class FaceDataset(data.Dataset):
    # 初始化
    def __init__(self, root):
        super(FaceDataset, self).__init__()
        self.root = root
        df_path = pd.read_csv(root + '\\dataset.csv', header=None, usecols=[0])
        df_label = pd.read_csv(root + '\\dataset.csv', header=None, usecols=[1])
        self.path = np.array(df_path)[:, 0]
        self.label = np.array(df_label)[:, 0]

    # 讀取某幅圖片,item為索引號
    def __getitem__(self, item):
        # 圖像數(shù)據用于訓練,需為tensor類型,label用numpy或list均可
        face = cv2.imread(self.root + '\\' + self.path[item])
        # 讀取單通道灰度圖
        face_gray = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY)
        # 直方圖均衡化
        face_hist = cv2.equalizeHist(face_gray)

        """
        像素值標準化
        讀出的數(shù)據是48X48的,而后續(xù)卷積神經網絡中nn.Conv2d() 
        API所接受的數(shù)據格式是(batch_size, channel, width, height),
        本次圖片通道為1,因此我們要將48X48 reshape為1X48X48。
        """
        face_normalized = face_hist.reshape(1, 48, 48) / 255.0
        face_tensor = torch.from_numpy(face_normalized)
        face_tensor = face_tensor.type('torch.FloatTensor')
        # face_tensor = face_tensor.type('torch.cuda.FloatTensor')
        label = self.label[item]
        return face_tensor, label

    # 獲取數(shù)據集樣本個數(shù)
    def __len__(self):
        return self.path.shape[0]

三、搭建模型

卷積神經網絡模型如下:
Pytorch實現(xiàn)基于深度學習的面部表情識別(最新,非常詳細)

# CNN_face.py
# 定義一個CNN模型
"""
inputs(48*48*1) ->
conv(24*24*64) -> conv(12*12*128) -> conv(6*6*256) ->
Dropout -> fc(4096) -> Dropout -> fc(1024) ->
outputs(7)
"""

import torch.nn as nn


# 參數(shù)初始化
def gaussian_weights_init(m):
    classname = m.__class__.__name__
    # 字符串查找find,找不到返回-1,不等-1即字符串中含有該字符
    if classname.find('Conv') != -1:
        m.weight.data.normal_(0.0, 0.04)


class FaceCNN(nn.Module):
    # 初始化網絡結構
    def __init__(self):
        super(FaceCNN, self).__init__()

        # layer1(conv + relu + pool)
        # input:(bitch_size, 1, 48, 48), output(bitch_size, 64, 24, 24)
        self.conv1 = nn.Sequential(
            nn.Conv2d(1, 64, 3, 1, 1),
            nn.BatchNorm2d(num_features=64),
            nn.RReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )
        # layer2(conv + relu + pool)
        # input:(bitch_size, 64, 24, 24), output(bitch_size, 128, 12, 12)
        self.conv2 = nn.Sequential(
            nn.Conv2d(64, 128, 3, 1, 1),
            nn.BatchNorm2d(num_features=128),
            nn.RReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )
        # layer3(conv + relu + pool)
        # input: (bitch_size, 128, 12, 12), output: (bitch_size, 256, 6, 6)
        self.conv3 = nn.Sequential(
            nn.Conv2d(128, 256, 3, 1, 1),
            nn.BatchNorm2d(num_features=256),
            nn.RReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )

        # 參數(shù)初始化
        self.conv1.apply(gaussian_weights_init)
        self.conv2.apply(gaussian_weights_init)
        self.conv3.apply(gaussian_weights_init)

        # 全連接層
        self.fc = nn.Sequential(
            nn.Dropout(p=0.2),
            nn.Linear(256*6*6, 4096),
            nn.RReLU(inplace=True),

            nn.Dropout(p=0.5),
            nn.Linear(4096, 1024),
            nn.RReLU(inplace=True),

            nn.Linear(1024, 256),
            nn.RReLU(inplace=True),
            nn.Linear(256, 7)
        )

    # 向前傳播
    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.conv3(x)
        x = x.view(x.shape[0], -1)  # 數(shù)據扁平化
        y = self.fc(x)

        return y

四、訓練模型

損失函數(shù)使用交叉熵,優(yōu)化器是隨機梯度下降SGD,其中weight_decay為正則項系數(shù),每輪訓練打印損失值,每10輪訓練打印準確率。

# train.py
# 定義訓練輪
import torch
import torch.utils.data as data
import torch.nn as nn
import numpy as np
from torch import optim

from models import CNN_face
from dataloader import rewrite_dataset


def train(train_dataset, val_dataset, batch_size, epochs, learning_rate, wt_decay, print_cost=True, isPlot=True):
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    # 加載數(shù)據集并分割batch
    train_loader = data.DataLoader(train_dataset, batch_size)
    # 構建模型
    model = CNN_face.FaceCNN()
    model.to(device)
    # 損失函數(shù)和優(yōu)化器
    compute_loss = nn.CrossEntropyLoss()
    optimizer = optim.SGD(model.parameters(), lr=learning_rate, weight_decay=wt_decay)
    # 學習率衰減
    # scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.8)

    for epoch in range(epochs):
        loss = 0
        model.train()
        for images, labels in train_loader:
            optimizer.zero_grad()
            outputs = model.forward(images)
            loss = compute_loss(outputs, labels)
            loss.backward()
            optimizer.step()

        # 打印損失值
        if print_cost:
            print('epoch{}: train_loss:'.format(epoch + 1), loss.item())

        # 評估模型準確率
        if epoch % 10 == 9:
            model.eval()
            acc_train = validate(model, train_dataset, batch_size)
            acc_val = validate(model, val_dataset, batch_size)
            print('acc_train: %.1f %%' % (acc_train * 100))
            print('acc_val: %.1f %%' % (acc_val * 100))

    return model


# 驗證模型在驗證集上的正確率
def validate(model, dataset, batch_size):
    val_loader = data.DataLoader(dataset, batch_size)
    result, total = 0.0, 0
    for images, labels in val_loader:
        pred = model.forward(images)
        pred_tmp = pred.cuda().data.cpu().numpy()
        pred = np.argmax(pred_tmp.data.numpy(), axis=1)
        labels = labels.data.numpy()
        result += np.sum((pred == labels))
        total += len(images)
    acc = result / total
    return acc


def main():
    train_dataset = rewrite_dataset.FaceDataset(root=r'D:\01 Desktop\JUST_YAN\05 DeepLearning\Facial-expression_Reg\datasets\cnn_train')
    val_dataset = rewrite_dataset.FaceDataset(root=r'D:\01 Desktop\JUST_YAN\05 DeepLearning\Facial-expression_Reg\datasets\cnn_val')
    model = train(train_dataset, val_dataset, batch_size=128, epochs=100, learning_rate=0.01,
                  wt_decay=0, print_cost=True, isPlot=True)
    torch.save(model, 'model_net.pkl')  # 保存模型


if __name__ == '__main__':
    main()

五、訓練結果

在超參數(shù)為:batch_size=128, epochs=100, learning_rate=0.01, wt_decay=0,的情況下跑得最終結果如下:
Pytorch實現(xiàn)基于深度學習的面部表情識別(最新,非常詳細)

附錄

代碼已托管到GitHub和Gitee:
GitHub:https://github.com/HaoliangZhou/FERNet
Gitee: https://gitee.com/zhou-zhou123c/FERNet
參考資料:
https://blog.csdn.net/Charzous/article/details/107452464/
數(shù)據集
數(shù)據集cnn_train.csv文章來源地址http://www.zghlxwxcb.cn/news/detail-441954.html

到了這里,關于Pytorch實現(xiàn)基于深度學習的面部表情識別(最新,非常詳細)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 計算機競賽 基于深度學習的人臉表情識別

    計算機競賽 基于深度學習的人臉表情識別

    ?? 優(yōu)質競賽項目系列,今天要分享的是 基于深度學習的人臉表情識別 該項目較為新穎,適合作為競賽課題方向,學長非常推薦! ?? 更多資料, 項目分享: https://gitee.com/dancheng-senior/postgraduate 面部表情識別技術源于1971年心理學家Ekman和Friesen的一項研究,他們提出人類主要有

    2024年02月10日
    瀏覽(860)
  • 基于深度學習的人臉表情識別 計算機競賽

    基于深度學習的人臉表情識別 計算機競賽

    ?? 優(yōu)質競賽項目系列,今天要分享的是 基于深度學習的人臉表情識別 該項目較為新穎,適合作為競賽課題方向,學長非常推薦! ?? 更多資料, 項目分享: https://gitee.com/dancheng-senior/postgraduate 面部表情識別技術源于1971年心理學家Ekman和Friesen的一項研究,他們提出人類主要有

    2024年02月06日
    瀏覽(786)
  • 基于Python+OpenCV+dlib+Tensorflow深度學習的人臉表情識別系統(tǒng)

    基于Python+OpenCV+dlib+Tensorflow深度學習的人臉表情識別系統(tǒng)

    歡迎大家點贊、收藏、關注、評論啦 ,由于篇幅有限,只展示了部分核心代碼。 ??人臉表情識別是一種重要的計算機視覺任務,它涉及到對人臉圖像中的表情進行分類和理解。在這個系統(tǒng)中,我們將使用Python、OpenCV、dlib和Tensorflow來實現(xiàn)深度學習模型,以識別人臉表情。

    2024年02月01日
    瀏覽(32)
  • [深度學習實戰(zhàn)]基于PyTorch的深度學習實戰(zhàn)(下)[Mnist手寫數(shù)字圖像識別]

    [深度學習實戰(zhàn)]基于PyTorch的深度學習實戰(zhàn)(下)[Mnist手寫數(shù)字圖像識別]

    PyTorch——開源的Python機器學習庫 ??首先感謝所有點開本文的朋友們!基于PyTorch的深度學習實戰(zhàn)可能要告一段落了。本想著再寫幾篇關于 PyTorch神經網絡深度學習 的文章來著,可無奈項目時間緊任務重,要求 短時間內出圖并做好參數(shù)擬合 。所以只得轉戰(zhàn) Matlab 編程,框架舊

    2024年02月16日
    瀏覽(28)
  • 基于Pytorch深度學習的腦腫瘤分類識別(文末送書)

    基于Pytorch深度學習的腦腫瘤分類識別(文末送書)

    ???♂? 個人主頁:@艾派森的個人主頁 ???作者簡介:Python學習者 ?? 希望大家多多支持,我們一起進步!?? 如果文章對你有幫助的話, 歡迎評論 ??點贊???? 收藏 ??加關注+ 目錄 實驗背景 實驗目的 實驗環(huán)境 實驗過程 1.加載數(shù)據 2.訓練模型 3.模型評估 源代碼 文末

    2024年02月12日
    瀏覽(91)
  • 基于深度學習的高精度浣熊檢測識別系統(tǒng)(PyTorch+Pyside6+模型)

    基于深度學習的高精度浣熊檢測識別系統(tǒng)(PyTorch+Pyside6+模型)

    摘要:基于深度學習的高精度浣熊檢測(水牛、犀牛、斑馬和大象)識別系統(tǒng)可用于日常生活中或野外來檢測與定位浣熊目標,利用深度學習算法可實現(xiàn)圖片、視頻、攝像頭等方式的浣熊目標檢測識別,另外支持結果可視化與圖片或視頻檢測結果的導出。本系統(tǒng)采用YOLOv5目標

    2024年02月09日
    瀏覽(24)
  • 人工智能概論報告-基于PyTorch的深度學習手寫數(shù)字識別模型研究與實踐

    人工智能概論報告-基于PyTorch的深度學習手寫數(shù)字識別模型研究與實踐

    本文是我人工智能概論的課程大作業(yè)實踐應用報告,可供各位同學參考,內容寫的及其水,部分也借助了gpt自動生成,排版等也基本做好,大家可以參照。如果有需要word版的可以私信我,或者在評論區(qū)留下郵箱,我會逐個發(fā)給。word版是我最后提交的,已經調整統(tǒng)一了全文格

    2024年02月05日
    瀏覽(110)
  • FER2013人臉表情識別從零實現(xiàn)(Pytorch,F(xiàn)NN,CNN)

    FER2013人臉表情識別從零實現(xiàn)(Pytorch,F(xiàn)NN,CNN)

    學完了深度學習的理論和框架,接下來就是實踐啦!相信大家在實踐的時候都會去找各種的項目,本文是kaggle上面的一個深度學習小項目,目的是實現(xiàn)人臉表情的分類。接下來我將具體講解實現(xiàn)過程,相信你只要學了深度學習的理論知識,對pytorch框架有所了解,就能夠看得懂

    2024年02月05日
    瀏覽(21)
  • 計算機設計大賽 深度學習人臉表情識別算法 - opencv python 機器視覺

    計算機設計大賽 深度學習人臉表情識別算法 - opencv python 機器視覺

    ?? 優(yōu)質競賽項目系列,今天要分享的是 ?? 深度學習人臉表情識別系統(tǒng) 該項目較為新穎,適合作為競賽課題方向,學長非常推薦! ??學長這里給一個題目綜合評分(每項滿分5分) 難度系數(shù):3分 工作量:3分 創(chuàng)新點:4分 ?? 更多資料, 項目分享: https://gitee.com/dancheng-senior/

    2024年02月21日
    瀏覽(570)
  • 基于深度學習的高精度山羊檢測識別系統(tǒng)(PyTorch+Pyside6+YOLOv5模型)

    基于深度學習的高精度山羊檢測識別系統(tǒng)(PyTorch+Pyside6+YOLOv5模型)

    摘要:基于深度學習的高精度山羊檢測識別系統(tǒng)可用于日常生活中或野外來檢測與定位山羊目標,利用深度學習算法可實現(xiàn)圖片、視頻、攝像頭等方式的山羊目標檢測識別,另外支持結果可視化與圖片或視頻檢測結果的導出。本系統(tǒng)采用YOLOv5目標檢測模型訓練數(shù)據集,使用

    2024年02月07日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包