SIMCommander ®

机器人创客网

©版权所有.转载请注明出处

物体识别

如果视频无法正常显示,请前往b站观看


§准备材料

  • 树莓派3B
  • 树莓派专用CSI接口摄像头,摄像头排线及支架
  • DFRobot数字触摸开关
  • 杜邦线若干
  • 可选:树莓派亚克力保护外壳
  • 键盘,鼠标(建议USB接口无线方式)
  • HDMI显示器(初次安装系统使用)
  • 改锥,剪刀等常用工具

§构架说明

    本项目由三部分组成:
  • 树莓派ubuntu: 负责采集物体图像
  • 基于x86的64位ubuntu: 后台负责图像识别
  • 语音播报: 将识别结果通过语音说出来

物体识别整体构架图

§连接方法

俯视连接图

侧面示意图

    数字触摸开关的作用是触发一个识别过程, 工作电压3.3v~5.5v,工作电流很小,可以直接由树莓派供电.信号线连接到树莓派的GPIO 18针脚,正极连接到树莓派的3.3v,负极连接到树莓派的GND针脚.

树莓派3B针脚示意图

    摄像头安装方法如图:

§图像采集: 摄像头配置

1.树莓派安装ubuntu系统

2.配置树莓派摄像头:

安装两个包:

sudo apt-get install libraspberrypi-dev
sudo pip install picamera

进入配置界面:

sudo raspi-config

如图所示,选择“Enable Camera”, 保存退出。

编辑/boot/config.txt文件.查看有没有下面两行,如果没有,请添加到文件末尾:

start_x=1 
gpu_mem=128

保存退出,然后重启系统.

测试摄像头工作是否正常.创建capture.py文件,内容如下:

import picamera
camera = picamera.PiCamera()
camera.capture('image1.jpg')
camera.close()

执行命令:

python capture.py

当前目录产生image1.jpg图片文件,说明摄像头工作正常.

§识别实现: 配置TensorFlow

1.考虑到树莓派运算能力比较弱,本方案将图像识别部分运行在x86主机的64位ubuntu系统上(本项目采用虚拟机安装),内存最少需要2G以上

2.在x86主机ubuntu系统配置Tensorflow

安装TensorFlow

sudo apt update
sudo apt install python3-dev python3-pip
sudo pip3 install --upgrade tensorflow

最后一个命令由于网络原因可能安装失败,多安装几次,直到安装成功.

下载TensorFlow训练好的模型数据:

mkdir tensorflow
cd tensorflow
mkdir models
cd models
wget http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz
tar xf inception-2015-12-05.tgz
cd ..

测试TensorFlow

本链接python脚本内容 在ubuntu当前目录保存成classify_image.py文件.或点击本文件链接直接下载.

执行命令:

python3 classify_image.py --model_dir /root/tensorflow/models --image_file /root/tensorflow/models/cropped_panda.jpg

--model_dir后面是模型数据所在目录;

--image_file后面是被识别图片文件的路径

运行后,我们将看到下列输出信息:

2019-03-29 04:32:38.781158: W tensorflow/core/framework/op_def_util.cc:355] Op BatchNormWithGlobalNormalization is deprecated. It will cease to work in GraphDef version 9. Use tf.nn.batch_normalization().
2019-03-29 04:32:39.261176: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 3801000000 Hz
2019-03-29 04:32:39.261409: I tensorflow/compiler/xla/service/service.cc:150] XLA service 0x4b83690 executing computations on platform Host. Devices:
2019-03-29 04:32:39.261445: I tensorflow/compiler/xla/service/service.cc:158] StreamExecutor device (0): <undefined>, <undefined>
giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (score = 0.89107)
indri, indris, Indri indri, Indri brevicaudatus (score = 0.00779)
lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens (score = 0.00296)
custard apple (score = 0.00147)
earthstar (score = 0.00117)

用红色部分标注行可以看出,被识别成大熊猫概率最大,接近90%.这个是模型数据自带的图片,识别准确率很高. 下面我们来看看自己提供的图片识别率:

2019-03-29 04:32:38.781158: W tensorflow/core/framework/op_def_util.cc:355] Op BatchNormWithGlobalNormalization is deprecated. It will cease to work in GraphDef version 9. Use tf.nn.batch_normalization().
2019-03-29 04:32:39.261176: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 3801000000 Hz
2019-03-29 04:32:39.261409: I tensorflow/compiler/xla/service/service.cc:150] XLA service 0x4b83690 executing computations on platform Host. Devices:
2019-03-29 04:32:39.261445: I tensorflow/compiler/xla/service/service.cc:158] StreamExecutor device (0): <undefined>, <undefined>
umbrella (score = 0.94752)
kimono (score = 0.00046)
pillow (score = 0.00041)
miniskirt, mini (score = 0.00040)
African elephant, Loxodonta africana (score = 0.00035)

从结果可以看出,识别为伞(umbrella)的概率接近95%,基本可以认定是一把伞. 从测试结果来看,图片清晰,特征明显的物体识别率较高.

§语音播报

1.有很多实现途径,最早是通过安装在windows上的客户端把结果数据取过来进行语音播放,本文采用chrome的语音播报功能,方便安卓手机浏览器登陆后台网页就可以完成.

