本文贡献:
1:CLRNet说明高级语意和低级语意对车道线检测都很重要,提出一个跨层细化网络结构。
2:为了解决无视觉的问题,提出了ROIGather模块以捕获更多的全局上下文信息。
3:定义了Line IOU损失,将车道作为一个整体进行回归并显著提高了性能。
网络结构:
从结构图中可以看出,输入一张图像,经过主干网络resnet进行特征提取,然后resnet的后三个stage输出的图片送到FPN中进行特征融合,分别为L0、L1、L2。然后进行特征细化,也就是将特征图L0和先验P0送到Head中,在Head中会有ROIGather模块进行特征的细化。细化完的P和下一层的L,再送到Head中,以此类推。每一个Head都会输出结果,然后有损失函数进行约束。
每个先验都由四部分组成:1、前景和背景概率。2、车道线的长度。3、车道线的起点坐标和与x轴之间的夹角。4、N个偏移量,即预测与其gt之间的水平距离。这个Lane prior是可学习的,也就是x,y,三个参数。
只要起始点和夹角确定,Lane prior就确定了。初始的Lane prior是192个,左右各1/8,中间3/4.左右每个起始点设置两种夹角,中间起始点设置四种夹角。由192个三维向量,生成192个78维向量。
1、首先P0+L0送到Head中,在Head中有ROIgather模块进行ROI特征和全局特征的学习,丰富上下文信息。最后可以得到新的x,y,。由这三个参数可以生成192个78维向量,然后进行车道线预测,通过Loss模块进行监督。
2、上面的x,y,三个参数和72个点组成新的Lane prior,记为P1(refined P0)。P1和L1送到Head中,重复上面的工作,学习新的参数,进行车道线预测,然后通过Loss监督。
3、P2+L2特征继续送到Head中进行学习,并通过Loss进行监督。推理时,这个结果就是最终的预测。
对于clr_head理解
首先初始化先验,x,y,。然后对192个3维向量初始化(左,中,右)。然后从编码中生成先验和初始先验特征图。在forward中,会先获得先验和初始先验特征图(好像就是一个索引)。然后将特征图batch_features和先验特征图送到pool_prior_features中得到真正的先验特征图。接下来会进行roi_gather等操作。
ROIgather介绍
首先用ROIAlign取每个anchor的36个采样点的特征(作者用grid_sample实现),然后送到roi_gather中,首先对roi特征进行一次卷积,然后进行拼接,又进行一次卷积核全连接,得到
C*1的Xp表达。然后对特征图进行resize和flatten,并将Xf和Xp做注意力权重的计算,获得更丰富的上下文信息。q是卷积处理的Xp,k,v为卷积处理的Xf。计算完权重,经过softmax层,并累成。最后加上Xp。
调试过程中遇到的问题:
创建虚拟环境
conda create -n clrnet python=3.8 -y
激活虚拟环境
conda activate clrnet
安装cudatoolkit=11.3
conda install pytorch torchvision cudatoolkit=11.3 -c pytorch
切换到clrnet项目下
进行requiremennts.txt安装
pip install --user -r requirements.txt -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
安装 :
这是错的
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=10.2 -c pytorch
进行安装
python setup.py build develop
建立数据库软连接
ln -s /home/xiaoxing/GANet/datasets/culane data/CULane
执行命令
python main.py configs/clrnet/clr_resnet18_culane.py --gpus 0
报错:意思是cudnn不能加速
自己尝试解决:conda install cudnn=7.6.5
打开配置文件:
sudo gedit ~/.bashrc
最后加上两句话,建立动态软连接
export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
保存配置文件
source ~/.bashrc
删除之前的软链接
sudo rm -rf /usr/local/cuda
建立新链接
sudo ln -s /usr/local/cuda-11.3 /usr/local/cuda
解除一个文件的权限
sudo chmod -R 777 /usr/local(文件路径)
修改文件权限
r 读 w 写 x 可执行
sudo chmod a+rwx /usr/local/cuda-11.3/include/cudnn.h (文件地址,要修改的地方)
sudo chmod a+rwx /usr/local/cuda-11.3/lib64/libcudnn* (文件地址,要修改的地方)
主要是把cudnn文件中的include 和 lib64 中的文件复制到cuda 11.3中对应的include 和 lib64中
cuda 11.3 放在usr/local/文件中
删除 虚拟环境clrnet
conda remove -n 需要删除的环境名 --all
conda remove -n clrnet --all
设置延时,否则会自动断调
conda config --set remote_read_timeout_secs 2000.0
删除之前的软链接
sudo rm -rf /usr/local/cuda
建立新链接
sudo ln -s /usr/local/cuda-11.3 /usr/local/cuda
解除一个文件的权限
sudo chmod -R 777 /usr/local(文件路径)
修改文件权限
r 读 w 写 x 可执行
sudo chmod a+rwx /usr/local/cuda-11.3/include/cudnn.h (文件地址,要修改的地方)
sudo chmod a+rwx /usr/local/cuda-11.3/lib64/libcudnn* (文件地址,要修改的地方)
主要是把cudnn文件中的include 和 lib64 中的文件复制到cuda 11.3中对应的include 和 lib64中
cuda 11.3 放在usr/local/文件中
删除 虚拟环境clrnet
conda remove -n 需要删除的环境名 --all
conda remove -n clrnet --all
设置延时,否则会自动断调
conda config --set remote_read_timeout_secs 2000.0
最后安装的环境是
cuda 11.3.1 cudnn 8.2.0 pytorch 1.11+cu113 等等