Attribute-Enhanced Face Recognition with Neural Tensor Fusion Networks(特征融合人脸识别)

本文介绍了一种基于张量融合的人脸识别方法,该方法结合了面部识别特征(FRF)和面部属性特征(FAF),利用神经网络进行特征融合,提高了在不同姿态下的人脸识别准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.论文相关

论文题目:Hu, Guosheng, et al. "Attribute-Enhanced Face Recognition with Neural Tensor Fusion Networks." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2017.

原文链接:http://yang.ac/papers/Hu2017Attribute.pdf

2.摘要

        本文作者提出了一种基于张量的图像特征融合方法。证明这种张量融合方法和神经网络等价之后,作者直接使用神经网络来学习并得到最终融合后的特征。最后的实验证明,融合后的特征在MultiPIE,CASIA NIR-VIS2.0和 LFW 数据集上都取得了不错的效果。

3.相关工作

        得益于大数据和深度学习的支持,人脸识别技术最近取得了长足的进步。不过,由于特征提取方法的局限,人脸识别技术在处理姿态变换问题时尚有不足。比如当一个人正面面对我们和侧面面对我们时,传统的提取特征方法提取到的特征FRF(face recognition features)肯定是不同的,这就会降低我们的识别准确率。而另一种特征FAF(face attribute features)对于光照和分辨率以及姿态变换则很鲁棒。什么是FAF呢?顾名思义,就是用一组属性来描述人脸特征。比如,一个人的外貌可以描述为“大鼻子,大眼睛,小嘴巴,高鼻梁,厚眉毛”,无论这个人以如何的姿态面对镜头,他的这些属性特征是不会改变的(比如不管正脸还是脸,大鼻子还是大鼻子),所以说FAF具有一些很鲁棒的特性。但是,单独用“大鼻子,大眼睛,小嘴巴,高鼻梁,厚眉毛”这些属性来描述一个人外貌又显得不够有区分性,因为长这样的人实在太多了。所以,本文作者为了充分利用两种特征的互补性,将FRF和FAF二者特征用基于张量的方法融合。由于求解张量特别繁琐,作者发现这个求解过程完全可以用一个神经网络来等价。于是作者最终使用神经网络来获取最终融合后的特征,降低了计算的复杂程度,并且取得了不错的效果。

4.具体方法

4.1目标函数
        以简单的多分类问题举例。
        对于一个特征来说,特征x和标签y之间的关系可以用矩阵W来建模,他们的关系如下:
而对于多个特征,比如2个特征 其中x表示FRF特征,z表示FAF特征,他们的关系也可以用一个张量W来建模,关系如下:
在这里,W是一个融合模型,一个D*C*B的三阶张量,x是D维特征向量,z是B维特征向量。y是最后标签,是一个C维向量,表示目标被分成C类。注意,公式2里的的乘法均为张量点积(tensor dot product)。所以,如果要对M个样本进行建模,求得一个最终的分量W的话,最终的目标函数即为:

其中,就是一般的损失函数了。这个公式里的W,融合了FRF和FAF并最终确定了特征的分类y。

4.2问题优化
         公式3里的W是一个三阶张量,有着非常复杂的计算难度。所以我们首先对W使用Tucker分解,将W分解为如下形式:

S是一个KD*KC*KB的三阶张量。 是KD*D维的矩阵, 是KC*C的矩阵, 是KB*B的矩阵。通过约束 我们可以有效地把参数从 降低到  。这样我们只需学习到 即可。将公式4插入公式2,得到
整理得到
再整理得

其中,是克罗内克积。是张量S的二模展开(mode-2 unfolding),为KC*KDKB矩阵。

        观察公式7,我们可以发现,融合特征是一个KC维的向量,而则扮演着一个分类器的角色。所以我们只要学习到,就可以使用来预测类别了。

        本文就使用一个神经网络来学习这4个变量,如下图所示:

4.3基本特征提取

(1)FRF特征使用下面网络提取,激活函数采用maxout。最终的特征为全连接层的256维向量。

(2)FAF特征使用Lighten CNN(Z. S. Xiang Wu, Ran He. A lightened cnn for deep face representationarXiv:1511.02683, 2015. 5)。5个conv-activation-pooling单元之后连接一个256维的全连接层。训练网络时,标签去掉了""wear glasses"和"smiling"这些不具有判别性的属性,最后一共使用17个属性来训练网络。

5.实验

