1. 程式人生 > >新手速成---TensorFlow實現jaffe表情識別--準備工作+step1

新手速成---TensorFlow實現jaffe表情識別--準備工作+step1

背景

正如前文講的,博主主要是為了交作業。。。作業三選一,牛津花卉資料集、jaffe表情資料集、股票預測,很顯然我選的表情識別。
JAFFE資料集一共有213張影象.選取了10名日本女學生,每個人做出7種表情.7種表情包括: Angry,Disgust,Fear,Happy,Sad,Surprise,Neutral.(憤怒,厭惡,恐懼,高興,悲傷,驚訝,中性)格式:tiff
將其中的193幅影象作為train,剩下的20幅作為test
琢磨了一週,也沒有完全適合新手的,特此寫一篇步驟比較全的供大家參考。
程式執行基礎:TensorFlow,用anaconda在environment上安裝所需要的所有包。(import報啥沒有,就下啥)

具體步驟

step1 裁剪人臉(將人臉區域裁剪出,獲得的人臉區域縮放為48*48大小的影象,儲存為.csv格式資料.) ,就是在你指定的路徑輸出一個Excel檔案
這部分詳見(https://blog.csdn.net/akadiao/article/details/79956952)
step2 建立CNN,訓練樣本
step3 輸出日誌檔案,折線圖
step4 tensorboard檢視網路結構圖
簡單的說就是這四步,重點就是step2,而對於從未看過Python的我來說,1234都挺費勁,下面進行分步講解。

step1: 你就把所有照片放在一個資料夾,因為所有影象都要進行人臉的裁剪,然後只需要改三個路徑,第一個f是照片資料夾的路徑,第二個cascade是haarcascade_frontalface_default.xml的路徑,這個xml去網上下,或者上GitHub裡扒完整程式碼時,資料夾裡都有。第三個是CSV的存放地址。
step1常見問題:寫路徑出錯,因為對Python不熟,這種錯誤我就沒用r,直接“\\“,簡單粗暴
下面是step1完整程式碼(改完路徑可以直接跑),其他程式碼見下一篇

# -*- coding: utf-8 -*-
"""
Created on Sat Nov 24 11:39:44 2018

@author: Administrator
"""

# -*- coding: utf-8 -*-
"""
Created on Sat Nov 24 11:15:45 2018

@author: Administrator
"""

import cv2
import os
import numpy as np
import csv

def detect(img,cascade):
    rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30),flags=cv2.CASCADE_SCALE_IMAGE)
    if len(rects) == 0:
        return []
    rects[:, 2:] += rects[:, :2]
    return rects

#cascade = cv2.CascadeClassifier("/home/.../data/haarcascades/haarcascade_frontalface_alt.xml")
cascade = cv2.CascadeClassifier("C:\\Users\\Administrator\\Desktop\\recognize\\data\\haarcascade_files\\haarcascade_frontalface_default.xml")
#f = "/home/w/mycode/jaffe/"
f="C:\\Users\\Administrator\\Desktop\\recognize\\data\\jaffe\\"
#jaffe 資料夾所在路徑
fs = os.listdir(f)#列出路徑下所有檔案和資料夾
data = np.zeros([213, 48*48], dtype=np.uint8)
label = np.zeros([213], dtype=int)
i = 0
for f1 in fs:
#具體資料夾考慮
    tmp_path = os.path.join(f, f1)#每張圖片的全路徑,f+f1
    if not os.path.isdir(tmp_path): #isdir判斷路徑是否為目錄
        # print(tmp_path[len(f):])
        img = cv2.imread(tmp_path, 1)
        dst = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #讀取圖片並轉換
        rects = detect(dst, cascade)
        for x1, y1, x2, y2 in rects:
            cv2.rectangle(img,(x1+10,y1+20),(x2-10,y2),(0,255,255),2)
            # 調整擷取臉部區域大小
            img_roi = np.uint8([y2-(y1+20), (x2-10)-(x1+10)])
            roi = dst[y1+20:y2, x1+10:x2-10]
            img_roi = roi
            re_roi = cv2.resize(img_roi, (48,48))
            # 獲得表情label
            img_label = tmp_path[len(f)+3:len(f)+5]
            # print(img_label)
            if img_label == 'AN':
                label[i] = 0
            elif img_label == 'DI':
                label[i] = 1
            elif img_label == 'FE':
                label[i] = 2
            elif img_label == 'HA':
                label[i] = 3
            elif img_label == 'SA':
                label[i] = 4
            elif img_label == 'SU':
                label[i] = 5
            elif img_label == 'NE':
                label[i] = 6
            else:
                print("get label error.......\n")

            data[i][0:48*48] = np.ndarray.flatten(re_roi)
            i = i + 1

            # cv2.imshow("src", dst)
            # cv2.imshow("img", img)
            # if cv2.waitKey() == 32:
            #     continue

#with open(r"/home/.../face.csv","w") as csvfile: #只讀的方式開啟檔案
#with open("C:\\Users\\Administrator\\Desktop\\recognize\\face.csv","w") as csvfile: #r只讀的方式開啟檔案,w 寫入檔案,檔案不存在則建立新檔案
            #遇到:冒號的就是一個方法體,要一起執行
with open("C:\\Users\\Administrator\\Desktop\\recognize\\face.csv","w") as csvfile: #r只讀的方式開啟檔案,w 寫入檔案,檔案不存在則建立新檔案
    writer = csv.writer(csvfile)
    writer.writerow(['emotion', 'pixels'])
    for i in range(len(label)):
        data_list = list(data[i])
        b = " ".join(str(x) for x in data_list)
        l = np.hstack([label[i], b])
        writer.writerow(l)