此文系第16届智能车智能视觉组-上海交通大学AuTop战队开源算法讲解第六部分--Openart识别方案,专栏及开源方案链接:

llo:第16届智能车智能视觉组-上海交通大学AuTop战队开源汇总

一.识别基本思路

智能视觉组赛题的识别要求包括三项,数字识别、Apriltag识别以及水果动物的分类,这三部分我们都基于官方建议的Openart mini进行实现。早期我们也尝试基于NXP Openmv来完成,其最大的问题是并不支持tf模型的部署与应用,相对而言不如Openart mini使用方便。

逐飞Openart_mini

龙邱Openmv

Openart上模型的部署常见的有两种思路:

  1. 是通过nncu工具将训练好的h5模型进行量化转化,详细步骤可参考nxp工程师Rocky Song的方案,在github上有详细开源记录。
  2. 另一方案是直接使用tensorflow将h5模型转化为tflite模型,并量化实现。早期电脑上测试的时候,我们发现tflite量化的模型反而在电脑上有着更慢的运行速度,可能是intel对浮点数的支持过于优秀的缘故。

经过对比测试,我们选用了第二种方案,其使用更加方便,量化效果较好,且时间上更优。

AuTop采用的基本思路框架为:

二.方案讲解

1.机械架构设计

AuTop机械设计

Openart mini需要使用舵机云台,我们采用了双S3010舵机构成两自由度结构的方案。底部舵机与底盘相连,并通过一个三层亚克力板旋转云台与上方p轴舵机进行连接。

这一结构的问题在于,S3010舵机的虚位严重,平时使用尚可,在激光打靶时可能会有一些偏差,且180°舵机的设计无法向后旋转,本计划进入国赛后更换性能更好的270°舵机,然而却没有了机会。

另外我们使用激光切割作出的三层亚克力板结构并不轻便,可能会造成小车重心前移,使用常规木质材料或者3D打印件会更加合适。

由于我们两个人对机械设计并不熟悉,云台架构并不是很合理。在比赛过程中也发现很多队伍有不错的设计思路,但绝大多数队伍是通过删去p轴舵机的方式,即只保留旋转自由度,也可以完成比赛任务。

2.数字识别

数字识别是赛题在三叉路口的要求,要求队伍根据数字的奇偶决定走左路或者右路,而不是像常规四轮那样随意选择道路。

根据逐飞提供的方案,基于Openart的find_rects()可以方便地找到数字矩形的边框,再使用一个十一分类模型即可快速对十个数字进行识别。这一方案的问题在于find_rects()函数本身对光照、背景、设定阈值等较为敏感,找寻方框会耗费大量的时间,甚至可能找不到对应的矩形,运动状况下也很难发现对应的矩形。

我们观看了多所学校的过三叉视频,发现他们的方案并未对逐飞的方案作出改变或创新。基本都是通过位置环或急刹停车后,尽可能保证静止状态下对三叉数字的识别。

AuTop采用的方案是,基于全局分类器的设计思想,识别到三叉后完全不需停车,且准确率极高。在识别到三叉路口后,取160×60的方框为ROI,使用训练好的分类模型直接对这一区域进行分类识别。模型的运行时间仅为100ms左右,即便以3m/s的速度也可以及时得到判断结果。经过测试,在直道紧接三叉路口的路况上,完全不用减速,在90°弯道接三叉的路况上,仅需微踩刹车也不需停车。

识别效果图

识别效果图

为了保证斜入时候也能达到,我们选取了较宽的ROI,早期使用96×60的ROI基本也是足够的,ROI上下区域的选取可根据不同车的实际情况进行微调。

识别效果动图

识别效果动图

为保证快速识别,我们在全程(为识别到Apriltag时),都将数字识别打开,总钻风识别到三叉后,直接查询最近的识别结果。这一方案的快速性,甚至会让人误会为未进行识别而随机选择道路行驶。识别动图如下所示:

3.Apriltag识别

Apriltag的识别,可直接根据Openart的find_apriltags()函数完成,很难有优化的空间。最大的问题在于Apriltag的帧率,20Fps左右的帧率使得高速高糊状态下很难识别,因而需要使用总钻风提前判断Apriltag(黑斑)的出现,提前降速等待识别。

使用总钻风对黑斑进行识别,我们使用的方案是,将透视变换后计算得到的中线反变换回原图,在10cm至70cm的距离内对中线点各取15×15(或更小)的区域,对每一区域分别计算黑色点占比及跳变点占比(方差理论来讲亦可),满足阈值即为Apriltag,此时降速并将Openart切为TAG_MODE,利用p轴舵机低头识别即可。

