首页 > 编程知识 正文

卷积神经网络的应用,空洞卷积对Unet优化作用

时间:2023-05-04 21:26:22 阅读:13598 作者:3331

卷积神经网络(CNN )是介绍传统CNN的强度后,其多层结构可以自动学习特征,并且可以学习多层特征。 浅卷积层感知域小,可以学习一些局部特征; 深卷积层感知域大,可以学习更抽象的特征。 这些抽象特征对物体的方向、大小、位置等的敏感性更低,有助于识别性能的提高。

缺点:抽象特征有助于分类,可以判断一幅图像中的物体属于哪一类。 但是抽象特征由于失去了物体的细节,不能很好地给出物体的具体轮廓,无法指出各像素具体属于哪个物体,难以实现准确的分割。

全体积神经网络(FCN )的提倡目标是从图像级分类进一步扩展到像素级分类(即,从单目标分类到多目标分类)

第一个APP应用程序:图像分割

贡献:端到端,像素到像素,输入大小与输出大小相同

网络模型设计

网络模型上图像中的第一个模型是AlexNet,第一个卷积后,图像大小将减小到输入的1/2,通道数为96; 第二次卷积池化后图像大小再次减小到输入的1/4,通道数成为256; 第三次、第四次……; 第六次是全连通层,经过多次卷积后,将特征图权重一维展开实现全连通权重和全连通,向量为4096x1; 最后使用softmax输出类别。 由于标签有1000个类别,因此最终输出大小必须为1000x1。 对应标签,更新网络参数以回复误差损失。

第二个模型是FCN。 前面的卷积层与AlexNet相同,但区别在于所有连接层。 FCN用辊压层叠替换所有连接层。

对于第一连接区域为[7x7x512]的所有连接层,如果滤波器尺寸为F=7,则整个输出数据为[1x1x4096]。 对于第二个所有连接层,滤波器大小被设置为F=1,并且整个输出数据被设置为[1x1x4096]。 最后的全连接层也同样设定F=1,最终输出可变更为[1x1x1000]最后一层的1000,并根据数据集的类型而变更。

两者的区别:

(从单一分类到多分类,从粗略分类到精细分类)

AlexNet的输出是1000维的矢量,哪个值高表示输入图像属于与该值对应的类别,实现了单一类别的图像分类功能。

FCN的输出是与输入大小相同的图像,FCN可以判断输入图像中的物体有什么种类并准确分类,实现了对多种图像进行分类的功能。

相对于原图像卷积了conv1、pool1的原图像缩小为1/2; 然后,对图像进行了第二次conv2、pool2之后的图像缩小为1/4; 接着对图像继续进行第三次卷积操作conv3、pool3,缩小为原图像的1/8,此时保留pool3的功能图; 继续对图像进行第四次卷积操作conv4、pool4,缩小为原图像的1/16,保留pool4的功能图; 最后对图像进行第五次卷积操作conv5、pool5,缩小到原图像的1/32后,将原CNN操作中的全连接变更为卷积操作conv6、conv7,图像的特征映射数发生变化,但图像传感器

那么,图1和图2有什么关系呢?

图1结构代码:

# the base net n.conv1_1,n.relu1_1=conv_relu(n.data,64,pad=100 ) n.conv1_2,n.relu1_2=conv n.relU2_1=conv_relu ) n.pool 1,128 ) n.conv2_2 128 ) n.pool2=max_pool(n.relU2_2) n.conv3_1 256 ) n.con v3n.relu3_3=conv _ relu (n.relu3_ 2,256 ) n.pool3=max_pool ) n.relu3_3) n.con v4 _ n.relu4_3=conv_relu ) n.relu4_ 2,512 ) ) n.relu5_1=conv _ relu (n.pool 4,512 ) n.conv5_2,n 512 ) n. 512 ) n.pool5=max_pool(n.relu5_3) # fully conv n.fc6,n.rel U6=conv _ relu (n.pool 5,4096,)

drop6 = L.Dropout(n.relu6, dropout_ratio=0.5, in_place=True) n.fc7, n.relu7 = conv_relu(n.drop6, 4096, ks=1, pad=0) n.drop7 = L.Dropout(n.relu7, dropout_ratio=0.5, in_place=True) n.score_fr = L.Convolution(n.drop7, num_output=21, kernel_size=1, pad=0, param=[dict(lr_mult=1, decay_mult=1), dict(lr_mult=2, decay_mult=0)])

在图1后加一个上采样层就是模型FCN-32s:

n.upscore2 =L.Deconvolution(n.score_fr,convolution_param=dict(num_output=21, kernel_size=4, stride=2,bias_term=False),param=[dict(lr_mult=0)])

对pooling4进行融合上采样就是模型FCN-16s:

n.score_pool4 = L.Convolution(n.pool4, num_output=21, kernel_size=1, pad=0,param=[dict(lr_mult=1, decay_mult=1), dict(lr_mult=2, decay_mult=0)])n.score_pool4c = crop(n.score_pool4, n.upscore2)n.fuse_pool4 = L.Eltwise(n.upscore2, n.score_pool4c,operation=P.Eltwise.SUM)n.upscore_pool4 = L.Deconvolution(n.fuse_pool4,convolution_param=dict(num_output=21, kernel_size=4, stride=2,bias_term=False),param=[dict(lr_mult=0)])

对pooling3进行融合上采样就是模型FCN-8s:

n.score_pool3 = L.Convolution(n.pool3, num_output=21, kernel_size=1, pad=0,param=[dict(lr_mult=1, decay_mult=1), dict(lr_mult=2,decay_mult=0)])n.score_pool3c = crop(n.score_pool3, n.upscore_pool4)n.fuse_pool3 = L.Eltwise(n.upscore_pool4, n.score_pool3c,operation=P.Eltwise.SUM)n.upscore8 = L.Deconvolution(n.fuse_pool3,convolution_param=dict(num_output=21, kernel_size=16, stride=8,bias_term=False),param=[dict(lr_mult=0)])

注意:这里融合上采样的步骤还是很有新意的!

优点与不足

1)得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。

2)对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。

官方论文代码:
https://github.com/shelhamer/fcn.berkeleyvision.org
推荐个使用自己的数据训练模型的文章:
https://www.jianshu.com/p/dfcce14c5018
这里有篇博文图画的不错:
https://blog.csdn.net/fate_fjh/article/details/53446630
但是这里有个地方我觉得解释的和原文的官方代码不一样,就是最后融合上采样的步骤与官方论文代码不一样,有待后期讨论!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。