用Labelme标注手掌关键点:从数据标注到SCRFD模型训练全流程
用Labelme标注手掌关键点从数据标注到SCRFD模型训练全流程在医疗手势识别、AR/VR交互等新兴领域手掌关键点检测正成为计算机视觉的重要研究方向。传统人脸检测模型如SCRFD虽性能优异但直接应用于手掌检测时面临关键点数量、分布差异等挑战。本文将完整呈现从数据标注到模型训练的全流程技术细节帮助开发者快速实现SCRFD在非人脸场景的迁移应用。1. 数据标注Labelme高效标注策略高质量标注数据是模型性能的基石。相比通用标注工具Labelme以其轻量化和关键点标注优势成为手掌检测的首选。1.1 环境配置与标注规范安装仅需一行命令pip install labelme -U启动交互界面labelme标注实操要点矩形框标注手掌边界Label建议设为hand关键点标注四指指缝位置建议按kp1-kp4顺序标注保存后生成与图片同名的JSON文件包含以下核心结构{ version: 5.1.1, flags: {}, shapes: [ { label: kp1, points: [[x1, y1]], shape_type: point }, { label: hand, points: [[x1,y1], [x2,y2]], shape_type: rectangle } ], imagePath: sample.jpg, imageData: null }1.2 标注质量控制通过以下策略提升数据质量多视角覆盖包含手掌旋转、遮挡等复杂场景光照变化采集不同亮度环境下的样本标注一致性检查使用脚本验证JSON文件完整性确保每张图片包含1个矩形框和4个关键点提示标注时可开启Auto Save功能避免数据丢失建议每标注100张后抽样检查标注准确性2. 数据格式转换JSON到SCRFD专用格式SCRFD训练需要特定格式的TXT文件每行记录包含# 图片路径 宽度 高度 x1 y1 x2 y2 kp1_x kp1_y 1 kp2_x kp2_y 1 ...2.1 转换脚本核心逻辑import json from pathlib import Path def convert_json_to_txt(json_path, txt_path): with open(json_path) as f: data json.load(f) img_w data[imageWidth] img_h data[imageHeight] # 提取关键点和边界框 kps [] bbox None for shape in data[shapes]: if shape[shape_type] point: kps.extend([shape[points][0][0], shape[points][0][1], 1]) elif shape[shape_type] rectangle: points sorted(shape[points]) bbox [points[0][0], points[0][1], points[1][0], points[1][1]] # 写入TXT文件 with open(txt_path, a) as f: f.write(f# {json_path.stem}.jpg {img_w} {img_h}\n) f.write( .join(map(str, bbox kps)) \n)2.2 批量处理与验证建议采用以下处理流程遍历所有JSON文件进行转换生成训练集/验证集分割文件可视化检查转换结果python visualize_annotations.py --txt train.txt --output check/常见问题处理坐标归一化确保坐标值在0-1之间关键点顺序保持所有样本标注顺序一致3. SCRFD模型适配改造原SCRFD针对5个人脸关键点设计需修改以下核心部分3.1 数据加载层修改文件mmdet/datasets/retinaface.py关键修改# 原配置人脸5关键点 self.NK 5 # 修改为手掌4关键点 self.NK 4 # 数据读取维度调整 kps np.array(values[4:16], dtypenp.float32).reshape((self.NK, 3))3.2 数据增强适配修改mmdet/datasets/pipelines/transforms.py# 关键点翻转顺序调整 flip_order [1, 0, 3, 2] # 原为[1,0,2,4,3] # 数据增强参数优化 train_pipeline [ dict(typeRandomFlip, flip_ratio0.5), dict(typeResize, keep_ratioTrue), dict(typeRandomRotate, rotate_degree10) ]3.3 检测头结构调整文件mmdet/models/dense_heads/scrfd_head.py关键修改# 输出通道数调整 kps_pred kps_pred.permute(0, 2, 3, 1).reshape(batch_size, -1, 8) # 原为10 # 损失函数权重调整 loss_kpsdict(typeSmoothL1Loss, beta1.0, loss_weight0.1)4. 模型训练与调优策略4.1 基础训练配置配置文件scrfd_2.5g_bnkps.py关键参数# 数据集路径 data_root data/hand/ train_txt train.txt val_txt val.txt # 训练参数 optimizer dict(typeSGD, lr0.002, momentum0.9, weight_decay5e-4) lr_config dict( policyCosineAnnealing, min_lr1e-5, warmuplinear, warmup_iters500)启动训练命令# 单GPU训练 python tools/train.py configs/scrfd/scrfd_2.5g_bnkps.py # 多GPU训练 CUDA_VISIBLE_DEVICES0,1,2,3 bash ./tools/dist_train.sh \ configs/scrfd/scrfd_2.5g_bnkps.py 44.2 高级调优技巧学习率策略对比策略初始LR最终mAP训练时长Cosine2e-378.2%6hStep2e-376.5%5.5hCyclic1e-377.8%7h数据增强组合效果基础增强翻转旋转mAP 72.3%增加色彩抖动2.1%添加随机遮挡1.8%混合CutMix3.5%4.3 模型评估与部署测试集评估命令python tools/test.py \ configs/scrfd/scrfd_2.5g_bnkps.py \ work_dirs/scrfd_2.5g_bnkps/latest.pth \ --eval bbox kps部署优化建议使用TensorRT加速推理量化到INT8精度针对边缘设备优化输出层在实际医疗手势识别项目中调整后的SCRFD模型在NVIDIA Jetson Xavier上达到35FPS的实时性能关键点检测误差小于3个像素。对于AR场景建议增加指尖关键点以提升交互精度。