【日常】第十五届智能车百度AI组初赛&&复赛摸鱼记

居然一直存在草稿箱里忘记发。。。已经第十六届了。。。趁着还没复赛先发出来
感觉今年比去年坑了不少。。。


5.20 ~ 6.17 初赛

大概是4月末的时候,当时ROS室外光电的通知迟迟没有下来。原本我也是一直在等ROS组的通知,直到金哥跟我说可以去看看创意组新加的一个跟深度学习有关的组别,虽然在此之前除了高中时学的一点神经网络算法之外,几乎没怎么接触过有关深度学习相关的内容,但一方面ROS组迟迟没有消息,另一方面这个组别的内容确实对我具有相当的吸引力。正是在一种对未知的兴奋的刺激下,我决定尝试踏足这一我所从未领略过的全新的世界——深度学习与计算机视觉的世界。
这个组别主要是百度和钢铁侠科技赞助,钢铁侠提供车模,百度提供训练平台——aistudio,采用的也是百度的深度学习框架——飞桨(Paddlepaddle)。这次比赛尤其是初赛的大部分工作都是在百度的ai studio上完成的。
做一个在此之前几乎没有接触过的东西,第一步当然是要去找相关的文档和教程,我前期的学习准备主要九四依靠的百度官方的说明文档和ai studio上的公开课,一方面要学飞桨的api,另一方面还要补深度学习相关的基础知识。当然比赛已经迫在眉睫,因此对于深度学习这种内容覆盖面极为广泛的知识来说就必须要针对比赛内容去学,而初赛两个赛题分别使“人流密度检测”和“红绿灯识别”,因此主要以学习卷积神经网络基础与目标检测算法为主:

5.7之后正式开始接触到赛题。红绿灯检测主要用的PaddleDetection的yolov3_mobilenet模型,而人流密度检测则主要参考的夜雨大佬的博客里的CrowdNet模型以及github上的开源项目,使用迁移学习的方式进行

比赛过程中遇到的一些所要做的主要问题:

  1. 模型的选择
    用了是PaddleDetection中yolov3-mobilenet模型来做红绿灯检测,mobilenet的特点就是体积小,所以训练和推理速度都很快,也就比较节省时间。
    人流密度用的密度图估计的方法,通过提取原图像特征信息,参考夜雨大佬的项目利用CrowdNet进行深层卷积网络与浅层卷积网络两个网络的融合得到一个更加优的结果,最后采用插值的方式得到密度估计图从而算得人流密度。

  2. 数据集的格式
    官方给出的数据集是VOC格式的,当然也可以通过改变数据输入来让coco数据集格式的模型支持VOC

  3. 训练的调整
    VisualDL确实很好用,试了好几种不同的初始学习率,换了几种loss函数以及优化器,但初赛时间比较短就没有深入去调

