DamoFD-0.5G模型训练指南:从零开始微调自定义数据集
DamoFD-0.5G模型训练指南从零开始微调自定义数据集1. 引言想让人脸检测模型更懂你的数据吗比如让它在特定场景下识别人脸更准或者在某种光线条件下表现更好今天咱们就来聊聊怎么用自定义数据集对DamoFD-0.5G这个轻量级人脸检测模型进行微调训练。DamoFD-0.5G是达摩院推出的一款高效人脸检测模型只有0.5G的计算量但在精度上一点都不含糊。最棒的是我们可以用自己的数据来训练它让它更好地适应我们的具体需求。不管你是想做安防监控、人脸签到还是其他什么人脸相关的应用这个教程都能帮到你。接下来我会手把手带你走完整个流程从数据准备开始到训练环境搭建再到模型训练和效果评估。不用担心复杂的技术细节我会用最直白的方式讲解保证即使你是新手也能跟着做下来。2. 环境准备与安装2.1 基础环境配置首先咱们需要准备好训练环境。推荐使用Python 3.8和PyTorch 1.8这样兼容性最好。如果你还没有配置环境可以按下面的步骤来# 创建conda环境 conda create -n damofd_train python3.8 conda activate damofd_train # 安装PyTorch pip install torch1.8.1 torchvision0.9.1 # 安装ModelScope库 pip install modelscope2.2 安装依赖包除了基础环境还需要安装一些额外的依赖# 安装计算机视觉相关依赖 pip install opencv-python matplotlib # 安装mmcv-full重要 pip install -U openmim mim install mmcv-full # 安装其他可能用到的包 pip install numpy scikit-learn tqdm安装过程中如果遇到问题特别是mmcv-full的安装可以查看官方文档或者降低版本试试。有时候网络问题会导致安装失败多试几次或者换个时间可能就解决了。3. 数据准备与处理3.1 数据集格式要求DamoFD-0.5G支持WIDER FACE格式的数据集这是人脸检测领域常用的格式。你的数据集需要包含两部分图片文件jpg或png格式标注文件txt格式记录每张图片中的人脸位置信息标注文件的格式是这样的图片路径 人脸数量 人脸1的坐标(x1, y1, w, h) 人脸2的坐标(x1, y1, w, h) ...3.2 准备自定义数据假设你有一些自己的人脸图片需要先转换成正确的格式。下面是一个简单的转换脚本import os import cv2 from glob import glob def prepare_custom_data(image_dir, output_file): 将自定义数据集转换为WIDER FACE格式 image_paths glob(os.path.join(image_dir, *.jpg)) glob(os.path.join(image_dir, *.png)) with open(output_file, w) as f: for img_path in image_paths: # 这里需要根据你的实际标注格式来解析 # 假设你已经有了人脸框的坐标 faces detect_faces(img_path) # 你需要实现这个函数 f.write(f{img_path}\n) f.write(f{len(faces)}\n) for face in faces: x, y, w, h face f.write(f{x} {y} {w} {h} 0 0 0 0 0 0\n) # 使用示例 prepare_custom_data(my_faces/, custom_annotation.txt)如果你的数据已经是其他格式比如COCO或VOC需要先转换成WIDER FACE格式。网上有很多转换工具可以用。3.3 数据集划分建议把数据分成训练集、验证集和测试集比例可以是7:2:1import random from sklearn.model_selection import train_test_split def split_dataset(annotation_file, train_ratio0.7, val_ratio0.2): with open(annotation_file, r) as f: lines f.readlines() # 解析标注文件 data [] i 0 while i len(lines): img_path lines[i].strip() num_faces int(lines[i1]) i 2 faces [] for j in range(num_faces): face_data lines[ij].split() faces.append(face_data) i num_faces data.append((img_path, faces)) # 划分数据集 train_data, temp_data train_test_split(data, train_sizetrain_ratio, random_state42) val_data, test_data train_test_split(temp_data, train_sizeval_ratio/(1-train_ratio), random_state42) return train_data, val_data, test_data4. 模型训练实战4.1 训练配置现在开始真正的训练部分。首先我们需要设置一些训练参数import os import tempfile from modelscope.msdatasets import MsDataset from modelscope.metainfo import Trainers from modelscope.trainers import build_trainer from modelscope.hub.snapshot_download import snapshot_download # 模型ID model_id damo/cv_ddsar_face-detection_iclr23-damofd # 下载模型 cache_path snapshot_download(model_id) # 创建工作目录 tmp_dir tempfile.mkdtemp() if not os.path.exists(tmp_dir): os.makedirs(tmp_dir)4.2 训练参数设置接下来配置训练参数这里有很多可以调整的地方def cfg_modify_fn(cfg): 修改训练配置 # 训练轮数 cfg.total_epochs 10 # 批大小 cfg.data.samples_per_gpu 8 cfg.data.workers_per_gpu 2 # 学习率 cfg.optimizer.lr 0.001 cfg.lr_config.warmup_ratio 0.1 # 验证间隔 cfg.evaluation.interval 1 cfg.checkpoint_config.interval 1 # 日志设置 cfg.log_config.interval 50 return cfg4.3 开始训练一切准备就绪现在可以开始训练了# 训练参数 kwargs dict( cfg_fileos.path.join(cache_path, DamoFD_lms.py), work_dirtmp_dir, train_rootpath/to/your/train/data, # 替换为你的训练数据路径 val_rootpath/to/your/val/data, # 替换为你的验证数据路径 total_epochs10, cfg_modify_fncfg_modify_fn ) # 创建训练器 trainer build_trainer(nameTrainers.face_detection_scrfd, default_argskwargs) # 开始训练 print(开始训练...) trainer.train() print(训练完成)训练过程中你会在控制台看到类似这样的输出[Epoch 1/10] lr: 0.001, loss: 1.234, accuracy: 0.567 [Epoch 2/10] lr: 0.001, loss: 0.987, accuracy: 0.654 ...4.4 训练技巧与注意事项训练时有几个小技巧可以帮你获得更好的效果学习率调整如果训练损失不下降可以尝试降低学习率数据增强在配置文件中可以开启各种数据增强选项早停机制如果验证集指标连续几轮不提升可以考虑提前停止训练模型保存训练好的模型会保存在work_dir目录下记得备份如果训练过程中遇到内存不足的问题可以减小batch_size或者使用梯度累积def cfg_modify_fn(cfg): cfg.optimizer_config.grad_clip dict(max_norm35, norm_type2) cfg.data.samples_per_gpu 4 # 减小批大小 return cfg5. 模型评估与测试5.1 评估训练结果训练完成后我们需要评估模型在新数据上的表现from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks # 加载训练好的模型 model_path os.path.join(tmp_dir, latest.pth) # 最新模型 face_detection pipeline(Tasks.face_detection, modelmodel_path) # 在测试集上评估 test_results [] for img_path in test_image_paths: result face_detection(img_path) test_results.append(result)5.2 精度指标计算人脸检测常用的评估指标是APAverage Precisionimport numpy as np from modelscope.utils.cv.image_utils import voc_ap, image_eval, img_pr_info, gen_gt_info, dataset_pr_info def evaluate_model(model, test_annotations, iou_threshold0.5): 计算模型在测试集上的AP gt_info gen_gt_info(test_annotations) pred_info {} thresh_num 1000 pr_curve np.zeros((thresh_num, 2)).astype(float) count_face 0 for img_name in os.listdir(test_image_dir): img_path os.path.join(test_image_dir, img_name) result model(img_path) # 转换预测结果格式 pred_boxes np.concatenate([result[boxes], np.array(result[scores])[:, np.newaxis]], axis1) # 计算PR曲线 gt_boxes np.array(gt_info[img_name]) pred_recall, proposal_list image_eval(pred_boxes, gt_boxes, iou_threshold) img_pr, _ img_pr_info(thresh_num, pred_boxes, proposal_list, pred_recall) pr_curve img_pr count_face gt_boxes.shape[0] # 计算AP pr_curve dataset_pr_info(thresh_num, pr_curve, count_face) ap voc_ap(pr_curve[:, 1], pr_curve[:, 0]) return ap5.3 可视化检测结果除了数字指标直观地看检测结果也很重要import matplotlib.pyplot as plt from modelscope.utils.cv.image_utils import draw_face_detection_result def visualize_detection(model, image_path, save_pathNone): 可视化检测结果 # 检测人脸 result model(image_path) # 绘制结果 img cv2.imread(image_path) img_draw draw_face_detection_result(image_path, result) # 显示或保存 if save_path: cv2.imwrite(save_path, img_draw) else: plt.imshow(cv2.cvtColor(img_draw, cv2.COLOR_BGR2RGB)) plt.axis(off) plt.show() # 使用示例 visualize_detection(face_detection, test_image.jpg, result.jpg)6. 模型部署与应用6.1 导出训练好的模型训练完成后你可能想要导出模型以便在其他地方使用# 导出模型 def export_model(model_path, export_dir): if not os.path.exists(export_dir): os.makedirs(export_dir) # 复制模型文件 import shutil shutil.copy(model_path, os.path.join(export_dir, damofd_trained.pth)) # 保存配置文件 shutil.copy(DamoFD_lms.py, os.path.join(export_dir, config.py)) print(f模型已导出到: {export_dir}) export_model(os.path.join(tmp_dir, latest.pth), exported_model)6.2 使用训练好的模型导出后就可以像使用原始模型一样使用你训练好的模型了# 加载自定义训练的模型 custom_face_detection pipeline( Tasks.face_detection, modelexported_model/damofd_trained.pth, config_fileexported_model/config.py ) # 使用模型 result custom_face_detection(your_image.jpg) print(f检测到 {len(result[boxes])} 张人脸)7. 总结走完整个流程你应该已经成功用自定义数据训练了DamoFD-0.5G模型。回顾一下我们做了哪些事情首先准备了训练环境然后处理了数据格式接着配置了训练参数并启动了训练最后评估了模型效果并导出了训练好的模型。训练过程中可能会遇到各种问题比如数据格式不对、内存不足、训练效果不理想等等。这些都是正常的重要的是学会怎么排查和解决。如果训练效果不好可以尝试调整学习率、增加数据量、或者调整模型参数。用自己数据训练后的模型在特定场景下的表现通常会比通用模型好很多。这是因为模型学到了你数据中的特定 patterns。比如如果你的数据都是在某种特定光线下拍摄的训练后的模型在这种光线条件下就会表现更好。最后提醒一下训练完成后记得多测试不同场景下的效果确保模型的泛化能力。如果发现某些情况下效果不好可以针对性地增加一些训练数据。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。