10天干智能车(心路历程:虽然没成功,但也学到了很多)

Posted 「已注销」

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10天干智能车(心路历程:虽然没成功,但也学到了很多)相关的知识,希望对你有一定的参考价值。

前言

时间还剩下10天,我们的时间很短,我们不得不改变策略策略,我们将跑的过程交给了电控,我的任务主要就是去负责识别图片加上给一些电控辅助的信息。然后我们现在要去做的主要是目标检测,目标检测我就感觉自己不是很会,然后的话,现在我要去做的问题就是目标检测的话用官方的数据集能不能行,其实的话我发现官方也是在开源项目的基础上进行改进的,我们现在也是不能造轮子,也得找开源的呀,然后我们去看一下那个项目,学一下。

ai stido持久化安装

有时候我们在解压完数据集后会发现再次启动环境的时候,那些解压的没有了,这时我们只要在开头加几行代码就可以去解决这个问题。
!mkdir /home/aistudio/external-libraries
!pip install beautifulsoup4 -t /home/aistudio/external-libraries

import sys
sys.path.append('/home/aistudio/external-libraries')

车道巡航数据集采集

其实这个程序很简单的但是有个小坑,这里记录一下,就是在以前我打开摄像头,然后读入视频就完事了,但这样是不对的,就是我们应该在每次用完之后
要去释放掉我们的摄像头,否则的话就是报错,因为没有去释放嘛所以再一次调用的话就不能了。

解决的方法就是:将这个摄像头的调用写成了一个函数,这个函数包括开启和关闭。
不要用过程化去写
    def take_photo(self,i):
        cap = cv2.VideoCapture(-1)
        ret, frame = cap.read() # cao.read()返回两个值,第一个存储一个bool值,表示拍摄成功与否。第二个是当前截取的图片帧。
        cv2.imwrite(".jpg".format(i), frame) # 写入图片
        sleep(0.2)
        cap.release() # 释放

消除光线影响

对于视觉来说,光线的影响太大了,就好比我上一次的工训比赛,换个环境就识别不上,那么我们要怎么去除光线的影响呢?我们都知道如果这个地方做好了,
那么在代码方面的处理就大大减少了。

主要有两个方面:光线强和光线弱。我们现在要解决的是光线强的问题。

RGB归一化算法:

rgb归一化其实思路就是重新计算rgb各通道的值然后计算r=r/r+b+g,b=b/r+g+b,
g=1-r-b。然后我们现在用代码实现一下看看效果:


这个效果…不白给嘛,于是在尝试各种方法后,我发现了:

HSV

其实以前有一个学长也跟我说过就是用hsv对光线的影响会比rgb要小很多,当时我并没有太在意,今天尝试了一下确实好不少!


可以看出在部分路道效果是真的好,但是对于一些其他的地方有一些不足,我下一
步还得继续尝试。然后这里我有一个顾虑,就是跑模型已经很占时间了,我在加一
个转hsv的是不是要用个几秒呀,那不就完了嘛。

于是我开始了测试:
#python 的标准库手册推荐在任何情况下尽量使用time.clock().
#只计算了程序运行CPU的时间,返回值是浮点数
import time
start =time.clock()
#中间写上代码块
end = time.clock()
print('Running time: %s Seconds'%(end-start))

说明hsv是完全可以的!

分歧+最终方案确定

今天是真正备赛的第一天,我们争吵了很多,最终也是确定了方案,但是也是不知
道最后的方案如何,但是这个方案确实是可行的,但是这里面也有几个难点,其实
我并不担心翔哥那边,但是就是我得一直给他心理暗示,鼓励他,然后我担心我这
边会拖后腿,为什么这么说呢,因为我对深度学习训练可以说是真正意义上的第一
次,	我并不知道会怎么样,主要是两个模型,一个是巡航的,那么这里我就担心我
加了阈值化会不会影响我的训练呢,其实我加阈值化是为了应对现场的情况,所以
现在的话也要考虑到这种情况,这种方案是必须的呀,因为现场的环境肯定和我们
学校的有区别,所以加这些预处理是必须的,然后就是行不行试了才知道。明天必
需把这个试一下,然后的话,一会目标检测的就训练完了,我要去部署看一下效果,
不行的话,我就要去拍数据集了,感觉有点搞。最重要的是巡航啊,做好就有希望。

