当前位置:   article > 正文

使用U-Net方法对航空图像进行语义分割

航拍语义分割怎么做

在机器学习中,模型是在各种应用中训练的,特别是在深度学习和图像数据集上。

基于卷积运算的方法在许多领域都进行了研究,尤其是手臂检测、自动驾驶汽车、无人机航拍图像、战争技术。

人眼能够很容易地对所看到的进行分类和区分。然而,在人工智能技术中,这种能力的等价物,即理解图像的问题,属于计算机视觉领域。

顾名思义,计算机视觉是以计算机可以理解的方式引入(分类)图像,下一步是使用不同的方法对这些图像进行操作。

本文介绍了一种分割方法,即U-Net体系结构,该体系结构是为生物医学图像分割而开发的,并包括一个实际项目,该项目使用U-Net对无人机捕获的航空图像进行分割。

efa09ef558034f9f1ebfad95f955ff57.jpeg

目录

1.语义分割

2.U-Net架构

3.教程

3.1. 数据预处理

3.2. 基于U-Net的语义分割

3.3. 基于迁移学习的U-Net语义分割

4.结论

5.参考文献

语义分割

图像是由数字组成的像素矩阵。在图像处理技术中,对这些数字进行一些调整,然后以不同的方式表示图像,并使其适合相关研究或解释。

卷积过程是一种基本的数学像素运算,它提供了从不同角度评估图像的机会。

例如,可以使用滤波器进行图像的边缘检测,也可以通过将图像从RGB格式转换为灰度,从不同角度解释和使用图像。

基于深度学习模型和卷积层,人们对图像内容进行了更全面的研究,如特征提取和分类。

b2504445cc728e0cc7e8d6fc9ab47fd6.png

如上图所示,使用边界框检测图像内容中的对象称为对象检测。

语义分割是一种逐像素的标记操作,它用一个标签来显示图片中相同类型的对象(天空、猫、狗、人、路、车、山、海等),即颜色。

即时分割是指每个实例都被单独标记,通过以不同的颜色显示来分隔每个对象。

如上所述,在这些操作的背景下,针对不同的用途开发了各种彼此不同的CNN模型和复杂模型。PSPNet、DeepLab、LinkNet、U-Net、Mask R-CNN就是其中的一些模型。我们可以说,分割过程是基于机器学习的应用(如自动驾驶汽车)项目的核心。

下面的视频包含实时语义分割过程,该过程比较了人眼视角和PSPNet视角。

https://youtu.be/rB1BmBOkKTw

总之,计算机视觉中的语义分割是一种基于像素的标记方法。如果相同类型的对象用单一颜色表示,则称为语义分割;如果每个对象用唯一的颜色(标签)表示,则称为实例分割。

U-Net体系结构

U-Net是一种特定类型的卷积神经网络架构,2015年在德国弗莱堡大学计算机科学系和生物信号研究中心为生物医学图像(计算机断层扫描、显微图像、MRI扫描等)开发。

“U-Net:生物医学图像分割的卷积网络”这篇文章可以通过这里的链接访问。

https://link.springer.com/chapter/10.1007/978-3-319-24574-4_28

当我们考虑技术思想时,该模型由编码器和解码器组成,编码器(收缩)是下采样(主要是迁移学习中的预训练权重),解码器(提取)是上采样部分,它被命名为U-Net,因为它的方案是U形的,如下图所示。该模型可根据不同的研究进行配置。

4d4f66434686c707d3e706aabbfbd52a.png

在以下教程中,为航空图像的语义分割配置了U-Net模型,如下所示:

  1. # -*- coding: utf-8 -*-
  2. """
  3. @author: Ibrahim Kovan
  4. https://ibrahimkovan.medium.com/
  5. """
  6. from tensorflow.keras.models import Model
  7. from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, concatenate, Conv2DTranspose, BatchNormalization, Dropout, Lambda
  8. from tensorflow.keras import backend as K
  9. def multiclass_unet_architecture(n_classes=2, height=256, width=256, channels=3):
  10.     inputs = Input((height, width, channels))
  11.     #Contraction path
  12.     conv_1 = Conv2D(16, (33), activation='relu', kernel_initializer='he_normal', padding='same')(inputs)
  13.     conv_1 = Dropout(0.1)(conv_1)  
  14.     conv_1 = Conv2D(16, (33), activation='relu', kernel_initializer='he_normal', padding='same')(conv_1)
  15.     pool_1 = MaxPooling2D((22))(conv_1)
  16.     
  17.     conv_2 = Conv2D(32, (33), activation='relu', kernel_initializer='he_normal', padding='same')(pool_1)
  18.     conv_2 = Dropout(0.1)(conv_2)  
  19.     conv_2 = Conv2D(32, (33), activation='relu', kernel_initializer='he_normal', padding='same')(conv_2)
  20.     pool_2 = MaxPooling2D((22))(conv_2)
  21.      
  22.     conv_3 = Conv2D(64, (33), activation='relu', kernel_initializer='he_normal', padding='same')(pool_2)
  23.     conv_3 = Dropout(0.1)(conv_3)
  24.     conv_3 = Conv2D(64, (33), activation='relu', kernel_initializer='he_normal', padding='same')(conv_3)
  25.     pool_3 = MaxPooling2D((22))(conv_3)
  26.      
  27.     conv_4 = Conv2D(128, (33), activation='relu', kernel_initializer='he_normal', padding='same')(pool_3)
  28.     conv_4 = Dropout(0.1)(conv_4)
  29.     conv_4 = Conv2D(128, (33), activation='relu', kernel_initializer='he_normal', padding='same')(conv_4)
  30.     pool_4 = MaxPooling2D(pool_size=(22))(conv_4)
  31.      
  32.     conv_5 = Conv2D(256, (33), activati
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/87745
推荐阅读
相关标签
  

闽ICP备14008679号