毫秒级检测!你见过带GPU的树莓派吗?

树莓派3B+英特尔神经计算棒进行高速目标检测

转载请注明作者梦里茶

NCS Pi

代码:
训练数据预处理:
https://gist.github.com/ahangchen/ae1b7562c1f93fdad1de58020e94fbdf
测试:https://github.com/ahangchen/ncs_detection

Star是一种美德。

Background

最近在做一个项目,要在树莓派上分析视频中的图片,检测目标,统计目标个数,这是一张样例图片:

Cattle Counting

Motivation

当下效果最好的目标检测都是基于神经网络来做的,包括faster rcnn, ssd, yolo2等等,要在树莓派这种资源紧张的设备上运行检测模型,首先想到的就是用最轻量的MobileNet SSD,使用Tensorflow object detection api实现的MobileNet SSD虽然已经非常轻,但在树莓派上推导一张1280x720的图仍然需要2秒,有兴趣的同学可以参考这两个项目:
- armv7版Tensorflow(必须是1.4及以上):https://github.com/lhelontra/tensorflow-on-arm/releases
- Tensorflow Object detection API: https://github.com/tensorflow/models/tree/master/research/object_detection

具体的操作在Tensorflow文档里都说的很清楚了,在树莓派上的操作也是一样的,有问题可以评论区讨论

Hardware

极限的模型仍然不能满足性能需求,就需要请出我们今天的主角了,Intel Movidius Neural Computing Stick
Intel Movidius Neural Computing Stick

处理器 Intel Movidius VPU
支持框架 TensorFlow, Caffe
连接方式 USB 3.0 Type-A
尺寸 USB stick (72.5mm X 27mm X 14mm)
工作温度 0° - 40° C
x86_64 Ubuntu 16.04主机
Raspberry Pi 3B Stretch desktop
Ubuntu 16.04 虚拟机
系统要求 USB 2.0 以上 (推荐 USB 3.0)
1GB 内存
4GB 存储

实际上这不是一个GPU,而是一个专用计算芯片,但能起到类似GPU对神经网络运算的加速作用。

京东上搜名字可以买到,只要500元左右,想想一块GPU都要几千块钱,就会觉得很值了。

SDK是开源的:https://github.com/movidius/ncsdk

提问不在GitHub issue里,而是在一个专门的论坛:https://ncsforum.movidius.com/

虽然目前NCSDK支持的框架包含Tensorflow和Caffe,但并不是支持所有的模型,目前已支持的模型列表可以在这里查到:https://github.com/movidius/ncsdk/releases

截止到2018年3月15日,NCSDK还没有支持Tensorflow版的MobileNet SSD(比如tf.cast这个操作还未被支持),所以我们需要用Caffe来训练模型,部署到树莓派上。

Environment

ncsdk的环境分为两部分,训练端和测试端。
- 训练端通常是一个Ubuntu 带GPU主机,训练Caffe或TensorFlow模型,编译成NCS可以执行的graph;
- 测试端则面向ncs python mvnc api编程,可以运行在树莓派上raspbian stretch版本,也可以运行在训练端这种机器上。

训练端

安装

安装这个过程,说难不难,也就几行命令的事情,但也有很多坑

在训练端主机上,插入神经计算棒,然后:

git clone https://github.com/movidius/ncsdk
cd ncsdk
make install 

其中,make install干的是这些事情:

  • 检查安装Tensorflow
  • 检查安装Caffe(SSD-caffe)
  • 编译安装ncsdk(不包含inference模块,只包含mvNCCompile相关模块,用来将Caffe或Tensorflow模型转成NCS graph的)

注意,
- 这些库都是安装到/opt/movidius/这个目录下,并关联到系统python3里边的(/usr/bin/python3),如果你电脑里原来有tf或caffe,也不会被关联上去
- NCSDK mvNCCompile模块目前只兼容python3,我尝试过将安装完的SDK改成兼容python2的版本,可以将模型编译出来,但是在运行时会报错,所以暂时放弃兼容python2了,也建议大家用默认的python3版本
- 这个步骤主要的坑来自万恶的Caffe,如果你装过python3版的caffe,大概会有经验一些,这里有几个小坑提示一下:

  • 最好在ncsdk目录中的ncsdk.conf中,开启caffe的cuda支持,即设置CAFFE_USE_CUDA=yes,这样你之后也能用这个caffe来训练模型
  • caffe的依赖会在脚本中安装,但有些Debian兼容问题要解决
  • 开启CUDA支持后,编译caffe会找不到libboost-python3,因为在Ubuntu16.04里,它叫libboost-python3.5,所以要软链接一下:
cd /usr/lib/x86_64-linux-gnu/
sudo ln -s libboost_python-py35.so libboost_python3.so
  • 其他可能出现的caffe的坑,可以在我博客找找答案,如果没有的话,就去caffe的GitHub issue搜吧
测试

一波操作之后,我们装好了ncsdk编译模块,可以下载我训练的caffe模型,尝试编译成ncs graph

git clone https://github.com/ahangchen/MobileNetSSD
mvNCCompile example/MobileNetSSD_deploy.prototxt -w MobileNetSSD_deploy.caffemodel -s 12 -is 300 300 -o ncs_mobilenet_ssd_graph

这里其实是调用python3去执行/usr/local/bin/ncsdk/mvNCCompile.py这个文件, 不出意外在当前版本(1.12.00)你会遇到这个错误:

[Error 17] Toolkit Error: Internal Error: Could not build graph. Missing link: conv11_mbox_conf

这是因为NCSDK在处理caffe模型的时候,会把conv11_mbox_conf_new节点叫做conv11_mbox_conf,所以build graph的时候就会找不着。因此需要为这种节点起一个别名,即,将conv11_mbox_conf_new起别名为conv11_mbox_conf,修改SDK代码中的/usr/local/bin/ncsdk/Models/NetworkStage.py,在第85行后面添加:

if ''_new' in name:
    self.alias.append(name[:-4])

于是就能编译生成graph了,你会看到一个名为ncs_mobilenet_ssd_graph的文件。

上边这个bug我已经跟NCSDK的工程师讲了,他们在跟进修这个bug:
NCS bug

  • 10
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值