2.整体实现需要在树莓派端和x86的ubuntu端安装相应的软件:

下载eye.tar后在树莓派的ubuntu上解压运行:

tar xvf eye.tar
cp libraspicam.so.0.1.6 /usr/lib/.
ldconfig 
./eye.out

运行后,正常情况下,我们将看到下列输出信息:

*******Press Ctrl+C to exit.**********
RaspiV_ServerThread.
RaspiV_ServerThread is ready.
RaspiV_ServerThread.
RaspiV_ServerThread is ready.
Opening Camera...
waiting for camera initializing...
camera is open.

摄像头已正常打开,并等待远程连接获取数据.同时按Ctrl和C键可以中断运行并安全退出.

下载mytf.tar后在x86的ubuntu主机上解压运行:

tar xvf mytf.tar
./mytf.out

mytf.out运行后会自动在同网段搜索和连接运行eye.out的树莓派主机,也可以自行加参数运行:

./mytf.out 192.168.0.100

192.168.0.100是运行图像采集程序eye.out的树莓派的ip地址.

启动成功后,我们将看到下列输出信息:

http_ServerThread.
mytf_HandlerThread
http_ServerThread..
mytf_ws_ReportThread
mytf_JpgFetchThread.
mytf_ws_ServerThread.
192.168.10.17 is ONLINE!
Connecting to 192.168.10.17...
Connected!
mytf_ws_ServerThread..

3.看到mytf_ws_ServerThread..信息,说明后台的web服务已经启动,这时你可以在安卓手机或PC端打开chrome浏览器,输入如下地址:

http://192.168.10.6:8989

其中192.168.10.6为运行mytf.out程序的x86 ubuntu主机ip地址,根据实际情况进行修改.如下图所示:

看到mytf connected信息,说明连接成功.

现在你可以用手触摸一下数字触摸传感器,马上触发一次识别过程.

从运行mytf.out的ubuntu(x86)主机画面看到如下信息:

显示"======>>"箭头是我们想要的结果,有两个地方匹配.

现在看看chrome浏览器的画面:

同时可以听到"台灯"的语音

§中文语音

mytf.tar解压后有一个名为en2cn.lst的文件.用文本编辑器打开文件,建议在PC端进行编辑, 部分内容如下:

---------------------
monitor|0.18|显示器
coffee mug|0.2|咖啡杯
cup|0.2|杯子
sun glass|0.2|杯子
sunglasses, dark glasses, shades|0.2|太阳镜,墨镜
sunglass|0.2|眼镜,太阳镜
mouse, computer mouse|0.2|鼠标,电脑鼠标
ladle|0.2|勺
pill bottle|0.2|装药片的瓶子
hand-held computer, hand-held microcomputer|0.2|手持电脑,手持微型电脑
lotion|0.2|洗面奶,护肤露,化妆品
computer keyboard, keypad|0.15|电脑键盘
sandal|0.2|凉鞋,凉拖鞋
table lamp|0.06|台灯
beer glass|0.2|啤酒杯
water jug|0.18|水壶,水杯
paper towel|0.2|纸巾
milk can|0.2|牛奶杯子,牛奶罐
cellular telephone, cellular phone, cellphone, cell, mobile phone|0.19|手机
acoustic guitar|0.7|木吉他
electric fan, blower|0.7|电扇
sandal|0.1|凉鞋,拖鞋
iPod|0.18|iPod,手机
clog, geta, patten, sabot|0.2|鞋子

每一行里有三项内容, 用"|"字符隔开.我们以红色的行举例:

第一项是识别结果的原始英文名称 monitor,可能有多个,用逗号分开;此项必须是完全匹配,要把mytf.out或者tensorflow识别输出的原始结果每一行的英文名包含空格和逗号等全部内容复制,首尾要去掉空格;

第二项是识别的分数(概率),0.18,取值0~1之间, 我们根据实际情况进行调整,只有大于等于本值的分数我们才接受;

第三项是我们想要播报或显示的中文名

比如,从mytf.out的主机看到如下识别输出结果:

--------------------------------------------------------------------------------------------------------
projector score=0.09585
china cabinet, china closet score=0.06599
television, television system score=0.03602
home theater, home theatre score=0.02771
pool table, billiard table, snooker table score=0.01878
--------------------------------------------------------------------------------------------------------

红色部分虽然score=0.06599,分数偏低,但是你认为在你的环境当中可以适用,那么在en2cn.lst文件内容后追加一行:

china cabinet, china closet|0.06|碗柜,瓷器柜

记得中间用"|"符号隔开. 保存后上传到和mytf.out同一个目录下,不需要重新运行mytf.out,程序会自动刷新内容.

注意:第一行内容不能删掉,同时必须保证en2cn.lst文件为UTF-8格式,否则linux无法正确识别中文.

另外,如果识别分数大于等于0.5,即使不在en2cn.lst中定义,程序也认为结果可以接受,进行匹配和播报.

§视频监控

如果想同时查看摄像头的视频,可以下载远程视频实时监控工具

在windows下解压后直接运行目录下的rCamera.exe,可自动扫描同网段摄像头设备,然后选择ip点击连接就可以了.

rCamera效果图