心态崩了呀

我服了,我能有训练了n回那个目标检测任务的了,但是没有一回好使的,我服了,
时间太长了,再加上网不好,其实我的方案的话可以不这么训练,那么这样的话我,
就应该自己去拿自己的数据集训练,不能这样呀,然后我也去感受一下目标检测的
魅力。

到场地上去试一下

现在我到了我们的场地,我们的是自己打印的,所以我必须知道怎么可以去取到很
好的阈值,然后去应用到比赛现场,其实现在问题也有很多,比如我现在还没有上
摄像头去尝试,然后我也没有和翔哥那边遥控到底效果怎么样,但是这一切的基础
都是建立我能识别很好出来的,其实我感觉最理想的就是说,我能在本地上去跑程
序,然后就把那些参数直接改到板子上,其实调的参就是阈值,可以更好地反应道
路的情况,这个完全是可以在本地上跑的。

然后的话我使用本地跑就很简单了因为我可以将照片显示出来呀,然后我也是在网
上找了一个用滑动条来动态得到hsv值的,使用后效果还不错,



我觉得这个效果不错吧,换一张图片再看看效果,最后调完我发现效果有点差强人
意,总感觉得加点什么,其实这里应该再加一个算法,之后就完美了,其实现场调
的话也是这么调,那感觉数据集真的得多采点,还有一个问题就是得挂载u盘,怎
么弄呢,这都得试,就这两个问题,先解决如何克服反光的问题。

反光问题先这样啊,我先去弄一下挂载u盘

挂载u盘

其实挂载u盘很简单的,就是几个linux的命令,第一步是获取权限
sudo -i
然后的话插上盘后,去查看一下路径:
fdisk -l
这里如果你发现有个内存和你u盘差不多大的,就先把u盘拔下来,然后就知道了。
这个是找那个device那个,就是下面那个然后先建一个文件夹在/mnt这个目录下
mkdir /mnt/usb_disk
然后下一步就是将我们的u盘挂载到这里来:
mount  /dev/sda1   /mnt/usb_disk 
在使用完之后不要忘了去卸载我们的u盘
umount /mnt/usb_disk

挂载u盘的问题也搞定了,下一步就是去用多线程去写数据采集的程序了。

多线程编写巡航数据采集

学多线程强推莫凡学python,在b站上有!

关于巡航的一些想法

就是我们为什么不能直接拿官方的呢,其实思路是一样的,我将官方的数据集用图像处理一下,不也可以得到转速吗?话不多说,试一下,思路就是先将官方的数据集都进行处理用hsv转成二值化图像,然后进行训练,之后进行部署,然后看看结果。

然后不得用到对目录文件的操作,我老是记不住呀,记住了,又忘了,这玩意真的,
不用就忘呀,百度吧!

新的问题

现在我得到了图像的二值化的图片,看着效果还可以,但是问题来了,以前我接触到的图片都是rgb的,但是这些图片是二值化的呀,这我咋训练呀,有点懵,这就有我受的了呀!

我们的任务属于一个回归的问题,官方的模型我也不知道好不好使,不过我们都知
道手写数字识别是用的二值化的图像,我觉得我可以去取波经。

手写数字识别用的也是二值化的图像,其实我的弱项是我不太清楚数据的输入和输出,其实我的
对于模型的理解还好,但是涉及到数据的我就有点蒙了、其实第一步就是去定义数据读取,但是
他这个是用的官方给的接口,但是官方得源码可以看到吗,还有就是回归问题用那个分类问题行
吗?最后就是如果都不行怎么自己去设计模型呀?这些都是问题呀,我现在有点蒙。

