关于图像分割:Matlab实现图像分割

文章和代码以及样例图片等相干资源,曾经归档至【Github仓库:digital-image-processing-matlab】或者公众号【AIShareLab】回复 数字图像处理 也可获取。目标把握线检测边缘检测应用梯度的分水岭宰割管制标记符的分水岭宰割内容线检测%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function B=pixeldup(A, m, n)if nargin<2; error('At least two inputs are required');endif nargin==2; n=m;endu=1:size(A,1);m=round(m);u=u(ones(1,m), :);u=u(:);v = 1:size(A,1);n=round(n);v=v(ones(1,n), :);v=v(:);B=A(u,v);%%%%%%%%%%%%%%%%%%%%%%%%%%%%clear allclcf=imread('D:\pic\DIP3E_CH10\Fig1005(a)(wirebond_mask).tif');figure,imshow(f);w=[2 -1 -1;-1 2 -1;-1 -1 2];g=imfilter(double(f),w);figure,imshow(g,[])%fig 2gtop=g(1:120,1:120);gtop=pixeldup(gtop, 4);figure,imshow(gtop,[])%fig 3gbot=g(end-119:end,end-119:end);gbot=pixeldup(gbot,4);figure,imshow(gbot,[])%fig 4g=abs(g);figure,imshow(g,[])%fig 5T=max(g(:));g=g>=T;figure,imshow(g)%fig 6%%%%%%%%%%%%%%%%%%%%%%%%边缘检测%%%%%%%%%%%%%%%%%%%%%%%%%%%clear allclcf=imread('D:\pic\DIP3E_CH10\Fig1016(a)(building_original).tif');figure,imshow(f);[gv,t]=edge(f,'sobel','vertical');figure,imshow(gv);tgv=edge(f,'sobel',0.15,'vertical');figure,imshow(gv);gboth=edge(f,'sobel',0.15);figure,imshow(gboth);w45=[-2 -1 0;-1 0 1;0 1 2]g45=imfilter(double(f),w45,'replicate');T=0.3*max(abs(g45(:)));g45=g45>=T;figure,imshow(g45);%%%%%%%%%%%%%%%%%%%%%%%%%Sobel,LoG 和Canny 边缘检测器的比拟clear allclcf=imread('D:\pic\DIP3E_CH10\Fig1016(a)(building_original).tif');figure,imshow(f);[g_sobel_default,ts]=edge(f,'sobel');figure,imshow(g_sobel_default);[g_log_default,tlog]=edge(f,'log');figure,imshow(g_log_default);[g_canny_default,tc]=edge(f,'canny');figure,imshow(g_canny_default);[g_sobel_best,ts]=edge(f,'sobel',0.05);figure,imshow(g_sobel_best);[g_log_best,tlog]=edge(f,'log',0.003,2.25);figure,imshow(g_log_best);[g_canny_best,tc]=edge(f,'canny',[0.04 0.10],1.5);figure,imshow(g_canny_best);应用梯度的分水岭宰割clear allclcf=imread('D:\pic\DIP3E_CH10\Fig1057(a)(small_blobs-original).tif');figure,imshow(f);h=fspecial('sobel');fd=double(f);g=sqrt(imfilter(fd,h,'replicate').^2+... imfilter(fd,h','replicate').^2);figure,imshow(g);L=watershed(g);figure,imshow(L);wr=L==0;g2=imclose(imopen(g,ones(3,3)),ones(3,3));figure,imshow(g2);L2=watershed(g2);figure,imshow(L2);wr2=L2==0;f2=f;f2(wr2)=255;figure,imshow(f2);管制标记符的分水岭宰割%%%%%%%%%%%%%%%%了解每幅图像的含意%%%%%%%%%%%clear allclcf=imread('D:\pic\DIP3E_CH10\Fig1057(a)(small_blobs-original).tif');figure,imshow(f);h=fspecial('sobel');fd=double(f);g=sqrt(imfilter(fd,h,'replicate').^2+...imfilter(fd,h','replicate').^2);L=watershed(g);wr=L==0;rm=imregionalmin(g);figure,imshow(rm);im=imextendedmin(f,2);figure,imshow(im);fim=f;fim(im)=175;figure,imshow(fim);Lim=watershed(bwdist(im));figure,imshow(Lim);em=Lim==0;g2=imimposemin(g,im|em);figure,imshow(g2);L2=watershed(g2);figure,imshow(L2);f2=f;f2(L2==0)=255;figure,imshow(f2);参考文献: [1] Rafael C. Gonzalez, Richard E. Woods, and Steven L. Eddins. 2003. Digital Image Processing Using MATLAB. Prentice-Hall, Inc., USA. [2] [阮秋琦. 数字图像处理(MATLAB版)[M]. 北京:电子工业出版社, 2014.](https://github.com/timerring/digital-image-processing-matlab/blob/main/reference/Digital_Image_Processing_(MATLAB_version).pdf) ...

March 9, 2023 · 1 min · jiezi

关于图像分割:图像分割二区域生长和区域分裂

上文曾经说到,图像宰割就是获取你感兴趣的物体或区域的过程。图像宰割中,基于区域的办法是以间接寻找区域为根底的宰割技术 一.区域成长1.基本原理区域成长法是较为根底的一种区域分割办法它的根本思维我说的艰深些,即是一开始有一个生长点(能够一个像素也能够是一个小区域),从这个生长点开始往外裁减,裁减的意思就是它会把跟本人有类似特色的像素或者区域拉到本人的队伍里,以此壮大本人的势力范围,每次扩充后的势力范围就是一个新的生长点,始终成长始终成长,直到不能成长为止。所以很容易就能总结进去三个要点:(1)一个适合的像素或者小区域作为开始的生长点(2)成长准则,也就是通过什么规范你能力拉他入伙(3)进行成长的条件 什么时候进行裁减 2.简略例子阐明上面是一个简略的例子:此例子截图来自:https://blog.csdn.net/webzhuc... 3.代码import cv2import numpy as np###########################################################################################################################################################################class Point(object): def __init__(self, x, y): self.x = x self.y = y def getX(self): return self.x def getY(self): return self.yconnects = [ Point(-1, -1), Point(0, -1), Point(1, -1), Point(1, 0), Point(1, 1), Point(0, 1), Point(-1, 1), Point(-1, 0)]###################################################################################### 计算两个点间的欧式间隔def get_dist(seed_location1, seed_location2): l1 = im[seed_location1.x, seed_location1.y] l2 = im[seed_location2.x, seed_location2.y] count = np.sqrt(np.sum(np.square(l1 - l2))) return count# import Imageim = cv2.imread('./7.jpg')cv2.imshow('src', im)im_shape = im.shapeheight = im_shape[0]width = im_shape[1]print('the shape of image :', im_shape)# 标记,判断种子是否曾经成长img_mark = np.zeros([height, width])cv2.imshow('img_mark', img_mark)# 建设空的图像数组,作为一类img_re = im.copy()for i in range(height): for j in range(width): img_re[i, j][0] = 0 img_re[i, j][1] = 0 img_re[i, j][2] = 0cv2.imshow('img_re', img_re)# 取一点作为种子点seed_list = []seed_list.append(Point(15, 15))T = 7 # 阈值class_k = 1 # 类别# 成长一个类while (len(seed_list) > 0): seed_tmp = seed_list[0] # 将以成长的点从一个类的种子点列表中删除 seed_list.pop(0) img_mark[seed_tmp.x, seed_tmp.y] = class_k # 遍历8邻域 for i in range(8): tmpX = seed_tmp.x + connects[i].x tmpY = seed_tmp.y + connects[i].y if (tmpX < 0 or tmpY < 0 or tmpX >= height or tmpY >= width): continue dist = get_dist(seed_tmp, Point(tmpX, tmpY)) # 在种子汇合中满足条件的点进行成长 if (dist < T and img_mark[tmpX, tmpY] == 0): img_re[tmpX, tmpY][0] = im[tmpX, tmpY][0] img_re[tmpX, tmpY][1] = im[tmpX, tmpY][1] img_re[tmpX, tmpY][2] = im[tmpX, tmpY][2] img_mark[tmpX, tmpY] = class_k seed_list.append(Point(tmpX, tmpY))######################################################################################### 输入图像cv2.imshow('OUTIMAGE', img_re)cv2.waitKey(0)左边的图让我想起来 离别巨匠外面邓超演的拉不拉卡(反正就是很黑) hhh ...

February 23, 2023 · 2 min · jiezi

关于图像分割:全球首个面向遥感任务设计的亿级视觉Transformer大模型

作者:京东摸索研究院深度学习在很大水平上影响了遥感影像剖析畛域的钻研。然而,大多数现有的遥感深度模型都是用ImageNet预训练权重初始化的,其中天然图像不可避免地与航拍图像相比存在较大的域差距,这可能会限度上游遥感场景工作上的微调性能。   为此,京东摸索研究院联结武汉大学、悉尼大学借助迄今为止最大的遥感场景标注数据集MillionAID,从头开始训练包含卷积神经网络(CNN)和曾经在天然图像计算机视觉工作中体现出了良好性能的视觉Transformer(Vision Transformer)网络,首次取得了一系列基于监督学习的遥感预训练根底骨干模型。并进一步钻研了ImageNet预训练(IMP)和遥感预训练(RSP)对包含语义宰割、指标检测在内的一系列上游工作的影响。   试验后果证实了摸索研究院先前提出的先进Vision Transformer系列模型ViTAE在遥感工作上的优越性,并发现RSP在遥感工作上的有效性以及感知相干语义方面具备的独特性。试验后果进一步表明RSP会受到上下游工作差别的影响,这些发现对遥感大规模数据集和预训练方法提出了新的要求。   01 钻研背景 近年来,深度学习凭借主动提取反映物体固有属性的深度特色的劣势,在计算机视觉畛域获得了令人印象粗浅的冲破,遥感畛域也不例外。在遥感畛域,最罕用的是深度模型是卷积神经网络(CNN)。 目前,简直所有的遥感深度模型都是在计算机视觉畛域最驰名的图像数据集 ImageNet-1K 数据集上进行预训练,该数据集中来自 1,000 个不同类别的百万张真实世界图像使模型可能学习弱小的示意。而后这些预训练后的模型被能够用做遥感工作的骨干网络进行进一步微调。   只管这些模型在遥感工作中获得了显著的成果,但仍有一些问题须要钻研。直观地说,与天然图像相比,遥感图像在视角、色彩、纹理、布局、对象等方面显著存在较大的域差距。以前的办法试图通过进一步微调遥感图像数据集上的预训练模型来放大这一差距。然而,ImageNet预训练(IMP)引入的零碎偏差对性能有着不可漠视的副作用。另一方面,咱们留神到,随着遥感技术的提高,各种各样的传感器捕捉到了丰盛的遥感图像,能够用于预训练。作为一个代表性的例子,MillionAID 是迄今为止最大的遥感图像数据集,它是从蕴含多种传感器图像的谷歌地球(GE)上收集的,并且具备相似ImageNet-1K的百万级图像数量规模,这使遥感预训练(RSP)成为可能。   RSP可能从头开始训练深度模型,这意味着候选模型不用局限于现成的CNN。因而,在本文中,咱们也钻研了视觉Transformer(Vision Transformer)的骨干网络,它们在计算机视觉畛域体现出了令人诧异的性能。与CNN中善于部分建模的卷积相比,Vision Transformer中的多头自留神(MHSA)可能灵便地捕获不同的全局上下文。最近,摸索研究院提出的ViTAE模型摸索了卷积和MHSA的平行结构,以同时建模局部性和长程依赖性,在ImageNet分类工作和上游视觉工作上获得了很好的后果。此外,它还通过扩张卷积模块和层级设计提取多尺度特色,这对于计算机视觉上游工作,尤其是在遥感图像了解工作,都具备重要的价值。因而咱们钻研了CNN和层级Vision Transformer网络通过RSP后,在场景辨认、语义宰割、指标检测和变化检测等遥感工作上的微调性能。为了实现这些指标,咱们在九个风行的数据集上进行了宽泛的试验,并得出了一些无益的论断。RSP是遥感图像了解中的一个新兴钻研方向,但仍处于摸索阶段,尤其是基于Vision Transformer这种新型网络架构的预训练方法。咱们心愿这项钻研可能填补这一空白,并为将来的钻研提供有用的见解。   02 MillionAID, ViTAE 和ViTAEv2的介绍   1.MillionAID MillionAID 是迄今为止遥感畛域最大的数据集。它蕴含 100,0848 个不重叠的场景,有51类,每类大概有2,000-45,000图像。该数据集来自谷歌地球,由包含但不限于 SPOT、IKONOS、WorldView 和 Landsat 系列的多种传感器组成,因此图像分辨率不同。最大分辨率可达0.5m,最小的则有153m。图像大小范畴从 110110 到 31,67231,672。该数据集均为RGB图像,非常适合训练典型的视觉神经网络模型。   2.ViTAE 和ViTAEv2    ViTAE是摸索研究院最近提出的先进Vision Transformer模型,它采纳深窄式设计,在网络开始时迅速降采样,而后将网络加深,在进步性能的同时升高模型大小和计算成本。ViTAE 模型首先通过三个Reduction Cell将输出图像下采样到1/16分辨率。与 ViT 相似,在增加地位编码之前,将class token与第三个Reduction Cell的输入连贯。而后重叠多个Normal Cell,并始终保持特色图分辨率。最初一个Normal Cell的class token输出到线性层进行分类。ViTAE 模型在 ImageNet 数据集上分类性能表现出色,但它不不便像CNN那样产生层次化的两头特色,从而迁徙到宰割、检测和姿势预计等其它上游工作(目前有一些新技术来解决这个问题,例如ViTDet,并已获得较好成绩,请关注咱们的复现Repo:https://github.com/ViTAE-Tran...)。   在此基础上,摸索研究院提出了 ViTAEv2,它采纳了 ResNet 和 Swin 等风行骨干网络的层次化设计。在 ViTAEv2 中,网络被分成四个阶段。每个阶段首先采纳Reduction Cell进行下采样,而后重叠多个 Normal Cell进行特色变换。在最初一个阶段的Normal Cell后应用全局均匀池化层来替换class token。当对上游工作进行微调时,该池化层被移除,剩下的网络与相应工作的解码器相连。图 2 显示了原始 ViTAE 和 ViTAEv2的网络架构。 ...

February 1, 2023 · 4 min · jiezi

关于图像分割:技术博客丨动手实践系列CV语义分割

作者:游璐颖,福州大学,Datawhale成员 图像宰割是计算机视觉中除了分类和检测外的另一项根本工作,它意味着要将图片依据内容宰割成不同的块。相比图像分类和检测,宰割是一项更精密的工作,因为须要对每个像素点分类。 如下图的街景宰割,因为对每个像素点都分类,物体的轮廓是精准勾画的,而不是像检测那样给出边界框。 图像宰割能够分为以下三个子畛域:语义宰割、实例宰割、全景宰割。 由比照图可发现,语义宰割是从像素档次来辨认图像,为图像中的每个像素制订类别标记,目前广泛应用于医学图像和无人驾驶等;实例宰割绝对更具备挑战性,不仅须要正确检测图像中的指标,同时还要准确的宰割每个实例;全景宰割综合了两个工作,要求图像中的每个像素点都必须被调配给一个语义标签和一个实例id。 01 语义宰割中的关键步骤在进行网络训练时,时常须要对语义标签图或是实例宰割图进行预处理。如对于一张黑白的标签图,通过色彩映射表失去每种色彩所代表的类别,再将其转换成相应的掩膜或Onehot编码实现训练。这里将会对于其中的关键步骤进行解说。 首先,以语义宰割工作为例,介绍标签的不同表达形式。 1.1 语义标签图语义宰割数据集中包含原图和语义标签图,两者的尺寸大小雷同,均为RGB图像。 在标签图像中,红色和彩色别离代表边框和背景,而其余不同色彩代表不同的类别: 1.2 单通道掩膜每个标签的RGB值与各自的标注类别对应,则能够很容易地查找标签中每个像素的类别索引,生成单通道掩膜Mask。 如上面这种图,标注类别包含:Person、Purse、Plants、Sidewalk、Building。将语义标签图转换为单通道掩膜后为右图所示,尺寸大小不变,但通道数由3变为1。 每个像素点地位一一对应。 1.3 Onehot编码Onehot作为一种编码方式,能够对每一个单通道掩膜进行编码。 比方对于上述掩膜图Mask,图像尺寸为,标签类别共有5类,咱们须要将这个Mask变为一个5个通道的Onehot输入,尺寸为,也就是将掩膜中值全为1的像素点抽取出生成一个图,相应地位置为1,其余为0。再将全为2的抽取出再生成一个图,相应地位置为1,其余为0,以此类推。 02 语义宰割实际接下来以Pascal VOC 2012语义宰割数据集为例,介绍不同表达形式之间应该如何互相转换。 实际采纳的是Pascal VOC 2012语义宰割数据集,它是语义宰割工作中非常重要的数据集,有 20 类指标,这些指标包含人类、机动车类以及其余类,可用于指标类别或背景的宰割。 数据集开源地址: https://gas.graviti.cn/datase... 2.1 数据集读取本次应用格物钛数据平台服务来实现数据集的在线读取,平台反对多种数据集类型,且提供了很多公开数据集便于应用。在应用之前先进行一些必要的筹备工作: Fork数据集:如果须要应用公开数据集,则须要将其先fork到本人的账户。获取AccessKey:获取应用SDK与格物钛数据平台交互所需的密钥,链接为https://gas.graviti.cn/tensor...了解Segment:数据集的进一步划分,如VOC数据集分成了“train”和“test”两个局部。 2.2 色彩映射表在失去黑白语义标签图后,则能够构建一个色彩表映射,列出标签中每个RGB色彩的值及其标注的类别。 2.3 Label与Onehot转换依据映射表,实现语义标签图与Onehot编码的互相转换: 2.4 Onehot与Mask转换同样,借助映射表,实现单通道掩膜Mask与Onehot编码的互相转换: 更多信息请拜访格物钛官网

December 15, 2021 · 1 min · jiezi

语义分割浅析

背景对图像而言,常见的任务是:图像分类:提取类别特征,如:VGG19网络目标检测:提取类别,位置特征,如:YOLO网络语义分割(实例分割):提取类别,位置特征,针对每个像素,如:Deeplab网络我们知道,在做图像分类的时候,一般会在模型的最后添加全连接层+softmax用于预测。但是,全连接层会把卷积学习到的类别,位置特征抽象成一维的概率信息,可以识别整个图片的类别,不能标识每个像素的类别。因此,为了保留图像特征我们将全连接层替换为卷积层。这样,模型的输出不再是一维,而是二维的图。由于特征图经过一系列的卷积和池化后(保持特征不变性,增大感受野,节省计算资源等)造成分辨率降低,丢失大量细节和边缘信息,因此我们需要通过一定的手段还原原图分辨率。不同的模型会采取不同的还原方式,图上以FCN为例,采用反卷积还原分辨率并使用加和的方式找回下采样阶段丢失的信息,直接把编码阶段的特征图加到解码阶段中来。基石FCN模型FCN阐释了如何将CNN应用到语义分割问题上,是深度学习应用此问题的基石。文章开始,我们谈到模型最后的全连接层不适用与分割任务,需要替换成卷积层,以此获取二维的特征图然后接softmax,对每个像素点进行分类。先通过卷积,池化下采样,然后上采样还原分辨率。上采样一般有两种方式:双线性插值(Deeplab),反卷积(FCN)。Google DeepLab v1DeepLab是针对语义分割任务提出的模型,主要使用DCNN(深度卷积网络),CRF(条件随机场),空洞卷积做像素级预测。DCNN在语义分割中存在两个主要问题:下采样带来的分辨率下降,细节信息丢失平移不变性,限制了定位精度针对以上问题,Deeplab采用空洞卷积扩大感受野,获取更多的上下文信息。使用全连接条件随机场(DenseCRF)提高模型捕获细节的能力。DCNN以VGG16模型为后端网络,将FC层全部转为卷积层,改成全卷积网络形式。最后的两个池化层不下采样,通过2或4的采样率空洞卷积对特征图扩大感受野,缩小步幅。模型训练的时候讲VGG16的权重做微调,损失函数取输出特征图ground truth下采样8倍做交叉熵和;测试时取输出图双线性上采样得到的结果(DCNN预测物体的位置是粗略的,没有确切的轮廓,针对此问题采用全连接的CRF提升分割精度)。Google DeepLab v2DeepLab v2相比DeepLab v1基础层由VGG16改为ResNet,添加多尺度和ASPP模块得到更好的分割结果。空洞卷积作为密集预测的强大工具,可以扩大感受野,在不增加参数量和计算量的同时获取更多的上下文。提出ASPP(空洞空间卷积池化金字塔),并行的采用多采样率的空洞卷积进行探测,以多个比例捕获对象及图像上下文。组合DCNN和概率模型,改善分割边界结果。模型运行步骤:输入经过改进的DCNN(带空洞卷积和ASPP模块)通过双线性插值恢复原图大小(FCN采用反卷积)通过全连接的CRF细化预测结果,得到最终输出Google DeepLab v3DeepLab v3相比DeepLab v2:重新讨论了空洞卷积的使用,让我们在级联模块和空间金字塔池化的框架下,能够获取更大的感受野从而获取多尺度信息。改进ASPP模块,由不同采样率的空洞卷积和BN层组成。使用大采样率的3x3空洞卷积,因为图像边界响应无法捕获远距离信息,会退化为1x1卷积,因此将图像级特征融合到ASPP模块。没有使用CRF做后期优化处理Google DeepLab v3+DeepLab v3+采用编码器,解码器结构,通过使用解码器模块改善物体边缘的分割结果,还尝试使用Xception作为编码器。如图所示,空间金字塔池化可以池化不同分辨率的特征图来捕获上下文信息。编码器解码器结构可以捕获锋利的边界。先4倍上采样,然后与编码器中的特征图合并,最后4倍上采样恢复到原始图像大小。encoder就是DeepLab V3,通过修改ResNet101最后两(一)个block的stride,使得output stride为8(16)。之后在block4后应用改进后的Atrous Spatial Pyramid Pooling,将所得的特征图concatenate用1×1的卷积得到256个通道的特征图。在decoder中,特征图首先上采样4倍,然后与encoder中对应分辨率低级特征concatenate。在concatenate之前,由于低级特征图的通道数通常太多(256或512),而从encoder中得到的富含语义信息的特征图通道数只有256,这样会淡化语义信息,因此在concatenate之前,需要将低级特征图通过1×1的卷积减少通道数。在concatenate之后用3×3的卷积改善特征,最后上采样4倍恢复到原始图像大小。U-Net网络U-Net网络可以利用较少的数据集进行端到端训练,医学领域应用较多(医学领域的标注数据获取成本很高)。为了更有效的利用标注数据,采用数据增强的方法(训练样本进行随机弹性形变)网络由收缩路径获取上下文信息以及一个对称的扩张路径用以精确定位。如图所示,网络结构由contracting path和expansive path组成。contracting:含有重复结构,每个都有2个3x3卷积层,relu层和2x2最大池化层每一次下采样都将特征通道数加倍expansive path:每一步都使用反卷积,每次反卷积后将通道数量减半,特征图大小加倍。反卷积后,将反卷积的结果与contracting path中对应的步骤的特征图拼接起来对拼接后的map再进行2次3*3卷积最后一层卷积核大小为1x1,将64通道的特征图转为特定类别数量

April 16, 2019 · 1 min · jiezi

使用DeepLab进行语义分割

介绍DeepLab是谷歌使用tensorflow基于CNN开发的语义分割模型,至今已更新4个版本。最新版本是DeepLabv3+,在此模型中进一步将深度可分离卷积应用到孔空间金字塔池化和解码器模块,从而形成更快,更强大的语义分割编码器-解码器网络。本文从官方案例出发,介绍如何训练以及使用DeepLabv3+模型。模型安装1,下载tensorflow model,然后将解压后的文件重命名为”models“并移动到tensorflow文件夹下。2,添加环境变量cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/researchexport PYTHONPATH=$PYTHONPATH:pwd:pwd/slim3,测试是否安装成功cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/researchpython deeplab/model_test.py结果出现如下错误:解决方法如下:准备数据下载数据:cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research/deeplab/datasets/sh download_and_convert_voc2012.sh具体执行步骤:下载并解压VOC2012数据集移除colormap在数据集中创建TFRecord文件下载预训练模型官方提供了多种模型,可以根据自己的实际需求下载安装。使用PASCAL VOC2012数据集训练文件结构:tensorflow deeplab文件夹:训练:cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research填写相关路径,执行训练python deeplab/train.py \ –logtostderr \ –training_number_of_steps=30000 \ –train_split=“train” \ –model_variant=“xception_65” \ –atrous_rates=6 \ –atrous_rates=12 \ –atrous_rates=18 \ –output_stride=16 \ –decoder_output_stride=4 \ –train_crop_size=513 \ –train_crop_size=513 \ –train_batch_size=1 \ –dataset=“pascal_voc_seg” \ –tf_initial_checkpoint=${PATH_TO_INITIAL_CHECKPOINT} \ –train_logdir=${PATH_TO_TRAIN_DIR} \ –dataset_dir=${PATH_TO_DATASET}PATH_TO_INITIAL_CHECKPOINT:初始checkpoint文件路径(迁移学习)PATH_TO_TRAIN_DIR:训练模型保存路径PATH_TO_DATASET:数据集路径需要注意的问题:当GPU显存不够,使用迁移学习方式进行训练并减少学习率大小,设置”fine_tune_batch_norm=False“当设置”output_stride=8“,”atrous_rates“取值区间应由[6,12,18]改为[12,24,36]。当不想使用解码器结构,需要注释掉”decoder_output_stride“。验证cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/researchpython deeplab/eval.py \ –logtostderr \ –eval_split=“val” \ –model_variant=“xception_65” \ –atrous_rates=6 \ –atrous_rates=12 \ –atrous_rates=18 \ –output_stride=16 \ –decoder_output_stride=4 \ –eval_crop_size=513 \ –eval_crop_size=513 \ –dataset=“pascal_voc_seg” \ –checkpoint_dir=${PATH_TO_CHECKPOINT} \ –eval_logdir=${PATH_TO_EVAL_DIR} \ –dataset_dir=${PATH_TO_DATASET}PATH_TO_CHECKPOINT:训练阶段checkpoint文件路径PATH_TO_EVAL_DIR:评估模型保存路径PATH_TO_DATASET:数据集路径可视化模型输出cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/researchpython deeplab/vis.py \ –logtostderr \ –vis_split=“val” \ –model_variant=“xception_65” \ –atrous_rates=6 \ –atrous_rates=12 \ –atrous_rates=18 \ –output_stride=16 \ –decoder_output_stride=4 \ –vis_crop_size=513 \ –vis_crop_size=513 \ –dataset=“pascal_voc_seg” \ –checkpoint_dir=${PATH_TO_CHECKPOINT} \ –vis_logdir=${PATH_TO_VIS_DIR} \ –dataset_dir=${PATH_TO_DATASET}PATH_TO_CHECKPOINT:训练阶段checkpoint文件路径PATH_TO_VIS_DIR:评估模型保存路径PATH_TO_DATASET:数据集路径需要注意的问题:当需要保存分割结果时,需要设置”also_save_raw_predictions = True“Tensorboardtensorboard –logdir=${PATH_TO_LOG_DIRECTORY}将同时显示”train“,”eval“,”vis“结果,如需要单独显示一类,可以指定显示类别,如:tensorboard –logdir train/对于voc2012这样的数据集,Tensorboard显示数据可能需要几分钟的时间。模型导出cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/researchpython deeplab/export_model.py \ –logtostderr \ –checkpoint_path="${PATH_TO_CHECKPOINT}" \ –export_path="${PATH_TO_EXPORT_PD}" \ –model_variant=“xception_65” \ –atrous_rates=6 \ –atrous_rates=12 \ –atrous_rates=18 \ –output_stride=16 \ –decoder_output_stride=4 \ –num_classes=21 \ –crop_size=513 \ –crop_size=513 \ –inference_scales=1.0PATH_TO_CHECKPOINT:checkpoint文件路径PATH_TO_EXPORT_PD:导出PD文件路径(加后缀.pd)案例cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research/deeplabsh local_test.shGoogle Colab在线测试地址,可选择预训练模型,测试分割照片来查看模型输出结果。总结基于深度学习的语义分割与传统基于随机森林的方法相比有了很大的进步,虽然目前基于深度学习的方法有多种思路,不过基本都是基于全卷积(FCN)衍变而来。FCN将网络全连接层使用卷积替代,因此可以接受任意大小的输入并且针对下采样存在位置信息丢失等问题,采用转置卷积用于恢复图片尺寸,方便后续进行逐像素预测。DeepLab模型为了改善分割效果,使用atrous卷积(空洞卷积),ASPP,全连接条件随机场等技术。 ...

January 21, 2019 · 1 min · jiezi