APP下载

树莓派机器学习初探之“物体分类”应用

2022-01-24牟晓东

电脑报 2022年2期
关键词:赋值树莓圆珠笔

牟晓东

我们利用机器学习中的“图片分类”功能,开发实现了能够智能识别开发板的“开发板分类器”。其实,只要前期的模型学习过程中进行了足够多的“训练”,后期的分类识别功能就会更强大,能“认识”更多的物品,而且识别准确率(称为“置信度”)也更高。不过,“图片分类”只限于识别单独的一个物体,如果摄像头画面中有多个待识别物体同时存在,就要用到“物体分类”功能来实现。以开发制作一个超市商品“计价提醒仪”为例,我们在树莓派上通过图形化编程和Python代码编程分别实现自动计价和多物体同时识别。

实验器材包括树莓派3B+及古德微扩展板一块,USB接口的摄像头一个,音箱一个,HC-SR04超声波传感器一个;作为“道具”的圆珠笔两支,塑料夹两个,铅笔刀一把,钉书针一盒,“购物托盘”一个,A4白纸若干。首先将摄像头插入台式机的USB接口,在平整的桌面上铺好白纸,将购物托盘水平放置并调整好摄像头的拍摄角度,四件文具商品各取一件放入购物托盘;然后,将超声波传感器的四个引脚插入扩展板的20号和21号引脚,注意方向朝外;最后,将音箱数据线插入树莓派的音频输出孔,给树莓派通电,启动操作系统。

基本操作与“图片分类”相似,“物体分类”的前期准备工作如下:

首先,在古德微机器人网站点击“更多功能”进入“机器学习”界面,点击右侧“物体检测”中的“开始物体识别”按钮(如图1)。

在弹出的“机器学习—物体检测”页面中点击“拍照”按钮,用鼠标分别框选每件文具商品后为其添加类别:“铅笔刀”、“圆珠笔”、“钉书针”和“塑料夹”,完成后点击“保存并切换下一张图片”按钮。

继续在购物托盘上变换文具商品,比如只放置一把铅笔刀,或是同时放置两支圆珠笔和一盒钉书针等等,重复拍照并进行物体的类别标注。这个过程需要耗费一定的时间,进行至少16张标记图片的采集,并且在每张图片上都要对其中的文具商品进行正确的标注——包括同一张图片上有两件及以上相同的文具商品也要一一标注。

接下来,点击中间的“开始训练”按钮,平台开始进行模型的训练,五六分钟之后会提示“模型训练完成!”;此时,在右侧的“预览”窗口中也会实时对摄像头所拍摄到的文具商品进行名称及置信度的百分比显示(如图2)。

点击“下载树莓派上使用的模型”按钮,将模型文件model.tflite通过Windows的远程桌面连接复制并粘贴至树莓派的/home/pi/model/object_detec

tion目录下;接着,在此目录中新建一个名为labels.txt的文本型标签文件,将之前的四种文具商品名称信息标注逐条输入并保存——如果后期测试时发现标注信息有错误的话,可在此标签文件中进行文具商品名称的位置调换。

返回古德微机器人平台,点击“积木”切换至图形化编程界面,开始进行编程:

首先,输出调试信息“程序开始运行”作为程序开始运行的提示;接着,建立一个名为“文具价目表”的空字典,通过四个连续的“为字典添加或更新数据”模块语句为其赋值:铅笔刀1元、塑料夹2元、钉书针5元、圆珠笔3元;然后,建立变量“文具识别模型”,赋值为“加载物体检测模型”,对应的模型文件和标签文件即准备工作中已经训练并下载至树莓派/home/pi/model/object_detection目录下的model.tflite和labels.txt;最后,输出调试信息“模型加载”(如图3)。

首先,建立一个名为“文具数量统计”的空字典;接着,建立一个“为每个项目在列表中执行”的循环结构,为变量“文具名称”赋值为“从字典‘单项识别结果’中获取键‘name’所对应的值”,实现从变量“文具名称”中提取对应物体名称的功能;再将从字典“文具价目表”获取键为“文具名称”所对应的值(即该文具商品的售价)取出,通过“自增”模块语句增加至变量“总价”中;然后,通过一个“如果…执行…否则…”双分支选择结构对刚刚识别出的“文具名称”进行判断——是否在字典“文具数量统计”中已经存在,条件成立的话,说明之前的循环已经统计过该文具商品的数量,则将其数量在原基础上进行“个数加1”;否则,说明该文具商品是第一次被识别到,对应的“个数”值就是1(如图4)。

