YOLOv5头部追踪中判断头部裁剪图是否为有效人脸的方法
问题描述
当前使用YOLOv5神经网络实现头部追踪,计划基于检测到的头部区域识别对应人员的年龄与性别。要保证识别准确率,必须确保采集到的头部区域为呈现人脸的一侧,因此现有流程为先裁剪YOLOv5输出的头部检测区域,再判断这些头部裁剪图是否可直接作为人脸裁剪图输入后续识别模型。
目前遇到的核心问题:可获取的所有人脸检测技术均用于检测图像内部是否存在人脸、输出人脸位置,无法直接判断整张输入图像本身是否为可用的人脸图像,需要可行的落地解决思路。
现有实现代码
def get_age_gender(frame): plt.imshow(frame) plt.show() resultImg, faceBoxes = highlightFace(faceNet, frame) print(faceBoxes) plt.imshow(resultImg) plt.show() for faceBox in faceBoxes: face = frame[max(0, faceBox[1] - padding): min(faceBox[3] + padding, frame.shape[0] - 1), max(0, faceBox[0] - padding) :min(faceBox[2] + padding, frame.shape[1] - 1)] #if face.shape if face.shape[0] == 0 or face.shape[1] == 0: break blob = cv2.dnn.blobFromImage(face, 1.0, (227, 227), MODEL_MEAN_VALUES, swapRB=False) genderNet.setInput(blob) genderPreds = genderNet.forward() gender = genderList[genderPreds[0].argmax()] print(f'Gender: {gender}') ageNet.setInput(blob) agePreds = ageNet.forward() age = ageList[agePreds[0].argmax()] print(f'Age: {age[1:-1]} years') return age, gender return '0', 'gender' frame = cv2.imread(f'output/Capture2.JPG') get_age_gender(frame)
相关示例

可行解决思路
- 零训练成本方案:基于现有人脸检测器的输出做规则阈值判断,不需要额外标注训练。将YOLOv5裁剪出的头部图输入人脸检测器后,校验两个核心指标:① 检测到的人脸框面积占整张头部裁剪图面积的比例;② 人脸检测结果的置信度得分。两个指标同时满足预设阈值即可判定为有效人脸图(常规场景下可设人脸占比≥60%、检测置信度≥0.8,可根据自己的场景调整),直接送入年龄性别识别模型;如果未检测到人脸、或人脸占比过低、置信度不足,就判定该头部图为后脑勺、严重遮挡、非人脸侧的无效输入,跳过本次识别即可。
- 轻量定制方案:训练专属二分类模型做整图有效性判断。收集两类业务场景下的样本:正样本为符合识别要求的有效头部裁图(包含完整正面/可用侧脸人脸),负样本为无效头部裁图(后脑勺、严重遮挡、仅露头顶、无有效面部特征的侧脸等),选用MobileNet这类轻量分类网络训练二分类器,推理时直接输出输入裁图是否为有效人脸的判断结果,推理速度快,针对特定场景的判断精度比通用规则更高。
- 流程优化方案:替换为头脸联合检测的多任务模型。替换原有单独YOLOv5头检+单独人脸检测的串联流程,选用可同时输出头部框、人脸框、人脸关键点的多任务检测模型,只要检测到的头部框内匹配到置信度达标的对应人脸框,就直接提取人脸区域做年龄性别识别,省去单独判断裁剪图是否有效的步骤,整体流程更简洁,端到端延迟更低。
另外现有代码存在可优化点:当前逻辑遍历到第一个人脸框就直接返回结果,会漏掉同帧内的其他人员;且没有做人脸框有效性过滤,很容易把误检的小框、低置信度框送入识别模型导致结果错误,可在遍历faceBox时加入上述提到的占比、置信度判断逻辑,过滤无效框后再做后续推理。
内容的提问来源于stack exchange,提问作者jack gell
相关产品推荐
相关产品推荐

