上一章中说明了如何在windows下编译libtensorflow_cc.so,这章将介绍如何使用(其实你被骗了,windows下libtensorflow_cc.so根本一点用都没有)。
1. 添加识别代码
在tensorflow目录结构下添加如下代码文件,如下图所示
请注意我的目录结构:E:\tf\tensorflow-1.13.0-rc2\tensorflow\cc\seed_switch_recog 和编译时的路径有关
简单说明一下,recog.h, recog.cc是封装好的识别代码,dll.cc是导出识别接口的代码,main.cc是编译成.exe调试的代码。(windows下bazel编译执行还不知道如何调试,不过官网有介绍,自行查阅)BUILD文件里面定义的是编译规则
如上图所示,第三行定义了一个cc_library 先编译出一个library供我们使用,然后有两个tf_cc_binary (正常情况下bazel的语法是cc_binary,这里tensorflow重新定义了一个tf_cc_binary规则,直接使用就可以,和cc_binary没多大区别)
重点 14行和22行两个规则的书写请查看bazel官方教程。
23行和24行说明我们要用dll.cc编译recoglib.dll, 并加上28行的标志说明要做链接操作那么就是可调用的dll了。
如上图所示,dll.cc里面定义了两个接口函数,一个init(接受两个参数,模型路径,标签路径), 一个reco(接收一个图片路径参数)(后期直接改成传输文件流的方式,不经过文件io操作(请加作者qq参与讨论360697611),识别函数可根据需要自行修改,返回置信度与类别结果。
剩下的就不多说了,请下载源代码查看
2. 编译recoglib.dll
如下图所示,在tf 根目录下打开cmd输入
bazel build //tensorflow/cc/seed_switch_recog:recoglib.dll
即可直接开始编译,此方法编译的recoglib.dll 不会依赖之前编译的 libtensorflow_cc.so 也就是说以后也不会用到 libtensorflow_cc.so 了,
经过很长一段时间后终于编译成功,如下图所示,同时在类似文件目录下会出现我们想要的recoglib.dll
3. 调用 recoglib.dll 进行图像分类
下载调用代码,示例模型,测试数据,
所有调用 recoglib.dll 代码在 invoking_dll 文件夹内,如下图:
其中包含test图片,python版调用dll示例代码(dll_tool.py),(c++版一更新至github),label.txt 标签文件,output.pb python训练好的模型, 还有刚刚编译好的recoglib.dll (此处请用刚刚自己成功编译出的dll测试)
运行效果图就不展示了,请自行查看自己的。
4. 使用 vs 2015 编写 opencv 图像处理代码,调用 recoglib.dll 进行识别
预处理代码这里就不献丑了…,c++ 调用dll方法很简单,此处不做介绍,github上放了示例代码,有问题请加我qq讨论。
windows下推荐使用vscode 进行简单tf c++代码编辑操作,vs也可以,不过只能编写代码,不能编译,编译只能用bazel。
windows下是可以将tensorflow 和 opencv 代码 一起编译的,使用bazel就可以,bazel 在 windwos 下也是使用 msvc 编译的,vs也是使用msvc编译的,所以是可以同时用的。下一章将介绍如何使用vscode 编写c++代码用bazel编译。