前言

在Gayhub上看到个项目,有人在YOLOv5的基础上,新增了一个分割头,把BiSeNet语义分割算法加入到了目标检测中,使其能够同时进行目标检测和语义分割。
项目地址:https://github.com/TomMao23/multiyolov5

效果预览

先看我使用原作者提供的模型,复刻出来的效果:
(本来想放视频的,不过传了两次CSDN都莫名其妙消失了,那就放动图了)

模型架构

目标检测模型采用的是YOLOv5,具体原理在我之前的博文【目标检测】从YOLOv1到YOLOX(理论梳理)里已经详细解读过。
语义分割模型采用的是部分BiSeNet结构,因为我不是这个方向的,具体原理不做细究,放张BiSeNet的结构图[1]:

核心代码

原作者目标检测使用的Coco数据集,语义分割使用的是Cityscapes数据集。
模型主要是在YOLOv5-5.0版本上进行修改的,基准模型采用的是YOLOv5m,语义分割的实现主要是在模型输出的Head部分添加了一个头:
yolov5m_city_seg.yaml

# parameters
nc: 10  # number of classes
n_segcls: 19 # 分割类别数
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple# anchors
anchors:- [10,13, 16,30, 33,23]  # P3/8- [30,61, 62,45, 59,119]  # P4/16- [116,90, 156,198, 373,326]  # P5/32# YOLOv5 backbone
backbone:# [from, number, module, args][[-1, 1, Focus, [64, 3]],  # 0-P1/2[-1, 1, Conv, [128, 3, 2]],  # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]],  # 3-P3/8[-1, 9, C3, [256]],[-1, 1, Conv, [512, 3, 2]],  # 5-P4/16[-1, 9, C3, [512]],[-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32[-1, 1, SPP, [1024, [5, 9, 13]]],[-1, 3, C3, [1024, False]],  # 9]# YOLOv5 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]],  # cat backbone P4  # PANet是add, yolov5是concat[-1, 3, C3, [512, False]],  # 13[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]],  # cat backbone P3[-1, 3, C3, [256, False]],  # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]],  # cat head P4[-1, 3, C3, [512, False]],  # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]],  # cat head P5[-1, 3, C3, [1024, False]],  # 23 (P5/32-large)#[类别/输出通道, C3的n, C3的c2, C3的shortcut(以base为例,其他头含义可能不同)] yolo.py解析代码, []内第一项必须是输出通道数#[[4, 19], 1, SegMaskLab, [n_segcls, 3, 256, False]],  # 语义分割头通道配置256,[]内n为3[[16, 19, 22], 1, SegMaskPSP, [n_segcls, 3, 256, False]],  # 语义分割头通道配置256#[[16, 19, 22], 1, SegMaskBiSe, [n_segcls, 3, 256, False]],  # 语义分割头通道配置无效#[[16], 1, SegMaskBase, [n_segcls, 3, 512, False]],  # 语义分割头通道配置512[[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)  必须在最后一层, 原代码很多默认了Detect是最后, 并没有全改]

代码中,在最后的输出部分,作者添加了3个和Detect平行的分割头,其中,SegMaskLabSegMaskPSPSegMaskBiSeSegMaskBase分别是不同的独立结构,是作者实验所用。
在yolo.py中,可以看到它们详细的结构:

