车内猫狗+人脸年龄性别检测方案总结
方案路线:
方案1:
使用 YOLO 检测人和猫狗,对检测到的人使用 Retinaface 检测人脸并做人脸对齐,扩大人脸面积40%,使用分类网络对人脸进行性别和年龄检测。
缺点:方案复杂,可能会累计误差,部署时候需要 3 个模型(YOLO、Retinaface 和 分类模型)。
优点:数据更易获取,可以使用不同的数据分别训练不同的模型。
思考:人脸对齐可能能够提高模型的精度。
方案2:
方案1 的优化,将 Retinaface 得到的人脸图像使用 Arcface 来提取 512d 向量,对该向量直接分类。
优点:分类模型可以更加简单
缺点:模型更多了。
方案3:
直接使用 YOLO 检测人脸和猫狗,无人脸对齐,YOLO 直接对人脸进行年龄段的划分。
缺点:相关数据难以获取,需要组合不同的公开年龄数据集并且还要包含性别。此外,还要和 猫狗组合在一起,就很麻烦。
优点:单个 YOLO 模型即可完成任务,但是可能效果不好,数据集来源复杂,模型可能很难较好的收敛。
难点
- 数据问题没有该场景的标注数据,只能自己组合和收集公开的数据集
- 年龄划分边界模糊,数据集标注存在部分错误
- 猫狗数据,牛津的数据集没有身体标注框,只能通过 3 元图像得到,得到的好像不是很准确。COCO 猫狗图像有的质量很差,可能需要手工删除;有2700 多张图像同时包含人脸,需要手工处理:遮盖住人脸,或者使用模型来推出年龄,但是人脸有的质量很差,难以使用公开的模型得到结果。我建议使用前者,将人脸直接覆盖掉,或者把猫狗目标及周围区域切出来粘贴到背景图像上。
- 类别不平衡问题严重,由于业务那边要求的有的年龄段跨度很大,如 18-60岁,那必然数据量最大,有的就要求 3-6 岁,数据集内就没有很多这种图像,导致模型会偏向预测成 18-60 岁。此外 18-60 岁还要区分男女,男女目标比例一般男的更多。
- 需要手工做许多数据清洗工作,好多数据的质量太差了。
- 在实际车内场景中,如果摄像头放到后视镜的位置,那么后排的遮挡问题尤其严重,不仅后排目标的尺度很小,对于儿童,后排的图像很难识别。
- 收集到的数据常常是 一张图像一个目标,目标的尺度较大,而实际车内场景中,前排识别较好,后排的目标由于遮挡,很难识别。
- 采用 类似 masic 的方式将四张目标图像拼接到一起,resize 成 640 大小,效果并不是很好,可能把目标放的太小了。
容易的地方:
- 实际部署场景单一,就是在车内,车内的目标一般是我们训练时候的类别,应该很少有把背景误识别为前景的情况。也就是这不是一个 开放域识别问题,后者常常叫做 误检。
- 可能使用一个 YOLO 框架就可以解决问题。
其他想法
如果只是针对人脸的年龄识别有如下方案:
方案1: YOLO 直接分类
方案2: SSR-Net
也就是先使用人脸检测,得到 bbox 和 landmark,根据 landmark 进行对齐,然后再对对齐后的人脸进行识别(比如可以使用 SSR-net,仅0.32m)
方案3: 人脸检测+对齐+人脸特征提取+MLP
使用 3 个模型,不过对齐的人脸使用 人脸识别模型来提取特征,比如 arcface, 然后再使用 MLP 进行分类。
可参考:https://github.com/tae898/age-gender/#deployment
如果要考虑宠物的话,可能宠物就需要另外一个单独的模型。