caffe 人脸特征提取并计算相似度

背景

要做人脸识别相关任务,查了很多资料,最近比较火的center-loss做人脸识别。利用caffe-face的模型来提取人脸特征,由于一直都没有深入到caffe的api来做过,一直都在到处查资料。现在将过程记录下。

caffe-face

caffe-facehttps://github.com/ydwen/caffe-face源码相较于caffe源码里面,多了一个face_example的文件夹,下面有一个extractDeepFeature.m文件,但是是matlab的文件,需要将其转换为c的。小白一枚,所以一步一步的“翻译”。

matlab代码

clear;clc;
addpath('path_to_matCaffe/matlab');
caffe.reset_all();% load face model and creat network
caffe.set_device(0);
caffe.set_mode_gpu();
model = 'path_to_deploy/face_deploy.prototxt';
weights = 'path_to_model/face_model.caffemodel';
net = caffe.Net(model, weights, 'test');% load face image, and align to 112 X 96
imgSize = [112, 96];
coord5points = [30.2946, 65.5318, 48.0252, 33.5493, 62.7299; ...51.6963, 51.5014, 71.7366, 92.3655, 92.2041];image = imread('./caffe-face-caffe-face/face_example/Jennifer_Aniston_0016.jpg');
facial5points = [105.8306, 147.9323, 121.3533, 106.1169, 144.3622; ...109.8005, 112.5533, 139.1172, 155.6359, 156.3451];Tfm =  cp2tform(facial5points', coord5points', 'similarity');
cropImg = imtransform(image, Tfm, 'XData', [1 imgSize(2)],...'YData', [1 imgSize(1)], 'Size', imgSize);% transform image, obtaining the original face and the horizontally flipped one
if size(cropImg, 3) < 3cropImg(:,:,2) = cropImg(:,:,1);cropImg(:,:,3) = cropImg(:,:,1);
end
cropImg = single(cropImg);
cropImg = (cropImg - 127.5)/128;
cropImg = permute(cropImg, [2,1,3]);
cropImg = cropImg(:,:,[3,2,1]);cropImg_(:,:,1) = flipud(cropImg(:,:,1));
cropImg_(:,:,2) = flipud(cropImg(:,:,2));
cropImg_(:,:,3) = flipud(cropImg(:,:,3));% extract deep feature
res = net.forward({cropImg});
res_ = net.forward({cropImg_});
deepfeature = [res{1}; res_{1}];caffe.reset_all();

现在的目标是根据这个matlab的代码,将其写成C++的代码。具体的流程如下:

①加载模型,初始化网络
caffe_model和prototxt,两个文件。指定CPU或者GPU模式。

boost::shared_ptr<Net<float> > _net;
string trained_file = "./mobile-id-master/models/mobile_id.caffemodel";
string model_file  = "./mobile-id-master/models/mobile_id_gallery(change.prototxt";
Caffe::set_mode(Caffe::GPU);
_net.reset(new Net<float>(model_file,TEST));  //定义一个网络
_net->CopyTrainedLayersFrom(trained_file);    //加载权重

②人脸对齐
因为caffe-face给的训练模型中的人脸大小是112x96,所以需要将输入的人脸图片变成112X96。然后是人脸对齐,需要一张标准脸的五个特征点的位置坐标,将待提取特征的人脸进行对齐处理。这里面facial5points的五个点的坐标是人脸检测(MTCNN)部分得到的五点位置信息。对于matlab里面的这两个函数,我在opencv里面找到的替代,不知道其具体底层实现是不是一样的,cp2tform和imtransform。将对齐部分写了一个函数。

