PyTorch搭建人脸检测识别管线时ResNet报张量维度不匹配错误如何解决
错误原因
你设置了MTCNN的keep_all=True,该参数开启后MTCNN会返回所有检测到的人脸裁剪结果,维度为[人脸数量, 3, 裁剪尺寸, 裁剪尺寸],你后续额外调用unsqueeze(0)给张量增加了一个维度,就会得到5维张量,不符合ResNet输入要求的4维[batch_size, 3, 高, 宽]格式,所以触发维度不匹配报错。调整图像尺寸不会解决该问题,因为核心问题是张量维度多了冗余维度,和图像分辨率无关。
解决方案
可根据你的实际使用场景选择对应修改方案:
- 场景1:每次输入图像仅需识别单张人脸
把MTCNN初始化时的keep_all参数改成False,此时MTCNN返回单张人脸的裁剪结果,维度为[3, 160, 160],你的原有推理代码不需要改动即可正常运行:# 修改MTCNN初始化代码 self.mtcnn = MTCNN(keep_all=False, device=self.device) - 场景2:每次输入图像需要识别所有检测到的人脸
不需要修改MTCNN的keep_all参数,直接去掉推理代码里的unsqueeze(0)操作即可,此时返回的cropped本身就是4维张量,符合ResNet的输入要求,修改后的推理代码如下:
此时ResNet会返回所有检测到的人脸对应的特征向量,维度为cropped = detector.mtcnn(image) # 直接传入cropped,不需要额外增加维度 detector.resnet(cropped)[人脸数量, 特征维度]。
内容的提问来源于stack exchange,提问作者areller
相关产品推荐
相关产品推荐

