【深度学习|地学应用】基于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]])
# 分割标注通常为多边形列表,取第一个多边形


1849

被折叠的 条评论
为什么被折叠?



