UNet深度学习实战遥感图像语义分割
UNet遥感航拍图像语义分割
文章目录
- 研究背景
- 一、效果演示
- 环境配置安装教程与资源说明
- 二、整体流程
- 2.1 数据准备
- 2.2 模型设计
- 2.3 模型训练
- 2.4 模型评估
- 三、U-Net图像分割原理
- 3.1 概述
- 3.2 U-Net原理
- 3.2.1 U-Net的基本结构
- 编码器(收缩路径)
- 解码器(扩展路径)
- 输出层
- 3.2.2 工作原理
- 编码阶段
- 解码阶段
- 3.2.3 跳跃连接的作用
- 3.2.4 损失函数和优化
- 3.3 U-Net具体实现
- 3.3.1 编码器
- 3.3.2 解码器
- 3.3.3 U-Net
- 3.4 U-Net模型评估
- 3.4.1 定量评估
- 3.4.2 计算评估指标
- 3.6 U-Net语义分割界面设计
- 3.7 U-Net分割预测
- 参考文献
- 结束语
研究背景
一、遥感航拍技术的广泛应用与数据增长
随着航空航天技术以及传感器技术的飞速发展,遥感航拍已成为获取地球表面信息的重要手段。高分辨率的遥感航拍设备能够从高空获取大面积的地球表面图像,涵盖城市、乡村、森林、水域等各类区域。这些图像广泛应用于众多领域,如地理信息系统(GIS)数据更新、城市规划与管理、农业监测、生态环境评估以及灾害应急响应等。例如,在城市规划中,通过定期的遥感航拍可获取城市建筑、道路、绿地等的分布与变化情况,为城市的发展布局提供数据支持;在农业领域,利用遥感航拍图像能够监测农作物的生长状况、病虫害分布以及土地利用类型等信息,助力精准农业的实施。
二、实际应用对精准信息提取的迫切需求
城市规划与管理:在快速城市化进程中,城市规模不断扩张,城市结构日益复杂。城市规划者需要准确了解城市中各类地物的分布与变化,如建筑物的类型、占地面积、高度,道路的宽度、连通性,以及绿地、水体的分布范围等。通过对遥感航拍图像进行语义分割,能够自动识别并分割出不同类别的地物,为城市规划提供详细、准确的基础数据,帮助规划者制定合理的城市发展策略,优化城市空间布局,提高城市管理效率。例如,在新建城区的规划中,通过分析历史遥感航拍图像的语义分割结果,能够合理规划交通线路,避免重复建设,同时更好地保护生态环境。
农业与资源监测:农业生产依赖于对土地资源、农作物生长状况的实时监测。语义分割技术可以在遥感航拍图像中准确区分不同农作物类型、识别农田边界、监测农作物的生长健康状态以及估算农作物产量等。对于资源监测,能够精准识别森林、矿产资源的分布范围,及时发现资源的变化情况,为资源的合理开发与保护提供依据。例如,在森林资源监测中,通过语义分割可以快速统计森林覆盖面积的变化,及时发现森林砍伐、病虫害等问题,采取相应的保护措施。
三、语义分割技术发展为研究提供基础
语义分割作为计算机视觉领域的重要研究方向,近年来取得了显著进展。深度学习算法的兴起,尤其是卷积神经网络(CNN)及其变体的广泛应用,极大地推动了语义分割技术的发展。CNN 能够自动从大量图像数据中学习到丰富的特征表示,通过构建不同的网络结构,如编码器 - 解码器结构(如 U - Net)、基于空洞卷积的结构(如 DeepLab 系列)等,实现对图像中每个像素的分类,从而完成语义分割任务。这些先进的语义分割技术为遥感航拍图像的处理提供了强大的工具。同时,相关的开源框架和工具(如 TensorFlow、PyTorch 等深度学习框架,以及众多基于这些框架开发的语义分割库)的出现,降低了研究和开发的门槛,使得更多的科研人员和开发者能够投身于遥感航拍图像语义分割的研究中,促进了该领域的快速发展。
一、效果演示
本文构建的遥感图像语义分割采用U-Net模型,PyQt5构建界面交互。
环境配置安装教程与资源说明
离线安装配置文件说明
二、整体流程
U-Net是一种广泛应用于图像分割的深度学习网络,尤其在肺部图像分割中表现出色。以下是U-Net用于肺部图像分割的整体技术流程:
2.1 数据准备
- 数据收集:获取包含肺部图像的医学影像数据集,例如CT或X光图像。数据集应包括原始影像和相应的标注图(ground truth masks)。
- 数据预处理:
- 图像归一化:对图像进行归一化处理,将像素值缩放到0到1的范围内。
- 图像裁剪和调整大小:根据需要裁剪或调整图像大小,以适应U-Net输入层的要求。
- 数据增强:通过旋转、平移、翻转等方法扩充数据集,以增加模型的鲁棒性。
2.2 模型设计
- U-Net结构:
- 编码器(下采样路径):一系列卷积层和池化层,用于提取图像特征并逐步降低空间维度。
- 解码器(上采样路径):一系列反卷积层(或上采样层)和卷积层,用于恢复图像的空间分辨率。
- 跳跃连接:在编码器和解码器之间建立跳跃连接,将编码器中的特征直接传递到解码器相应层,帮助恢复细节信息。
2.3 模型训练
- 损失函数:
- 常用的损失函数包括二值交叉熵损失(Binary Cross-Entropy Loss)和Dice损失(Dice Loss),用于衡量预测分割与真实分割之间的差异。
- 优化器:
- 常用的优化器有Adam、SGD等,用于调整模型的权重以最小化损失函数。
- 训练过程:
- 分割数据集为训练集和验证集。
- 进行多轮(epoch)迭代训练,每轮中通过前向传播和反向传播更新模型参数。
- 在每个epoch结束后评估模型在验证集上的表现,调整超参数以优化模型。
2.4 模型评估
- 评估指标:
- Dice系数:衡量预测结果与真实结果的重叠程度。
- 交并比(IoU):衡量预测结果与真实结果的交集与并集的比值。
- 精准率和召回率:衡量模型的准确性和召回能力。
三、U-Net图像分割原理
3.1 概述
U-net是一种图像分割技术,主要用于图像分割任务。这些特点使U-net在医学影像领域具有很高的实用性,并导致广泛采用U-net作为医学成像中分割任务的主要工具。U-net在几乎所有主要的成像方式中都得到了广泛的应用,从CT扫描、MRI到X光检查和显微镜。此外,虽然U-net在很大程度上是一种细分工具,但也有一些例子U-net在其他应用中的使用。鉴于U-net的潜力仍在增长,这部叙事文学综述分析了U-net体系结构的众多发展和突破,并提供了对近期趋势的观察。我们还讨论了在深度学习和讨论这些工具如何促进U-net。
得益于计算机视觉深度学习的最新进展在过去十年中,深度学习越来越受到重视用于医学图像的分析。而使用计算机视觉的深度学习在中国得到了快速发展在许多不同的领域,它仍然面临着一些挑战医学影像领域。有很多突破多年来克服这些问题的技术挑战,新的研究不断导致开发更新颖和创新的方法。其中U-net是一种在国内广泛采用的深度学习技术医学影像学界。
U-net是一种主要设计的神经网络结构用于图像分割[1]。U网的基本结构架构由两条路径组成。第一条路是收缩路径,也称为编码器或分析路径,类似于常规卷积网络和提供分类信息。第二个是扩展路径,也称为解码器或合成路径,由上卷积和与收缩路径的特征。这种扩展允许网络学习本地化的分类信息。此外,扩展路径还增加了输出的分辨率,然后可以传递到最终卷积层创建一个完全分割的图像。这个由此产生的网络几乎是对称的,给它一个u形形状大多数人执行的主要规范任务卷积网络是将整个图像分类为单一标签。然而,分类网络无法提供像素级上下文信息,这在医学图像分析中是至关重要的。
3.2 U-Net原理
U-Net是一种卷积神经网络(CNN),专门设计用于生物医学图像分割任务。它的结构特点使其能够有效地处理小数据集并产生精确的分割结果。以下是U-Net框架的详细原理说明:
3.2.1 U-Net的基本结构
U-Net的结构可以分为两个主要部分:编码器(收缩路径)和解码器(扩展路径),中间通过跳跃连接进行特征融合。
编码器(收缩路径)
- 卷积层:每个卷积层使用小的3x3卷积核进行卷积操作,并且每个卷积操作后跟随一个ReLU激活函数。
- 池化层:通过2x2最大池化层对特征图进行下采样,减少特征图的尺寸,同时保留重要特征。
- 多层结构:编码器由多层卷积层和池化层堆叠而成,每下采样一次,特征图的宽度和高度减半,深度加倍。
解码器(扩展路径)
- 上采样层:通过反卷积(转置卷积)或上采样操作,将特征图尺寸还原,同时恢复空间分辨率。
- 卷积层:每个上采样层后跟随两个3x3卷积层和ReLU激活函数,逐步细化特征图。
- 跳跃连接:从编码器的每个层直接连接到解码器相应层,将编码器中提取的高分辨率特征图与解码器中的特征图拼接(concatenate),帮助恢复细节信息。
输出层
- 最后一个卷积层使用1x1卷积核,减少特征图的深度到目标类数(对于二分类任务,输出一个通道),并应用Sigmoid或Softmax激活函数得到每个像素的分类概率。
3.2.2 工作原理
U-Net通过多层卷积和池化操作提取图像的多尺度特征,并通过上采样和跳跃连接逐步恢复图像的空间分辨率,从而实现精确的像素级别分类。
编码阶段
- 输入图像通过一系列卷积和池化操作提取不同尺度的特征。每经过一次池化,图像尺寸减半,特征通道数加倍,从而在不同层次捕捉到图像的不同特征。
- 编码阶段的最后输出一个低分辨率、高维度的特征图,包含图像的全局上下文信息。
解码阶段
- 通过上采样操作逐步恢复特征图的原始尺寸。每一次上采样后,通过跳跃连接将编码器相应层的高分辨率特征图拼接到当前特征图中,融合不同尺度的信息。
- 这种方式不仅能够利用全局上下文信息,还能保留局部细节特征,提升分割精度。
3.2.3 跳跃连接的作用
跳跃连接(skip connections)是U-Net的重要特性之一。它将编码器每一层的特征图直接传递到解码器相应层,避免了信息丢失,并使得模型能够更好地恢复图像细节。具体作用包括:
- 信息保留:确保细粒度特征在编码过程中不会被完全丢失。
- 梯度传播:有助于缓解梯度消失问题,使得模型更容易训练。
- 特征融合:结合不同层次的特征,增强模型对复杂边界和小目标的分割能力。
3.2.4 损失函数和优化
- 损失函数:U-Net通常使用交叉熵损失函数或Dice系数损失函数,具体选择取决于任务和数据特点。对于二分类任务,常用二值交叉熵;对于多分类任务,使用多类交叉熵。
- 优化器:常用的优化器包括Adam、SGD等。Adam优化器具有较快的收敛速度和稳定性,因此在U-Net中较为常用。
3.3 U-Net具体实现
3.3.1 编码器
class encoder(nn.Module):
def __init__(self, in_channels, out_channels):
super(encoder, self).__init__()
self.down_conv = nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True),
nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True)
)
# ceil_mode参数取整的时候向上取整,该参数默认为False表示取整的时候向下取整
self.pool = nn.MaxPool2d(kernel_size=2, ceil_mode=True)
def forward(self, x):
out = self.down_conv(x)
out_pool = self.pool(out)
return out, out_pool
3.3.2 解码器
class decoder(nn.Module):
def __init__(self, in_channels, out_channels):
super(decoder, self).__init__()
# 反卷积
self.up = nn.ConvTranspose2d(in_channels, out_channels, kernel_size=2, stride=2)
self.up_conv = nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True),
nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True)
)
def forward(self, x_copy, x, interpolate=True):
out = self.up(x)
if interpolate:
# 迭代代替填充, 取得更好的结果
out = F.interpolate(out, size=(x_copy.size(2), x_copy.size(3)),
mode="bilinear", align_corners=True
)
else:
# 如果填充物体积大小不同
diffY = x_copy.size()[2] - x.size()[2]
diffX = x_copy.size()[3] - x.size()[3]
out = F.pad(out, (diffX // 2, diffX - diffX // 2, diffY, diffY - diffY // 2))
# 连接
out = torch.cat([x_copy, out], dim=1)
out_conv = self.up_conv(out)
return out_conv
3.3.3 U-Net
class BaseModel(nn.Module):
def __init__(self):
super(BaseModel, self).__init__()
self.logger = logging.getLogger(self.__class__.__name__)
def forward(self):
raise NotImplementedError
def summary(self):
model_parameters = filter(lambda p: p.requires_grad, self.parameters())
nbr_params = sum([np.prod(p.size()) for p in model_parameters])
self.logger.info(f'Nbr of trainable parametersL {nbr_params}')
def __str__(self):
model_parameters = filter(lambda p: p.requires_grad, self.parameters())
nbr_params = sum([np.prod(p.size()) for p in model_parameters])
return super(BaseModel, self).__str__() + f"\nNbr of trainable parameters: {nbr_params}"
class UNet(BaseModel):
def __init__(self, num_classes, in_channels=1, freeze_bn=False, **_):
super(UNet, self).__init__()
self.down1 = encoder(in_channels, 64)
self.down2 = encoder(64, 128)
self.down3 = encoder(128, 256)
self.down4 = encoder(256, 512)
self.middle_conv = nn.Sequential(
nn.Conv2d(512, 1024, kernel_size=3, padding=1),
nn.BatchNorm2d(1024),
nn.ReLU(inplace=True),
nn.Conv2d(1024, 1024, kernel_size=3, padding=1),
nn.ReLU(inplace=True)
)
self.up1 = decoder(1024, 512)
self.up2 = decoder(512, 256)
self.up3 = decoder(256, 128)
self.up4 = decoder(128, 64)
self.final_conv = nn.Conv2d(64, num_classes, kernel_size=1)
self._initalize_weights()
if freeze_bn:
self.freeze_bn()
def _initalize_weights(self):
for module in self.modules():
if isinstance(module, nn.Conv2d) or isinstance(module, nn.Linear):
nn.init.kaiming_normal_(module.weight)
if module.bias is not None:
module.bias.data.zero_()
elif isinstance(module, nn.BatchNorm2d):
module.weight.data.fill_(1)
module.bias.data.zero_()
def forward(self, x):
x1, x = self.down1(x)
x2, x = self.down2(x)
x3, x = self.down3(x)
x4, x = self.down4(x)
x = self.middle_conv(x)
x = self.up1(x4, x)
x = self.up2(x3, x)
x = self.up3(x2, x)
x = self.up4(x1, x)
x = self.final_conv(x)
return x
def get_backbone_params(self):
# There is no backbone for unet, all the parameters are trained from scratch
return []
def get_decoder_params(self):
return self.parameters()
def freeze_bn(self):
for module in self.modules():
if isinstance(module, nn.BatchNorm2d):
module.eval()
3.4 U-Net模型评估
U-Net模型的评估是确保其在图像分割任务中有效性和鲁棒性的重要步骤。评估通常包括定量评估指标的计算和定性结果的分析。以下是详细的U-Net评估流程:
3.4.1 定量评估
3.4.2 计算评估指标
在模型训练和验证阶段,可以使用这些指标来评估模型性能。在Keras中可以自定义评估函数来计算这些指标:
import numpy as np
from sklearn.metrics import f1_score, jaccard_score
# Example function to calculate Dice coefficient
def dice_coefficient(y_true, y_pred):
smooth = 1e-6
y_true_f = np.ravel(y_true)
y_pred_f = np.ravel(y_pred)
intersection = np.sum(y_true_f * y_pred_f)
return (2. * intersection + smooth) / (np.sum(y_true_f) + np.sum(y_pred_f) + smooth)
# Calculate Dice coefficient for validation set
dice_scores = [dice_coefficient(true, pred) for true, pred in zip(val_masks, val_predictions)]
average_dice = np.mean(dice_scores)
# Calculate IoU for validation set
iou_scores = [jaccard_score(true.flatten(), pred.flatten()) for true, pred in zip(val_masks, val_predictions)]
average_iou = np.mean(iou_scores)
# Calculate F1 score for validation set
f1_scores = [f1_score(true.flatten(), pred.flatten()) for true, pred in zip(val_masks, val_predictions)]
average_f1 = np.mean(f1_scores)
print(f'Average Dice Coefficient: {average_dice}')
print(f'Average IoU: {average_iou}')
print(f'Average F1 Score: {average_f1}')
3.6 U-Net语义分割界面设计
3.7 U-Net分割预测
def predict(image_file_name):
im = np.asarray(Image.open(image_file_name))
im = im.reshape((Height, Width, Img_channel))
im = transform(im).float().cuda()
im = im.reshape((1,Img_channel,Height,Width))
output = model(im)
_, pred = output.max(1)
pred = pred.view(Height, Width)
mask_im = pred.cpu().numpy().astype(np.uint8)
w,h = mask_im.shape
print(w,h)
for i in range(0, w):
for j in range(0, h):
if mask_im[i, j] == 1:
# print('xxx')
mask_im[i,j] = 255
return mask_im
参考文献
[1] 基于改进UNet网络的室内运动目标阴影分割[J]. 刘莹;杨硕.计算机系统应用,2022(12)
[2] 基于SegNet与三维点云聚类的大田杨树苗叶片分割方法[J]. 胡春华;刘炫;计铭杰;李羽江;李萍萍.农业机械学报,2022(06)
[3] 基于DeepLab v3+的葡萄叶片分割算法[J]. 李余康;翟长远;王秀;袁洪波;张玮;赵春江.农机化研究,2022(02)
[4] 基于U-Net的玉米叶部病斑分割算法[J]. 刘永波;胡亮;曹艳;唐江云;雷波.中国农学通报,2021(05)
[5] 针对TT100K交通标志数据集的扩增策略[J]. 龚祎垄;吴勇;陈铭峥.福建电脑,2019(11)
[6] 深度学习自适应学习率算法研究[J]. 蒋文斌;彭晶;叶阁焰.华中科技大学学报(自然科学版),2019(05)
[7] 基于Lab空间和K-Means聚类的叶片分割算法研究[J]. 邹秋霞;杨林楠;彭琳;郑强.农机化研究,2015(09)
[8] 复杂背景下植物叶片的彩色图像分割[J]. 王红君;陈伟;赵辉;岳友军.中国农机化学报,2013(02)
[9] 田间枣树叶片复杂目标图像综合分割方法[J]. 董金勇;王建仑;李道亮;何建磊;王永彬.农业机械学报,2011(01)
[10] 基于Mean-shift和提升小波变换的棉花叶片边缘的图像检测[J]. 李寒;王库;边昊一.农业工程学报,2010(S1)
[11] Image Segmentation Method for Sweetgum Leaf Spots Based on an Improved DeeplabV3+ Network[J]. Cai Maodong;Yi Xiaomei;Wang Guoying;Mo Lufeng;Wu Peng;Mwanza Christine;Kapula Kasanda Ernest.Forests,2022
[12] A MobileNetV2-SENet-based method for identifying fish school feeding behavior[J]. Zhang Lu;Wang Jianping;Li Beibei;Liu Yiran;Zhang Hongxu;Duan Qingling.Aquacultural Engineering,2022
[13] LEMOXINET: Lite ensemble MobileNetV2 and Xception models to predict plant disease[J]. Sutaji Deni;Yıldız Oktay.Ecological Informatics,2022
[14] A bone segmentation method based on Multi-scale features fuse U2Net and improved dice loss in CT image process[J]. Liu Tao;Lu Yonghua;Zhang Yu;Hu Jiahui;Gao Cheng.Biomedical Signal Processing and Control,2022
[15] A Framework Using Binary Cross Entropy - Gradient Boost Hybrid Ensemble Classifier for Imbalanced Data Classification[J]. Isabella S.J.;Srinivasan S.;Suseendran G…Webology,2021
[16] GhostNet: More features from cheap operations[J]. Han K.;Wang Y.;Tian Q.;Guo J.;Xu C.;Xu C…Proceedings of the IEEE Computer Society Conference on Computer Vision and Pattern Recognition,2020
[17] Accuracy and sensitivity of radium mass balances in assessing karstic submarine groundwater discharge in the stratified Calanque of Port-Miou (Mediterranean Sea)[J]. Christelle Claude;;Sabine Cockenpot;;Bruno Arfib;;Samuel Meulé;;Olivier Radakovitch.Journal of Hydrology,2019
[18] ImageNet classification with deep convolutional neural networks[J]. Alex Krizhevsky;;Ilya Sutskever;;Geoffrey E. Hinton.Communications of the ACM,2017
[19] Improving Text Classification Performance Using PCA and Recall-Precision Criteria[J]. M. Zahedi;;A. Ghanbari Sorkhi.Arabian journal for science and engineering,2013
[20] LabelMe: A Database and Web-Based Tool for Image Annotation[J]. Bryan C. Russell;;Antonio Torralba;;Kevin P. Murphy;;William T. Freeman.International Journal of Computer Vision,2008
结束语
由于博主能力有限,本篇文章中提及的方法,也难免会有疏漏之处,希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。