yolo实现语义分割(cityscapes数据集)附源码
使⽤yolo做语义分割⽹上的资料不是很多,⽽且写的不是很清楚,不容易复现(对我这种菜鸟来说),在此⼩编整合⽹上的资料对yolo实现语义分割做了详细的介绍,希望能够帮助⼤家。以下内容如有错误,还望⼤家留⾔批评指正,⼩编⼀定会及时更改。
1. 概述
语义分割是当今计算机视觉领域的关键问题之⼀。从宏观上看,语义分割是⼀项⾼层次的任务,为实现场景的完整理解铺平了道路。场景理解作为⼀个核⼼的计算机视觉问题,其重要性在于越来越多的应⽤程序通过从图像中推断知识来提供营养。其中⼀些应⽤包括⾃动驾驶汽车、⼈机交互、虚拟现实等,近年来随着深度学习的普及,许多语义分割问题正在采⽤深层次的结构来解决,最常见的是卷积神经⽹络,在精度上⼤⼤超过了其他⽅法。以及效率。
语义分割是从粗推理到精推理的⾃然步骤:
1. 原理可以定位在分类,分类包括对整个输⼊进⾏预测。
2. 本地化/检测,它不仅提供类,还提供关于这些类的空间位置的附加信息。
3. 语义分割通过对每个像素进⾏密集的预测、推断标签来实现细粒度的推理,从⽽使每个像素都被标记为其封闭对象矿⽯区域的类别。
2.语义分割的基础
也有必要回顾⼀些对计算机视觉领域做出重⼤贡献的标准深层⽹络,因为它们通常被⽤作语义分割系统的基础:
Alexnet:Toronto⾸创的Deep CNN,以84.6%的测试准确率赢得了2012年Imagenet竞赛。它由5个卷积层、最⼤池层、作为⾮线性的ReLUs、3个完全卷积层和dropout组成。
VGG-16:这款⽜津型号以92.7%的准确率赢得了2013年的Imagenet竞争。它使⽤第⼀层中具有⼩接收场的卷积层堆栈,⽽不是具有⼤接收场的少数层。
GoogLeNet:这GoogLeNet赢得了2014年Imagenet的竞争,准确率为93.3%。它由22层和⼀个新引⼊的称为初始模块的构建块组成。该模块由⽹络层⽹络、池操作、⼤卷积层和⼩卷积层组成。
Resnet:这款微软的模型以96.4%的准确率赢得了2016年的Imagenet竞争。这是众所周知的,因为它的深度(152层)和残余块的引进。剩余的块通过引⼊标识跳过连接来解决培训真正深层架构的问题,以便层可以将其输⼊复制到下⼀层。
3.语义分割的⽅法
3.1基于区域的语义分割
基于区域的⽅法通常遵循“使⽤识别的分割”管道,⾸先从图像中提取⾃由形式的区域并对其进⾏描述,然后进⾏基于区域的分类。在测试时,基于区域的预测转换为像素预测,通常通过根据包含该预测的最⾼评分区域标记像素。具有代表性的R-CNN
3.2全卷积⽹络语义分割
原始的完全卷积⽹络(FCN)学习从像素到像素的映射,⽽不提取区域建议。FCN⽹络管道是经典CNN的延伸。其主要思想是使经典的CNN以任意⼤⼩的图像作为输⼊。CNN仅接受和⽣产特定尺⼨输⼊的标签的限制来⾃完全连接的固定层。与之相反,FCN只有卷积层和池层,它们能够对任意⼤⼩的输⼊进⾏预测。
图片下载站源码3.3弱监督语义分割
语义分割中的⼤多数相关⽅法都依赖于⼤量带有像素级分割遮罩的图像。然⽽,⼿⼯注释这些⾯具是相当费时,令⼈沮丧和商业成本。因此,最近提出了⼀些弱监督的⽅法,这些⽅法致⼒于通过使⽤带注释的边界框来实现语义分割。
4.Yolo语义分割
4.1 cityscapes数据集介绍
Cityscapes是关于城市街道场景的语义理解图⽚数据集。它主要包含来⾃50个不同城市的街道场景,拥有5000张在城市环境中驾驶场景的⾼质量像素级注释图像(其中 2975 for train,500 for val,1525 for test, 共有19个类别)。根⽬录如下:
leftImg8bit⽂件夹⾥主要有train,val,test三个⽂件夹,每个⽂件夹都有很多城市的原始图像,⽽对应的精细标注⽂件就放在gtFine⾥⾯,不过每个原始图像在⾥⾯对应了6个标注⽂件如下所⽰:
其中 xxx_color.png是标注的可视化图⽚,真正对训练有⽤的是后⾯三个⽂件。xxx_instanceIds.png是⽤来做实例分割训练⽤的,⽽xxx_labelsIds.png是语义分割训练需要的。它们的像素值就是class值。⽽最后⼀个⽂件xxx_polygons.json是⽤labelme⼯具标注后所⽣成的⽂件,⾥⾯主要记录了每个多边形标注框上的点集坐标。
4.2 训练以及测试
训练命令以及过程:
获得的权重⽂件:
测试结果:
由于测试结果为34类,每类的class值就是像素值,所以图像结果都是⼀⽚⿊,为了可视化为彩⾊图像,使⽤matlab写了⼀个脚本⽤以测试结果可视化。代码如下:
clear;clc;
A=imread('pred.png');
[m,n]=size(A);
R=uint8(zeros(m,n));
G=uint8(zeros(m,n));
B=uint8(zeros(m,n));
for i=1:m
for j=1:n
switch(A(i,j))
case{5}
R(i,j)=111;
G(i,j)=74;
case{6}
R(i,j)=81;
B(i,j)=81;
case{7}
R(i,j)=128;
G(i,j)=64;
B(i,j)=128;
case{8}
G(i,j)=25;
B(i,j)=232;                          case{9}
R(i,j)=250;
G(i,j)=170;
B(i,j)=160;
case{10}
R(i,j)=250;
G(i,j)=150;
B(i,j)=140;
case{11}
R(i,j)=70;
G(i,j)=70;
B(i,j)=70;
case{12}
R(i,j)=102;
G(i,j)=102;
B(i,j)=56;
case{13}
R(i,j)=190;
G(i,j)=153;
B(i,j)=153;
case{14}
R(i,j)=180;
G(i,j)=165;
B(i,j)=180;
case{15}
R(i,j)=150;
G(i,j)=100;
B(i,j)=100;
case{16}
R(i,j)=150;
G(i,j)=120;
B(i,j)=90;
case{17,18}
R(i,j)=153;
G(i,j)=153;
B(i,j)=153;                          case{19}
R(i,j)=250;
G(i,j)=170;
B(i,j)=30;
case{20}
R(i,j)=220;
G(i,j)=220;
B(i,j)=0;                            case{21}
R(i,j)=107;
G(i,j)=142;
B(i,j)=35;                          case{22}
R(i,j)=152;
G(i,j)=251;
B(i,j)=152;                            case{23}
R(i,j)=70;
G(i,j)=130;
B(i,j)=180;                            case{24}
R(i,j)=220;
G(i,j)=20;
B(i,j)=20;                              case{25}
R(i,j)=255;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。