西电"智能星"第一届自动驾驶小车比赛 参赛记录 暨 JetRacer 使用心得

由于一些神秘原因, 我参加了这个比赛. 最后又由于自己的神秘操作, 痛失冠军. 当时挺自责的, 后来想想这和考试粗心错了题是一个道理, 粗心就是能力不足, 真正有实力的人是不会忽略各种细节的, 我还是能力不够, 再接再厉吧.

大二好像马上也要搞了, 而且这东西好像会一直搞下去? 不懂, 我搞的时候资料很少, 基本上是自己一步一步摸索出来的. 最后决定写一下记录, 栽个树😁.

陈克凡凭一己之力组装好了小车烧好了环境, 抱大腿.

当时是说给数据来着, 结果啥也不给, 不知道主办方在干什么. 然后就只能自己去训练了. 一开始是搞小赛道, 就和车一起来的那个, 第一次训练的效果还不错, 可能是队友做的数据集比较优秀, 后面我自己一通分析猛如虎, 想重新采集更好的数据, 然后拉到不行.

大赛道铺好后的那天晚上, 我抱着车就去了活动室, 成功赶走了正在打数模的一男一女, 然后一顿采集加训练, 忙活到零点, 刚训练完, 车没电了. 还好保存了下来.

后来花了大概一个小时在自己电脑上搭建好了小车训练所需环境 —— 我有 2060 我用你的垃圾GPU干什么? 2060 快了一万倍好吧, 原来在小车上跑 1h, 现在在电脑上只需要 10min.

之后一直去活动室训练的, 用了那天晚上的模型, 效果还行, 但是拐弯处还是压线, 调参半天也不行, 就想着重新采集数据, 但几次结果都不如晚上的那个好.

后来我一通分析猛如虎, 在自己电脑上年写了一个数据集制作的代码, 用当晚的图片重新标记, 并且做了翻转增强. 再去赛道上一跑, 好像没什么区别, 搞了个寂寞.

(本来想放GIF的, 实在太大, 我又压缩不来, 还是算了吧)

后来我们的车摄像头撞坏了, 然后借到了张嘉伟, 蒋之铭, 李傲队的, 某天晚上借车去训练, 张佬"出于人道主义精神"在一旁帮我(队友有课), 最后张佬一语点醒梦中人: “你 FPS 设的多少?”

原来是FPS太高了, 导致处理滞后. 调成 30 后立马起飞, 感谢张佬 ○| ̄|_

(本来想放GIF的, 实在太大, 我又压缩不来, 还是算了吧)

后来也给了标志物的照片, 贼少, 还不全, 给了个寂寞. 用给的数据熟悉了一下 yolov5 的数据制作和训练.

之后去活动室, 本来是想采进阶赛道和标志物的数据来着, 但是其他队伍在搞基础赛道. 索性先把我的基础赛道的算法进行一些调参工作, 最好结果是杀进了10s, 9.97s. 认识了一堆人工智能院的大佬, 和大佬们一起瞎搞很欢乐. 中途去偷窥其他队伍的训练成果, 也很欢乐.

后来某天晚上采了进阶赛道的数据, 发现不太行, 又重新采了一点, 还是不太行. 一通分析猛如虎, 感觉应该标记以水平中线与赛道白线交点. 然后在电脑上重新标记, 最后结果相当好.

后来和张嘉伟以及张庭嘉他们队一起采了标志物的数据, 让队友标记了一个小时(自己跑去打ACM校赛网络赛了, 我就是巨屑队员😁), 后来试着跑 yolov5, 在自己电脑用 CPU(10-i7) 上一张图片要 200ms, 小车上虽然有个GPU但是还不如我的 CPU. 跑了几次都不行, FPS 调到很低照样跑不下来. 他们说可以用 TensorRT 优化, 但是我没搞起来.

于是回去换了 NanoDet, 在小车上一张只需 60-80ms. FPS 调到5-8之间, 勉强能跑. 我觉得不太行, 于是想用 TensorRT 优化, 搞了半个下午加一个晚上, 最后以英伟达没开发在 Windows 上的 Python 接口而告终. 第二天拿小车尝试, 结果根本找不到模型加载在哪. 反正就失败了, 想着就这样吧我 NanoDet 不行别人 yolo 更不行了.

之后和从其他队那里嫖来了解决方法: 目标检测每隔几帧进行一次. 离比赛不远了, 一边在肝技术文档. 队友太给力了🌹, 扯了一堆摘要简介出来, 技术报告大概用了合计一整天, 最后呈现出来效果我觉得特别好.

最后一天晚上, 我去偷窥敌方训练成果, 并且最后调试进阶赛道, 成功用我的精准识别快速行驶劝退了一支刚开始的队伍😖.

期间, 张庭嘉和张嘉伟两个队用 yolov5 也跑得很好, 秦春霞学姐还在把 yolov5 搬到小车上, 张培博发现图像分类没搞背景不行. 所有人都在积极努力地备战.

EOD的时候加了几个大佬的好友, 要到了漂亮学姐的QQ😊(学姐真的好好看啊awsl).

