tebsorflow2.0 语义分割(Oxford-IIIT数据集)(下)

简介: 语义分割是在像素级别上的分类,属于同一类的像素都要被归为一类,因此语义分割是从像素级别来理解图像的。The Oxford-IIIT Pet Dataset是一个宠物图像数据集,包含37种宠物,每种宠物200张左右宠物图片,并同时包含宠物轮廓标注信息。下面就是tensorflow2.0的对该数据集的语义分割实现。本文基于TF2.0 , 谷歌Colab平台。

我们定义的一个上采样的计算块

class Connect(tf.keras.layers.Layer):
    def __init__(self,
               filters=256,
               name='Connect',
               **kwargs):
        super(Connect, self).__init__(name=name, **kwargs)
        self.Conv_Transpose = tf.keras.layers.Convolution2DTranspose(filters=filters,
                                                                    kernel_size=3,
                                                                    strides=2,
                                                                    padding="same",
                                                                    activation="relu")
        self.conv_out = tf.keras.layers.Conv2D(filters=filters,
                                           kernel_size=3,
                                           padding="same",
                                           activation="relu")
    def call(self, inputs):
        x = self.Conv_Transpose(inputs)
        return self.conv_out(x)

为了提取更为一般的特征我们将vgg13网络的"block5_conv3",“block4_conv3”,“block3_conv3”,等不同深度层输出结果进行了跳级(skip)连接。

layer_names = ["block5_conv3",
               "block4_conv3",
               "block3_conv3",
               "block5_pool"]
#得到4个输出
layers_out = [vgg16.get_layer(layer_name).output for layer_name in layer_names] 
multi_out_model = tf.keras.models.Model(inputs = vgg16.input,
                                        outputs = layers_out)
multi_out_model.trainable = False
#创建输入
inputs = tf.keras.layers.Input(shape=(224,224,3))
out_block5_conv3,out_block4_conv3,out_block3_conv3,out = multi_out_model(inputs)
print(out_block5_conv3.shape)
x1 = Connect(512,name="connect_1")(out)
x1 = tf.add(x1,out_block5_conv3)#元素对应相加
x2 = Connect(512,name="connect_2")(x1)
x2 = tf.add(x2,out_block4_conv3)#元素对应相加
x3 = Connect(256,name="connect_3")(x2)
x3 = tf.add(x3,out_block3_conv3)#元素对应相加
x4 = Connect(128,name="connect_4")(x3)
prediction = tf.keras.layers.Convolution2DTranspose(filters=3,
                            kernel_size=3,
                            strides=2,
                            padding="same",
                            activation="softmax")(x4)
