目录

一、模型概述

二、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]

车道线分割项目记录-模型构建相关推荐

  1. 车道线分割项目记录-tusimple数据集处理

    一.数据集包含信息 该项目训练所使用的数据集是tusimple数据集,其中用于训练及验证的有约3500张图,测试的有2000多张图.数据集中,除了图片,还包含了json文件,携带了车道线信息.文件路径 ...

  2. 读了那么多CV论文,竟然连车道线分割都实现不了!

    你如果想要进入AI的计算机视觉领域,那么,你一定逃不过的就是语义分割了,要想进入像高德.腾讯.百度等这样的公司,车道线检测.车道线分割等知识你是一定要学的. 我们知道,现代汽车融合了越来越多的驾驶辅助 ...

  3. 实战教程 | 车道线检测项目实战,霍夫变换 新方法 Spatial CNN

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 此文按照这样的逻辑进行撰写.分享机器学习.计算机视觉的基础知识,接着我们以一个实际的项目,带领大家自己 ...

  4. 【深度学习】实战教程 | 车道线检测项目实战,霍夫变换 新方法 Spatial CNN

    此文按照这样的逻辑进行撰写.分享机器学习.计算机视觉的基础知识,接着我们以一个实际的项目,带领大家自己动手实践.最后,分享更多学习资料.进阶项目实战,这部分属于我CSDN上的专栏,最后会按照顺序给出相 ...

  5. 助力自动驾驶:行车检测和车道线分割

    助力自动驾驶:行车检测和车道线分割 一.项目简介 项目背景: 该项目着眼于基于视觉深度学习的自动驾驶场景,旨在对车载摄像头采集的视频数据进行道路场景解析,为自动驾驶提供一种解决思路.利用轻量级检测模型 ...

  6. PaddleX助力无人驾驶:基于YOLOv3的车辆检测和车道线分割实战

    [飞桨开发者说]梁瑛平,北京理工大学徐特立学院本科二年级,人工智能开发爱好者. 项目简介 无人驾驶汽车利用传感器技术.信号处理技术.通讯技术和计算机技术等,通过集成视觉.激光雷达.超声传感器.微波雷达 ...

  7. 基于OpenCV的实时车道线分割&车道保持系统(源码&教程)

    1.研究背景 汽车主动安全系统能够实现风险的主动预防和规避,其能有力缓解当前我国汽车交通事故频发的困境,故对其的相关研究得到了国家的大力支持. 车道保持辅助系统(LKAS,Lane Keeping A ...

  8. 2020-10-06 车道线检测项目及相关学习经验

    车道线检测项目的本质是一个边缘检测的算法的延伸. 在汽车正常行驶过程中,车道线往往出于车体视野的中心对称位置,其位置相对固定. 下图展示了一个该场景,随着车辆的移动,车道线基本处于该黑色虚线所包围的区 ...

  9. 详解车道线检测数据集和模型 VIL-100: A New Dataset and A Baseline Model for Video Instance Lane Detection

    本文介绍一个新的车道线数据集 VIL-100 和检测模型 MMA-Net,论文已收录于 ICCV2021,重点是理解本文提出的 LGMA 模块,用于聚合局部和全局记忆特征. 论文链接:https:// ...

最新文章

  1. 如何卸载iPhone模拟器中的自己创建的程序
  2. 并查集(压缩路径+按秩排序)
  3. 绝对路径VS相对路径
  4. 开发中常用的19 条 MySQL 优化技巧
  5. springboot 整合druid
  6. REVERSE-PRACTICE-BUUCTF-7
  7. 如何删除虚拟机上的操作系统、删除新建的虚拟机
  8. 大数据时代 银行信息安全如何防护?
  9. Using TFS2010 Build 提示:Silverlight 4 SDK is not installed解决方法
  10. MongoDB学习(黑马教程)-4-数据库MongoDB的更新(修改)文档操作
  11. 如何用WGDI进行共线性分析(下)
  12. LeetCode之报数(简单 模拟 递归)
  13. Adobe Photoshop CS6图片无法拖入解决方法
  14. 2021Java校招笔试题答案及评分标准
  15. 雨听 | 英语学习笔记(十一)~作文范文:公园的免费入口
  16. bootstrap 表格表头固定
  17. NanoPC-T4|Android-Q 色温调节
  18. 加速及控制精灵移动,加速计值的处理
  19. R语言学习笔记8_回归分析和相关分析
  20. java计算机毕业设计-线上自助旅游报名网-源程序+mysql+系统+lw文档+远程调试

热门文章

  1. 链接如何生成二维码?怎样创建一个网址二维码?
  2. lineageos没有信号解决方法
  3. 刚刚!鸿蒙OS 2升级用户破千万!(1000+企业共建鸿蒙生态)
  4. 40行Python代码,实现卷积特征可视化
  5. python实现简单图书管理系统
  6. 利用Python进行股票交易分析(三):A股量化交易策略的验证及数据分析。
  7. 解析.txt文件入库
  8. java9新特性-4-模块化系统: Jigsaw与Modularity
  9. 赛灵思 Xilinx Versal 自适应计算加速平台嵌入式设计教程
  10. 统计英文中单词的个数