<think>我们正在解决在Spyder中使用OpenCV进行人脸识别时出现的AttributeError:module'cv2'hasnoattribute'face'错误。这个错误通常是因为OpenCV的contrib模块未安装或版本不匹配导致的。解决方案步骤:1.确认安装的是opencv-contrib-python包,而不仅仅是opencv-python。因为人脸识别模块在contrib扩展包中。2.检查OpenCV的版本,确保安装的版本包含face模块。3.在Spyder中检查Python环境是否使用了正确的安装包。具体操作:首先,我们需要安装opencv-contrib-python包。如果已经安装了opencv-python,需要先卸载它,然后安装opencv-contrib-python。在命令行(终端或AnacondaPrompt)中执行以下命令:```bashpipuninstallopencv-pythonpipinstallopencv-contrib-python```注意:如果使用Anaconda环境,请确保在Spyder使用的环境中执行这些命令。如果问题仍然存在,可能是因为安装的OpenCV版本过高,face模块被移除了(在OpenCV4中,部分face模块被转移到了opencv_contrib仓库的不同位置,或者需要单独安装)。在这种情况下,可以尝试安装一个包含face模块的特定版本,例如4.5.5版本。```bashpipinstallopencv-contrib-python==4.5.5.64```另外,也可以尝试使用以下方式导入face模块:```pythonimportcv2fromcv2.faceimportLBPHFaceRecognizer_create#或者其他具体的类```但根据错误信息,是`cv2.face`整个模块不存在,所以更可能是安装问题。如果在Spyder中运行程序时仍然报错,请检查Spyder使用的Python解释器环境是否与安装opencv-contrib-python的环境一致。在Spyder中,可以通过以下步骤检查环境:1.打开Spyder2.点击菜单栏的"Tools"->"Preferences"->"Pythoninterpreter"3.查看当前使用的解释器路径,确保该环境是安装了opencv-contrib-python的环境。如果使用了虚拟环境(如conda环境),请确保在Spyder中选择了该虚拟环境。如果上述步骤仍然不能解决问题,可以尝试在代码中使用以下方式导入:```pythonimportcv2#检查cv2的版本print(cv2.__version__)```如果版本是3.x,那么face模块应该存在。如果是4.x,可能需要使用以下方式:```python#对于OpenCV4,可以尝试face_recognizer=cv2.face.LBPHFaceRecognizer_create()#注意:在4.x中,如果安装了contrib,face模块应该可用```但是,根据OpenCV官方文档,从3.1版本开始,face模块就被放到了opencv_contrib中,因此需要安装contrib版本。最后,如果还是不行,可以考虑使用opencv-contrib-python-headless版本(如果没有GUI需求),或者尝试重新创建一个新的虚拟环境,并安装opencv-contrib-python。根据引用[^1]中提到的安装命令,我们也可以参考其安装方式。总结:核心问题在于缺少contrib模块中的face部分,因此重新安装opencv-contrib-python是根本解决方法。下面我们将生成相关问题。</think>### 解决Spyder中OpenCV人脸识别AttributeError错误 在Spyder中使用OpenCV进行人脸识别时出现`AttributeError: module 'cv2' has no attribute 'face'`错误,通常是因为**未正确安装包含人脸识别模块的OpenCV contrib包**。以下是完整解决方案: --- ### 解决方案步骤 1. **检查当前OpenCV安装** ```python import cv2 print(cv2.__version__) # 查看OpenCV版本 print(dir(cv2)) # 检查是否包含'face'模块 ``` 如果输出中没有`face`,说明未安装contrib扩展包[^1]。 2. **卸载现有OpenCV** 在Anaconda Prompt或终端执行: ```bash pip uninstall opencv-python opencv-python-headless opencv-contrib-python ``` 3. **安装完整contrib包** ```bash pip install opencv-contrib-python==4.5.5.64 # 推荐使用兼容性好的版本 ``` 或安装最新版: ```bash pip install opencv-contrib-python ``` 4. **验证安装** 重启Spyder后执行: ```python import cv2 # 测试人脸识别模块 recognizer = cv2.face.LBPHFaceRecognizer_create() # 应无报错 print("人脸模块可用:", hasattr(cv2, 'face')) # 输出True即成功 ``` 5. **环境一致性检查** - 在Spyder中:`Tools > Preferences > Python interpreter` - 确保选择的解释器与安装OpenCV的环境一致(如`anaconda3/envs/your_env/bin/python`) --- ### 常见问题排查 - **虚拟环境问题**:如果使用conda环境,需在对应环境中执行安装命令 - **版本冲突**:安装特定兼容版本`pip install opencv-contrib-python==4.5.5.64` - **多版本共存**:删除所有`cv2*.so`文件(Linux/Mac)或`cv2.pyd`(Windows) - **IDE缓存**:重启Spyder或执行`importlib.reload(cv2)` > **技术说明**:OpenCV的标准包(`opencv-python`)不包含`face`等扩展模块,必须安装contrib版本才能使用人脸识别算法如LBPH、EigenFaces等[^1]。 --- ### 人脸识别代码示例(安装成功后使用) ```python import cv2 # 初始化人脸识别器 recognizer = cv2.face.LBPHFaceRecognizer_create() detector = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml") # 后续添加训练和识别代码... ``` --- ### 相关问题 1. OpenCV中不同人脸识别算法(LBPH/EigenFaces/FisherFaces)有何区别? 2. 如何在Anaconda环境中管理多个OpenCV版本? 3. OpenCV人脸识别在实际项目中的完整工作流程是怎样的? 4. 如何解决OpenCV与其他计算机视觉库(如dlib)的兼容性问题? 5. 使用OpenCV进行实时人脸识别需要哪些性能优化技巧? [^1]: 安装OpenCV contrib扩展包是解决人脸识别模块缺失的关键步骤,标准安装包不包含这些扩展功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值