因项目需求需要对人像进行男、女、老、少人脸属性分类,与单标签多类不同(一张图一个标签,有多个类别),多标签分类(一个图有多个标签如:男的老人、女的青年人等)的标注应该如何实现?参考https://blog.youkuaiyun.com/LEO_Angel01/article/details/116103164,采用onehot标签编码实现数据的多标签标注。
1.数据准备与标注
思路:
1)通过yolov8人脸检测模型对自研图像进行人脸区域截取
2)通过公开的人脸属性分类模型对截取的图像进行粗分类,然后通过人工方式进行筛选。也可以直接通过人工方式进行筛选。
3)将分类好的自研图像与公开的数据集进行合并,增强模型泛化能力。
分类好的图像存储如下图所示,以下文件存储在output文件夹底下,在不同文件夹中存储了不同属性的人脸图像
label.csv生成,根据文件夹的名称提取图像的标签,与图像进行关联
import os
import csv
output_folder = r"E:\chen\FaceAttributes\data\output"
csv_file = "label.csv"
# 写入CSV文件头部
with open(csv_file, mode='w', newline='') as file:
writer = csv.writer(file)
writer.writerow(["file", "age", "gender"])
# 遍历output文件夹中的子文件夹
for folder_name in os.listdir(output_folder):
folder_path = os.path.join(output_folder, folder_name)
# 确保是文件夹而非文件
if os.path.isdir(folder_path):
# 解析文件夹名,提取年龄、性别和种族信息
parts = folder_name.split('_')
age = parts[0]
gender = parts[1]
# race = parts[2]
# 获取文件夹内的图片文件列表
image_files = [f for f in os.listdir(folder_path) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp'))]
# 遍历图片文件列表,构建完整路径并将信息写入CSV文件
for image_file in image_files:
image_path = os.path.join(folder_name, image_file)
with open(csv_file, mode='a', newline='') as file:
writer = csv.writer(file)
writer.writerow([image_path, age, gender])
print("Label information has been extracted and written to", csv_file)
将生成的标签文件label.csv进行onehot编码转换
2.mobilenetv2模型改造
训练集与验证集划分
import pandas as pd
from sklearn.model_selection import train_test_split
# 读取原始数据
df = pd.read_csv('onehot_labels.csv')
# 划分训练集和验证集
train_df, val_df = train_test_split(df, test_size=0.1, random_state=42)
# 保存训练集和验证集到csv文件
train_df.to_csv('train.csv', index=False)
val_df.to_csv('val.csv', index=False)
train.py
首先调用mobilenet_v2
函数加载预训练的MobileNetV2模型,并保存在mobilenet_v2_model