新手速成---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)




©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页