第十六届全国大学生智能汽车竞赛AI智能视觉组过程回顾

第十六届全国大学生智能汽车竞赛AI智能视觉组过程回顾

省赛前

从去年12月前开始第十六届全国大学生智能汽车竞赛比赛规则初稿,我从其中就对AI智能视觉组就情有独钟,可能对我本人来说这种带有任务型竞赛比较满足我对竞赛的渴望。但是,在享受任务有趣的同时,确实这项新的组别在一定程度上有一定的挑战性,对于我这种小白来说。
还没分组前,就已经开始着手尝试这个组别,在考完试之后就找同学借个星曈科技的openmv玩了一下,也先装了IDE,在哔哩哔哩看完视频完成各个功能,在此过程中,还是第一次觉得openmv的IDE还是有很好的人机交互编程,由于MicroPython是设计运行在微处理器上的,所以他在某些方面实现了精简以此来保障性能。同时在某些地方,MicroPython和普通Python解释器存在一些微小的差异,可以说是差不多的。
当然,AI视觉组就离开不了AI,其实AI之前也是接触过,但是没有很深入系统去学习,星瞳科技也只是直接提供成熟的模型,且只有MV4支持,当时没有就只能先看视频学习。
寒假回到家到二月份期间,是没在学习python的,反而重新学习起了C语言,把浙江大学翁恺老师的视频看完,确实只要把C语言这种面向过程编程学好才能在更好的程度上了解python,刚好电脑上虚拟机有Ubuntu操作系统,就想着直接在这系统上编程不就好,也刚好复习一下Linux操作指令,于是寒假那些天,每天在操作系统上面Ctrl+Alt+T然后gcc ~这些。最烦的是新的指令学了,之前就忘了,每次都是help去查看对应后面的选项, -b、-n这些等等。
开学之后,在某次浏览的时候发现可以利用EdgeImpulse在线网站自行训练神经网络进行分类识别(图1),符合我这次比赛的分类要求,且STM32H7的OpenMV机器视觉模组和云端AI平台Edge Impulse合作,就很好的打通了从数据收集、打标,NN模型训练、优化到部署的整个流程。在OpneMV那边你也只需采集你所要的数据集然后就可以在这个网站训练,一些input_shape、alpha、learning_rate、batch_szie等等这些都可以根据网络的效果进行修改,最后的accuracy、loss和各类的correct和incorrect都可以比较直观的显示出来(图2),图2是我自己当时随便采集一些数据集去训练哈哈。
买了龙邱openmv之后,就开始准备了,在使用过程中,发现其不能支持tensorflow框架,对于数字识别和动物水果识别模型的部署就遇到了困难,在之前一直怀疑是自己没找到正确的部署办法,直到在一篇推文发现明确说明,我才知道龙邱的openmv原来真的不可以,然后就换成了openmvart mini。因为比赛动物水果图片在赛道的两旁,且高度固定,所以我们搭建车模的时候就可以在车的两旁固定openmvart ,中间一开始的的数字识别本来是想用LeNet模型,这样子的龙邱的openmv也就可以用。在多次跑车到达三岔路口的时候通过openmv保存每一次的图片,通过多张图像阈值编辑将周围的噪声降到最近,尽可能在输入图片的时候只有数字因素,但是由于场地的不确定因素,大部分二值化图像还是存在很大噪声,所以预测出来的结果也是差强人意。既然这种做法不行,那就用NCC,但是由于必须和存入的图片作比较,运行慢且具有自身的局限性,主要它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。所以就直接放弃使用龙邱openmv,改用openmvart mini。那么这样子以来就三个,中间一个,旁边两个。真的是斥巨资打造。
在4、5和6月的时候,因为打球的时候不小心伤到膝盖,走路困难,所以那段时间在考研复习,暂时放在实验室手头的事情。期末考完试之后又开始实验室事情,对于边考研边做车,还是很急的。所以在过暑假之前就确定以后尽可能少看手机,把手机静音掉。自己曾经也一度每天5点起床然后复习,下午旁晚时候就去实验室搞,那段时间真的太累了。
AI方面,吴恩达视频看完之后还是对官方的例程上手挺快的,一开始用官网的数据集(没带紫边框)训练虽然高,但是还是数据集不够,(因为我以为比赛用的是随机找的图片)所以用爬虫爬取了一些,每一类都找到九百多张,训练出来的效果验证集的准确率大概百分之八十多,然后叫队友去网上找一些图片进行验证哈哈(图3)。最后从推文知道比赛用的图片是官网数据集里面的,所以舍弃自己搞了很久的数据集。一开始没有对数据集做处理(因为有点懒哈哈),我是一直在该网络的模型框架。一开始觉得例程给的CNN有点…(怎么说呢,模型有点单薄,不知道这种形容对不对嘻嘻),所以加多了几层卷积层和池化层,当然激活函数还是RELU函数,但是出来的效果还变差了,所以还是用来正规的网络模型。一开始想到了LeNet-5,因为想到手写数字识别是十分类问题,softmax为10,效果还是可以的(忘记截图),第二个是用了VGG-16,VGG16相比AlexNet的一个改进是采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(11x11,7x7,5x5)。对于给定的感受野(与输出有关的输入图片的局部大小),采用堆积的小卷积核是优于采用大的卷积核,因为多层非线性层可以增加网络深度来保证学习更复杂的模式,而且代价还比较小(参数更少)。其中为什么使用2个3x3卷积核可以来代替5*5卷积核,因为5x5卷积看做一个小的全连接网络在5x5区域滑动,我们可以先用一个3x3的卷积滤波器卷积,然后再用一个全连接层连接这个3x3卷积输出,这个全连接层我们也可以看做一个3x3卷积层。这样我们就可以用两个3x3卷积级联(叠加)起来代替一个 5x5卷积。这样子在我看来这次动物水果识别用这个最恰好不过了,但是VGG耗费更多计算资源且每次迭代一次耗费时间长,我认为其中原因来自全连接层,何况VGG有3个全连接层(13+3)。可是最后的最后,训练出来的结果还是不忍直视。损失率一直不下来。在最后的掂量中,还是在图片数据集进行了加强,我是把图片顺时针和逆时针左右旋转5°c,然后将所以图片进行亮度的增强,还有什么对比度的什么,最后出来的数据集快10G容量,训练的时候我把它过拟合,验证集准确率达到了百分之一百。然后就根据步骤,进行量化,确实神经网络模型最大的一个特点就是拥有宰相一样的肚量:宰相肚里能撑船,而神经网络模型的肚子里装满了权重。权重的多少往往直接反映出一个模型的复杂程度,而权重越大,模型的效果一般会更加好。但是所占的资源在MCU计算是不行的,训练后量化技术可以压缩,会损失一点精度,但是,会显著降低模型尺寸,同时提高运行效率。
openmv方面通过nncu转化工具部署模型,在每次得到预测的时候,我都是通过创建一个列表存储起来,通过多次识别存储多次结果,最后 maxlabel = max(number,key=number.count)这条函数将结果出现最多的作为本次结果,也相当于一个众数滤波。
终于到了比赛的时候,在比赛的前一天调试时间,因为去别的学校调试的时候没注意到亮度,在车到达第二个码的时候找不到图片的框,当时脑子嗡嗡的也不知道什么情况,出来发现可能是openmv获取的亮度问题,所以回来的时候赶紧熟悉一下openmv亮度的变化。那一晚也通宵搞了一下串口通讯问题。到了比赛的时候,上场就马上调了亮度,最后在最后一圈跑出了37秒多的成绩,当时的心也放下了。最后也是拿个省一。

国赛前

国赛的时候比赛规则也变,循迹和识别任务分开,这对我来说,数字动物水果码这些识别就必须在严谨起来,通过官网提供的软件,我是用之前的网络模型大概分类了采集的所有数据,一想到那晚从晚上10点采集到隔天的9点,真的是难受,再加上我膝盖不能一直保持一段时间,那天真的差点人没。但是还好,出来的预测还是很准的。之后我也根据思路设计了一个S、V分类器,根据不同类图片进行不同的网络模型预测。但是由于是openmv拍出来的图片且在电脑显示,整体的图片偏紫色,确实有点买家秀和卖家秀的区别(图4)。很难根据特征点去分类,,所以最后放弃了这个S、V分类器的使用。
确实这几天很累,现在比赛结束了,我也得全心投入考研中,之前那种太累了,这一篇我也是考研复习的时候突然想回忆写一下,记录一下嘻嘻。

在这里插入图片描述 图1 在这里插入图片描述 图2
在这里插入图片描述图3

在这里插入图片描述
在这里插入图片描述 图4

  • 13
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值