实战| 使用深度学习分割和计算水体和农田面积【Pytorch附源码】

《博主简介》

小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。

👍感谢小伙伴们点赞、关注!

《------往期经典推荐------》

一、AI应用软件开发实战专栏【链接】

项目名称 项目名称
1.【人脸识别与管理系统开发 2.【车牌识别与自动收费管理系统开发
3.【手势识别系统开发 4.【人脸面部活体检测系统开发
5.【图片风格快速迁移软件开发 6.【人脸表表情识别系统
7.【YOLOv8多目标识别与自动标注软件开发 8.【基于YOLOv8深度学习的行人跌倒检测系统
9.【基于YOLOv8深度学习的PCB板缺陷检测系统 10.【基于YOLOv8深度学习的生活垃圾分类目标检测系统
11.【基于YOLOv8深度学习的安全帽目标检测系统 12.【基于YOLOv8深度学习的120种犬类检测与识别系统
13.【基于YOLOv8深度学习的路面坑洞检测系统 14.【基于YOLOv8深度学习的火焰烟雾检测系统
15.【基于YOLOv8深度学习的钢材表面缺陷检测系统 16.【基于YOLOv8深度学习的舰船目标分类检测系统
17.【基于YOLOv8深度学习的西红柿成熟度检测系统 18.【基于YOLOv8深度学习的血细胞检测与计数系统
19.【基于YOLOv8深度学习的吸烟/抽烟行为检测系统 20.【基于YOLOv8深度学习的水稻害虫检测与识别系统
21.【基于YOLOv8深度学习的高精度车辆行人检测与计数系统 22.【基于YOLOv8深度学习的路面标志线检测与识别系统
23.【基于YOLOv8深度学习的智能小麦害虫检测识别系统 24.【基于YOLOv8深度学习的智能玉米害虫检测识别系统
25.【基于YOLOv8深度学习的200种鸟类智能检测与识别系统 26.【基于YOLOv8深度学习的45种交通标志智能检测与识别系统
27.【基于YOLOv8深度学习的人脸面部表情识别系统 28.【基于YOLOv8深度学习的苹果叶片病害智能诊断系统
29.【基于YOLOv8深度学习的智能肺炎诊断系统 30.【基于YOLOv8深度学习的葡萄簇目标检测系统
31.【基于YOLOv8深度学习的100种中草药智能识别系统 32.【基于YOLOv8深度学习的102种花卉智能识别系统
33.【基于YOLOv8深度学习的100种蝴蝶智能识别系统 34.【基于YOLOv8深度学习的水稻叶片病害智能诊断系统
35.【基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统 36.【基于YOLOv8深度学习的智能草莓病害检测与分割系统
37.【基于YOLOv8深度学习的复杂场景下船舶目标检测系统 38.【基于YOLOv8深度学习的农作物幼苗与杂草检测系统
39.【基于YOLOv8深度学习的智能道路裂缝检测与分析系统 40.【基于YOLOv8深度学习的葡萄病害智能诊断与防治系统
41.【基于YOLOv8深度学习的遥感地理空间物体检测系统 42.【基于YOLOv8深度学习的无人机视角地面物体检测系统
43.【基于YOLOv8深度学习的木薯病害智能诊断与防治系统 44.【基于YOLOv8深度学习的野外火焰烟雾检测系统
45.【基于YOLOv8深度学习的脑肿瘤智能检测系统 46.【基于YOLOv8深度学习的玉米叶片病害智能诊断与防治系统
47.【基于YOLOv8深度学习的橙子病害智能诊断与防治系统 48.【基于深度学习的车辆检测追踪与流量计数系统
49.【基于深度学习的行人检测追踪与双向流量计数系统 50.【基于深度学习的反光衣检测与预警系统
51.【基于深度学习的危险区域人员闯入检测与报警系统 52.【基于深度学习的高密度人脸智能检测与统计系统
53.【基于深度学习的CT扫描图像肾结石智能检测系统 54.【基于深度学习的水果智能检测系统
55.【基于深度学习的水果质量好坏智能检测系统 56.【基于深度学习的蔬菜目标检测与识别系统
57.【基于深度学习的非机动车驾驶员头盔检测系统 58.【太基于深度学习的阳能电池板检测与分析系统
59.【基于深度学习的工业螺栓螺母检测 60.【基于深度学习的金属焊缝缺陷检测系统
61.【基于深度学习的链条缺陷检测与识别系统 62.【基于深度学习的交通信号灯检测识别
63.【基于深度学习的草莓成熟度检测与识别系统 64.【基于深度学习的水下海生物检测识别系统
65.【基于深度学习的道路交通事故检测识别系统 66.【基于深度学习的安检X光危险品检测与识别系统
67.【基于深度学习的农作物类别检测与识别系统 68.【基于深度学习的危险驾驶行为检测识别系统
69.【基于深度学习的维修工具检测识别系统

