本周工作
第三周继续探索相关的车道线识别的网络,上一周的对于RESA的探索中,当把模型跑通时,发现该模型的时间也并不足够快,在3090显卡上1280*720的图片帧率为50帧左右,这将在Jeston的板子上会很慢,因此我还需要进一步探索更快的车道线检测办法来实现实时检索。 再不断翻阅论文的过程,我发现Ultra-fast-lane-detection这篇论文的思想和前面复现的几个模型不太相同,在论文他所提到了它的推理速度达到了300+fps。因此我便展开了对于Ultra-fast-lane-detection模型的尝试,将该模型进行了复现和相关的测试。
模型介绍:
加快推理预测的主要原理
之前的车道线分割的网络模型是多是根据逐个像素进行预测是否属于车道线,这样极大的减慢了推理的速度。直观上来车道线的预测不需要每个像素的预测。该模型便推出了一种新的车道线定义,它将车道线检测定义在寻找车道线在某些行上的集合,即基于行方向上的位置选择和分类问题。 如上图所示,该模型针对分出的每一行h上的列维度w上进行车道线位置的选择,h 和w是可以远小于原图像的H,W的,这样推理的速度便会极大的提升。就如下图所示: 它相比于全像素的分割,计算的量级极大的减少。根据我对论文的阅读,它的推理过程是提取h*w的特征图,对于每一行的预测过程是输出w+1的特征,和上图相同,直观上来讲就是越有可能属于车道线的cell的颜色越深。
全局感受野
车道线的识别不应该单纯只是单像素的分割识别,而是应该各个像素之间要有所关联,也就是感受野的大小,当车道线有所破损时,感受野的作用便凸显出来了。 该模型是一般的基于全连接层的分类,它所使用的特征是全局特征。这样就直接解决了感受野的问题,对于我们的方法,在检测某一行的车道线位置时,感受野就是全图大小,因此他对于遮挡和损坏的车道线的推测效果更好。 其主要关于全连接的代码如图所示
self.cls = torch.nn.Sequential(
torch.nn.Linear(1800, 2048),
torch.nn.ReLU(),
torch.nn.Linear(2048, self.total_dim),
)
Loss定义
除了有了水平行方向上直接的位置信息,该模型还使用这些信息来加入车道线的先验约束——平滑性和刚性。
该模型将相邻行上分类的L1范数定义为平滑性,希望车道线位置在相邻行上是相近且平滑变化的。 关于该损失的定义代码如下:
class ParsingRelationLoss(nn.Module):
def __init__(self):
super(ParsingRelationLoss, self).__init__()
def forward(self,logits):
n,c,h,w = logits.shape
loss_all = []
for i in range(0,h-1):
loss_all.append(logits[:,:,i,:] - logits[:,:,i+1,:])
#loss0 : n,c,w
loss = torch.cat(loss_all)
return torch.nn.functional.smooth_l1_loss(loss,torch.zeros_like(loss))
将相邻行间的二阶差分定义为车道线的形状。由于车道线大多是直线,因此其二阶差分为0,所以约束其二阶差分与0的差异可以在优化过程中使得预测出的车道线更直。 该Loss的代码如下所示:
class OhemCELoss(nn.Module):
def __init__(self, thresh, n_min, ignore_lb=255, *args, **kwargs):
super(OhemCELoss, self).__init__()
self.thresh = -torch.log(torch.tensor(thresh, dtype=torch.float)).cuda()
self.n_min = n_min
self.ignore_lb = ignore_lb
self.criteria = nn.CrossEntropyLoss(ignore_index=ignore_lb, reduction='none')
def forward(self, logits, labels):
N, C, H, W = logits.size()
loss = self.criteria(logits, labels).view(-1)
loss, _ = torch.sort(loss, descending=True)
if loss[self.n_min] > self.thresh:
loss = loss[loss>self.thresh]
else:
loss = loss[:self.n_min]
return torch.mean(loss)
优化目标的定义,尤其是平滑性和刚性的定义是其他的先前网络不具有的,而这些特性恰好是车道线具有的特性。下一周我准备对于该模型进行相关的训练和测试。并不断调优。
|