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