我们现在的目的是什么,我得用目的去反推呀,我得目的就是用二值化去训练,做回归任务,然
后返回一个值,这就是我要去完成的,那么我怎么去实现呢,我有什么?我有二值化的数据,并
且这里数据的输入是啥呀?去看下官方的源码,去看下输入数据?在这之前我得知道回归是用啥
模型去做的,他和分类有什么区别呀?经过了解后发现就是对于回归来说是为了预测值,而分类
是预测标签,但是的话,他俩的网络结构有什么区别或者网络结构怎么构成的呢?二值化的网络
结构肯定和rgb的不一样呀,那我们咋整呢?其实我还担心一个问题就是到时候二值化后的差别
会不一样,但是我想呀,按理说二值化后训练应该比rgb简单才对呀,不管了试试才知道。

开始解决问题

我们先看一下这个手写数字识别的网络结构,这里事太多了,但是如果我真正能去实现上来,我
得水平应该直接就上去了,还有就是刘老师也说最重要的就是网络结构的部分其他的不太重要的
说明我可以用这个模型嘛,但是得自己去写数据的读取呀。

然后我看了一个预处理现将车道线转换的例子,就是先将车道的图像进行透视变换,然后计算得
到想要的数据,那么这里我们就得先学习一下透视变换,感觉网上资料好少啊,我们多进行一下
尝试。透视变换没弄明白,但是这里我发现了一个直方图均值化的函数来提高对比度,最后发现
效果真的不错,那现在第一步去直接取阈值,看看效果,然后第二步是去调节对比度,但是就是
有个问题呀,不用仿射变换似乎不能确定在那个地方断开呀,这样的话我的我不知道去哪个点呀
但是也是有方法就是从第一个点从上往下遍历,但是有个问题,未知因素太多了,最好还是能像
,直线还好说可以直接补,那拐弯的咋弄呢,这也是个问题,

解决方案一:

我们现在的话就是将摄像头的摆放位置进行了改进,不再倾斜的摆放,而是通过将摄
像头与地面平行这样,效果确实好了不少。

然后在这个基础上我加了个线性变换,发现结果好上不少。

最后看一下二值化的效果。

总体还是可以的了,这次应该不用在考虑那个问题了,但是在现场也得调呀,有两
个需要调的东西,一个线性参数,一个是阈值,那么我们先进行下一步,去写一个
算法就是可以得到左右的东西,但是这种拐弯怎么得到呢,这个程序写完,翔哥那
边完事就可以上车调了。

这个地方真的是最难的地方了,这个地方弄不好,后面就都没了,我本来还合计跑
深度学习,但是现在好像不行了,但是目标检测一定要跑深度学习,这个就先这样
,翔哥说必须要得到中心点,那么我就给他得到好了,现在想到如果出现断的话可
以用霍夫变换补上,但是还有就是网上都说用曲率那有什么用呢,

断线问题及其解决

我在开摄像头识别的时候经常出现下面这种情况··断线问题:

之后对图像进行了高斯平滑和边缘检测,现在去试试效果

图像相同尺寸

然后就是一切都是基于开始的识别上,所以那个得好好弄,然后还有就是这里有个
东西要注意就是在开始的时候要先将图片变成640X640的,这样在遍历的时候才不
会有错误

两次线性变换

下场地试了下又出现问题了,昨天调的非常好呀,为什么现在我这出问题了呢,我
这边的时间没有多少了,因为现在翔哥那边要上车了,我这边得快点,但是这个是
什么问题呢?

我是用了2次线性变换解决的这个问题,我也不知道为什么用了两次效果会好那么
多,一次是在高斯滤波后,一次是在转为hsv后,用了两次效果是真的好。

