开心土星
图像处理的很多任务都离不开图像分割。因为图像分割在cv中实在太重要(有用)了,就先把图像分割的常用算法做个总结。 接触机器学习和深度学习时间已经不短了。期间看过各种相关知识但从未总结过。本文过后我会尽可能详细的从工程角度来总结,从传统机器学习算法,传统计算机视觉库算法到深度学习目前常用算法和论文,以及模型在各平台的转化,量化,服务化部署等相关知识总结。 图像分割常用算法大致分为下面几类。由于图像的能量范函,边缘追踪等方法的效果往往只能解决特定问题,效果并不理想,这里不再阐述。当然二值化本身也可以分割一些简单图像的。但是二值化算法较多,我会专门做一个文章来总结。这里不再赘述。 1.基于边缘的图像分割算法: 有利用图像梯度的传统算法算子的sobel,roberts,prewitt,拉普拉斯以及canny等。 这些算法的基本思想都是采用合适的卷积算子,对图像做卷积。从而求出图像对应的梯度图像。(至于为什么通过如图1这样的算子卷积,即可得到图像的梯度图像,请读者复习下卷积和倒数的概念自行推导)由于图像的边缘处往往是图像像素差异较大,梯度较大地方。因此我们通过合适的卷积核得到图像的梯度图像,即得到了图像的边缘图像。至于二阶算子的推导,与一阶类似。优点:传统算子梯度检测,只需要用合适的卷积核做卷积,即可快速得出对应的边缘图像。缺点:图像边缘不一定准确,复杂图像的梯度不仅仅出现在图像边缘,可以能出现在图像内部的色彩和纹理上。 也有基于深度学习方法hed,rcf等。由于这类网络都有同一个比较严重的缺陷,这里只举例hed网络。hed是基于FCN和VGG改进,同时引出6个loss进行优化训练,通过多个层输出不同scale的粒度的边缘,然后通过一个训练权重融合各个层的边缘结果。hed网络结构如下: 可以得到一个比较完整的梯度图像,可参考github的hed实现。优点:图像的梯度细节和边缘完整性,相比传统的边缘算子要好很多。但是hed对于边缘的图像内部的边缘并不能很好的区分。当然我们可以自行更改loss来尝试只拟合外部的图像边缘。但最致命的问题在于,基于vgg的hed的网络表达能力有限,对于图像和背景接近,或者图像和背景部分相融的图片,hed似乎就有点无能为力了。 2.基于区域分割的算法: 区域分割比较常用的如传统的算法结合遗传算法,区域生长算法,区域分裂合并,分水岭算法等。这里传统算法的思路是比较简单易懂的,如果有无法理解的地方,欢迎大家一起讨论学习。这里不再做过多的分析。 基于区域和语意的深度学习分割算法,是目前图像分割成果较多和研究的主要方向。例如FCN系列的全卷积网络,以及经典的医学图像分割常用的unet系列,以及rcnn系列发展下的maskrcnn,以及18年底的PAnet。基于语意的图像分割技术,无疑会成为图像分割技术的主流。 其中,基于深度学习语意的其他相关算法也可以间接或直接的应用到图像分割。如经典的图像matting问题。18年又出现了许多非常优秀的算法和论文。如Deep-Image-Matting,以及效果非常优秀的MIT的 semantic soft segmentation(sss). 基于语意的图像分割效果明显要好于其他的传统算法。我在解决图像分割的问题时,首先尝试用了hed网络。最后的效果并不理想。虽然也参考github,做了hed的一些fine-tune,但是还是上面提到的原因,在我多次尝试后,最终放弃。转而适用FCN系列的网络。但是fcn也无法解决图像和背景相融的问题。图片相融的分割,感觉即需要大的感受野,又需要未相融部分原图像细节,所以单原FCN的网络,很难做出准确的分割。中间还测试过很多其他相关的网络,但都效果不佳。考虑到感受野和原图像细节,尝试了resnet和densenet作为图像特征提取的底层。最终我测试了unet系列的网络: unet的原始模型如图所示。在自己拍照爬虫等手段采集了将近1000张图片。去掉了图片质量太差的,图片内容太过类似的。爬虫最终收集160多张,自己拍照收集200张图片后,又用ps手动p了边缘图像,采用图像增强变换,大约有300*24张图片。原生unet网络的表现比较一般。在将unet普通的卷积层改为resnet后,网络的表达能力明显提升。在将resnet改为resnet101,此时,即使对于部分相融的图像,也能较好的分割了。但是unet的模型体积已经不能接受。 在最后阶段,看到maskrcnn的实例分割。maskrcnn一路由rcnn,fasterrcnn发展过来。于是用maskrcnn来加入自己的训练数据和label图像进行训练。maskrcnn的结果表现并不令人满意,对于边缘的定位,相比于其他算法,略显粗糙。在产品应用中,明显还不合适。 3.基于图的分割算法 基于深度学习的deepgrab,效果表现并不是十分理想。deepgrab的git作者backbone采用了deeplabv2的网络结构。并没有完全安装原论文来做。 论文原地址参考: 整体结构类似于encode和decoder。并没有太仔细的研究,因为基于resent101的结构,在模型体积,速度以及deeplab的分割精度上,都不能满足当前的需求。之前大致总结过计算机视觉的相关知识点,既然目前在讨论移动端模型,那后面就分模块总结下移动端模型的应用落地吧。 由于时间实在有限。这里并没有针对每个算法进行详细的讲解。后续我会从基础的机器学习算法开始总结。
搜奇猎怪
什么是照片修复呢?它由以下三个步骤组成:
我们找到所有的照片缺陷:折痕,磨损,破洞我们基于所发现的照片缺陷周围的像素值来进行图像修复我们为图像上色接下来,我将阐释照片修复的每一个步骤,并且告诉你我们如何获得数据,用哪种网络训练,取得了哪些成就,以及犯了什么错误。
寻找缺陷
我们需要在一张已经上传的照片当中找到所有与缺陷相关的像素值。首先,我们需要弄清楚人们会上传什么样的照片。我们与immortal regiment项目的创始人交流过,一个存储二战遗留照片的非商业组织,他们分享数据给我们。在此基础上进行分析,我们意识到人们上传的大部分个人或集体肖像存在中等到大量的缺陷。
接着我们必须收集一个训练集,这个训练集需要对图像进行分割,得到一张图片,和一张把所有缺陷都标注出来的黑底白纹蒙版。做这一步最简单的方法是让评估员创立分割蒙版。当然,一般人非常清楚怎样找到缺陷,但那会耗费太长时间。
标记一张照片中缺陷处的像素将会花费一个小时或一整个工作日,因此,在几周内收集一个超过100张图片的训练集是不简单的。这就是为什么我们尝试加强我们的数据,并创造我们自己的缺陷:拍一张照片,用图片上的随机纹理增加缺陷,最终得到一张显示有缺陷的图像部分的蒙版。在没有增强的情况下,我们已经获得了含有68张手动标记照片的训练集和和11张照片的验证集。
最流行的分割方法是:使用unet和预训练编码器,将BCE(binary cross-entropy)与DICE(Srensen–Dice coefficient)的和最小化。
在我们为了项目任务使用这个分割方法时,什么样的问题会出现呢?
虽然照片看起来像有许多的缺陷,非常老旧而残破,有缺陷的部分仍然远远小于没有受到损伤的部分。为了解决这个问题,我们可以增加BCE中的积极类内权重,最优权重应是清晰像素与缺陷像素的比率。
第二个问题是如果我们用可以立刻上手使用的预训练编码器和UNET,将会损失许多位置数据。第1层如果由一个核为5、步长为2的卷积组成,网络运行得更快。我们牺牲网络运行的时间来换取更好的缺陷定位。我们在第1层之后移除最大的pooling层,将卷积步长减至1,卷积核减至3。
如果我们通过压缩处理小图片,比如说到256或512像素,小瑕疵会因为内插而消失。然而,我们还需要处理大图像。在实际应用中我们一般把1024像素的照片瑕疵分割。这就是为什么我们必须将网络训练成为适于处理大图像。但这会引起在单个GPU上处理规格小批量的问题。
在训练中,我们我们可以在一个GPU上匹配20张左右的图片。因此我们最终会在BatchNorm层得到不准确的平均值和标准偏差值。我们可以通过 In-place BatchNorm来解决这个问题。一方面节省内存空间,另一方面拥有一个 Synchronized BatchNorm版本,可以同步所有GPU上的数据。这样我们计算平均值和标准偏差值就不是参照一个GPU上的20张图片,而是4个GPU上的80张图片,这改善了网络集成。
最后,基于增加bce的权重,改变体系结构和使用In-place BatchNorm,我们将分割做得更好,但为了做得更好而使用Test Time Augmentation并不会花费许多。我们可以在一张输入的图片上运行网络,获取镜像,再重新运行网络去找到所有的小缺陷。
用了四个GeForce 1080Ti显卡,花费了18个小时,相对时间较长,但这就是精益求精的代价。
图像修复
我们使用了在图像分割领域很火的Unet网络。为了做图像修复,我们需要上传原始图像和一个掩模(使用1标记了所有干净区域的像素,使用0标记了需要好修复的像素)。数据是这样被搜集的:在一些开源的图像数据集上(例如:OpenImagesV4)加入了一些在生活中会出现的照片瑕疵,然后我们训练网络去重新修复有瑕疵的这部分。
我们是如何使用在图像修复中使用Unet的呢?
我们使用了部分卷积替代了原始的那一版。当我们使用一些核去卷积一个区域时,我们没有把损坏的像素算在内。这使得图像修复更精密。从英伟达的论文来举个例子,他们使用了Unet结合默认的2维卷积的修复结果在中间这幅图,使用部分卷积的修复结果在右边这幅图。
着色
我们已经将图片有缺陷的部分分割了出来并且修复了他们;第三步——颜色复原。就像我之前说的,Immortal Regiment项目有很多个人或集体的相片。我们希望网络可以在修复这些照片上起到很好的作用。因为现有的服务不能有效且快的着色,所以我们决定提出我们自己的着色方案。我们希望我们的被着色的图片更可信。
Unet是一个非常棒的模型。在第一个分割任务中,我们在训练过程中遇到了一个问题,就是处理高分辨率的图像,这就是为什么我们使用In-Place 批归一化。在我们的第二个任务(图像修复)中,我们使用了部分卷积而不是标准卷积,这让我们得到了更好的结果。在进行着色时,我们增加了一个简单的判别器网络,它可以对生成不真实图像的生成器进行惩罚。我们还使用了感知损失。
第二个结论——评估人员是必不可少的。不仅在创建分割掩码阶段,而且在最终的结果验证阶段。最后,我们给用户提供了三张照片:一幅带有缺陷的原始照片,一幅带有缺陷的彩色照片,以及一幅简单的彩色照片,以防缺陷搜索和图像修复算法出错。
星不所在
原文链接: 一、写在前面: 网络架构的设计主要是基于 CNN 结构延伸出来的。主要的改进方式有两点:新神经架构的设计(不同深度,宽度,连接性或者拓扑结构)或设计新的组件(或者层)。下面我们逐个去分析了解。 本文涉及到的论文范围如下图: 二、网络架构的改进 2.1.1 FCN 传统的 CNN 分割,为了对一个像素分类,使用该像素周围的一个图像块作为 CNN 的输入用于训练和预测。缺点很多:比如存储开销大,计算效率低,像素块大小也限制了感知域的大小。基于存在的这些问题,由 Long 等人在 2015 年提出的 FCN 结构,第一个全卷积神经网络的语义分割模型。我们要了解到的是,FCN 是基于 VGG 和 AlexNet 网络上进行预训练,然后将最后两层全连接层改为的卷积层。 FCN 具体处理过程是怎么样的?从 pool1 开始,每个 pool 后图像都会变为上个池化后图像的 1/2。Pool1 为原图的 1/2,以此类推,pool5 后为原图的 1/2^5,conv6,和 conv7 之后的图像保持不变,进行 stride=32 的反卷积,得到 FCN-32s。也就是直接对 pool5 进行 32 倍上采样获得 32 upsampled feature,再对 32 upsampled feature 每个点做 softmax prediction,就可以获得 32*upsampled prediction(分割图)。 FCN 这三个创新点有哪些? 全卷积 :用于解决逐像素的预测问题。通过将基础网络最后面几个全连接层换成卷积层,可实现任意大小的图像输入,并且输入图像大小与输入相对应。 反卷积 :端到端的像素级语义分割需要输出大小和输入图像大小一致。但是传统的 conv+pooling 结构会缩小图片尺寸。基于此作者引入反卷积(deconvolution)操作,对缩小后的特征进行上采样,恢复原始图像大小。 跳跃结构 :语义分割包括语义识别和目标定位。卷积网络的高层特征图可以有效的反应语义信息,而低层特征图可以有效反应目标的位置信息。语义分割任务同时进行语义识别和目标定位。作者提出的跨层连接结构(skip architecture),将低层的目标位置信息和高层语义信息进行融合,以此来提升语义分割性能。在此基础上进行 2 倍采样,2 倍 upsample 之后与 pool4 的像素点相加,进行 stride=16 的 upsample,为此 FCN-16s,重复上面类似的步骤,得到 FCN-8s。 了解到以上信息,应该对 FCN 有个整体的认识了。还有一些细节部分,比如 FCN 采用的简单的 softmax 分类损失函数,采用双线性差值 + 反卷积进行上采样,在微调的时候没有采用类别平衡策略。分割结果来看,FCN-8s>FCN-16s>FCN-32s。也就是说使用多层特征融合有利于提高分割准确性。 2.1.2 SegNet SegNet 主要动机是在场景理解 。它在设计的时候考虑的是预测期间保证内存和计算时间上的效率。其中,SegNet 和 FCN 有很多相似之处,编码网络使用 VGG16 的前 13 层卷积;移除全连接;解码器使用从相应的编码器的 max-pooling indices 进行 upsampling。 对比 SegNet 和 FCN 实现 Decoder 的过程。FCN 是利用双线性插值初始化的反卷积进行上采样。而 SegNet 则是在每次 pooling 时,都存下最大值的位置,在 upsample 时将 input 值直接赋给相应的位置,其他位置的值置零。 2.1.3 U-Net 接下来,我们需要了解的是 U-Net。U-net 网络架构,由收缩路径(contracting path)和扩展路径(expanding path)组成。每一层使用两个 3 乘 3 的 conv kernel,每次卷积都进行 Relu 和 stride=2 的 maxpooling 进行下采样。四次操作后输出结果称之为 feature map。 2 乘 2 的反卷积,上采样,通道数减半,并将左边对称位置的 feature map copy 到右边进行 concate 操作,来融合下采样的浅层位置信息和高层语义信息。合并后在进行 3*3 的卷积操作。最后 output 之前,通道数表示分类的类别产生 N 类分割结果,最后选择出概率值最大的分割结果,作为最后的分割图。 U-Net 中常常会问为什么适用于医学图像这个问题.。首先分析医学影像数据特点:图像语义较为简单,结构较为固定:都是一个固定的器官的成像。而且器官本身结构固定,语义信息没有特别丰富,所以高级语义信息和低级特征都非常重要。(U-net 的 skip connection 可以解决这个问题);数据量少:医学影像的数据较难获取,为了防止过拟合,设计的模型不宜过大;多模态:医学影像是具有多种模态的;可解释性:医生需要进一步指导病灶在哪一层,哪一层的哪个位置,分割结果能求体积么?而且 U-Net 在自然图像分割也取得了不错的效果。 需要注意的一点:Unet 融合浅层信息是 maxpooling 之前还是之后的结果?是 maxpooling 之前的结果。因为 Maxpooling 之后会丢失准确的位置信息。 2.1.4 V-Net V-Net 也就是 3D 的 U-net 的一种版本,3D 卷积,引入残差模块和 U-Net 的框架。整个网络分为压缩路径和非压缩路径,也就是缩小和扩大 feature maps,每个 stage 将特征缩小一半,也就是 128-128-64-32-16-8,通道上为 1-16-32-64-128-256。每个 stage 加入残差学习以加速收敛。 图中的圆圈加交叉代表卷积核为 5 乘 5 乘 5,stride 为 1 的卷积,可知 padding 为 2 乘 2 乘 2 就可以保持特征大小不变。每个 stage 的末尾使用卷积核为 2 乘 2 乘 2,stride 为 2 的卷积,特征大小减小一半(把 2x2 max-pooling 替换成了 2x2 conv.)。整个网络都是使用 keiming 等人提出的 PReLU 非线性单元。网络末尾加一个 1 乘 1 乘 1 的卷积,处理成与输入一样大小的数据,然后接一个 softmax。 而且 V-Net 采用 Dice coefficient 损失函数,如下: Pi 为预测的前景,Gi 为标记的前景,使用这个函数能有效避免类别不平衡的问题。 2.1.5 Dense-UNet Dense U-net(原名:one-hundred layers Tiramisu Network)该架构是由密集连接块(dense block)构建的。该架构由向下过度的两个下采样路径和向上过度的两个上采样路径组成。且同样包含两个水平跳跃连接,下采样 Dense 模块的输出与同水平的上采样 Dense 模块输入的相应特征图拼接在一起。上采样路径和下采样路径的连接模式并不完全相同:下采样路径中,每个密集块外有一条跳跃性连接,从而导致 feature map 数量线性增长,上采样中没有此操作。 主要创新点是融合了 Dense-Net 和 U-Net 网络。 2.1.6 DeepLab 系列网络 DeepLabV1:首次把空洞卷积(dilated convolution) 引入图形分割领域, 融合卷积神经网络和概率图模型:CNN + CRF,提高了分割定位精度。 DeepLabV2:ASPP (扩张空间金字塔池化):CNN+CRF。 DeepLabV3:改进 ASPP,多了 1 乘 1 卷积和全局平均池化(global avg pool);对比了级联和并联空洞卷积的效果。 DeepLabV3+:加入编解码架构思想,添加一个解码器模块来扩展 DeepLabv3;将深度可分离卷积应用于 ASPP 和解码器模块;将改进的 Xception 作为 Backbone。 2.1.7 PSPNet PSPNet 全名是 Pyramid Scene Parsing Network(金字塔场景解析网络)。提出了金字塔池化模块(pyramid pooling module)能够聚合不同区域的上下文信息,从而提高获取全局信息的能力。 输入图像后,使用预训练的带空洞卷积 ResNet 提取特征图。最终的特征映射大小是输入图像的 1/8;在特征图上,我们使用 C 中的金字塔池化模块收集上下文信息。使用 4 层金字塔结构,池化内核覆盖了图像的全部、一半和小部分。他们被融合为全局先验信息;在 c 的最后部分将之前的金字塔特征映射与原始特征映射 concate 起来;在进行卷积,生成 d 中的最终预测图。 总结 基于深度学习的图像语义分割模型大多遵循编码器-解码器体系结构,如 U-Net。近几年的研究成果表明,膨胀卷积和特征金字塔池可以改善 U-Net 风格的网络性能。 参考文献: Deep Semantic Segmentation of Natural and Medical Images: A Review
论文发表一般需要的时间如下: 1、普刊即省级国家级一般安排周期是1到3个月。 2、本科学报的安排周期一般为2到4个月。 3、北大核心以上级别期刊的安排周期
刊期和出刊时间的区别是什么?刊期就是期刊的出版周期,常见的出版周期打击阿斗非常熟悉,半月刊、月刊、双月刊、季刊等,都是常见的期刊出版周期,出刊时间是一个更为具体
关于刊出日期和检索日期怎么查方法如下sci期刊发表时间不一定看得到,哪怕看online时间、见刊时间或检索时间,一般也只能确定具体的年份和月份,甚至只能确定年份
论文发表时间是指文章见刊时间。 首先如果论文发表纯属作者个人爱好,那么发表时间就是文章见刊时间。但是如果论文发表是用来评职称晋升的,就需要特别注意一下了,职称论
从投稿到发表周期大概是7-10个月,审稿在1-2个月。如果是核心期刊的话,周期在12-16个月,核心期刊审稿就得2-4个月。如果是找淘淘论文网发表的话,普刊,从