QAQ又不是我跑我紧张个什么劲

我们是最后跑, 基础赛道第一轮先看了其他队伍的成绩, 最好的也在15s以上, 我觉得稳了. 可能是环境有点影响, 11s, 压线一次, 最后成绩 12s. 第二次轮张佬积极调参, 速度确实提高了, 但是还是没进 15s (发动技能嘲讽). 所有队伍第二轮跑完后, 还是没有人进 15s. 之前压线一次可能是运气问题, 想着再来一次应该不会压吧. 没想到, 压了 4 次, 最后成绩 16s, 离谱, 环境影响有这么大的吗? 后来结果出来, 第二轮速度居然还是第一? 极速奖到手.

我是拿usb连的小车, 进阶赛道本来调好了参数, 跑得也又快又好, 然后 Jupyter Lab 在拔了线前忘记保存了, 再去正式跑的时候就没跑成. 第二次调参也没调好, 结果就无了, 红绿灯识别慢了, 识别到了, 但是没停住, 又往前走了, 看不到红灯结果又加速了… 评分标准太离谱了, 直接扣了 150 分. 然后就彻底无了. 刘焕宇, 张嘉伟, 张庭嘉, 陈克凡跑了下来, 学姐没跑, 张培博图像分类失效, 但跑了, 然后得了个精神文明奖.

然后我就自闭了……

裁判统计分数的时候我去瞟了几眼, 我们技术文档是最高分, 44/50. 基础赛道第一 100, 进阶赛道 -150 (心痛暴击). 最后统计排名的时候听到裁判质疑我们队的排名低了? 啊啊啊啊啊, 我的问题, 要是保存了绝对是冠军呜呜呜, 别骂了别骂了我爬还不行吗😭.

什么叫演队友对手甚至裁判一波

最后第五, 拿了个优胜奖和极速奖, 爬了爬了, 垃圾 Sublime 失去焦点自动保存的功能让我养成了不按 Ctrl + S 的优良习惯🙂🙂🙂

结果
结果
颁奖
颁奖
我的奖状
我的奖状
fmx的奖状
fmx的奖状

来张兵兵放公众号上的照片:

罪魁祸首兵兵
罪魁祸首兵兵

再来张张炀杰偷拍照片:

罪魁祸首张炀杰
罪魁祸首张炀杰

最后奖品还有两本书: 吴军的《浪潮之巅》, 据说挺好看?

浪潮之巅
浪潮之巅

说起来我天天说不垫底就是胜利, 但是我从小就比较好强, 对事很上心, 甚至有点过头了, 导致一点小问题就责怪自己, 一点小挫折就抑郁自闭. 也许是我对自己要求太高了吧. 初中自招没看见多选哭了好久, 高中生物学不来哭了好久, NOIP看不出背包哭了好久, 省选二等没资格哭了好久, 跳高赛前准备不足得了倒一也哭, 追不来妹子也哭…

可能是我对自己的期望或者要求过高了吧, 明明没有这个本事, 可总是潜意识认为我能行, 自信一点没啥坏处, 但为什么总不能如愿以偿? 父亲总是说我已经很能干了, 省二已经很不错了, 考上西电也很不错, 但始终我无法接受.

仔细想想, 不能把任何东西都看得很重. 自招失利, 但最后还是在领军班; 生物学不来最后还不是有几次名列前茅; NOIP成绩根本不影响我进校队拿牌; 跳高更无足轻重, 追妹子…… emm, 先放一放吧别再颓废下去了.

小车的结果其实也没什么, 就像胡艳玎后来在空间里评论说的: 现场谁最nb明眼人心里都有数. 人工智障本身变数就巨大, 只跑两次的结果并不能代表什么. 最重要的是搞小车的整个过程, 虽然说学会调API不算学会什么, 但是认识了很多朋友, 一起瞎搞, 开心就完事了. 更重要的是加到漂亮学姐好友就算成功! 而且冠军奖品是台灯, 已经有了; 亚军奖品是体脂秤, 我不需要; 季军奖品是水杯, 太没诚意了; 倒是急速奖奖品是无线鼠标, 正好缺一个 (但是小付上个月刚买了个一模一样的hhh). 缺什么拿什么, 这还不好吗?

既然上帝不让我拿冠军, 那一定有他的理由, 我只要做好自己, 提高自己就行了.

生活不断拿你开玩笑
可你还得报之以微笑

环境不是我搭的我不会.

