go语言可以做网站吗,jquery电子商务网站模板,品牌策划公司取名,网站建设报价图片欣赏Deeplab是图像分割领域非常强大的模型#xff0c;在前面的博文中我们也进行过很多相应项目的开发实践#xff0c;感兴趣的话可以自行移步阅读即可#xff1a;
《基于DeepLabv3Plus开发构建人脸人像分割系统》
《基于DeepLabV3实践路面、桥梁、基建裂缝裂痕分割》
《基于D…Deeplab是图像分割领域非常强大的模型在前面的博文中我们也进行过很多相应项目的开发实践感兴趣的话可以自行移步阅读即可
《基于DeepLabv3Plus开发构建人脸人像分割系统》
《基于DeepLabV3实践路面、桥梁、基建裂缝裂痕分割》
《基于DeepLabV3Plus实现质检划痕图像分割识别系统》
《基于DeepLabV3Plus实现无人机航拍目标分割识别系统》
《python基于DeepLabv3开发构建河道分割识别系统》
《基于DeepLabV3Plus实现焊缝分割识别系统》
《python基于DeeplabV3Plus开发构建裂缝分割识别系统并实现裂缝宽度计算测量》 《AI助力隧道等洞体类场景下水泥基建缺陷检测基于DeeplabV3Plus开发构建洞体场景下壁体建筑缺陷分割系统》
本文的核心目的就是想要基于DeepLabV3Plus来开发构建手机屏幕表面缺陷图像智能分割识别系统助力工业生产流程上的智能化首先看下实例效果 在图像分割领域中有不少优秀出色的网络DeepLab系列就是其中非常经典的分支之一在之前的很多项目中陆续都已经有接触到了在处理图像分割中表现出色。
DeepLabV3Plus是一种用于语义分割任务的深度学习模型它是DeepLab系列模型的一种改进版本。下面详细解释DeepLabV3Plus的原理
引入空洞卷积Dilated ConvolutionDeepLabV3Plus利用空洞卷积来扩大感受野以更好地捕捉图像中的上下文信息。传统的卷积操作只关注局部区域而空洞卷积通过在卷积核中引入间隔或称为膨胀率使得卷积核能够跳过一些像素点从而扩大感受野。
多尺度金字塔池化Multi-scale Atrous Spatial Pyramid Pooling, ASPPDeepLabV3Plus使用ASPP模块来处理不同尺度的信息。ASPP模块使用多个并行的空洞卷积分支每个分支具有不同的膨胀率以捕捉来自不同感受野的特征。最后将这些特征进行汇总并进行融合以生成更丰富的特征表示。
融合低级特征为了结合低层次的细节特征DeepLabV3Plus引入了一个编码器-解码器结构。在编码器部分通过堆叠多个残差块和降采样操作提取高层次的语义特征。然而这会导致空间信息的丢失。因此在解码器部分使用反卷积或上采样操作来恢复特征图的分辨率并与对应的低级特征进行融合。
融合注意力机制为了进一步提升融合的效果DeepLabV3Plus引入了注意力机制。该机制利用辅助监督信号和空间注意力模块自适应地对不同的特征图进行加权融合。这样可以使网络更加关注重要的特征区域提升语义分割的准确性。
DeepLabV3Plus通过引入空洞卷积、多尺度金字塔池化、融合低级特征和注意力机制等改进提升了语义分割任务的性能。它能够准确地标记图像中每个像素的类别从而在许多计算机视觉领域如图像分割、自动驾驶等中发挥着重要作用。
整体网络结构图如下所示 接下来看下数据集 共包含油污、划痕和斑点这三种常见的手机屏幕缺损类型。
DeepLabV3Plus核心实现如下
import tensorflow as tf
from keras import backend as K
from keras.layers import (Activation,BatchNormalization,Concatenate,Conv2D,DepthwiseConv2D,Dropout,GlobalAveragePooling2D,Input,Lambda,Softmax,ZeroPadding2D,
)
from keras.models import Model
from modules.mobilenet import mobilenetV2
from modules.Xception import Xceptiondef SepConv_BN(x,filters,prefix,stride1,kernel_size3,rate1,depth_activationFalse,epsilon1e-3,
):if stride 1:depth_padding sameelse:kernel_size_effective kernel_size (kernel_size - 1) * (rate - 1)pad_total kernel_size_effective - 1pad_beg pad_total // 2pad_end pad_total - pad_begx ZeroPadding2D((pad_beg, pad_end))(x)depth_padding validif not depth_activation:x Activation(relu)(x)x DepthwiseConv2D((kernel_size, kernel_size),strides(stride, stride),dilation_rate(rate, rate),paddingdepth_padding,use_biasFalse,)(x)x BatchNormalization(epsilonepsilon)(x)if depth_activation:x Activation(relu)(x)x Conv2D(filters, (1, 1), paddingsame, use_biasFalse)(x)x BatchNormalization(epsilonepsilon)(x)if depth_activation:x Activation(relu)(x)return xdef Deeplabv3(input_shape, num_classes, alpha1.0, backbonemobilenet, downsample_factor16
):img_input Input(shapeinput_shape)x, atrous_rates, skip1 MobileNet(img_input, alpha, downsample_factordownsample_factor)size_before tf.keras.backend.int_shape(x)b0 Conv2D(256, (1, 1), paddingsame, use_biasFalse)(x)b0 BatchNormalization(epsilon1e-5)(b0)b0 Activation(relu)(b0)b1 SepConv_BN(x, 256, A!, rateatrous_rates[0], depth_activationTrue, epsilon1e-5)b2 SepConv_BN(x, 256, A2, rateatrous_rates[1], depth_activationTrue, epsilon1e-5)b3 SepConv_BN(x, 256, A3, rateatrous_rates[2], depth_activationTrue, epsilon1e-5)b4 GlobalAveragePooling2D()(x)b4 Lambda(lambda x: K.expand_dims(x, 1))(b4)b4 Lambda(lambda x: K.expand_dims(x, 1))(b4)b4 Conv2D(256, (1, 1), paddingsame, use_biasFalse)(b4)b4 BatchNormalization(epsilon1e-5)(b4)b4 Activation(relu)(b4)b4 Lambda(lambda x: tf.image.resize_images(x, size_before[1:3], align_cornersTrue))(b4)x Concatenate()([b4, b0, b1, b2, b3])x Conv2D(256, (1, 1), paddingsame, use_biasFalse)(x)x BatchNormalization(epsilon1e-5)(x)x Activation(relu)(x)x Dropout(0.1)(x)skip_size tf.keras.backend.int_shape(skip1)x Lambda(lambda xx: tf.image.resize_images(xx, skip_size[1:3], align_cornersTrue))(x)dec_skip1 Conv2D(48, (1, 1), paddingsame, use_biasFalse)(skip1)dec_skip1 BatchNormalization(epsilon1e-5)(dec_skip1)dec_skip1 Activation(tf.nn.relu)(dec_skip1)x Concatenate()([x, dec_skip1])x SepConv_BN(x, 256, DC0, depth_activationTrue, epsilon1e-5)x SepConv_BN(x, 256, DC1, depth_activationTrue, epsilon1e-5)size_before3 tf.keras.backend.int_shape(img_input)x Conv2D(num_classes, (1, 1), paddingsame)(x)x Lambda(lambda xx: tf.image.resize_images(xx, size_before3[1:3], align_cornersTrue))(x)x Softmax()(x)model Model(img_input, x)return model基于轻量级的MobileNet作为骨干网络来实现特征的提取即使是在算力较弱的设备下也可以完成训练。在自己的项目中也可以直接整合集成使用。
训练完成后对整体进行可视化核心实现如下
from matplotlib import pyplot as pltwith open(train.txt) as f:train_list [float(one) for one in f.readlines() if one.strip()]
with open(val.txt) as f:val_list [float(one) for one in f.readlines() if one.strip()]
print(train_list_length: , len(train_list))
print(val_list_length: , len(val_list))plt.clf()
plt.figure(figsize(8, 6))
plt.plot(train_list, labelTrain Loss Cruve, cg)
plt.plot(val_list, labelVal Loss Cruve, cb)
plt.title(Model Loss Cruve)
plt.savefig(loss.png)
结果如下所示
这里分为两个阶段进行训练首先是冷冻训练主要是基于预训练权重来进行训练如下 这一阶段大部分参数被冻结模型的整体损失比较高完成预热之后解冻模型参数开启全量训练如下所示 这里为了方便使用模型开发了专用的可视化系统界面实例推理计算效果如下所示 直观来看效果还是不错的有兴趣的话都是可以自己动手实践一下的。