class SegMaskPSP(nn.Module):  # PSP头,多了RFB2和FFM,同样砍了通道数,没找到合适的位置加辅助损失,因此放弃辅助损失def __init__(self, n_segcls=19, n=1, c_hid=256, shortcut=False, ch=()):  # n是C3的, (接口保留了,没有使用)c_hid是隐藏层输出通道数(注意配置文件s*0.5,m*0.75,l*1)super(SegMaskPSP, self).__init__()self.c_in8 = ch[0]  # 16  # 用16,19,22宁可在融合处加深耗费一些时间,检测会涨点分割也很好。严格的消融实验证明用17,20,23分割可能还会微涨,但检测会掉3个点以上,所有头如此self.c_in16 = ch[1]  # 19self.c_in32 = ch[2]  # 22# self.c_aux = ch[0]  # 辅助损失  找不到合适地方放辅助,放弃self.c_out = n_segcls# 注意配置文件通道写256,此时s模型c_hid=128self.out = nn.Sequential(  # 实验表明引入较浅非线性不太强的层做分割会退化成检测的辅助(分割会相对低如72退到70,71,检测会明显升高),PP前应加入非线性强一点的层并适当扩大感受野RFB2(c_hid*3, c_hid, d=[2,3], map_reduce=6),  # 3*128//6=64 RFB2和RFB无关,仅仅是历史遗留命名(训完与训练模型效果不错就没有改名重训了)PyramidPooling(c_hid, k=[1, 2, 3, 6]),  # 按原文1,2,3,6,PSP加全局更好,但是ASPP加了全局后出现边界破碎FFM(c_hid*2, c_hid, k=3, is_cat=False),  # FFM改用k=3, 相应的砍掉部分通道降低计算量(原则就是差距大的融合哪怕砍通道第一层也最好用3*3卷积,FFM融合效果又比一般卷积好,除base头外其他头都遵循这种融合方式)nn.Conv2d(c_hid, self.c_out, kernel_size=1, padding=0),nn.Upsample(scale_factor=8, mode='bilinear', align_corners=True),)self.m8 = nn.Sequential(Conv(self.c_in8, c_hid, k=1),)self.m32 = nn.Sequential(Conv(self.c_in32, c_hid, k=1),nn.Upsample(scale_factor=4, mode='bilinear', align_corners=True),)self.m16 = nn.Sequential(Conv(self.c_in16, c_hid, k=1),nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True),)# self.aux = nn.Sequential(#                        Conv(self.c_aux, 256, 3),  #                        nn.Dropout(0.1, False), #                        nn.Conv2d(256, self.c_out, kernel_size=1),#                        nn.Upsample(scale_factor=8, mode='bilinear', align_corners=True),# )def forward(self, x):# 这个头三层融合输入做过消融实验,单独16:72.6三层融合:73.5,建议所有用1/8的头都采用三层融合,在Lab的实验显示三层融合的1/16输入也有增长feat = torch.cat([self.m8(x[0]), self.m16(x[1]), self.m32(x[2])], 1)# return self.out(feat) if not self.training else [self.out(feat), self.aux(x[0])]return self.out(feat)

下面是模型检测(detect.py)中的主要改动,在模型输出部分使用seg来获取语义分割结果,再利用提前定义好的颜色图Cityscapes_COLORMAP分别给分割部分上色。

seg = F.interpolate(seg, (im0.shape[0], im0.shape[1]), mode='bilinear', align_corners=True)[0]
mask = label2image(seg.max(axis=0)[1].cpu().numpy(), Cityscapes_COLORMAP)[:, :, ::-1]
dst = cv2.addWeighted(mask, 0.4, im0, 0.6, 0)

代码备份

其它改动还很多,可以去原作者的仓库阅读。
这里将其代码进行备份,包含作者提供的模型权重:
https://pan.baidu.com/s/1JtqCtlJwk5efkiTQqmNpVA?pwd=36bk

References

[1]https://blog.csdn.net/qq_40073354/article/details/120725919

