1. 程式人生 > >Tensorflow入門教程(二十九)人臉表情識別(上)人臉表情資料集-fer2013

Tensorflow入門教程(二十九)人臉表情識別(上)人臉表情資料集-fer2013

------韋訪 20181102

1、概述

好久沒更新tensorflow的教程了,這這段時間一直在學習機器學習的基礎,但是如果想去找工作,沒有一點實際的應用可能就沒那麼容易聊了,所以,做一下人臉表情識別的例子,其實我最終的目的是想做一個疲勞檢測的例子,這裡就先練練手,看看效能如何。標題有點長有點拗口,其實不應該加上“人臉表情資料集-fer2013”這幾個字的,但是我發現在別人的部落格裡,有網友想跟博主要將圖片解析以後的資料集,博主好像沒回復,所以,我最後會上傳解析後的資料集的,供不熟悉Python的網友下載。

2、fer2013人臉表情資料集簡介

Fer2013人臉表情資料集由35886張人臉表情圖片組成,其中,測試圖(Training)28708張,公共驗證圖(PublicTest)和私有驗證圖(PrivateTest)各3589張,每張圖片是由大小固定為48×48的灰度影象組成,共有7種表情,分別對應於數字標籤0-6,具體表情對應的標籤和中英文如下:0 anger 生氣; 1 disgust 厭惡; 2 fear 恐懼; 3 happy 開心; 4 sad 傷心;5 surprised 驚訝; 6 normal 中性。

但是,資料集並沒有直接給出圖片,而是將表情、圖片資料、用途的資料儲存到csv檔案中,如下圖所示,

如上圖所示,第一張圖是csv檔案的開頭,第一行是表頭,說明每列資料的含義,第一列表示表情標籤,第二列即為圖片資料,這裡是原始的圖片資料,最後一列為用途。

3、將表情圖片提取出來

知道資料結構以後,就好辦了,使用pandas解析csv檔案,(pandas的簡單用法可以檢視這篇部落格:https://blog.csdn.net/rookie_wei/article/details/82974277 ),再將原始圖片資料儲存為jpg檔案,並根據用途和標籤標籤進行分類,分別儲存到對應資料夾下,程式碼比較簡單,並且做了詳細備註,直接給完整程式碼如下,

#encoding:utf-8
import pandas as pd
import numpy as np
import scipy.misc as sm
import os

emotions = {
    '0':'anger', #生氣
    '1':'disgust', #厭惡
    '2':'fear', #恐懼
    '3':'happy', #開心
    '4':'sad', #傷心
    '5':'surprised', #驚訝
    '6':'normal', #中性
}

#建立資料夾
def createDir(dir):
    if os.path.exists(dir) is False:
        os.makedirs(dir)

def saveImageFromFer2013(file):


    #讀取csv檔案
    faces_data = pd.read_csv(file)
    imageCount = 0
    #遍歷csv檔案內容,並將圖片資料按分類儲存
    for index in range(len(faces_data)):
        #解析每一行csv檔案內容
        emotion_data = faces_data.loc[index][0]
        image_data = faces_data.loc[index][1]
        usage_data = faces_data.loc[index][2]
        #將圖片資料轉換成48*48
        data_array = list(map(float, image_data.split()))
        data_array = np.asarray(data_array)
        image = data_array.reshape(48, 48)

        #選擇分類,並建立檔名
        dirName = usage_data
        emotionName = emotions[str(emotion_data)]

        #圖片要儲存的資料夾
        imagePath = os.path.join(dirName, emotionName)

        # 建立“用途資料夾”和“表情”資料夾
        createDir(dirName)
        createDir(imagePath)

        #圖片檔名
        imageName = os.path.join(imagePath, str(index) + '.jpg')

        sm.toimage(image).save(imageName)
        imageCount = index
    print('總共有' + str(imageCount) + '張圖片')


if __name__ == '__main__':
    saveImageFromFer2013('fer2013.csv')

執行結果,

執行完上面的程式碼後,得到3個資料夾,檔案下有相應的表情的子資料夾,

子資料夾下又有相應的圖片,

 這些表情,說真的,我自己都傻傻分不清,比如,

這張圖片我可能歸於傷心,但是它卻在生氣類裡,還有很多類似的例子,裡面甚至有些圖片是漫畫的,也有不知道是什麼東西的,如下,

可能是想加些噪音吧,真是為難了機器了。

這裡就將原始資料集、提取成圖片後的資料集和提取程式碼上傳,下載連結為:

以前下載可以選擇免積分,現在最少也得一個積分,真是苦了沒積分的小夥伴們~