背景
课题组需要开发一个人脸识别加人脸防伪的系统,而现在很多识别模型和防伪模型都是基于深度学习训练出来的,常见的tensorflow框架可以训练模型生成pb文件,由于整个系统的客户端是在基于QT来编写的,因此需要用C++来编译tensorflow,得到可以供C++调用的动态链接库tensorflow.dll,然后通过包含动态链接库才能调用训练好的pb模型。
环境准备
操作系统:windows10 64位 专业版
编译器:visual studio2015专业版
Swigwin-3.0.12
Python3.5
CMake-3.8.0
Tensorflow-1.8.0 CPU版本源码
有些东西下载不来,要有能去外面世界的东西(你懂的)
编译tensorflow
打开Cmake,选择tensorflow源码路径以及生成文件的路径,此时点击Configure,出现的错误提示:Compiler Not Found。原因在于在使用Cmake编译时需要指定编译器,而visual studio2015对应的编译器是vc14,指定vc14。再点击Configure,最后Generate,会在生成文件的文件夹下生成许多文件,包括tensorflow.sln文件。
用vs2015打开tensorflow.sln,对于64位版本的windows系统,选择目标编译平台Release x64(若是想要得到Debug版本的,选择Debug x64平台。千万不能选Debug x64,Debug版本是调试版本,编译的结果包含调试信息,且不做任何优化,速度慢,中间报错很多;而Release版本为发布版本,不保存调试信息,进行了各种优化,期望达到代码最小和速度最优)。
选择好目标平台为Release x64后,点击运行按钮,visual studio就开始编译tensorflow了,期间等待一到两个小时,编译完成后会出现各种各样的错误。
编译器的堆空间不足。
- 解决方案:具体为在“项目和解决方案”中的“生成并运行”中,“最大并行项目生成数”设置为1,“MSBuild项目生成输出详细级别”以及“MSBuild项目生成日志文件详细级别”设置为“最小”。
re2编译不通过
- 转到tensorflow文件里tensorflow-1.8.0\tensorflow\contrib\cmake\build\re2\ src\re2目录下,保留CmakeList.txt,删除该目录下所有非文件夹的文件。
对于一些文件下载不成功,包括很多zip,png之类的
- 很多网址是外网,你懂的
error C2046:项不会计算为接受0个参数的函数
- 将visual studio2015升级到update3,只要update3,不要用update5
无法打开输入文件“xxx.lib”
- 由于3个项目的配置有问题,具体的不记得,需要单独编译这3个,最后进行ALL_BUILD
生成C++可调用的动态链接库.dll文件
与在visual studio中配置opencv类似,需要在visual studio中的包含目录和库目录中包含之前编译好tensorflow生成的必要依赖项。
具体如下:
在VC++目录->包含目录中包括

在VC++目录->库目录中包括

在链接器->输入->附加依赖项中包括

调用pb模型
对于生成的动态链接库,里面包含了封装pb模型,并且需要调用的函数,由于这个pb模型主要实现的是人脸真伪的判断,所以输出的是一个二分类,包含两个值,对于一开始pb模型而言,输出的两个值一直都是1和0,与现实情况不符合。
分析:pb模型是由keras的h5模型转换而来,在转化过程中可能会出现图结构和结点的损失。
解决方案:直接在训练的时候将keras保存成pb模型,成功调用。