基于图像处理的物体识别与分类系统
—2021研究生电子设计大赛总结
1. 赛题
?我们组选的是TI企业命题第三题:基于图像处理的物体识别与分类系统。
- 摄像机采集图像,通过图像处理算法实时检测识别出目标物体,并测量目标与小车距离,控制小车移动靠近目标并同时控制机械臂抓取目标物体进行分类
- 抓取3种以上物体(例如:泡沫小球、泡沫方块等等机械臂可抓取物体)
- 目标识别与分类可以使用Opencv、Arm NN、Caffe等任意框架
- 目标距离检测可通过图像测距/激光雷达实现
- 支持AM5708的DSP核心进行算法加速
- 禁止使用带深度信息输出的摄像机
2.软硬件及实验环境
-
软件
- 框架:OpenCV框架
- IDE:VScode. Visual stidio 2019
- TI ProcessorSDK
-
硬件
- TI-RSLK专家版(搭载ubuntu操作系统)
- 舵机控制的机械臂
- 激光雷达
- USB摄像头
- wifi模块
- 速度反馈直流电机
-
实验环境
3.解题思路
? ?主要分为图像识别与分类和小车驱动两部分。 ? ?关于图像识别分类部分 ? ?主要采用特征提取+支持向量机的方法。该部分采用Opencv框架,以C++语言编写程序。特征提取方面,先对视频逐帧读取得到图片,之后对图片进行灰度、二值化等图像处理操作得到待识别的预处理图像。机器学习方面,用最后要进行识别与分类的小球、方块和圆锥等物体制做训练集,然后在PC机上进行训练得到权重文件。之后将权重文件和识别与分类程序下载到工业派上,对图像进行识别与分类。 ? ?关于小车驱动部分 ? ?主要了解linux下C程序的运行方式以及arm在linux操作系统下的配置与使用,然后参照例程驱动电机、舵机、激光雷达和wifi模块。其中电机用以驱动小车前进或后退;前轮靠舵机转向;机械臂由舵机驱动,可以完成放下、举起和抓取等动作;激光雷达测量360度范围内障碍物的距离;wifi模块用于下载程序和与PC机通信。 ? ? 小车前轮转向 ? ?小车抓取物体 ? ?关于图像识别程序和小车驱动程序的联合问题。 ? ?图像识别程序采用C++语言编写,而小车驱动程序采用C语言编写。这俩程序难以互相转换使二者在同一个函数中编写,故我们采用共享内存的方式进行进程间通信。物体识别与分类程序将被识别物体的位置坐标、个数及种类写入共享内存,小车驱动从共享内存中主要读取物体的位置信息(物体与屏幕中线的距离)以指导前轮舵机的转向从而对准物体。
4.技术关键
? ?关于小车定点停车的问题 ? ?小车要想抓住物体,必须停在距离物体一定的位置,这样小车在放下机械臂时才能恰好在可以抓起物体的位置。为达到此目标,我们采用速度、距离双环PID控制的策略。具体的策略为:预先设定一个我们需要的距离-速度参照表V-Smap,在这个表中,每个距离上对有对应的小车速度,而且这个速度是我们自己设定的并可以使小车定点停下来。在小车前进过程中,小车实时监测自己与目标物的距离和自己电机的转速。每到一个距离,小车就会去查表找到对应的预期转速,这个速度与当前的实际速度的差作为误差参与PID调节,输出的是控制电机转速的pwm的占空比。这样小车就能按照我们设计好的速度趋近物体并在指定的位置停下来。 ? ?V-Smap
? ?图像预处理部分 ? ? 预处理方面先要进行灰度处理,之后进行二值化处理使图像中只剩下被识别物体的实心轮廓。关于图像预处理,要使用DSP进行加速,其具体方式为用共享内存的方式将图片传入DSP,然后调用ti官方的图像处理库IMGLIB中的函数进行图像处理。处理完后再传回主程序中进行之后的支持向量机分类。 ? ? 以共享内存的方式在ARM和DSP之间传输图像
? ? 使用opencv库中的二值化函数效果 ? ? 使用IMGLIB中的函数DSP加速的效果
? ?物体跟踪问题 ? ?假设屏幕中不只一个物体,仅仅知道当前帧特定物体的位置并不能完全指导小车趋近该物体。还得知道在下一帧中同一物体的位置。这样我们才能根据位置反馈来调节前轮舵机来对准物体。但实际的情况是,我们对每一帧进行物体的分类与识别,每次识别我们会给物体进行序号标记,遗憾的是,不同帧中同一物体的标号并不相同,如下图所示,在下一帧中可能是cone的index=2而cube的index=1,这使我们不能依靠标号来锁定物体的位置,按照我们预先的想法,假设同一物体的标号一直不变,我们以共享内存的方式按照标号将位置信息写入数组中该标号对应的位置,然后在小车驱动程序中一直读该数组同一位置的距离信息,以此来作为反馈来调节前轮舵机。但是因为标号在改变,这种思路行不通。之后我们也尝试用相邻帧同一物体位移距离很小的原则来锁定同一物体,但是这种思路对于屏幕中出现或消失的新物体的情况并不理想。最后询问哈工大的一位朋友得知可以用boosting算法进行跟踪来解决此问题。 ? ? ? ? ? ? ? ? ? ? 成功识别物体效果图 ? ?图像处理与识别分类的处理时间即实时性的问题 ? ?在比赛开始之初我们完全没有考虑过实时性的问题,以为这种基于AM5708的工业派搭载linux操作系统运行起来会很快,但实际情况并非如此,在图像处理与识别分类部分,程序对每一帧都会进行机器学习,这十分耗时。我们做了程序计时,在图像预处理过程(灰度处理、二值化)中时间花费相对较少,时间大量花费在对物体进行识别分类上,这就导致位置信息的反馈是滞后的,无法及时发送给小车驱动程序以指导前轮舵机的转向。具体表现为小车的舵机在小车前进快接近目标时才接受到转向信息,但此时已没有剩余距离可供调节转向。哈工大朋友的建议我们可以采取只机器学习(svm)识别第一帧然后用boosting算法进行跟踪,根据他所说,hog+svm在pi4上能跑到10fps左右,但boosting能到60fps。这为我们的工作指明了前进的方向。
5.总结
? ?在做这次比赛之前我们团队仅有单片机的编程经验和少量的linux 操作系统知识,对于图像处理、机器学习、搭载在arm上的linux操作系统如何驱动硬件等领域毫无经验。但好在匠牛科技出具了完成的视频与文档教程为参赛者提供参考,使我们能够快速上手。在图像处理与目标识别方面,我们已经可以成功在PC端进行识别与分类但无法实现跟踪,而且程序下载到工业派中的运行速度太慢,以至于无法及时提供反馈信息以控制转向。这也和程序的控制策略有关系,我们不应该对每一帧都进行机器学习(这浪费了大量的时间),而应该只对第一帧机器学习并识别出物体后再使用boosting算法进行跟踪,这将会极大改善我们小车对准物体运行的情况。在小车定点停车方面,我们已经使用PID控制算法基本完成了从高速启动-缓慢行驶-定点停车的全过程,但是由于时间关系我们调整好PID参数及V-Smap来让小车的停车点更为精确。 ? ?下图便是我们交上去的最终作品视频,可以看到视频中只有一个物体,因为我们无法实现跟踪及转向,就让小车直奔一个物体;没有抓到物体是因为没有时间来调节PID参数及V-Smap。
6.展望
? ?我们这次没有完成题目的指标,也没有在比赛中获奖,但是我们认真且努力地投入到了这场比赛当中,领会到了控制算法与机器学习的魅力,体会到了奋斗与坚持的艰难,也感受到了团队一起工作的快乐。这将是我们宝贵的经验与记忆,也是构成多彩人生的一点一滴。 ? ?最后我想说,以出世的精神做入世的事情,认真做事,成功与否且随他,只求内心安乐。
|