一般来说, 按照官网教程 quick start 没有问题. 主要写一下自己使用过程中遇到的问题及解决方法, 还有一些相关的技巧, 可能会比较杂乱无章, 请结合实际问题食用.

  • 记得保存!记得保存!记得保存!记得保存!记得保存!记得保存!记得保存!记得保存!记得保存!记得保存!

  • 小车在用 wifi 控制的时候可以接手柄, 这样万一小车出轨可以马上拉手刹(后退键), 避免小车撞坏.

  • Jupiter 代码块不需要跑完, 看具体需要什么跑什么, 比如转换好模型后, 前面几块其实可以不用跑. (这么简单的道理但是我看到好多队伍在跑的时候还是直接从头跑到底)

  • 数据采集记得不仅仅采集沿着白线走的, 否则稍微偏一点点可能就出去了. 我是采了沿白线, 压内外黄线, 甚至完全出界的数据, 效果很好, 甚至车完全跑偏也能回来 (当时训练其他队都惊呆了, 其他队基本上收集的数据是沿白线, 可能这是我跑的比他们好的原因之一).

  • 循迹的模型一次推理大概在 30ms 左右, 所以 FPS 调到 30 能够获得最好效果.

  • 调参的时候, 除了设置已经给的常数 STEERING_GAINSTEERING_BIAS 外, 再自己设置 car.steering_bias 以及 car.steering_gain 可以获得更好的效果, car.steering_gainSTEERING_BIAS 设置的好的话, 可以让小车左右偏转没有什么差别, 也就是说正反跑绕圈的效果应该没差别 (除去模型问题); 而 car.steering_gainSTEERING_GAIN 设置好的话可以在过弯的时候达到更好的效果 (其他队没有设置这些东西, 只在调STEERING_GAINSTEERING_BIAS, 可能这是我跑的比他们好的原因之一).

  • 模型还有一个返回值 y 没有用到, 可能可以拿来当油门的预测参数, 我尝试过, 但是由于惯性, 在进弯的时候虽然油门的值确实减了, 但是减速效果不是很明显, 所以直道加速但是进弯速度仍然过高, 容易压线, 可能在弯道处刹一下车会更好, 我没试验, 理论上是可行的. 在官网 GitHub 下有几个 branch 在找一个关于 y 的函数, 返回油门的值, 他们搞了好几个, 但可能效果都不怎么样, 被注释掉了.

  • 关于摄像头占用问题, 微雪官方给出的教程是重启服务, 但他没说之前需要关闭一下实例化了摄像头类的任务进程, 注意一下, 小心别被摄像头逼疯. 我有一个暴力而又优美的方法: 插上 usb, 然后车上的按钮拨一下 off 再拨回 on. 最好再重启一下任务进程. 我猜是因为 usb 给操作系统供电, 而开关关了就把摄像头什么的给关了, 实现了物理层面重启服务😁.

  • 小车训练很耗电, 注意低电量时别训练, 不然白等几小时. 可以用有 NVIDIA 显卡的计算机或笔记本跑, 注意先搭 CUDA 环境, 否则你在用 CPU 训练. 然后把需要的 jetracer 装好(去 GitHub 下载然后本地安装), 然后安装 jupyter notebook, (别用 jupyter lab, 由于版本原因 ipywidgets 会显示不出来, 具体表现为打印字符串), 启动 jupyter, 把 interactive_regression.ipynb 中摄像头相关代码去掉, 把数据放在 road_following_A/apex (默认目录, 也可以修改一下代码放到其他地方)下, 就可以开始训练了.

  • 训练注意次数不要太低, 否则效果不好, 不用担心过拟合, 根本没遇到这种问题(其他队伍说怕过拟合只训练了几十次, 我训练了 500+ 来着).

  • 训练的时候有个选项是随机水平翻转. 我认为效果不怎么样, 我直接手动翻转所有图片, 然后把这个选项取消了.

  • 如果采集的循迹数据训练出来的效果不行, 可以把图片拷到电脑上重新标记, 不需要用小车重新采集(当然想增加数据还是得要的), 重新标记好来也能达到很好的效果.

  • 标记可以用水平中线和赛道白线的交点当做目标点, 这样做在进阶赛道上效果非常好, 普通赛道因为已经搞好了没有尝试, 理论上来说应该也很好. 但是这样会失去 y 这个信息, 如果需要使用 y 的话就还是别用这个方法了.

  • NanoDet 目标识别在 25fps, 每 10 帧做一次检测能跑得又快又稳(前提是别忘记保存调好的参数别忘记保存调好的参数别忘记保存调好的参数)

虽然是最高分, 但我们真的是瞎扯的, 完全不知道写啥, 只能说队友比较会扯.

emmm, 如果真的需要的话在下面评论或者给我发邮件.

微雪官方的 wiki

GitHub JetRacer 注意有好多个 branch, 都可以看看

hygradme 的关于 JetRacer 的博客

GitHub NanoDet

GitHub NanoDet-PyTorch 后来发现他只是把 NanoDet 官方仓库下的 demo 拷了一下并写了点额外的东西, 参考价值不是很大

GitHub nanodet_cigar 写了怎么训练模型

很高兴你看我扯皮看到了这里. 由于能力问题, 技术部分的东西肯定写的不全面(有些我觉得是小问题就没写了), 甚至也许你根本看不懂我在说什么(语文没学好, 见谅). 如果有任何问题欢迎在下方评论, 我会尽力帮忙. XDU 都是一家人, 可以伸手要代码或技术文档之类的(技术文档别抄太猛因为评委已经看过我们的了). 跑的效果由于 gif 太大没放上来, 如果感兴趣我可以给视频. 哦如果大佬会 TensorRT 能不能教教我qwq?

如果你正在准备这个比赛, 祝取得好成绩!