A. 图像分割算法总结
图像处理的很多任务都离不开图像分割。因为图像分割在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的网络结构。并没有完全安装原论文来做。
论文原地址参考: https://arxiv.org/pdf/1707.00243.pdf
整体结构类似于encode和decoder。并没有太仔细的研究,因为基于resent101的结构,在模型体积,速度以及deeplab的分割精度上,都不能满足当前的需求。之前大致总结过计算机视觉的相关知识点,既然目前在讨论移动端模型,那后面就分模块总结下移动端模型的应用落地吧。
由于时间实在有限。这里并没有针对每个算法进行详细的讲解。后续我会从基础的机器学习算法开始总结。
B. 图像软抠图(soft matting) 怎么做算法是什么
function [A]=getLaplacian1(I,consts,epsilon,win_size)
if (~exist('epsilon','var'))
epsilon=0.0000001;
end
if (isempty(epsilon))
epsilon=0.0000001;
end
if (~exist('win_size','var'))
win_size=1;
end
if (isempty(win_size))
win_size=1;
end
neb_size=(win_size*2+1)^2;
[h,w,c]=size(I);
n=h; m=w;
img_size=w*h;
consts=imerode(consts,ones(win_size*2+1));
indsM=reshape([1:img_size],h,w);
tlen=sum(sum(1-consts(win_size+1:end-win_size,win_size+1:end-win_size)))*(neb_size^2);
row_inds=zeros(tlen ,1);
col_inds=zeros(tlen,1);
vals=zeros(tlen,1);
len=0;
for j=1+win_size:w-win_size
for i=win_size+1:h-win_size
if (consts(i,j))
continue
end
win_inds=indsM(i-win_size:i+win_size,j-win_size:j+win_size);
win_inds=win_inds(:);
winI=I(i-win_size:i+win_size,j-win_size:j+win_size,:);
winI=reshape(winI,neb_size,c);
win_mu=mean(winI,1)';
win_var=inv(winI'*winI/neb_size-win_mu*win_mu' +epsilon/neb_size*eye(c));
winI=winI-repmat(win_mu',neb_size,1);
tvals=(1+winI*win_var*winI')/neb_size;
row_inds(1+len:neb_size^2+len)=reshape(repmat(win_inds,1,neb_size),...
neb_size^2,1);
col_inds(1+len:neb_size^2+len)=reshape(repmat(win_inds',neb_size,1),...
neb_size^2,1);
vals(1+len:neb_size^2+len)=tvals(:);
len=len+neb_size^2;
end
end
vals=vals(1:len);
row_inds=row_inds(1:len);
col_inds=col_inds(1:len);
A=sparse(row_inds,col_inds,vals,img_size,img_size);
sumA=sum(A,2);
A=spdiags(sumA(:),0,img_size,img_size)-A;
C. 如何驱除浓雾作业
清除浓雾
清除浓雾(寰宇译︰雾气打散,日文︰きりばらい,英文︰Defog)是第四世代引入的飞行属性招式。[1]
中文名
清除浓雾
外文名
きりばらい
招式附加效果
对战中
令目标的闪避率降低1级。清除场上的雾天气。
只要此招式成功使出,无论是否降低了目标的闪避率,都会移除对方场地上的白雾、光墙、反射壁、极光幕和神秘守护,移除双方场地上的撒菱、隐形岩、毒菱和黏黏网。
如果目标处于替身状态,则虽然闪避率不会降低,但后续效果仍然发生。
清除浓雾一定会命中,除非目标正在使用蓄力的招式并不在场地上。
如果对手被白雾保护,则对手闪避率不会降低,但白雾随之被清除。
对战外
消除雾天气。DPPt
招式变更
第六世代
去除对方场地的撒菱、隐形岩、毒菱和黏黏网 → 双方
一般来说,秋冬早晨雾特别多,为什么呢?我们知道,当空气容纳的水汽达到最大限度时,就达到了饱和。而气温愈高,空气中所能容纳的水汽也愈多。1立方米的空气,气温在4℃时,最多能容纳的水汽量是6.36克;而气温是20℃时,1立方米的空气中最多可以含水汽量是17.30克。如果空气中所含的水汽多于一定温度条件下的饱和水汽量,多余的水汽就会凝结出来,当足够多的水分了与空气中微小的灰尘颗粒结合在一起,同时水分子本身也会相互粘结,就变成小水滴或冰晶。空气中的水汽超过饱和量,凝结成水滴,这主要是气温降低造成的。
如果地面热量散失,温度下降,空气又相当潮湿,那么当它冷却到一定的程度时,空气中一部分的水汽就会凝结出来,变成很多小水滴,悬浮在近地面的空气层里,这就是雾。它和云都是由于温度下降而造成的,雾实际上也可以说是靠近地面的云。
白天温度比较高,空气中可容纳较多的水汽。但是到了夜间,温度下降了,空气中能容纳的水汽的能力减少了,因此,一部分水汽会凝结成为雾。特别在秋冬季节,由于夜长,而且出现无云风小的机会较多,地面散热较夏天更迅速,以致使地面温度急剧下降,这样就使得近地面空气中的水汽,容易在后半夜到早晨达到饱和而凝结成小水珠,形成雾。秋冬的清晨气温最低,便是雾最浓的时刻