使用tensorflow-serving在docker在虚拟机上【服务器】拉取镜像的方式进行YOLOv3模型部署,并将检测结果在windows系统下【客户端】显示,现将过程整理记录下来。
参考代码:https://github.com/George-2019/tensorflow-serving-yolov3;
https://github.com/Byronnar/tensorflow-serving-yolov3
目录
demo展示:
权重转化
图像预测
模型部署
转化成可部署的saved model格式
docker拉取镜像
Docker部分记录(报错处理)
解决docker 图像显示问题:
树莓派上安装tensorflow问题
安装
树莓派开启摄像头:
提示h5py不存在
windows远程树莓派
$ git clone https://github.com/byronnar/tensorflow-serving-yolov3.git (下载代码)
代码下载到根目录下
$ cd tensorflow-serving-yolov3
将预加载模型放置
checkpoint
在
checkpoint
下解压模型
,
在
tensorflow-serving-yolov3
目录下运行权重转换(转成
pb
格式),并对
yolo
框架图进行冻结
$ cd checkpoint
$ tar -xvf yolov3_coco.tar.gz
$ cd ..
$ python3 convert_weight.py
$ python3 freeze_graph.py
$ python3 image_demo_Chinese.py # 中文显示
$ python3 image_demo.py # 英文显示
$ python3 images_demo_batch.py # 批量图片测试
$ python3 video_demo.py # video_path = 0 代表使用摄像头
$ python3 save_model.py
将
savedmodel
文件夹里面的
yolov3
文件夹复制到
tmp
文件下,这里的
tmp文件是根目录下的文件,一般进入
ubuntu
后默认路径为
/home/
用户名
/...
进入根目录,输入sudo su后再输入密码(
注意这里的密码是不显示的
,
输完按回车即可进入
root
权限用户
)
docker拉取镜像
Note:在部署之前要先安装docker,输入python时,需要输入python3,即使用python3.x,如果没有3,则默认的为2.x,且在使用pip安装命令,也要输入pip3
$ docker run -p 8501:8501 -p 8500:8500 --mount type=bind,source=/tmp/yolov3/,target=/models/yolov3 -e MODEL_NAME=yolov3 -t tensorflow/serving:1.14.0 &
(
运行
tensorflow-serving
的镜像,我这里用的
1.14
版本,如果不指定版本会默认拉取最新的,并做端口映射)【
tmp
文件中的
yolov3
每次虚拟机开机会自动清除,需要重新放置,不然上述命令会报错】
(
该命令在根目录下运行)
###
如果需要使用GPU, 请使用Tensorflow-serving-GPU镜像
$ cd yolov3_tfserving (在tensorflow-serving-yolov3下)
预测
HTTP 接口:
$ python3 http_client.py
GRPC 接口:
$ python3 grpc_client.py
虚拟机做服务器,windows做客户端进行预测
在实现了上一部分的基础上,实现windows客户端的预测,需要做端口映射。
由yolov3_tffserving文件下运行的http_client.py可知生成的API端口为8501,所以只要客户端和服务器端口映射即可。
具体步骤:1.打开Vmware虚拟网络设置
打开 Vmware — 点击「编辑」— 选择「虚拟网络编辑器」
在弹出框选择「NAT模式」 — 点击「更改设置」— 点击之后可以根据自己需要修改虚拟机网关
点击「NAT模式」— 选择「NAT设置」
在「端口转发」下边选择「添加」
虚拟机部分设置完成。接下来是windows部分,打开防火墙设置,选择高级设置
在左侧点击入站规则,新建入站规则,选择【端口】,下一步
然后一直点下一步即可,在名称中写一个与端口相关的名字即可。
通过以上步骤端口映射即成功,在这里我是将主机的8501和虚拟机的8501进行了映射,也可以进行其他端口的映射,但需要查一下端口是否占用。
打开cmd,切换到本地预测的python程序路径下并运行即可得出预测结果。如下图
拉取镜像后import cv2报错:
ImportError: libSM.so.6: cannot open shared object file: No such file or dir
输入:apt-get install libsm6;
ImportError: libXrender.so.1: cannot open shared object file: No such file or directory
输入:apt-get install libxrender1
ImportError: libXext.so.6: cannot open shared object file: No such file or directory
输入:apt-get install libxext-dev
解决方法:通过在宿主机(比如我的是Ubuntu18.04)安装xserver,将docker容器视为客户端,这样可以将容器中需要显示的图像通过挂载的方式显示在宿主机的屏幕上,简单的讲就是将宿主机的屏幕共享给docker容器.
详细步骤:
第一步:在宿主机上安装 xserver
sudo apt install x11-xserver-utils
第二步:在宿主机上修改权限,允许所有用户访问显示接口
xhost +【每次电脑启动的都要输入】
出现access control disabled, clients can connect from any host说明操作成功.
第三步:运行Docker镜像时指定相关参数(这一步最关键)
docker run -it -e DISPLAY \
-e QTX11NOMITSHM=1\
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v $HOME/.Xauthority:/root/.Xauthority
--name [container name][image name] bash
运行该命令进入容器后,即可正常使用OpenCV中的imshow()函数来显示图像.
Docker摄像头:docker run --device=/dev/video0
树莓派(arm)框架下安装tensorflow1.14.0cpu:
可以通过分享的百度网盘安装:
链接:https://pan.baidu.com/s/11JZobbC6K0kKiuiWNTLzUg
提取码:yxin
其他linux下tensorflow安装链接:piwheels - Links for tensorflowhttps://www.piwheels.org/simple/tensorflow/(根据自己的python版本和arm选择版本下载)
注意:树莓派采用的arm架构,需要安装arm架构版的tensorflow
安装python3的一些依赖
sudo apt update
sudo apt install python3-dev python3-pip python3-venv
sudo apt install libatlas-base-dev # required for numpy
- 更换raspi镜像源:更换参考:raspbian | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
- sudo apt-get update
- sudo apt-get upgrade(时间可能会很长)
- 之后会出现文件管理器闪退的情况,再执行sudo apt full-upgrade,重启,ok!
- pip3 install grpcio-1.32.0-cp37-cp37m-linux_armv7l.whl
- pip3 install h5py-2.10.0-cp37-cp37m-linux_armv7l
- pip3 install tensorflow-1.14.0-cp37-none-linux_armv7l
sudo raspi-config
将光标移动到摄像头选项(Camera option)处,并选择启用(Enable)。在退出 raspi-config 时会要求您重新启动
raspistill -v -o test.jpg
这个命令将显示来自摄像头 5 秒钟的预览图像,并且拍摄一张照片,然后保存为文件 test.jpg,保存在/home/pi的目录下面,同时显示出需要相关信息。
在树莓派上安装tensorflow,明明已经安装了h5py,但还是提示不存在:
解决办法:numpy可能过高,现安装的是numpy=1.18.2,h5py=2.10.0
如果换了版本还不行,输入:sudo apt-get install libhdf5-dev
·windows与树莓派需要同一局域网
·sudo apt install xrdp(没错,确实不需要“apt-get”):如果提示更新在更新
sudo apt install tightvncserver(会输入很多次密码)
然后就可以用windows远程桌面了