主要内容
机器人按照给定的购物列表,识别出物品的种类并将指定的物品放入到属于它的其对应的货架上。
大致方案
比赛中机器人需要具有移动和物品分类的能力。上位机运行python利用mxnet进行迁移学习识别物品,然后用广度优先搜索规划机器人的路径传给STM32单片机控制机器人移动,机器人的移动是用红外模拟和数字传感器配合STM32单片机实现的,同时使用serial模块和二次通信协议控制机械臂取出和放置物品。
物品识别实现方法
普通的图像识别进行训练需要很大的样本,但是我们这次比赛12个物品每个物品大约只用摄像头拍摄了1000张,数据量远远不够,所以使用迁移学习,迁移学习是把一个源领域学习到的知识,迁移到另一个目标领域,是的目标能取得更好的学习效果。迁移学习的模型选用resnet50_v2,阿里2018FashionAI衣服分类比赛也用的这个模型进行迁移学习,效果较好。迁移学习将该模型的网络参数w和b全部复制过来,输出层重新定义并随即初始化,加载的模型有features和output两个成员变量,对应前面讲述的前者和后者。
该学习使用了Gluon,是的实现模型更加简洁:data模块提供了有关数据处理的工具、nn模块定义了大量神经网络的层,loss模块定义了各种损失函数、Trainer。
准备数据集、定义模型结构(前向传播)、定义损失函数和优化算法(反向传播)、训练模型
训练模型时,首先将图片增强,随机将亮度增加或减少在0%~50%之间,并将三个通道数值做标准化每个像素点转成浮点型并归一化,每个batch有(16,3,224,224)维度的数据,随后通过迁移学习模型的features层,每个batch得到(16, 2048)维度的数据。
将该数据通过两个全连接层,并过激活函数relu,再经过输出层得到每一个batch(16, 12)维度的数据,使用交叉熵作为损失,用梯度下降方法进行模型训练,打印loss值,准确率观察效果。
实验中使用cpu进行训练速度较慢,每次识别可能需要5~6秒,后改为GPU,大大提高了训练和识别的速度,且由于使用了迁移学习,最后的识别效果很好。
机器人移动部分
机器人的移动由STM32单片机控制,以格子为单位,每一个格子都是用白线分隔好的。机器人四周的部分数字传感器计算机器人走的格子数目,中间的两个红外模拟传感器收集到的数据通过PID参数调节控制机器人直线行驶,移动的指令由上位机根据物品应摆放的位置发送给STM32。
缺点
由于场地的光线或者场地平整度的偏差,数字红外传感器非0即1的特点可能会使得机器人实际走的格子数和期望走的格子数有偏差,所以计算格子数目也改为了模拟传感器。
前期机器人控制机器人行走,模拟红外数据的测量的调试都是通过串口,串口接上蓝牙,然后我在手机上自己做了一个蓝牙客户端扫描并连该蓝牙,进行一些数据的传递和控制。但是我没有想到的是,pid参数(控制机器人走直线和转弯,通过pwm波占空比的不同来控制四个轮子的转速)的调试我们都是代码改一次,烧录一次,浪费了很多的时间,而且当时比赛现场调试的时候时间紧迫,我要是当时想到直接手机app修改pid参数,然后通过蓝牙发送给STM32进行调试,速度会快得非常多。
机械臂的控制
我们买的机械臂可以进行二次开发,通过串口发送特定的数据,就能控制机械臂的一个动作,然后我们设计了抓取、放置的动作组,将该动作组数据存储在代码中,巧妙地完成了机械臂的问题。
我负责的部分
我主要负责物品的物品识别,之前看过李沐的机器学习视频,也写过数字手写识别的代码。在图片增强的时候我给图片增加了光线影响的问题,调试一些训练轮数、学习率batch_size等一些参数,使识别效果更好。然后我是该项目的队长,STM32控制机器人识别的部分我也参与的比较多,我写了一个iOS蓝牙应用程序,与插上蓝牙的单片机进行调试,比如调试时直接用手机控制机器人的运动,观察模拟红外的数据等等,唯一的遗憾是当时调试PID参数一直是用的keil修改代码、烧录代码花费很多时间,要是当时直接用手机应用通过蓝牙发送PID参数给单片机来调试会快很多。
附:机器学习训练及预测代码
1 | #preprocessing.py |
1 | #top_train.py |
1 | #predict.py |
Author: Jcwang
Permalink: http://example.com/2020/05/06/%E8%B6%85%E5%B8%82%E8%B4%AD%E7%89%A9%E6%9C%BA%E5%99%A8%E4%BA%BA/