车道线分割项目记录-模型构建
目录
一、模型概述
二、BackBone构建
三、语义分割分支
四、实例分割分支
五、代码汇总
一、模型概述
整个模型有一个backbone,以及两个分支,输入图片之后,先进入backbone,这一部分是两个分支共用参数,输出给两个分支,上面的图的彩色部分,是实例分割的分支,黑白部分,是语义分割的分支。将二者结合,通过聚类损失函数,进行反向传播,从而完成训练。
二、BackBone构建
可以使用的backbone有很多,这里我使用了resnet50,对网络修改一下就可以。
先看看resnet的forward部分,输入一张图之后,每一步得到的是怎样的输出,比如我输入的图是(B, 3, 360, 640),使用调试模式,进入模型forward部分,一步一步看输出形状。
之后我选出来八倍下采样之后的结果(B, 512, 45, 80),再写一个8倍上采样部分,结果(B, 8, 360,640)作为输出,给到两个分支。注意通道数的调整。(这里又扩大了一下通道数,目的是使用膨胀卷积,增加一下感受野,之后再一步步减小通道数,最后进行上采样。)
注意:这里我是直接进入torchvision里面,复制出来了resnet,并且直接删去了模型forward中的后半部分,因此才可以直接使用resnet输出的结果。
def __init__(self, embed_dim):super(LaneNet, self).__init__()self.embedding_dim = embed_dimself.backbone = resnet50(pretrained=True)self.upsample8x = nn.Sequential(# 进行一次膨胀卷积,增加感受野,之后再一步步降下来,最后再上采样。nn.Conv2d(512,1024,3, padding=4,dilation=4,bias=False),nn.BatchNorm2d(1024),nn.ReLU(),nn.Conv2d(1024, 256, 3, padding=1, bias=False),nn.BatchNorm2d(256),nn.ReLU(),nn.Conv2d(256, 64, 3, padding=1, bias=False),nn.BatchNorm2d(64),nn.ReLU(),nn.Conv2d(64, 8, 3, padding=1, bias=False),nn.BatchNorm2d(8),nn.ReLU(),nn.Upsample(scale_factor=8, align_corners=True,mode='bilinear'))
三、语义分割分支
语义分割所需要的输出,是(B, 2, 360, 640),其中第二个维度的2,可以认为一个是用来判定车道线的,一个是用来判定背景的。这样的话,根据输入的形状,写一个专属分支即可,这里从backbone过来的时候是(B, 8, 360,640),就通过卷积+BN等层,生成目标形状即可。
self.seg = nn.Sequential(nn.Conv2d(8,8,1),nn.BatchNorm2d(8),nn.ReLU(),nn.Conv2d(8,2,1))
四、实例分割分支
这部分的目的,是对每一个像素点,给出一个embedding,比如我设定embedding的维度是4,那么,这部分的输出,就应该是(B, 4, 360, 640)。
这里embedding的意思,就是使用一个4维向量,来表示每一个像素点。为什么要用embedding呢?
假如我不用embedding,输出就是(B, 360, 640),也就是说,每一张图,都有360*640个像素点,每一个像素点有不同的值,代表不同的颜色,比如0是黑色等等。
但是,这里的实例分割,是要区别出每条车道线的。我们虽然从图中一眼就看出来了,车道线那一部分的像素点,那一坨就是一根线啊,但是电脑看不出来,它只知道那些点是像素点,并且有一个像素值而已。
因此我们要使用不同的方式,来表示这个点,并且能通过计算距离,得到两个点之间的相似度。假如一个点的像素是200,另一个的像素是201,他们不一定属于同一条车道线。但假如第一个点的向量表示是[2,2,3,3,4],另一个点的向量表示是[2,2,3,3,4.1],那这俩就很相似了,就可以认为他们是属于同一条车道线了。
因此,我们对每一个点,都进行一个embedding,就可以计算每个点与每个点之间的相似度,进一步也可以计算一条线和另一条线的相似度。有了这样一种方法,就可以计算损失了。具体的损失计算,另一篇文章记录。
self.embedding = nn.Sequential(nn.Conv2d(8,8,1),nn.BatchNorm2d(8),nn.ReLU(),nn.Conv2d(8,self.embedding_dim,1))
五、代码汇总
import torch
import torch.nn as nn
from resnet import resnet50
import torch.nn.functional as Fclass LaneNet(nn.Module):def __init__(self, embed_dim):super(LaneNet, self).__init__()self.embedding_dim = embed_dimself.backbone = resnet50(pretrained=True)self.upsample8x = nn.Sequential(# 进行一次膨胀卷积,增加感受野,之后再一步步降下来,最后再上采样。nn.Conv2d(512,1024,3, padding=4,dilation=4,bias=False),nn.BatchNorm2d(1024),nn.ReLU(),nn.Conv2d(1024, 256, 3, padding=1, bias=False),nn.BatchNorm2d(256),nn.ReLU(),nn.Conv2d(256, 64, 3, padding=1, bias=False),nn.BatchNorm2d(64),nn.ReLU(),nn.Conv2d(64, 8, 3, padding=1, bias=False),nn.BatchNorm2d(8),nn.ReLU(),nn.Upsample(scale_factor=8, align_corners=True,mode='bilinear'))self.embedding = nn.Sequential(nn.Conv2d(8,8,1),nn.BatchNorm2d(8),nn.ReLU(),nn.Conv2d(8,self.embedding_dim,1))self.seg = nn.Sequential(nn.Conv2d(8,8,1),nn.BatchNorm2d(8),nn.ReLU(),nn.Conv2d(8,2,1))self.seg_loss = nn.CrossEntropyLoss()def forward(self,inputs):# 通过Backbone之后的输出是(B,512,45,80),是8倍降采样之后的结果。x = self.backbone(inputs)# 上采样这里是先膨胀卷积一次,后慢慢降下来通道数,再一个8倍双线性插值上采样。out = self.upsample8x(x)# 去实例分割的那条路,embedding成4维的(B,4,360,640)embedding = self.embedding(out)# 去语义分割的那条路,变成2通道的,一个预测背景,一个预测车道线(B,2,360,640)seg = self.seg(out)return [embedding, seg]
车道线分割项目记录-模型构建相关推荐
- 车道线分割项目记录-tusimple数据集处理
一.数据集包含信息 该项目训练所使用的数据集是tusimple数据集,其中用于训练及验证的有约3500张图,测试的有2000多张图.数据集中,除了图片,还包含了json文件,携带了车道线信息.文件路径 ...
- 读了那么多CV论文,竟然连车道线分割都实现不了!
你如果想要进入AI的计算机视觉领域,那么,你一定逃不过的就是语义分割了,要想进入像高德.腾讯.百度等这样的公司,车道线检测.车道线分割等知识你是一定要学的. 我们知道,现代汽车融合了越来越多的驾驶辅助 ...
- 实战教程 | 车道线检测项目实战,霍夫变换 新方法 Spatial CNN
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 此文按照这样的逻辑进行撰写.分享机器学习.计算机视觉的基础知识,接着我们以一个实际的项目,带领大家自己 ...
- 【深度学习】实战教程 | 车道线检测项目实战,霍夫变换 新方法 Spatial CNN
此文按照这样的逻辑进行撰写.分享机器学习.计算机视觉的基础知识,接着我们以一个实际的项目,带领大家自己动手实践.最后,分享更多学习资料.进阶项目实战,这部分属于我CSDN上的专栏,最后会按照顺序给出相 ...
- 助力自动驾驶:行车检测和车道线分割
助力自动驾驶:行车检测和车道线分割 一.项目简介 项目背景: 该项目着眼于基于视觉深度学习的自动驾驶场景,旨在对车载摄像头采集的视频数据进行道路场景解析,为自动驾驶提供一种解决思路.利用轻量级检测模型 ...
- PaddleX助力无人驾驶:基于YOLOv3的车辆检测和车道线分割实战
[飞桨开发者说]梁瑛平,北京理工大学徐特立学院本科二年级,人工智能开发爱好者. 项目简介 无人驾驶汽车利用传感器技术.信号处理技术.通讯技术和计算机技术等,通过集成视觉.激光雷达.超声传感器.微波雷达 ...
- 基于OpenCV的实时车道线分割&车道保持系统(源码&教程)
1.研究背景 汽车主动安全系统能够实现风险的主动预防和规避,其能有力缓解当前我国汽车交通事故频发的困境,故对其的相关研究得到了国家的大力支持. 车道保持辅助系统(LKAS,Lane Keeping A ...
- 2020-10-06 车道线检测项目及相关学习经验
车道线检测项目的本质是一个边缘检测的算法的延伸. 在汽车正常行驶过程中,车道线往往出于车体视野的中心对称位置,其位置相对固定. 下图展示了一个该场景,随着车辆的移动,车道线基本处于该黑色虚线所包围的区 ...
- 详解车道线检测数据集和模型 VIL-100: A New Dataset and A Baseline Model for Video Instance Lane Detection
本文介绍一个新的车道线数据集 VIL-100 和检测模型 MMA-Net,论文已收录于 ICCV2021,重点是理解本文提出的 LGMA 模块,用于聚合局部和全局记忆特征. 论文链接:https:// ...
最新文章
- 如何卸载iPhone模拟器中的自己创建的程序
- 并查集(压缩路径+按秩排序)
- 绝对路径VS相对路径
- 开发中常用的19 条 MySQL 优化技巧
- springboot 整合druid
- REVERSE-PRACTICE-BUUCTF-7
- 如何删除虚拟机上的操作系统、删除新建的虚拟机
- 大数据时代 银行信息安全如何防护?
- Using TFS2010 Build 提示:Silverlight 4 SDK is not installed解决方法
- MongoDB学习(黑马教程)-4-数据库MongoDB的更新(修改)文档操作
- 如何用WGDI进行共线性分析(下)
- LeetCode之报数(简单 模拟 递归)
- Adobe Photoshop CS6图片无法拖入解决方法
- 2021Java校招笔试题答案及评分标准
- 雨听 | 英语学习笔记(十一)~作文范文:公园的免费入口
- bootstrap 表格表头固定
- NanoPC-T4|Android-Q 色温调节
- 加速及控制精灵移动,加速计值的处理
- R语言学习笔记8_回归分析和相关分析
- java计算机毕业设计-线上自助旅游报名网-源程序+mysql+系统+lw文档+远程调试