解决相机进程的问题

这个板子不能在程序结束的时候自动释放进程,因为我是用的一个死循环,所以
我只能在终端来强制关闭,但是当再次执行这个程序的时候就发现了一个事,不
能再次打开相机,这时我在群里询问了一下,有个人很热心得告诉我了,很感谢

我们这里主要是通过结束进程的方式来解决这个问题的!
#先查看现在的进程
ps -a

#然后通过PID来杀死进程,这个PID是根据上面的命令得到的,然后会改变
kill -9 PID

新的问题:电机走了

我们在解决上面问题后,加了开机自启,然后就是发现效果还不错,但是在一刻,
我们还没有高兴几分钟,突然间就读不到值了,我们后来通过查看,发现是电机
的编码器没了,然后我们听了一个人的话,打算用开环试试,因为编码器读不到
值,我们不能闭环,于是我们就用开环跑了,当然要是开环跑就只能交给命运了
我们发现开环跑肯定是不行的,于是我们向官方申请了板子打算换个新的,但是
从上海邮来顺丰最快都得1天多,本来都没有时间,然后看到也有很多弃赛的,当
时我们也很慌,这一天我们啥也没干因为我们后期还有很多事没干呀,但是现在
也干不了呀,后来我们索性今天放天假,我们去吃烧烤去了,然后这两个和我都
挺好的,我就合计都和我干这么多天了,都挺不容易的,于是我最后选择请客。

既然现在干不了啥,我只好现在选择去干目标检测

目标检测任务

这里我们先就对侧面任务进行识别,也就是对那三个图案进行识别,这个其实不一
定非得用目标检测,但是我也是没有使用过,这次就想去尝试一下吧。

我不打算用官方的实例了,因为我发现那个程序给我限制死了,我不能有自己的想
法了,我打算使用paddle的套件了,我先去了解一下。其实对于新手来说最好的方
法就是去看视频,当对一些有了解后就可以选择去看博客啥的快速掌握例子等,我
先找了一个百度快车道的一个关于paddledetection的讲解,那么现在开始

然后感觉他们做的好棒啊,很贴心,在网站首页列上了ai stdio的链接,这也让我可
以去很好地学习,然后第一个是快速上手嘛,因为我以前玩过paddleseg所以感觉接
受的还是很快的,然后看完第一个后就有一个很深刻的认识了,然后下一步是怎么
做数据集的,然后我去看一下。

数据集制作

弄数据集弄得我头大,弄了要2点了,我其实也没有弄多少数据,我大约一张照片弄
了100多张吧,先看看效果,训练一下,效果不好我在加,然后现在就是我用labelme
标注完了,已经得到了很多的json文件,然后我要将这些文件转换成coco和voc的,我
这里选择使用coco的,具体的转换方法可以去paddledection的gitee的官网上面有:


然后现在我也是得到了数据集(这也是我第一次做目标检测的数据集,以前做过分类的,然后分割的也是不会做。)

PaddleDection使用

问题:不会读取自己的数据集

现在我的数据集可以了(没有试效果),但是在使paddle
dection的时候发现了问题,什么问题呢?就是现在我不知
道怎么去读取到我的数据集,照着几个文章改了配置文件,
但是一运行就报错。

开始解决问题

要想解决这个问题我们就必须先了解一下配置文件:首先我
们运行的yml文件是一个集成的文件,是有依赖的,就是几个
底层的文件,这里我借助一个实例了解一下

比如说yolov3_mobilenet_v3_large_ssld_270e_voc.yml
  '_base_/optimizer_270e.yml',主要说明了学习率和优化器的配置,以及设置epochs。在其他的训练的配置中,学习率和优化器是放在了一个新的配置文件中。

  '../datasets/voc.yml'主要说明了训练数据和验证数据的路径,包括数据格式(coco、voc等)

  '_base_/yolov3_reader.yml', 主要说明了读取后的预处理操作,比如 resize、数据增强等等

  '_base_/yolov3_mobilenet_v3_large.yml',主要说明模型、和主干网络的情况说明。

  '../runtime.yml',主要说明了公共的运行状态,比如说是否使用GPU、迭代轮数等等
