- CK+有123的子类(人),每个人提供1~7种表情,每种表情是一组序列(总共有593个图像序列,其中327个序列是有表情标签的):从自然缓慢变化到给定表情
比如上图是人S026做出的某类表情,第一张是自然,缓慢变化到最终是峰值快乐表情
- 标签 593个序列中只有327个是具有情感序列标签的,情绪类别分别是0=neutral, 1=anger, 2=contempt, 3=disgust, 4=fear, 5=happy, 6=sadness, 7=surprise
某些实验会说明在CK+上的精度,所以需要自己制作为ImageNet式的数据集
import glob
import os
import shutil
import cv2
defcreat_folder():[os.makedirs(os.path.join('results',folder,str(i+1)))for folder in['ckp','ckp_facedet_crop','train','val','test']for i inrange(7)]deftoImageFolder():"""
将该函数所在脚本与"Emotion_labels"和"extended-cohn-kanade-images"同级,
成功运行后,会产生ckp文件夹并有1~7共7个子文件夹,总共981张图片(选取最后三张)
@return:
"""
i =0for info in os.walk("Emotion_labels/Emotion"):
abs_path, _, file_names = info # 获取标签文件所在路径,以及标签文件的名字file_namesif file_names.__len__()>0:# 如果至少存在一个标签,则循环读取标签复制相应图片文件for file_name in file_names:# 获取当前标签的类别withopen(os.path.join(abs_path, file_name))as f:
label_context = f.readline()
label_index = label_context.strip()[0]# 标签仅记录序列图片中感情最强烈的图片[pos=-1],但是倒数几张[pos=-1,-2,-3]其实都很强烈,可以作为数据集
img_root_path = abs_path.replace("Emotion_labels/Emotion","extended-cohn-kanade-images/cohn-kanade-images")
img_paths = glob.glob(img_root_path +"/*")for img_path in img_paths[-3:]:# 选取最后三张# 将label路径修改为"xx/类别/文件名"路径
src = img_path
dst = os.path.join('results',"ckp", label_index,
img_path.split(os.path.sep)[-1])# eg: 'ckp\\3\\S005_001_00000009.png'
shutil.copyfile(src, dst)
i +=1print("图片总数:", i)defface_crop():"""
遍历ckp每个子文件夹下的所有图片,进行人脸检测并裁剪
@return:
"""defface_detect(img_path):
image = cv2.imread(img_path)
image_draw = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
face_detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
faces = face_detector.detectMultiScale(gray,1.02,20)for x, y, w, h in faces:
face_img = image[y:y + h, x:x + w]
cv2.rectangle(image_draw,(x, y),(x + w, y + h),(0,0,255),2)
dst = img_path.replace("ckp",'ckp_facedet_crop')# 需要创建文件夹
cv2.imwrite(dst, face_img)
i =0for sub in glob.glob("results/ckp/*"):for img_path in glob.glob(sub +"/*"):
face_detect(img_path)
i +=1if i %50==0:print(i)defcp_splite_img():"""
根据同级的train_list.txt、val_list.txt、test_list.txt,
分割文件我用PaddleX GUI划分,也可以手动划分
按ImageNet式数据集划分标签进行train、val和test划分
@return:
"""defcp_train_data():"""
读取train_list.txt文件,并将所属train数据复制到train文件夹内
@return:
"""withopen("train_list.txt")as f:
file_datas=f.readlines()for data in file_datas:
path,index=data.split(" ")
src = os.path.join('results','ckp_facedet_crop', path)
dst=os.path.join('results',"train",path)
shutil.copyfile(src,dst)defcp_val_data():withopen("val_list.txt")as f:
file_datas=f.readlines()for data in file_datas:
path,index=data.split(" ")
src = os.path.join('results','ckp_facedet_crop', path)
dst=os.path.join('results',"val",path)
shutil.copy(src,dst)defcp_test_data():withopen("test_list.txt")as f:
file_datas=f.readlines()for data in file_datas:
path,index=data.split(" ")
src = os.path.join('results','ckp_facedet_crop', path)
dst=os.path.join('results',"test",path)
shutil.copy(src,dst)
cp_train_data()
cp_val_data()
cp_test_data()if __name__=="__main__":"""
同级目录下,应当包含:
Emotion_labels:CK+标签文件夹
extended-cohn-kanade-images:CK+图像文件夹
ck+process.py:本程序
haarcascade_frontalface_default.xml:opencv人脸检测器
test_list.txt:分割列表
train_list:分割列表
val_list:分割列表
"""print("创建文件夹......")
creat_folder()print("开始处理ImageFolder......")
toImageFolder()# 将原始CK+整理为ImageFolder形式,复制到ckp文件夹print("开始处理人脸检测裁剪......,裁剪后请手动处理裁剪失败的样本")
face_crop()# 遍历ckp文件夹所有图像进行人脸检测裁剪,$少许裁剪失败,需手动修复print("开始train、val和test划分......")
cp_splite_img()# 根据同级的train_list.txt、val_list.txt、test_list.txt,进行train、val和test划分
本文转载自: https://blog.csdn.net/qq_40243750/article/details/128019629
版权归原作者 我是一个对称矩阵 所有, 如有侵权,请联系我们删除。
版权归原作者 我是一个对称矩阵 所有, 如有侵权,请联系我们删除。