由于初赛的时候水平实在不够,加之平台当时bug不断,导致最终成绩不甚理想,最终人流密度成绩在150名,目标检测在100名
(侥幸地由于是承办校所以得以进入复赛*1


7.8 ~ 8.3 复赛

怀念c楼504的调车时光(然而c504已经无了

复赛相对于初赛来说实际上个人感觉难度是有所下降的
(因为能够接触到实体车,更加便于调试。
两个项目——车道线识别和交通标志检测都是在官方所给出的项目代码的基础之上进行的优化,并对每种标志物所对应动作进行控制代码的设计。
大部分工作集中于数据集制作以及运动控制代码的实现上。许多大佬都对底层进行了改进,但是介于担心底层修改之后万一车动不了的担忧(真有这种情况发生,因此我就没有对小车底层进行修改,在比赛结束之后才开始的对adurino和底层代码的学习。

主要流程就是数据采集、数据处理、上传之后用云端项目训练模型,同时使用VisualDL对训练过程进行可视化分析,分析模型的拟合度、验证集的预测情况以及损失函数的下降情况以便及时修正训练代码的各种参数,避免不必要的时间浪费、下载模型之后部署模型到小车上进行验证
车道线的数据在采集的时候尽量让每次采集的数据保持一致,数据量也不应该过多或者过少,这样做可以让数据做到过拟合的也不至于“过”拟合,导致小车的鲁棒性变低。

在车道线模型的实际测试中,发现赛道识别率有时不高,因此对模型训练以及自动驾驶程序中车道线的HSV阈值进行了重新调整,使之更加贴合实际光线条件下的色彩情况。

#获取HSV
import cv2
import numpy as np
from matplotlib import pyplot as plt
image=cv2.imread('path of image file')
HSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
def getpos(event,x,y,flags,param):
    if event==cv2.EVENT_LBUTTONDOWN:
        print(HSV[y,x])
cv2.imshow("HSV",HSV)
cv2.imshow('img',image)
cv2.setMouseCallback("HSV",getpos)
cv2.waitKey(0)

标志物的数据则尽量往多了采扩大数据规模,采集多种角度、多种距离的标志物图像,提高数据集的规模,使训练出来的目标检测模型鲁棒性更强。
由于小车核心芯片性能实在有限,即使采用了tiny版的yolov3,模型在车上的效果也相当一般,整体准确度只能达到70%左右,同时图像处理速度过低,摄像头帧数过低等等不利因素也导致了交通标志检测的效果不甚理想。我们自定义了一个函数,实现准确度在某个范围内的时候进行标志物判断,同时对标志物进行延迟检测,尽量让检测与动作执行同步。

根据现在dalao们po出的报告,新的思路包括像对官方程序的优化,除去无用的函数,遥控程序修改一下save_img让每次跑的时候图片编号连起来(我是用的手动修改,麻烦一点),底层输出加一个pid控制让输出更加顺滑,多用小角度转向,跑完之后再用自动驾驶跑圈拍摄车道线进行优化,标志物用opencv做一个半自动标注程序、模型用余弦衰减学习率代替恒定学习率等等。
复赛对算法理解的要求比起之前要更加严格了,倒也不难,就是有些dalao的idea是真的想不到,可能是做的东西还比较少的原因。
同时在参数设置方面也过于保守导致最后小车跑的过慢了,最终复赛成绩49,没能进入前40十分可惜。本来觉得能复赛拿个国三保底就很满足了,但很幸运的是由于是承办校所以又得以进入决赛*2,有机会去南京观摩dalao们的表演.

决赛

在这里插入图片描述

决赛的思路基本建立在复赛总结的基础上

1.模拟行驶部分
基于复赛的基本框架,增加了超车、坡道、避障等环节,难度也是增加了许多。
首先,我们将速度提高到了最高的1600。因为在更高速度下,智能车图像与转角采集更加流畅,转角数据中无用的直行数据更少,小车转弯时模型输出的角度信息更加稳定,之后还重新调整了交通标志数据集,增加了新加标志的标签信息与标注信息以求匹配新的赛道。
在模型训练方面则优化了模型的训练参数,包括学习率衰减由定值衰减改为余弦衰减和分段衰减等等。
为停车线、到车入库、超车标志等标志物增加了对应的新的运动控制代码,因为车速较快,所以在复赛的基础上为小车增加了根据检测时间以及利用检测框坐标信息计算标志物距小车距离来综合判断交通标志,但是由于电机控制参数没有进行调整所以执行情况并不理想,主要在于未能做到检测控制的完全闭环,鲁棒性较差,小车运动运动情况受环境影响比较大。
避障,由于实在是调不出来了,于是决定让小车识别第一个障碍避开之后直接走直线进入s弯道,避免因为避障而导致的其他行驶问题。

2.人车跟随
人车跟随采取了手持标志物,利用目标检测生成标志物的检测框,再利用检测框中心坐标与摄像头坐标的差值,并通过图像上坐标距离与智能车实际行驶路径的对应关系进行缩放,处理成小车转弯信息发送给下位机实现小车转向,同时车载摄像头持续扫描检测标志物位置,当检测框中心与摄像头中心的差值稳定在一个较小的范围内时转向完成。


最后因为各种原因,小车很可惜没能在南京跑完第一个项目,人车跟随的速度设置则较为保守,因此用时1分钟,只能说还算可以。最终拿到国二,也实属意料之外的惊喜。
感谢南信大决定举办创意组的全国决赛(南信大的饭真好吃qwq),也感谢一起努力的同学、师哥们,希望在这次比赛的基础上能够明确今后的努力方向,做好基础知识的积累与学习,来年更进一步。

Guess you like

Origin blog.csdn.net/weixin_45441838/article/details/107847385