Apriltag平视

Apriltag低头

find_apriltags()这一函数在某些条件下会有奇怪误识别,因此更加完整的方案应在此后串接一个二分类模型保证识别结果的可靠性,亦可根据限定长宽比、选定ROI等方案减少误识别。上图是openart低头与抬头的识别效果,个人认为低头更加有利于识别,因而p轴舵机的存在还是有一定必要性的。

值得一提的是,由于逐飞提供的裁判系统的设计方案使得仅能在道路一侧放置靶牌,因而用超声或者TOF模块可以快速的对靶牌进行左右判断,而完全不需识别Apriltag,且这种判断方法不受到靶牌放置在Apriltag前后25cm规则的限制,可以较为方便而又快速的找到靶牌。个人认为这一方案并不符合视觉识别的初衷,因而认为是因裁判系统的硬件设计而造成的漏洞。

3.水果动物的识别

逐飞提供的水果动物的识别与数字识别类似,即找框加分类。这一方案改动空间并不大,我们最终也是采用了这一基本思路。

针对找矩形这一易扰因素,可以考虑提前根据一些因素对目标进行筛选,例如最小长宽、长宽比、指定ROI、矩形与外接矩形的角度偏差等等,这些思路都可以滤去大多的杂乱矩形,只留下需要分类的靶标,可以极快加速模型的运行。

识别效果图如下所示

水果识别

动物识别

此外,考虑到找框对识别与打靶的影响,我们也考虑过设计一个回归分类模型,即对指定ROI内存在的靶牌进行分类,同时回归得到靶牌中心。在PC端测试回归效果不错,由于时间原因,也未能尝试在Openart端的部署。

由于识别得到的中心是对Openart而言,得到的相对坐标。打靶作为激光与舵机的动作,需要知道art镜头坐标与旋转舵机转动角度的映射关系,因而我们需要对此进行标定(标定原理可参考:zhuanlan.zhihu.com/p/39)

棋盘标定图

棋盘标定图

棋盘标定图

基于标定结果,可以直接计算得到云台舵机需要转动的角度,实现一步到位的打靶。但由于S3010舵机的性能,实际使用精度有些许偏差,因而我们编写的逻辑是等待舵机云台转动至偏差角度小于一定误差时,才打开激光。

激光应调整至,打开激光,取牌子远近放置观察激光点,无论多远都恰好打在靶牌中央(15cm)最佳。

由于S3010舵机虚位严重,建议更换舵机或将光斑点调至最大,以保证打靶的准确无误。

三.模型训练

归根到底,以上三种识别任务除了Apriltag的识别外,都需要分类模型的训练。

比赛官方提供了赛场上可能会出现的图片,因而我们只需要对这些图片进行数据增强与扩充即可。

同时为了提高标志识别模型的泛化能力,需要对图像集进行数据增强。数据增强能够通过预处理图像,产生更多的图像来补充训练集,从而增强模型的鲁棒性。常用的数据增强方法有翻转、旋转、缩放、移位、高斯模糊、椒盐噪声、运动模糊以及对比度和亮度的随机改变等。

三叉模型的训练已在另外一篇文章中介绍:

llo:第16届智能车智能视觉组-上海交通大学AuTop战队开源算法讲解(七)三岔数字识别

四.总结与吐槽

针对识别任务,我们有足够的自信,三叉识别有着绝对的优势,动物植物分类与打靶也绝不会弱于那几所学校,而这也是我们最初以为智能视觉组应该最为强调最为关注的部分。想要让更多的队伍完成智能视觉比赛,应该是通过加长比赛时间(例如三十分钟)、增加发车机会的方式,而不是像华东赛区这样,为了保证所谓的完赛率,完全不更换靶标,将智能视觉组变写死三叉转向、第一个Tag黑斑直接冲过、第二个黑斑停留3s的比赛模式。智能视觉组,不应当是面向赛道编程的四轮。让120s完赛的四轮队伍进入智能视觉组的决赛,或许只会让认认真真做了识别任务而没有在三次机会中完赛的队伍心寒。

最后,希望AuTop的Openart识别方案、源码以及模型,可以为一些同学提供帮助,无法参加国赛,能看到自己的模型方案在赛场上使用,也算一种安慰吧。


SJTU-AuTop完整开源方案链接,如果觉得我们的方案和代码对您有帮助,请在github上帮忙点个star吧:)

llo:第16届智能车智能视觉组-上海交通大学AuTop战队开源汇总