model = tf.keras.models.Model(inputs=inputs,outputs=prediction)
model.summary()
Model: "model_5"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_6 (InputLayer)            [(None, 224, 224, 3) 0                                            
__________________________________________________________________________________________________
model_4 (Model)                 [(None, 14, 14, 512) 14714688    input_6[0][0]                    
__________________________________________________________________________________________________
connect_1 (Connect)             (None, 14, 14, 512)  4719616     model_4[1][3]                    
__________________________________________________________________________________________________
tf_op_layer_Add_6 (TensorFlowOp [(None, 14, 14, 512) 0           connect_1[0][0]                  
                                                                 model_4[1][0]                    
__________________________________________________________________________________________________
connect_2 (Connect)             (None, 28, 28, 512)  4719616     tf_op_layer_Add_6[0][0]          
__________________________________________________________________________________________________
tf_op_layer_Add_7 (TensorFlowOp [(None, 28, 28, 512) 0           connect_2[0][0]                  
                                                                 model_4[1][1]                    
__________________________________________________________________________________________________
connect_3 (Connect)             (None, 56, 56, 256)  1769984     tf_op_layer_Add_7[0][0]          
__________________________________________________________________________________________________
tf_op_layer_Add_8 (TensorFlowOp [(None, 56, 56, 256) 0           connect_3[0][0]                  
                                                                 model_4[1][2]                    
__________________________________________________________________________________________________
connect_4 (Connect)             (None, 112, 112, 128 442624      tf_op_layer_Add_8[0][0]          
__________________________________________________________________________________________________
conv2d_transpose_14 (Conv2DTran (None, 224, 224, 3)  3459        connect_4[0][0]                  
==================================================================================================
Total params: 26,369,987
Trainable params: 11,655,299
Non-trainable params: 14,714,688
__________________________________________________________________________________________________
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
        loss="sparse_categorical_crossentropy",
        metrics=["acc"]
       )
steps_per_eooch = train_count//batch_size
validation_steps = test_count//batch_size
history = model.fit(train_ds,
            epochs=3,
            steps_per_epoch=steps_per_eooch,
            validation_data=test_ds,
            validation_steps=validation_steps)
Epoch 1/3
739/739 [==============================] - 293s 396ms/step - loss: 0.3794 - acc: 0.8461 - val_loss: 0.2967 - val_acc: 0.8797
Epoch 2/3
739/739 [==============================] - 292s 395ms/step - loss: 0.2823 - acc: 0.8848 - val_loss: 0.2743 - val_acc: 0.8897
Epoch 3/3
739/739 [==============================] - 292s 395ms/step - loss: 0.2572 - acc: 0.8947 - val_loss: 0.2631 - val_acc: 0.8935

4. 模型评估

从上面的训练中,我们迭代了三次就达到了,达到90%的准确率,从整体说效果是不错的,下面我们可视化一个图像,观察具体的预测效果。

for image,mask in test_ds.take(1):
  pred_mask = model.predict(image)
  pred_mask = tf.argmax(pred_mask,axis=-1)
  pred_mask = pred_mask[...,tf.newaxis]
  plt.figure(figsize=(10,10))
  plt.subplot(1,3,1)
  plt.imshow(tf.keras.preprocessing.image.array_to_img(image[0]))
  plt.subplot(1,3,2)
  plt.imshow(tf.keras.preprocessing.image.array_to_img(mask[0]))
  plt.subplot(1,3,3)
  plt.imshow(tf.keras.preprocessing.image.array_to_img(pred_mask[0]))

相关文章
|
机器学习/深度学习 编解码 PyTorch
DenseNet的应用--语义分割--(DenseASPP )
转载自:https://blog.csdn.net/u011974639 DenseASPP DenseASPP for Semantic Segmentation in Street Scenes 原文地址:DenseASPP 收录:CVPR2018(IEEE Conference on Computer Vision and Pattern Recognition) 代码: PyTorch 简介: 将DeepLab系列中的ASPP和DenseNet中的密集连接相结合,构成了DenseASPP。
5319 1
|
1月前
分割数据集,并对数据集进行预处理
【8月更文挑战第8天】分割数据集,并对数据集进行预处理。
25 1
|
4月前
|
计算机视觉
论文介绍:像素级分类并非语义分割的唯一选择
【5月更文挑战第24天】论文《像素级分类并非语义分割的唯一选择》提出了MaskFormer模型,该模型通过掩模分类简化语义与实例级分割任务,无需修改模型结构、损失函数或训练过程。在ADE20K和COCO数据集上取得优异性能,显示处理大量类别时的优势。MaskFormer结合像素级、Transformer和分割模块,提高效率和泛化能力。掩模分类方法对比边界框匹配更具效率,且MaskFormer的掩模头设计降低计算成本。该方法为语义分割提供新思路,但实际应用与小物体处理仍有待检验。[链接](https://arxiv.org/abs/2107.06278)
41 3
|
11月前
|
移动开发 数据可视化 算法
Pointnet语义分割任务S3DIS数据集
Pointnet语义分割任务S3DIS数据集
365 0
|
机器学习/深度学习 编解码 人工智能
【计算机视觉】MaskFormer:将语义分割和实例分割作为同一任务进行训练
目标检测和实例分割是计算机视觉的基本任务,在从自动驾驶到医学成像的无数应用中发挥着关键作用。目标检测的传统方法中通常利用边界框技术进行对象定位,然后利用逐像素分类为这些本地化实例分配类。但是当处理同一类的重叠对象时,或者在每个图像的对象数量不同的情况下,这些方法通常会出现问题。
【计算机视觉】MaskFormer:将语义分割和实例分割作为同一任务进行训练
算法训练Day41|416. 分割等和子集
算法训练Day41|416. 分割等和子集
|
机器学习/深度学习 人工智能 自然语言处理
MaskFormer:将语义分割和实例分割作为同一任务进行训练
目标检测和实例分割是计算机视觉的基本任务,在从自动驾驶到医学成像的无数应用中发挥着关键作用。目标检测的传统方法中通常利用边界框技术进行对象定位,然后利用逐像素分类为这些本地化实例分配类。但是当处理同一类的重叠对象时,或者在每个图像的对象数量不同的情况下,这些方法通常会出现问题。
4826 0
|
机器学习/深度学习 数据可视化 数据挖掘
字符级CNN分类模型的实现
字符级CNN分类模型的实现
|
机器学习/深度学习 编解码 人工智能
关于语义分割的亿点思考
关于语义分割的亿点思考
228 0
|
机器学习/深度学习 SQL 数据挖掘
论文推荐:CCNet用于语义分割的交叉注意力
CCNet, Transformer递归交叉自注意力,比非局部神经网络更有效。华中科技大学、地平线、ReLER 和伊利诺伊大学香槟分校联合研发
268 0