实战| 使用深度学习分割和计算水体和农田面积【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性能对比专栏【链接】,持续更新中~

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

目录

  • 引言
  • 步骤1:收集图像(GeoTIFF格式)
  • 步骤2:将GeoTIFF转换为常规图像
    • Python代码:将GeoTIFF转换为PNG
  • 步骤3:图像预处理
    • 预处理代码
  • 步骤4:选择模型(U-Net)
    • U-Net模型构建
  • 步骤5:训练模型
    • 训练代码
  • 步骤6:分割水体和农田
    • 预测代码
  • 步骤7:计算面积
    • 面积计算代码
  • 结论

引言

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

img

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

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

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

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

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

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

Python代码:将GeoTIFF转换为PNG

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 PNGplt.imsave('output_image.png', image)

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

步骤3:图像预处理

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

预处理代码

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.0return 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模型构建代码:

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:训练模型

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

训练代码

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 = 0for 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:分割水体和农田

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

预测代码

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

步骤7:计算面积

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

面积计算代码

def calculate_area(segmented_image, pixel_size=10):num_water_pixels = torch.sum(segmented_image == 1).item()  # Class 1 for waternum_crop_pixels = torch.sum(segmented_image == 2).item()   # Class 2 for crops# Calculate area in square meterswater_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.86crop_area_acres = crop_area / 4046.86return 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中的地理信息计算这些区域的面积。通过遵循这些简单的步骤,即使是初学者也可以使用卫星图像和深度学习模型。


在这里插入图片描述

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/3279.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟机 Ubuntu 扩容

文章目录 一、Vmware 重新分配 Ubuntu 空间二、Ubuntu 扩容分区 一、Vmware 重新分配 Ubuntu 空间 先打开 Vmware ,选择要重新分配空间的虚拟机 点击 编辑虚拟机设置 ,再点击 硬盘 ,再点击 扩展 选择预计扩展的空间,然后点击 扩展…

Mybatis的高级用法

MybatisPlus 实体类注释字段 TableName(“数据库表名”) TableId(“主键名”) TableField(“字段名”) BaseMapper接口对象方法 普通查询 1、主键 T selectById(Serializable id) 使用场景为通过主…

excel表格加锁忘密码怎么解决?

百度好多方法都无效,下面方法可行: 点击sheet单元格名称,鼠标右边出现弹框选择“查看代码”: 出现的框中输入以下代码: Sub demo()// 锁定当前工作表,允许筛选操作ActiveSheet.Protect DrawingObjects:True, CONTENT…

Vue中ref、reactive、toRef、toRefs的区别

一、ref、reactive setup 函数中默认定义的变量并不是响应式的(即数据变了以后页面不会跟着变),如果想让变量变为响应式的变量,需要使用 ref 和 reactive 函数修饰变量。 ref 函数可以把基本类型变量变为响应式引用reactive 函数…

PDF全能免费转换 3.18 | 免费PDF工具集,多种转换和美化功能

PDF全能免费转换是一款主打免费好用的PDF工具集,功能丰富且实用。主要功能包括:PDF转Word/PPT/Excel/TXT/图片,PDF压缩和合并,多图合并成长图或PDF,身份证扫描、文件扫描、证件扫描,证件照换底色&#xff0…

DICOM标准:DICOM标准中的公用模块、核心模块详解(一)——病人、研究、序列、参考帧和设备模块属性详解

目录 概述 1 公用病人IE模块 1.1 病人模块 2 公用的研究IE模块 2.1 常规研究模块 2.2 病人研究模块 3 公用序列IE模块 3.1 常规序列模块 3.1.1 常规序列属性描述 4 公用参考帧信息实体模块 4.1 参考帧模块 4.1.1 参考帧属性描述 5 公用设备IE模块 5.1 常规设备模…

Webpack 配置module.css报错Uncaught TypeError: Cannot read properties of undefined