YOLOv5+BiSeNet——同时进行目标检测和语义分割相关推荐

  1. 2021-01-24过去十年十大AI研究热点,分别为深度神经网络、特征抽取、图像分类、目标检测、语义分割、表示学习、生成对抗网络、语义网络、协同过滤和机器翻译。

    专利申请量全球第一!清华人工智能发展报告:国内215所高校成立相关本科专业 发布时间:01-2415:20万象大会年度获奖创作者,东方财富网官方帐号 1月20日,清华大学人工智能研究院.清华-中国工程 ...

  2. 图像分类、目标检测、语义分割、实例分割和全景分割的区别

    1.Image Classification(图像分类) 图像分类(下图左)就是对图像判断出所属的分类,比如在学习分类中数据集有人(person).羊(sheep).狗(dog)和猫(cat)四种,图 ...

  3. Keras之Mask R-CNN:《极限挑战》第四季第2期助力高考—使用Mask R-CNN代替Photoshop抠图、颜色填充框出目标检测/图像分割/语义分割

    Keras之Mask R-CNN:<极限挑战>第四季第2期助力高考-使用Mask R-CNN代替Photoshop抠图.颜色填充框出目标检测/图像分割/语义分割 导读 没有伞的孩子只能努力 ...

  4. 【NIPS2018】实时联合目标检测与语义分割网络

    本文发表于第32届神经信息处理系统会议(NIPS 2018),是法国汽车零部件供应商法雷奥集团(Valeo)研究提出的一种用于自动驾驶领域的多任务神经网络,可同时执行目标检测与语义分割任务. 代码开源 ...

  5. 自动驾驶深度多模态目标检测和语义分割:数据集、方法和挑战

    自动驾驶深度多模态目标检测和语义分割:数据集.方法和挑战 原文地址:https://arxiv.org/pdf/1902.07830.pdf Deep Multi-Modal Object Detec ...

  6. 图像分类,目标检测,语义分割,实例分割,全景分割联系与区别

    一.图像分类 识别图像中存在的内容,如下图,有人(person).树(tree).草地(grass).天空(sky),只知道有没有这一类东西就行. 二.目标检测 识别图像中存在的内容和检测其位置,如下 ...

  7. CVPR2019 | 15篇论文速递(涵盖目标检测、语义分割和姿态估计等方向)

    [导读]CVPR 2019 接收论文列表已经出来了,但只是一些索引号,所以并没有完整的论文合集.CVer 最近也在整理收集,今天一文涵盖15篇 CVPR 2019 论文速递,内容涵盖目标检测.语义分割 ...

  8. 联合目标检测和语义分割——学习笔记

    联合目标检测和语义分割 目标检测 目标检测是一种与计算机视觉和图像处理相关的计算机技术,用于检测数字图像和视频中特定类别的语义对象(例如人,建筑物或汽车)的实例.然而现实中物体的尺寸.姿态.位置都有很 ...

  9. 从CNN到Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

    更多资讯,请关注:Ai尚研修科研技术动态 公众号 我国高分辨率对地观测系统重大专项已全面启动,高空间.高光谱.高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全 ...

最新文章

  1. 各种有return的情况下try-catch-finally的执行顺序
  2. python自学网站 知乎-如何自学Python拿到25K的薪资?非常感谢这11个站点!
  3. Py之folium:python库之folium的简介、安装、使用方法之详细攻略
  4. hdu1597(二分)
  5. URAL 1047 Simple Calculations
  6. uva 11383(二分图最大权匹配)
  7. Windows11右下角出现评估副本水印如何去除?
  8. Hadoop解决内存受限问题
  9. 大前端的自动化工厂(5)—— 基于Karma+Mocha+Chai的单元测试和接口测试
  10. 四层和七层负载均衡的特点及常用负载均衡Nginx、Haproxy、LVS对比
  11. python2.7.7笔记if in
  12. 递归经典案例汉诺塔 python实现_python实现汉诺塔递归算法经典案例
  13. yanqiyetan V1.0 存档
  14. 腾讯良心软件,被秒了
  15. xfce4桌面连接蓝牙设备ubuntu
  16. matlab 加权回归估计_Matlab:地理加权回归基本操作
  17. Windows安装redis教程
  18. 论文邮箱不是导师的_我的漫漫读研路,就是导师对我的套路
  19. 微信会员系统怎么做?如何建立全方位会员营销体系?
  20. 携程2016校园招聘笔试题分析

热门文章

  1. ant安装和ant的环境配置
  2. win7上安装DDK,SDK。。
  3. 【UE虚幻引擎】手把手教学,UE打包全攻略
  4. 深圳云计算培训:新手学习云计算的规划
  5. 产品经理1.1_如何高效的开展产品需求评审会
  6. 原来高手是这样练成的
  7. 中国体育场馆行业运营管理现状及十四五模式分析报告2022版
  8. Queue.queue 退出与阻塞
  9. server 2008 r2 怎么打开任务管理?
  10. 深度学习 warmup 策略