二、机器学习实战专栏【链接】 ,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~

《------正文------》

目录

引言

在本文中,我们将介绍如何使用深度学习从卫星图像中分离水体(如湖泊和河流)和农田(植物生长的地方)。我们还将估计这些区域的面积,比如水体或农田覆盖了多少英亩。本文将包括PyTorch代码,并将以简单的步骤为初学者进行解释说明。

步骤1:收集图像(GeoTIFF格式)

我们需要收集卫星图像,这些图像通常以GeoTIFF格式存储。这些图像不仅仅是普通的照片-它们还存储了地理信息,这有助于我们以后测量面积。

您可以从以下位置获取GeoTIFF图像:

  • Google Earth:用于查看地图。
  • Sentinel-2或Landsat:用于高质量的卫星图像。

步骤2:将GeoTIFF转换为常规图像

由于我们的深度学习模型不需要存储在GeoTIFF中的地理信息,我们首先将GeoTIFF文件转换为常规图像格式,如PNGJPEG

Python代码:将GeoTIFF转换为PNG

python 复制代码
import rasterio
from matplotlib import pyplot as plt
import numpy as np
# Open GeoTIFF file
with rasterio.open('path_to_geotiff.tif') as dataset:
    # Read the image data as an array (RGB bands)
    image = dataset.read([1, 2, 3])
    image = np.transpose(image, (1, 2, 0))  # Rearrange to (H, W, C) format
    # Save the image as PNG
    plt.imsave('output_image.png', image)

现在,我们有了一个可以在深度学习模型中使用的常规图像。

步骤3:图像预处理

在我们使用图像进行训练之前,我们需要调整图像的大小并将其标准化。这个过程称为预处理

预处理代码

python 复制代码
import cv2
import torch
# Function to load and resize images
def preprocess_image(image_path, size=(256, 256)):
    image = cv2.imread(image_path)
    resized_image = cv2.resize(image, size)
    normalized_image = resized_image / 255.0
    return normalized_image
# Example usage
processed_image = preprocess_image('output_image.png')
tensor_image = torch.tensor(processed_image).permute(2, 0, 1).unsqueeze(0)

步骤4:选择模型(U-Net)

对于这个任务,我们使用了U-Net模型,它非常适合分离图像的不同部分,比如水体和农田。

U-Net模型构建

下面是一个简化版本的U-Net模型构建代码:

python 复制代码
import torch
import torch.nn as nn
class UNet(nn.Module):
    def __init__(self):
        super(UNet, self).__init__()
        self.encoder = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.Conv2d(64, 128, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2)
        )
        self.decoder = nn.Sequential(
            nn.ConvTranspose2d(128, 64, kernel_size=2, stride=2),
            nn.ReLU(),
            nn.Conv2d(64, 1, kernel_size=1)
        )
    def forward(self, x):
        enc = self.encoder(x)
        dec = self.decoder(enc)
        return dec

步骤5:训练模型

