LaneATT调试笔记
代码地址为 https://github.com/lucastabelini/LaneATThttps://github.com/lucastabelini/LaneATT
首先说这个Label,因为input肯定是一张图片,这个毫无疑问,这个Label的构建主要是在LaneDataset中,该类首先构建一个dataset,比如我这里是TuSimple,其数据集的Label是车道线的坐标点,不过是十行(像素)取一个x点的坐标,所以lane就是x点坐标,而h_samples就是y的坐标,主要也就是一个json文件,这部分还好理解
然后这个lane不是直接传进去训练的,会把lane再处理成label,核心是lane_dataset中的transform_annotation函数,其会调用sample_lane来把lane处理成label,
这个label中是不包含y坐标的,只有x坐标,y坐标是通过一个超参数S=72计算出来的,也就是大概整个画面会横切为72份,然后对应的x的坐标,就是label,这一部分也不难理解,
但是会产生一个问题,是不是每条线都有72个x坐标?答案是否定的,因为画面的上方,其实就是驾驶员的远方,是天空,天空这部分画面肯定是没有车道线的,所以也就没有x坐标,
那上面部分缺失,近处部分就是完整的呢?答案也是否定的,因为画面的左侧或右侧,紧邻的还能看见,但左侧车道的左侧车道线,可能就切割了,右侧车道的右侧车道线也一样,所以,y的起点也未必是画面的最下方,那么在label中如何体现车道线是否完整呢?
函数sample_lane中,是把近处的车道线补全了,
extrap = np.polyfit(two_closest_points[:, 1], two_closest_points[:, 0], deg=1)
利用已知坐标点,拟合出了未知坐标点,那这部分坐标点,其实是在画面外,但这部分坐标点也作为了label的一部分进行训练,所以label中x坐标的起点,是画面的最下方,尽管其中包含了超出画面部分的x,然后label中会记录下来有几个点在画面外,以此为开始就是真实的车道线label
lanes[lane_idx, 2] = len(xs_outside_image) / self.n_strips
搞懂了label,那就回过头来看model
model就是class LaneATT,backbone是resnet34,然后,forward中,x的shape为[8, 3, 360, 640],当然8是batchsize,后面是图片尺寸,
feature_extractor之后的batch_features的shape是[8, 512, 12, 20],就是压缩了32倍,后面又跟了一个conv,变为了[8, 64, 12, 20],
下面先停一下,看一下anchor,这里当然主要是anchor点,他是依次沿画面左侧,再依次遍历left_angles的角度,所得出的点的坐标,那么,我们可以想象,得出的坐标点,是有可能在画面外的;同样的,也沿画面右侧,遍历right_angles的角度,也得出一堆anchor,再遍历画面底部,遍历bottom_angles的角度,再得出一堆anchor,
这样得出的anchor有一大堆,left_anchors有[432, 77],right_anchors有[432, 77],bottom_anchors有[1920, 77],最后cat一起有,[2784, 77],当然这里面有大量的点是离谱了,比如从左上角向左划一条线,这个就没太大意义,所以这里面会有一个mask, anchors_freq_path就是'data/tusimple_anchors_freq.pt',这个文件是工程中自带的,应该是统计出来的,各个line的有效性的次数,然后用该mask来提取出有效性最高的topk_anchors根线,也就是1000根线,最终self.anchors的尺寸为[1000, 77],
而self.anchors_cut,我没看出来与self.anchors的区别,目前感觉就是切的stride不一样,anchors是切72刀,而 anchors_cut 是切10刀,
下面是计算切片索引,也就是cut_xs,cut_ys,cut_zs,cut_zs就比较简单,就是0-63重复了11编,再重复一千遍,就是64*11*1000个数,cut_ys也比较简单,就是0-10重复64 * 1000 遍,总共也就是 11 * 64 * 1000 个数, cut_xs 是吧 anchors_cut 中的数据 [1000, 11] 重复了64遍
然后回到上面, 用 cut_xs,cut_ys,cut_zs 来采样 [8, 64, 12, 20] 的 feature, 得到 batch_anchor_features 的 shape 为 [8, 1000, 64, 11, 1], 然后进行了一下维度变换,变为了 [8000, 704], 后面经过一个 attention,注意力机制,生成 attention_features,[8, 1000, 704],batch_anchor_features也resize回[8000, 704],cat一下变成[8000, 1408],
把1408送到1408*2的全连接层,进行分类,得到 cls_logits [8000, 2],然后reshape为 [8, 1000, 2]
把1408送到1408*73的全连接层,进行分类,得到 reg [8000, 73],然后reshape为 [8, 1000, 73]
然后构建 reg_proposals,把 self.anchors, cls_logits, reg都合并到一块去,
最后送到nms去,不过这个nms会调用cpp的代码的nms,所以暂未debug,
后面计算损失,中间一大部分应该是匹配正负样本的,看的有点迷糊,总之,最后会匹配到一些正样本和负样本,损失大概分为两部分,一部分是坐标部分,另一部分是二分类部分,坐标部分的损失是l1 loss,就是差值的绝对值,求和,二分类用的是focal_loss
最后,分类损失会乘以一个系数10,和坐标部分的loss相加,得到总的损失,
LaneATT调试笔记相关推荐
- 调试笔记--jlink 变量转实时波形小技巧
调试笔记–jlink 变量转实时波形小技巧 上篇讲了jlink RTT组件在RAM中开辟一段内存,将printf字符串存入然后通过jlink调试接口读取RAM,将printf字符串在jlink-RTT ...
- 调试笔记--keil 测量周期小技巧
调试笔记–keil 测量周期小技巧 本文参考安富莱专题教程第7期 http://www.armbbs.cn/forum.php?mod=viewthread&tid=87176&ext ...
- 调试笔记--keil 断点调试小技巧
调试笔记–keil 断点调试小技巧 给变量打断点 调试不熟悉的项目时,卧槽!怎么这么多全局变量?这玩意又在那修改了??这个时候会给变量打断点就能省好多事. 将要监视的全局变量添加到watch窗口 选中 ...
- gpio驱动广播Android,[RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED【转】
Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92 由于板子没有lcd无法得知sd卡升级是否完成,因此使用LED显示. Recovery中升级完成后控 ...
- keil4怎么移植其他人的程序_【调试笔记】韦东山:在100ask_imx6ull上移植使用六轴传感器ICM20608...
之前发了LCD调试笔记,大家很感兴趣,所以这次再来一篇:六轴传感器ICM20608驱动移植笔记,大家还需要什么移植笔记?可以留言.我们尽量满足. 1.1 移植思路 先找到驱动:也许内核里已经有,也许需 ...
- RK3399 GT1X触摸屏驱动调试笔记
硬件环境 1.Firefly AIO-3399(AI)开发版: 2.恒智的5寸电容触摸屏800X480,I2C驱动支持GT5688. 操作系统 Android 7.2 for rockship Ste ...
- Rockchip基于RK3566/RK3568 WiFi AP6256调试笔记
1.开发平台 CPU:RK3566 编译环境:Ubuntu18.04 内核版本:kernel 4.19 2.目的 因为RK3566/RK3568支持SDIO3.0并且向下兼有SDIO2.0接口,由于核 ...
- 雅马哈四轴机器人调试笔记
雅马哈四轴机器人调试笔记 1.0 先简单说下硬件,如下图对着插就行,雅马哈四轴主要硬件有控制器跟机械手,机械手到控制器主要有4跟电机接口电缆,每2个轴有一个编码器接口电缆,每根轴有一个配置的数据备份电 ...
- OMAP3530-mini调试笔记(2)
PS:USB不能正常工作的根本原因参见调试笔记(3) 各个版本的x-loader和u-boot对kernel的支持情况: U-Boot 2011.12-00010-ga3eb89c (Jan 29 2 ...
最新文章
- android5.0后新特性修改标题头,Android5.0中Material Design的新特性
- python的类写法_Python3 类静态数据的写法
- 生成器表达式 内置函数
- php 屏蔽deprecated,新人求教PHP高手,Deprecated?
- Redis(案例六:ZSet数据)
- catalog java,Java Connection getCatalog()方法与示例
- android放在上个元素的左边代码,控件悬浮在某个控件之上 Android五大布局方式——相对布局(RelativeLayout)属性详解...
- 一文搞定Linux环境下线程编程,这些东西老师也不会教你。(史上最详细的线程攻略)
- 为什么道理都懂,课执行力差的现象如此普遍?
- 中文编码之GB2312,Big5,GBK简介
- 测试计划和测试方案的本质区别
- 【CS231n】A Few Useful Things to Know about Machine Learning全文翻译
- 学习线性代数-行列式 笔记(一)
- php获取视频信息,支持优酷土豆新浪腾讯等多家网站
- modelsim和vivado仿真不一致——噩梦debug
- Android手机令牌教程
- 【通讯原理】Ch.1:通讯原理导论
- rds proxy 数据库代理 简介
- SWI-Prolog特性
- Android 基础:Materia Design 定义视图阴影elevation和创建卡片CardView