【深度学习|地学应用】基于Mask R-CNN进行滑坡识别的流程。

【深度学习|地学应用】基于Mask R-CNN进行滑坡识别的流程。

【深度学习|地学应用】基于Mask R-CNN进行滑坡识别的流程。



欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup

大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “学术会议小灵通”或参考学术信息专栏:https://blog.csdn.net/2401_89898861/article/details/145551342


一、流程概述

制作数据集

  • 收集滑坡图像数据(卫星、航拍或地面照片)
  • 使用标注工具(例如 LabelMe、CVAT)对图像中的滑坡区域进行分割标注,保存为多边形格式
  • 最后将标注数据转换为 COCO 格式或 Pascal VOC 格式,以便后续使用

数据准备与数据处理

  • 将图像和标注文件整理到统一目录
  • 编写数据集类:读取图像、解析标注,将多边形转换为二值 mask,并计算边界框
  • 数据增强:可选旋转、缩放、翻转等操作
  • 划分训练、验证和测试集

模型构建

  • 使用 Mask R-CNN 模型(例如 torchvision 中的 maskrcnn_resnet50_fpn
  • 修改分类头和 mask 预测头,使之适应滑坡识别(通常滑坡为单一目标类别) 加载预训练权重并进行微调

输入输出

  • 输入:输入图像经过预处理(归一化、尺寸调整、转为张量)
  • 输出:模型输出每个检测目标的边界框、类别分数和像素级的分割 mask

训练与推理

  • 构建数据加载器和训练循环,计算损失,反向传播并更新权重
  • 在推理阶段,根据模型输出进行后处理(如 NMS)得到最终滑坡检测结果

二、模型代码及逐行解释

下面给出一个完整示例代码,包含自定义数据集类和 Mask R-CNN 模型构建、训练的简化流程。

import os
import json
import cv2
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import Dataset, DataLoader
import torchvision
from torchvision.models.detection import maskrcnn_resnet50_fpn
from torchvision.transforms import functional as TF

# 自定义数据集类:用于加载滑坡识别数据集(COCO 格式)
class LandslideDataset(Dataset):
    def __init__(self, root, annotation_file, transforms=None):
        """
        Args:
            root: 图像文件夹路径。
            annotation_file: COCO 格式的标注文件路径。
            transforms: 数据预处理转换函数(可选)。
        """
        self.root = root
        self.transforms = transforms
        # 加载 COCO 格式的标注文件(JSON 格式)
        with open(annotation_file, 'r') as f:
            self.coco = json.load(f)
        # 从标注文件中获取图像列表
        self.imgs = self.coco["images"]
        # 获取所有标注信息
        self.annotations = self.coco["annotations"]
        # 构建图像 id 到标注列表的映射字典
        self.img_id_to_ann = {
   
   }
        for ann in self.annotations:
            img_id = ann["image_id"]
            if img_id not in self.img_id_to_ann:
                self.img_id_to_ann[img_id] = []
            self.img_id_to_ann[img_id].append(ann)

    def __getitem__(self, idx):
        # 根据索引获取图像信息
        img_info = self.imgs[idx]
        img_path = os.path.join(self.root, img_info["file_name"])
        # 读取图像(OpenCV 以 BGR 格式读取)
        img = cv2.imread(img_path)
        # 转换为 RGB 格式
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        img_id = img_info["id"]
        # 获取该图像对应的标注列表
        annots = self.img_id_to_ann.get(img_id, [])
        boxes = []   # 存储边界框 [x_min, y_min, x_max, y_max]
        masks = []   # 存储分割 mask
        labels = []  # 存储类别标签
        for ann in annots:
            # COCO 格式中 bbox 格式为 [x, y, width, height]
            bbox = ann["bbox"]
            boxes.append([bbox[0], bbox[1], bbox[0] + bbox[2], bbox[1] + bbox[3]])
            # 分割标注通常为多边形列表,取第一个多边形
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

985在读小水博一枚呀~

您的鼓励是我创作的动力!谢谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值