我的项目结构如下: 入口文件是index.jsx,组件Button.jsx使用了样式button.module.css .btn {background-color: #4CAF50;border: none;color: white; padding: 15px 32px;text-align: center;text-decoration: none;display: inline-block;font-size: 16px;margin:…

PyCharm中pylint安装与使用

目录 1. 安装插件2. pycharm中使用该功能3. 命令行使用 1. 安装插件 然后重启 2. pycharm中使用该功能 3. 命令行使用 前提是先 pip install pylint pylint demo01.py下面红框内容的意思是,得到10分/ 满分10分,上次运行获得8.33分,经调整…

无人机避障——大疆与Airsim中的角速度信息订阅获取

本文先将Airsim仿真中的角速度信息获取弄好,然后再将大疆SDK中的角速度话题订阅一下,并验证获取角速度信息,后续为DWA动态窗口法替代PID作为局部路径规划做足准备。 Airsim中的角速度信息获取 Airsim无人机状态获取:getMultirot…

绿宝石二十载:如何打破国外在高端电容市场的垄断?

【哔哥哔特导读】作为本土电容器企业,绿宝石凭借二十年的技术创新与市场深耕,在高端电容市场取得了显著突破。从铝电解电容器到叠层式固态电容器,绿宝石是如何做到的? 在当今竞争激烈的电子元器件市场中,技术创新、定…

JS中DOM和BOM

DOM DOM(文档对象模型)是一个跨平台和语言独立的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。在网页浏览器中,DOM 通常表示 HTML 或 XML 文档的对象模型。DOM 将网页内容视为节点树,其中每个节点都…

从配置anaconda到配置pycharm

Anaconda 是全球领先的数据科学与机器学习平台,专为开发者、数据分析师设计。通过 Anaconda,可以轻松管理数据环境、安装依赖包,快速启动数据分析、机器学习项目。 丰富的 Python 数据科学库:Anaconda 集成了常用的 Python 数据科…

JAVA开源项目 影城管理系统 计算机毕业设计

本文项目编号 T 045 ,文末自助获取源码 \color{red}{T045,文末自助获取源码} T045,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 用…

无人机测绘遥感技术算法概述!

一、数据采集算法 航线规划算法 根据测绘任务需求,利用地理信息系统(GIS)和遥感技术,对无人机进行航线规划。 考虑地形、气候、障碍物等因素,优化飞行路径,确保数据采集的完整性和准确性。 传感器控制算…

剪绳子小游戏 #线上游玩 #介绍 #部分代码截图展示

自制的割绳子小游戏。 线上游玩地址:戳Rain的剪绳子游戏。 不得不承认做了很久。。。 简单介绍一下。。。 割绳子游戏机制 物理引擎 《割绳子》的核心在于其高度逼真的物理引擎。游戏中的所有物体,包括糖果、绳索、气球、弹簧等,都遵循…

分享一波 百度 C++ 服务器开发面试

之前有粉丝反馈说,有没有 C 服务器开发的面试呀? 还真有,最近有 C 同学被百度从简历池捞起来面试了,目前经历了一二面,我把比较通用的面试问题抽离出来跟大家分享一波。 这次主要面试涵盖的知识点: MySQ…

使用ref对父子组件进行操作

子组件 <template><view><button v-if"option.isShow" click"buttonClick">子组件关闭按钮</button></view> </template><script>export default {data() {return {option: {num: 0}}},methods: {// 父组件调用…

【从零开始的LeetCode-算法】3289. 数字小镇中的捣蛋鬼

数字小镇 Digitville 中&#xff0c;存在一个数字列表 nums&#xff0c;其中包含从 0 到 n - 1 的整数。每个数字本应 只出现一次&#xff0c;然而&#xff0c;有 两个 顽皮的数字额外多出现了一次&#xff0c;使得列表变得比正常情况下更长。 为了恢复 Digitville 的和平&…

ros入门:服务通信(c++)

ros服务通信的原理类似于RPC&#xff0c;其实现原理如下图所示 实验目标 创建一个客户端和一个服务端客户端向服务端发送两个参数num1和num2服务端接收到客户端的两个参数num1和num2&#xff0c;并计算出num1num2的求和结果&#xff0c;最后返回给客户端客户端接收服务端的计算…

域控操作二十四:主域故障辅域接替

模拟环境&#xff1a;上海DC1故障无法开机&#xff0c;导致只有一个DNS的电脑无法上网&#xff08;实际可以添加DC2但是为了实验就不说了&#xff09; FSMO还在DC1上 使用powershell把角色迁移到DC2 ntdsutil roles connections connect to server DC2SHA.whbk.cn quitSeize …