我的是ubuntu16.04版本,GPU2080T台式机,以前已经安装了tensorflow1.13.1GPU版本,而且已经训练好了自己的目标物模型,在树莓派3上使用此模型识别的时候(调用CSI摄像头实时识别,当然这里有很多工作需要做,包括tensorflow1.13.1树莓派安装,python3.5编译安装,opencv3.4.5编译安装以及一些依赖包的安装,以及python编程解析模型,并调用摄像头实时处理图像,此处省略),识别率不输台式机,但延时5–10s,听说想优化模型需要源码安装tensorflow,并且使用bazel(不支持window系统),可是自己已经费了好多时间弄好了人工智能的工作环境(听说ancoda专业解决此问题),不舍得卸载啊!于是,决定另外装一个tensorflow1.13.1,管它后果呢,肯定比重装强。
一、安装bazel
装的时候发现我以前已经装过最新的0.27版本,可tensorflow官方说tensorflow1.13.1需要bazel 0.19.2版本,于是乎降低bazel版本成了大问题,搜了好多,没找到关于降低版本的办法,最后用rm -r 指令强行删除0.27版本,用法如下:
rm -r test 就是删除当前目录下的test,不管它是文件还是文件夹或者目录
终端直接输入:
bazel
会输出bazel版本信息,如果没有反应,那说明你没有装bazel或者没有设置bazel的环境,我就是通过此命令发现我已经安装了bazel0.27了的。想知道bazel安装后的路径,终端直接输入:
whereis bazel
会输出bazel路径,此路径替换掉上面的test就可以删掉0.27版本,相当于卸载它。我的 bazel路径为:
/home/siat/bin/bazel
好了,卸载完高版本,就可以安装0.19。2版本了。官网下载:
https://github.com/bazelbuild/bazel/releases ----- 下载installer-linux-x86_64.sh文件
或者我网盘:https://pan.baidu.com/s/1bLdGXBZau0yXQPNk6Gwxyg
chmod +x bazel--installer-linux-x86_64.sh (赋予运行权限)
./bazel--installer-linux-x86_64.sh --user (安装,前面的./很重要)
export PATH=“ P A T H : PATH: PATH:HOME/bin” (最后设置环境变量)
到此为止,bazel已经安装并设置完成,安装完成后,千万不要更新bazel,否则你0.19.2不保啊,tensorflow1.13.1就无法buuild了。听说还要用到JDK8,我也安装了一下。
安装JDK:
sudo apt-get install openjdk-8-jdk
终端显示我已经有更新的JDK了,所以就省心了。
二、tensorflow1.13.1源码安装
github上下载tensorflow-1.13.1.zip,或者我网盘:https://pan.baidu.com/s/1Nu4MjwE39KDMsVBxH5Ll_Q 并解压到当前文件夹,会自动生成一个tensorflow-1.13.1的文件夹。终端进入此目录,以下所有操作都是在此目录下进行的。
1.配置tensorflow安装环境:
./configure
配置安装环境,全部选no,python library paths不要用默认,为:/usr/lib/python3.5 其它morning。虽然有GPU,但我选了不使用GPU,因我试了失败,关于GPU的设置和术语我实在是招架不住,优化个模型而已,至于这么认真么?索性cpu没有辜负我,哈哈。后来才发现使用bazel优化模型不需要到安装tensroflow那一步,只要build完tensorflow就行了。
2.编译pip安装包:
bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
编译完以后,在此文件夹下会多出几个bazel开头的快捷方式文件夹,此时说明已经可以在此目录下优化瘦身.pb模型了。
这一阶段要等很久,我的2万多配置的台式机用了40分钟左右。
3.生成pip安装包.whl文件(纯粹优化模型的话,这步不要):
sudo bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
生成的安装包会放在你的机器名(我的hzt)文件夹下面的 tmp中的tensorflow_pkg中,而不是当前目录下,我困惑了好久,以为没有成功生成安装包呢,怎么都找不到tmp文件夹,后来自己在此目录下建立了一个,生成完,还是空空如也。
此步很快,我的有好多个warning,都是找不到什么文件的,不用管它。在tmp/tensorflow_pkg目录下找到tensorflow-1.13.1-cp35-cp35m-linux_x86_64.whl就行。
4.安装(纯粹优化模型的话,这步不要):
sudo pip3 install tensorflow-1.13.1-cp35-cp35m-linux_x86_64.whl
三、优化.pb模型
为了安全起见,编译graph_transforms文件夹中的transform_grap(没此步应该也可以,没敢试),在tensorflow1.13.1目录,输入以下指令编译(耗时10几分钟):
bazel build tensorflow/tools/graph_transforms:transform_grap
把训练好的frozen_inference_graph.pb模型拷贝到上文的tensorflow-1.13.1目录下,输出命名为:frozen_graph_quantized.pb。终端输入:
bazel-bin/tensorflow/tools/graph_transforms/transform_graph --in_graph=frozen_inference_graph.pb --outputs=“output_node_name” --out_graph=frozen_graph_quantized.pb --transforms=‘quantize_weights’
模型frozen_inference_graph.pb小22M,优化后frozen_graph_quantized.pb大小6M.
把优化后的模型放到树莓派上测试,同一位置,识别精度低28%,并且误识别率很高,会把其它物体识别成目标物,最重要的是识别时间没有缩短,延时5–10s.所以放弃模型优化!
另外说一下,transform_graph在tensorflow1.13.1目录下tensorflow/tools文件夹里的graph_transforms,还有一个量化瘦身模型的在tensorflow1.13.1目录下tensorflow/contrib文件夹下的quantize中,不用bazel,有现成的py文件,optimize_for_inference.py删除节点的方法直接可用。据说没transform_graph好用。 后来总结了一下,发现只有一种可能加速了,那就是采用内存映射的方式,这一种方式是在运行时控制内存占用的一种有效方式,只是使用起来与原本的PB文件调用方式有些不同,从整个文件读到内存中变成内存的映射,这能大量的节省内存带宽以及占用量。
使用发放如下:
bazel-bin/tensorflow/contrib/util/convert_graphdef_memmapped_format
–in_graph=/tf_files/rounded_graph.pb
–out_graph=/tf_files/mmapped_graph.pb
听说 经过这个脚本输出的PB文件不能再Python中直接调用,所以我们暂时也无法检测其可行性,需要在手机端调用,ios有成功例子,安卓端 少见。