尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

InsightFace 人脸识别训练中的口罩增强(Mask Augmentation):从数据预处理到 arcface_torch 一键接入

InsightFace 人脸识别训练中的口罩增强(Mask Augmentation):从数据预处理到 arcface_torch 一键接入 InsightFace 人脸识别训练中的口罩增强Mask Augmentation从数据预处理到 arcface_torch 一键接入【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface导读本文基于 InsightFace 仓库中 challenges/iccv21-mfr/tutorial_pytorch_mask_aug.md 教程系统讲解如何在 arcface_torch 人脸识别训练管线中启用口罩数据增强Mask Augmentation。该方案源于 ICCV 2021 口罩人脸识别挑战赛MFR其核心思路是先用三维形变模型BFM对每张训练人脸做 3D 拟合把拟合参数离线写入 MXNet RecordIO 数据集再在训练时通过MaskAugmentation增强算子将虚拟口罩渲染到人脸上。读完本文你将掌握 antelope 模型包下载、BFM 数据生成、rec.addmaskparam数据集预处理、MaskAugmentation一行接入以及dataset_mask.py整体替换的完整实战流程并理解其背后的 3D 渲染源码实现。一、为什么需要口罩增强MFR 挑战赛背景在 ICCV 2021 Masked Face Recognition ChallengeMFR中InsightFace 赛道专门设置了Mask 测试集6,964 个身份、6,964 张戴口罩图像与 13,928 张未戴口罩图像评估戴口罩与未戴口罩人脸之间的 1:1 匹配准确率TARMaskFAR 1e-4。同时官方排行榜以0.25 * TARMask 0.75 * TARMR-All的综合公式排序可见口罩场景直接决定最终名次。竞赛规则第 3 条明确规定Mask>insightface-cli model.download antelope下载完成后模型位于~/.insightface/models/antelope。该命令由 python-package/insightface/commands/model_download.py 实现注册为model.download子命令支持的参数包括参数默认值说明model位置参数必填模型包名称如antelope--root~/.insightface模型存储根目录--force关闭强制重新下载即使本地已存在源码中ModelDownloadCommand.run()最终调用download(models, self._model, force..., root...)完成下载与解压。需要注意的是MaskRenderer初始化时会在模型目录下查找BFM.mat与BFM_UV.mat见python-package/insightface/app/mask_renderer.py中assert osp.exists(bfm_file)因此 antelope 只是第一步还必须补齐 BFM 文件。四、准备工作二生成 BFM.mat 与 BFM_UV.matBFMBasel Face Model是渲染所用的三维人脸形变模型。由于许可原因BFM.mat与BFM_UV.mat需要按 recognition/tools/README.md 的说明自行生成具体做法是参照 face3d 项目 BFM 数据准备教程生成后放置到模型包目录下例如~/.insightface/models/antelope/BFM.mat ~/.insightface/models/antelope/BFM_UV.mat在 python-package/insightface/app/mask_renderer.py 中MaskRenderer.__init__通过face3d.morphable_model.MorphabelModel(bfm_file)加载 BFM 模型并用load_uv_coords(bfm_uv_file)加载 UV 坐标。UV 坐标随后被换算为texcoord224x224 纹理坐标用于将口罩贴图映射到人脸表面——这是后续generate_mask_uv与render_mask的基础。五、准备工作三rec.addmaskparam 生成带口罩参数的数据集这是整个流程中计算量最大的离线步骤。教程给出的命令为insightface-cli rec.addmaskparam /data/ms1m-retinaface-t1 /data/ms1m-retinaface-t1mask它将输入目录含train.rec/train.idx的每张图片读取出来做 BFM 拟合后把拟合参数追加到 label 中写入新的 RecordIO 数据集。5.1 命令实现与 label 结构该命令注册于 python-package/insightface/commands/rec_add_mask_param.py核心逻辑在RecAddMaskParamCommand.run()创建MaskRenderer()并prepare(ctx_id0, det_size(128,128))即使用 GPU 0 做人脸检测遍历输入train.rec的每个索引解码图片后转为 BGR调用tool.build_params(bgr)做 3D 拟合拟合成功时用tool.encode_params(params)把参数展平为235 维向量与身份 id 和有效性标记拼接成237 维label[idlabel, 0.0] mask_label拟合失败无人脸时写入[label] [-1.0]*236即 237 维、标记位为 -1 的占位 label最后通过RecBuilder.add_image见 python-package/insightface/data/rec_builder.py逐条写盘并在结束时输出失败统计finished on ... , failed: ...。237 维 label 的组成可以从 python-package/insightface/app/mask_renderer.py 的encode_params/decode_params反推区间内容维度params[0:199]形状参数 shape parametersfitted_sp199params[199:228]表情参数 expression parametersfitted_ep29params[228]缩放系数 scalefitted_s1params[229:232]旋转欧拉角 anglesfitted_angles3params[232:235]平移向量 translationfitted_t3合计掩码参数235再加上前导的 id 与有效性标记0.0表示有效-1.0表示无效恰好是assert len(wlabel)237所校验的长度。5.2 拟合原理build_paramsmask_renderer.py内部先通过FaceAnalysis启用detection与landmark_3d_68两个模块检测人脸并取得 68 点 3D 关键点再调用self.bfm.fit(landmark, self.X_ind, max_iter3)迭代拟合 BFM 模型参数最终返回[fitted_sp, fitted_ep, fitted_s, fitted_angles, fitted_t]。整个预处理在 GPU 上完成但只需对每个数据集执行一次。注意rec.addmaskparam依赖 mxnet读取 RecordIO以及可选编译的 face3d 扩展。从 python-package/insightface/commands/rec_add_mask_param.py 的ImportError分支可以看到运行前需确保已安装 mxnet 与可选依赖。六、训练接入方式一一行代码追加 MaskAugmentation教程给出的最简接入方式是在 arcface_torch 的dataset.py中追加from insightface.app import MaskAugmentation self.transform_list.append( MaskAugmentation( mask_names[mask_white, mask_blue, mask_black, mask_green], mask_probs[0.4, 0.4, 0.1, 0.1], h_low0.33, h_high0.4, p0.1) )其中insightface0.3.2及以上的 Python 包提供MaskAugmentation。该算子参数含义如下参数默认值说明mask_names[mask_white, mask_blue, mask_black, mask_green]可选口罩贴图名称列表对应python-package/insightface/data/images/内置贴图mask_probs[0.4, 0.4, 0.1, 0.1]各口罩贴图的采样概率必须与mask_names等长且和需为 1h_low/h_high0.33/0.35口罩纵向位置归一化高度的随机区间教程中建议0.33~0.4值越大口罩越往下覆盖更多口鼻区域p1.0该增强被触发的概率albumentations 语义教程训练场景设为0.1从源码看MaskAugmentation继承自albumentations.core.transforms_interface.ImageOnlyTransformpython-package/insightface/app/mask_renderer.py其内部流程为get_params_dependent_on_targets依据mask_probs随机选一款口罩贴图并在[h_low, h_high]内随机取纵向位置h_posapply校验 label 长度必须为 237 或 235即确保数据集包含 mask 参数若hlabel[1] 0无效拟合则原图返回否则decode_params还原 5 组拟合参数调用renderer.render_mask(image, mask_name, mask_params, input_is_rgbTrue, positions[0.1, h_pos, 0.9, 0.7])完成渲染。positions[0.1, h_pos, 0.9, 0.7]定义了口罩在 UV 纹理上的覆盖矩形左右 0.1~0.9上边h_pos下边 0.7保证口罩只覆盖眼睛以下的区域、不遮挡眼睛这一关键判别特征。七、训练接入方式二用 dataset_mask.py 整体替换教程同时提供了 challenges/iccv21-mfr/dataset_mask.py 作为arcface_torch/dataset.py的增强版替代文件直接覆盖原文件即可启用增强。该文件与原版 recognition/arcface_torch/dataset.py 相比核心变化在于MXFaceDataset的构造函数def __init__(self, root_dir, local_rank, aug_modesbrightness0.1mask0.1):aug_modes使用连接多个增强项、指定概率的字符串语法支持三种增强增强键默认概率实现mask0.1MaskAugmentation(mask_names[...], mask_probs[...], h_low0.33, h_high0.4, pself.mask_prob)brightness0.2A.RandomBrightnessContrast(brightness_limit0.125, contrast_limit0.05, pprob)blur0.1A.ImageCompression(quality_lower30, quality_upper80)A.MedianBlur(blur_limit(1,7))A.MotionBlur(blur_limit(5,12))其解析逻辑为aug_modes.lower().split()后逐项split()未指定概率时回退到default_aug_probs。组合得到的transform_list再追加A.HorizontalFlip(p0.5)、A.Normalize(mean[0.5,0.5,0.5], std[0.5,0.5,0.5])与ToTensorV2()最终构成A.Compose管道。也就是说仅通过命令行式字符串即可灵活开关亮度扰动 模糊退化 口罩渲染三类增强且这三者恰好模拟了现实场景中最常见的图像质量退化因素。dataset_mask.py还保留了原版的BackgroundGenerator与DataLoaderX后台线程预取 CUDA 流预加载保证增强算子带来的额外计算不会阻塞 GPU 训练流水线。在__getitem__中transform 以self.transform(imagesample, hlabelhlabel)的形式调用将原始 237 维 label 一并传入这正是MaskAugmentation通过targets_as_params [image, hlabel]声明的依赖目标。接入提醒dataset_mask.py读取数据时仍要求train.rec/train.idx结构MXIndexedRecordIO并且 label 中必须包含由rec.addmaskparam写入的 235 维掩码参数否则MaskAugmentation.apply中的长度断言会直接失败。八、源码原理MaskRenderer 的 3D 口罩渲染管线要真正理解这套增强为何逼真且可复现需要回到渲染器实现 python-package/insightface/app/mask_renderer.py 中的MaskRenderer类其渲染链路如下参数重建params_to_vertices用bfm.generate_vertices(fitted_sp, fitted_ep)生成 3D 顶点经bfm.transform缩放/旋转/平移与preprocess坐标归一化后投影到图像平面得到image_vertices贴图生成generate_mask_uv将 224x224 的 UV 空白画布按positions截取矩形区域把口罩贴图cv2.resize后填入得到uv_mask_image纹理渲染render_mask调用face3d.mesh.render.render_texture(image_vertices, full_triangles, uv_mask_image, texcoord, ...)把 UV 贴图按三角面片映射到人脸表面输出 0~255 的掩码结果自动混合auto_blendTrue时以输出中255的像素作为原始人脸保留区其余区域替换为渲染的口罩实现只遮挡、不破坏背景的自然融合效果。渲染单张口罩在 224x224 UV 尺寸、CPU 单线程下约为 10msrecognition/tools/README.md 中说明这也是为何预处理阶段就把拟合参数离线算好、训练阶段只做贴图渲染的原因——把重计算从训练循环中剥离出去。九、可视化验证快速检查增强效果dataset_mask.py自带__main__可视化入口可快速验证数据增强效果python dataset_mask.py --dataset /data/ms1m-retinaface-t1mask --samples 256 --cols 16其内部用aug_modesmask1.0构造数据集然后剔除Normalize与ToTensorV2后深拷贝两份一份触发增强、一份不触发交错采样拼成网格图并写出./datasets.png。通过观察同一身份原图 / 加口罩的成对样本可以直观确认口罩位置、贴图类型与随机性是否符合预期。--samples需能被--cols整除且--cols需为偶数。十、接入 arcface_torch 的完整清单与约束综合教程与源码将口罩增强接入 recognition/arcface_torch 训练例如使用 configs/ms1mv3_r50.py 这类配置需要满足以下前提安装insightface0.3.2提供MaskAugmentation并确保可选 face3d 扩展可用python-package/insightface/app/init.py 中mask_renderer的导入被try/except ImportError包裹缺失时只会静默跳过需自行确认导入成功下载antelope模型包并将生成的BFM.mat、BFM_UV.mat放入其目录用rec.addmaskparam对训练集MS1MV2/MS1MV3/Glint360K 等任意 RecordIO 数据集生成带掩码参数的新数据集并确保dataset.py中config.rec指向新目录选择接入方式修改dataset.py追加MaskAugmentation需自建 transform 列表并传hlabel或直接用dataset_mask.py覆盖原文件并通过aug_modes字符串控制增强组合依据任务调节超参口罩触发概率p训练建议 0.1 左右防止过度增强损害无口罩场景精度、h_low/h_high控制遮挡高度、mask_probs控制不同口罩款式的分布。该方案已在 MFR 挑战赛中被官方作为推荐的数据增强路径challenges/iccv21-mfr/README.md 规则第 3 条明确允许其离线 3D 拟合 在线 2D 渲染的架构思路同样适用于口罩识别之外的其他局部遮挡如墨镜、围巾增强场景只需替换贴图素材与渲染位置参数即可复用。【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表