接下来,我们将使用标记的图像(我们绘制线条以显示水体和农田位置的图像)来训练模型。

训练代码

python 复制代码
from torch.optim import Adam
# Initialize model and optimizer
model = UNet()
optimizer = Adam(model.parameters(), lr=0.001)
loss_fn = nn.CrossEntropyLoss()
# Training loop
def train_model(model, train_loader, num_epochs):
    model.train()
    for epoch in range(num_epochs):
        epoch_loss = 0
        for images, masks in train_loader:
            optimizer.zero_grad()
            outputs = model(images)
            loss = loss_fn(outputs, masks)
            loss.backward()
            optimizer.step()
            epoch_loss += loss.item()
        print(f'Epoch {epoch+1}/{num_epochs}, Loss: {epoch_loss:.4f}')

步骤6:分割水体和农田

在训练模型之后,我们使用它来预测新图像上的水体和农田,进行图像分割。

预测代码

python 复制代码
def predict(model, image):
    model.eval()
    with torch.no_grad():
        output = model(image)
        pred = torch.argmax(output, dim=1)
        return pred

步骤7:计算面积

要计算真实世界的面积(以英亩为单位),我们需要返回到原始GeoTIFF文件以查找每个像素的大小(以米为单位)。这将帮助我们计算分割区域的面积,如水体和农田。

面积计算代码

python 复制代码
def calculate_area(segmented_image, pixel_size=10):
    num_water_pixels = torch.sum(segmented_image == 1).item()  # Class 1 for water
    num_crop_pixels = torch.sum(segmented_image == 2).item()   # Class 2 for crops
    
    # Calculate area in square meters
    water_area = num_water_pixels * (pixel_size ** 2)
    crop_area = num_crop_pixels * (pixel_size ** 2)
    
    # Convert to acres (1 acre = 4046.86 square meters)
    water_area_acres = water_area / 4046.86
    crop_area_acres = crop_area / 4046.86
    
    return water_area_acres, crop_area_acres
# Open the GeoTIFF file to get the pixel size
with rasterio.open('path_to_geotiff.tif') as dataset:
    pixel_size = dataset.res[0]
# Example usage
water_acres, crop_acres = calculate_area(segmented_image, pixel_size)
print(f'Water Area: {water_acres:.2f} acres, Crop Area: {crop_acres:.2f} acres')

结论

在本文中,我们学习了如何以GeoTIFF格式拍摄卫星图像,将其转换为常规图像,并使用深度学习来分离水体和农田。分割后,我们可以使用GeoTIFF中的地理信息计算这些区域的面积。通过遵循这些简单的步骤,即使是初学者也可以使用卫星图像和深度学习模型。


好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!

相关推荐
武子康14 分钟前
大数据-207 数据挖掘 机器学习理论 - 多重共线性 矩阵满秩 线性回归算法
大数据·人工智能·算法·决策树·机器学习·矩阵·数据挖掘
Topstip1 小时前
在 Google Chrome 上查找并安装 SearchGPT 扩展
前端·人工智能·chrome·gpt·ai·chatgpt
python_知世1 小时前
AI时代:成为产品经理的核心路径
人工智能·深度学习·程序人生·自然语言处理·产品经理·计算机技术·大模型应用
这个男人是小帅1 小时前
【GCN】 代码详解 (1) 如何运行【pytorch】可运行版本
人工智能·pytorch·python·深度学习·分类
cv-daily1 小时前
优化模型训练过程中的显存使用率、GPU使用率
人工智能
Jason-河山2 小时前
人工智能技术:未来生活的“魔法师”
人工智能·生活
电子手信2 小时前
教育机构如何利用知识中台进行数字教学
大数据·人工智能·自然语言处理·自动化
深度学习实战训练营2 小时前
HyperGAT模型复现微博文本情绪多分类
人工智能·分类·数据挖掘
pzx_0012 小时前
【深度学习】梯度累加和直接用大的batchsize有什么区别
pytorch·深度学习