cv::Mat alignFace(cv::Mat img, cv::Rect rects, std::vector<cv::Point2d>& points)
{std::vector<cv::Point2d> targrtCoordinate;targrtCoordinate.push_back(cv::Point2d(30.2946, 51.6963));targrtCoordinate.push_back(cv::Point2d(65.5318, 51.5014));targrtCoordinate.push_back(cv::Point2d(48.0252, 71.7366));targrtCoordinate.push_back(cv::Point2d(33.5493, 92.3655));targrtCoordinate.push_back(cv::Point2d(62.7299, 92.2041));cv::Mat alignImg;cv::Mat transform = cv::estimateRigidTransform(points, targrtCoordinate, 0);if (((transform.type() == CV_32F || transform.type() == CV_64F) && transform.rows == 2 && transform.cols == 3)){//必须要能正确的进行刚体转换才行cv::warpAffine(img, alignImg, transform, cv::Mat::zeros(112, 96, img.type()).size());}else{//直接根据检测坐标进行裁切cv::Mat crop = img(cv::Rect(rects.x, rects.y, rects.width, rects.height));cv::Mat tmp;cv::resize(crop, tmp, cv::Size(96, 112), 0, 0, CV_INTER_LINEAR);}return alignImg;
}

③前向传播
matlab中前向传播,直接net.forward返回值就是特征向量了。在c++的接口中不是这样的。

vector<float> getLastLayerFeatures(const Mat& _img){ //求一张图片经过最后一层的特征向量Mat img = _img.clone();img.convertTo(img, CV_32FC3);   //转为浮点图Blob<float>* inputBlob = _net->input_blobs()[0];int width = inputBlob->width();            //网络规定的输入图片的宽度和高度int height = inputBlob->height();resize(img, img, Size(width, height));     //将测试图片进行调整大小img = (img - 127.5)*0.0078125;           //减均值,再缩放到-1 到 1float* data = inputBlob->mutable_cpu_data();   //将图片的像素值,复制进网络的输入Blobfor (int k = 0; k<3; ++k){for (int i = 0; i<height; ++i){for (int j = 0; j<width; ++j){int index = (k*height + i)*width + j;  //获取偏移量data[index] = img.at<Vec3f>(i, j)[k];}}}vector<Blob<float>* > inputs(1, inputBlob);const vector<Blob<float>* >& outputBlobs = _net->Forward(inputs);   //进行前向传播,并返回最后一层的blobBlob<float>* outputBlob = outputBlobs[0];      //输出blobconst float* value = outputBlob->cpu_data();vector<float> result;for (int i = 0; i<outputBlob->count(); ++i)     //将输出blob里的特征数值,拷贝到vector里并返回result.push_back(value[i]);return result;}

以上是直接根据prototxt里面的网络结构,获取最后一层的输出特征向量。如果不是获取最后一层的输出,可以根据prototxt里面的层的名字获取特征向量。

_net->Forward();
boost::shared_ptr<caffe::Blob<float>> fc5 = _net->blob_by_name("fc5");//提取fc5层
const float* psfc5 = fc5->cpu_data();
std::vector<float> result;//提取特征的容器
for (int i = 0;i < fc5->count();i++){result.push_back(*psfc5);psfc5++;
}

特征余弦相似度

float getSimilarity(const vector<float>& lhs, const vector<float>& rhs){int n = lhs.size();assert(n == rhs.size());float tmp = 0.0;  //内积for (int i = 0; i<n; ++i)tmp += lhs[i] * rhs[i];return tmp / (getMold(lhs)*getMold(rhs));}float getMold(const vector<float>& vec){   //求向量的模长int n = vec.size();float sum = 0.0;for (int i = 0; i<n; ++i)sum += vec[i] * vec[i];return sqrt(sum);}

然后

ENJOY IT


关注我的公众号,分享资源
公众号搜索: 卡本特
扫码关注

caffe 人脸特征提取并计算相似度相关推荐

  1. CV之FR之MTCNN:基于TF框架利用MTCNN算法检测并对齐人脸图像进(人脸识别/人脸相似度)而得出人脸特征向量从而计算两张人脸图片距离案例应用之详细攻略

    CV之FR之MTCNN:基于TF框架利用MTCNN算法检测并对齐人脸图像进(人脸识别/人脸相似度)而得出人脸特征向量从而计算两张人脸图片距离案例应用之详细攻略 目录 基于TF框架利用MTCNN算法检测 ...

  2. caffe 人脸关键点检测_人脸关键点对齐

    摘要: 从传统方法到深度学习方法,对人脸关键点定位/人脸对齐的发展进行梳理,对该领域中经典的方法,最新成果进行汇总,并给出相应的paper原文,项目主页及代码链接.重点介绍深度学习的几种最新方法. 1 ...

  3. 人脸系列:人脸检测、人脸关键点定位、人脸优选、人脸对齐、人脸特征提取、人脸跟踪、人脸活体检测

    一.一点想法 缘由:最近想整理下从事人脸方向的所有查阅过的论文,做过的相关实验,因为随着时间的推移,自己总会遗忘当初的一些想法,所以想好好整理下自己的学习笔记. 过程:本系列包括从人脸检测.人脸关键点 ...

  4. NLP-文本匹配-2016:MaLSTM(ManhaĴan LSTM,孪生神经网络模型)【语句相似度计算:用于文本对比,内容推荐,重复内容判断】【将原本的计算余弦相似度改为一个线性层来计算相似度】

    <MaLSTM原始论文:Siamese Recurrent Architectures for Learning Sentence Similarity> MaLSTM模型(ManhaĴa ...

  5. 一个基于特征向量的近似网页去重算法——term用SVM人工提取训练,基于term的特征向量,倒排索引查询相似文档,同时利用cos计算相似度

    一个基于特征向量的近似网页去重算法--term用SVM人工提取训练,基于term的特征向量,倒排索引查询相似文档,同时利用cos计算相似度 摘  要  在搜索引擎的检索结果页面中,用户经常会得到内容相 ...

  6. Caffe图片特征提取(Python/C++)

    Caffe图片特征提取(Python/C++) 1.Caffe特征提取(C++实现) Caffe框架提供了相应的Tools(build/tools/extract_features.bin)工具ext ...

  7. pytorch 计算相似度,相关系数

    torch.cosine_similarity 可以对两个向量或者张量计算相似度 结果:可能为负数,只能判断方向,相似度精度比较低. 比如1和10000的相似度为1,1和-1的相似度为-1. impo ...

  8. 文本去重之MinHash算法——就是多个hash函数对items计算特征值,然后取最小的计算相似度...

    来源:http://my.oschina.net/pathenon/blog/65210 1.概述 跟SimHash一样,MinHash也是LSH的一种,可以用来快速估算两个集合的相似度.MinHas ...

  9. ML之相似度计算:图像数据、字符串数据等计算相似度常用的十种方法简介、代码实现

    ML之相似度计算:图像数据.字符串数据等计算相似度常用的十种方法简介.代码实现 目录 相似度 1.余弦相似性-夹角余弦(Cosine_Distance)距离 2.代码实现-余弦距离.余弦相似度 2.皮 ...

最新文章

  1. 独家 | 2021年打破了零日黑客攻击的记录
  2. TP-LINK821N无线网卡拆解分析
  3. (Application下)组件(所在的)进程创建时,创建Application
  4. 《网球王子》与阿梅尔
  5. CentOS上安装Git
  6. deepin linux mac主题,deepin,安装GNOME桌面环境,类mac界面美化
  7. 打印准考证服务器异常显示,注意了!打印准考证时,你可能遇到这些问题!
  8. 软考高级 真题 2017年下半年 信息系统项目管理师 论文
  9. lol连接服务器失败怎么修复,英雄联盟lol连接服务器失败怎么办?解决方法大全...
  10. 使用scapy 构造一个 特定Ether dmac 的报文
  11. Git - 学习/实践 - 以及相关操作
  12. 四步教你用网站源码建站
  13. 【ctrl+space】键位解除占用+永久删除微软拼音输入法
  14. Windows Server2008上安装VS2008出错及解决办法
  15. CentOS 7安装图形化界面
  16. 01虚拟化与系统部署
  17. 140.210.28.29扬州BGP高防服务器
  18. 如何开启Chrome内核浏览器(360极速版、QQ、UC)的多线程下载模式来提高浏览器的下载速度?
  19. 破解电信最新版华为光猫的配置文件:HG8245C(针对hw_ctree.xml已加密)
  20. 计算机应用责任编辑刘丽,普通高等教育“十二五”规划教材·公共课系列:新编大学计算机应用基础习题与上机指导...

热门文章

  1. 数字后的顿号变成斜杠 - 解决方案
  2. 《数据结构与算法》(二十五)- 排序算法:快速排序
  3. STM32之TIM定时器
  4. 微博好友推荐算法-SALSA
  5. Comsol Multiphysics 5.6软件安装包下载COMSOL Multiphysics5.6安装教程win
  6. 儿子五岁生日感言-preview
  7. Day04对象的不同形态(多态)转型
  8. SpringCloudAlibaba学习文档
  9. Mac GitKraken7.0以下版本无法登陆问题解决
  10. PDF导出-复杂样式【像搭积木一样排版】