大体上就是在runtime上填写GPU使用和训练轮数,在Voc.yml中配置读取的数据
集的路径,然后这个reader.yml是进行预处理的不是数据集读取,这个是我一直
都理解错的,然后的optimizer_270e.yml是进行学习率和优化器的调节!

使用心得

研究了很长时间也是基本上把整个流程跑了一遍,然后我说下我的心得吧

首先我们要准备自己的数据集,我用的是coco格式的,可以先用labelme标注,
然后用paddledection来转成coco的数据,然后就是先找到一个模型,在config
里面,然后看这个模型的base就是可以去找到它的配置文件,有的是在这个文
件夹,还有一些是单独分出来一个个文件,在runtime是规定训练的轮数和规定
gpu,在cocodection里设定好数据集,这里要设置test的要不后面会报错然后
就是训练的时候可以恢复训练,可以看下面这个链接
https://aistudio.baidu.com/aistudio/projectdetail/2187184?forkThirdPart=1

训练的问题:

现在我训练了130轮,但是最后推理了一下,发现在框上什么也没有,一会加一下
阈值看下效果。现在训练去。

现在训练到loss为7点多就降不下去了,我在看看,要是下不去想点招。

哎,现在到了6点多了最好就是到6.4,然后我也去改学习率,改epoch为100,但是
效果都不是很理想,还是来回上下,也不是说一直下降呀。现在连6.6都到不了了,
哎,就偶尔能就有几回6.6,这咋弄呀,是数据集不够吗?

还是不正常,为什么训练不是会反复上下波动而且,loss降不下去,我必须想点
招呀,怎么去降loss和影响loss的因素是什么呢?

然后我对batch_size进行了更改,还有就是调到了学习率,然后训练了562论,终
于突破到了4点多,继续加油!

经过几次尝试现在是能到3.8左右,但是就卡在这个地方了,不下降了,这可咋办。
实在将不下去了然后就去看看效果,真的可以识别出来了,但是敦煌就识别不出来,
其他两个还好。


但是敦煌就识别不出来,所以我得继续训练呀,降到2点多再来试试效果!

这次死活降不下去,应该不是参数的问题了,看看还有什么影响因素吧!

电机到了,新的问题

电机到了,然后我也去试着跑一下,我发现是可以过全部的弯的,但是有个地方不
太后,我就合计该点代码,后来发现效果更不好了,然后我就想把代码该回去了,
后来就出现了新的问题:

相机不稳定。
这个不稳定,怎么给我的感觉就好像,每次刷新就是重新采集的时候,有一点偏差
那是相机的问题了,怎么解决呢?是帧率的问题吗,不像呀,是曝光的问题吗,不
到呀,但是可以去试试看。不过估计也应该不行,因为我以前也改过,确实是,我
用本机跑程序的时候都是,抖得厉害,那么我就开摄像头会抖吗?

这个问题我纠结的时候,板子开不开机了,后来试了很长时间也没好使,最后我重
新弄了一下系统。最后好使了,但是时间可能来不及了。

结束

这次的智能车可能就这样结束了,然后的话我们最后也是没去上上海,更多的话我就不说了吧,然后。。。。。。。。。。。。。

以上是关于10天干智能车(心路历程:虽然没成功,但也学到了很多)的主要内容,如果未能解决你的问题,请参考以下文章

如何让测试更全面:一个菜鸟的心路历程

外贸新手获取订单的心路历程

十载寒冰,难凉热血——2020CSDN年度博客之星Top10心路历程

心路历程

涂鸦智能选型 TiKV 的心路历程

人工智能一张图看懂华为云EI的年度心路历程