首先,调用“初始化”函数;接着,建立一个“重复当‘真’执行”的循环结构,为变量“超声波测距”赋值为“智能硬件”-“常用”-“超声波测距”;在“如果…执行…”选择结构中对“超声波测距”的值进行是否“小于30”(单位:厘米)的判断,条件成立,则进行以下操作:

将计算文具商品最终付款金额的“总价”赋值为0,再通过变量“照片路径”实现控制USB摄像头拍摄一张相片,为变量“识别结果”赋值——“用物体检测模型‘文具识别模型’对图片‘照片路径’进行物体检测”,并且通过输出调试信息进行显示;接着,调用“计算文具数量和总价”函数,实现将正确识别出的文具商品数量与总价进行统计的功能;然后,建立一个名为“识别到的文具名称列表”的变量,为其赋值为“获取字典‘文具数量统计’的所有键”,并且再通过一个“为每个项目在列表中执行”的循环结构,实现变量“文具清单”的赋值、语音播报及LOG调试区的文字信息输出,格式为:“X的选购数量:Y元。”;最后,再建立一个名为“文具总计”的变量,同样也是通过“建立字符串使用”模块语句,实现赋值、语音播报及信息输出,格式为:“您应付款Z元。”(如图5)。

将程序保存为“超市商品‘自动计价提醒仪’”,并且要将USB摄像头从台式机上拔出,插至树莓派的USB接口;点击“连接设备”后再点击“运行”按钮,开始测试:

先尝试将1把铅笔刀和2支圆珠笔放置于购物托盘中,再用手掌靠近超声波传感器模拟购物者靠近收银台,LOG调试区先是输出“程序开始运行”和“模型加载”的提示信息,接着又以列表内嵌套字典的形式输出“识别结果”:[{"box"”:[322,374,512,435],"name":"铅笔刀","score":85.49},{"box":[219,169,554,249],"name":"圆珠笔","score":51.56},{"box":[205,260,546,328],"name":"圆珠笔","score":51.4}],表示在对应区域分别进行了物体识别;然后再分别输出“文具清单”和“文具总计”信息——铅笔刀 的选购数量:1,圆珠笔 的选购数量:2,您应付款7元。与此同时,音箱也会进行文具商品选购情况及最终付款金额数目的语音播报。接下来,再分别测试“铅笔刀1把、钉书针1盒、圆珠笔1支”和“塑料夹1个、钉书针1盒、铅笔刀1把”的选购情况,最终分别得到“您应付款9元”和“您应付款8元”的正确识别结果显示与语音播报提醒。

与“图片分类”类似,我们仍然是访问Github页面(https://github.com/tensorflow/examples/

tree/master/lite/examples/object_detection/rasp

berry_pi)查找和下載object_detector.py文件,改写另存为object_detection_with_usbcamera.py,同样也是改写成用USB接口的摄像头,而且将调用的模型文件和标签文件重新定位至准备工作中训练好并下载到树莓派的model.tflite和labels.txt。

通过Windows的远程桌面连接进入树莓派,在Thonny编辑器中打开/home/pi/pycode目录中的object_detection_with_usbcamera.py文件,点击“运行”按钮进行多物体识别测试——比如在摄像头下的购物托盘中先放置“一支圆珠笔、一盒钉书钉、一把铅笔刀”时,程序弹出的frame视频窗口中就会对这三种文具商品进行正确的识别,包括名称及置信度(百分比);同样,如果再放置“一支圆珠笔、两个塑料夹、一把铅笔刀”的话,程序同样也会进行识别和置信度的标识(如图6)。

如果想要实现使用图形化编程时的文具商品数量统计与总价合计的话,就需要在程序中建立对应的变量,同时结合字典及列表等相关的Python编程知识进行物体识别信息的提取(包括对各种文具商品进行定价、对超声波传感器进行测距判断等),同样也会实现“自动计价提醒仪”的其他功能,大家不妨一试。

猜你喜欢

赋值树莓圆珠笔
创意圆珠笔
你不知道的创可贴
算法框图问题中的易错点
黄金水果红树莓
树莓红了 游人醉了
抽象函数难度降 巧用赋值来帮忙
利用赋值法解决抽象函数相关问题オ
e络盟率先推出第三代树莓派
年度睡姿大盘点(下)
圆珠笔花