news 2026/4/24 16:04:16

基于 PyTorch+Mask R-CNN 无人机占道经营检测数据集 无人机占道经营实例分割数据集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于 PyTorch+Mask R-CNN 无人机占道经营检测数据集 无人机占道经营实例分割数据集

占道经营数据集说明

数据集核心信息表

信息类别具体内容
数据集类别实例分割(Instance Segmentation)类计算机视觉数据集,包含 “yusanyusan” 和 “zhandaojingying” 2 个核心类别
数据数量包含 359 张标注图像,覆盖占道经营相关场景的典型视觉样本
数据集格式种类支持计算机视觉模型训练常用格式,适配主流实例分割算法的数据输入需求
最重要应用价值1. 为城市管理领域的占道经营智能监测系统提供标注数据支撑,助力 AI 模型开发;2. 可用于优化占道经营场景的图像识别精度,提升自动化监管效率;3. 为相关计算机视觉研究提供真实场景样本,推动实例分割技术在城市治理中的落地

数据三要素概述

一、数据集类别

  1. 整体类别定位为实例分割类计算机视觉数据集,专注于解决占道经营场景下的目标分割任务;

  2. 细分 2 个核心类别,分别对应 “yusanyusan” 和 “zhandaojingying”,覆盖占道经营场景中的关键识别对象;

  3. 类别标注逻辑贴合实际城市管理需求,确保标注结果可直接用于模型训练。

二、数据数量

  1. 图像总量为 359 张,样本数量可满足基础模型的训练与验证需求;

  2. 图像样本覆盖占道经营的典型场景,能够反映不同环境下的目标特征,保证数据的多样性;

  3. 每张图像均经过标注处理,标注信息完整,可直接用于模型输入。

三、应用价值

  1. 助力城市管理智能化:为占道经营自动监测设备提供模型训练数据,减少人工巡查成本,提升监管效率;

  2. 推动技术落地:为实例分割算法在城市治理领域的应用提供真实场景数据,加速技术从实验室到实际场景的转化;

  3. 支持研究创新:为相关领域的学术研究和技术开发提供公开可用的样本,促进计算机视觉技术在民生领域的创新应用。


二、训练代码(基于 PyTorch+Mask R-CNN)

  1. 环境依赖安装
    bash
    pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
    pip install pillow matplotlib pycocotools opencv-python
  2. 数据加载与预处理
    python
    import os
    import torch
    from torch.utils.data import Dataset, DataLoader
    from torchvision import transforms
    import cv2
    import json

数据集类定义

class OccupiedRoadDataset(Dataset):
definit(self, img_dir, ann_dir, transform=None):
self.img_dir = img_dir # 图像文件夹路径
self.ann_dir = ann_dir # 标注文件文件夹路径
self.transform = transform
self.img_names = [f for f in os.listdir(img_dir) if f.endswith((‘.jpg’, ‘.png’))]
# 类别映射(根据实际标注调整)
self.class_map = {“yusanyusan”: 1, “zhandaojingying”: 2}

def __len__(self): return len(self.img_names) def __getitem__(self, idx): img_name = self.img_names[idx] img_path = os.path.join(self.img_dir, img_name) # 读取图像并转换为RGB格式 image = cv2.imread(img_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 读取对应标注文件(假设标注为JSON格式,含mask和类别信息) ann_name = img_name.replace('.jpg', '.json').replace('.png', '.json') ann_path = os.path.join(self.ann_dir, ann_name) with open(ann_path, 'r') as f: ann_data = json.load(f) # 提取标注信息(mask为二值图像,labels为类别ID) masks = [] labels = [] for obj in ann_data['objects']: # 读取mask(此处假设mask已保存为图像,或从标注中解析坐标生成) mask_path = os.path.join(self.ann_dir, obj['mask_path']) mask = cv2.imread(mask_path, 0) # 单通道二值图 mask = (mask > 127).astype(torch.uint8) # 转为0-1二值 masks.append(mask) labels.append(self.class_map[obj['class']]) # 转换为tensor格式 image = torch.from_numpy(image.transpose(2, 0, 1)).float() / 255.0 # 归一化并调整维度 masks = torch.stack(masks) if masks else torch.zeros((0, image.shape[1], image.shape[2]), dtype=torch.uint8) labels = torch.tensor(labels, dtype=torch.int64) if labels else torch.zeros(0, dtype=torch.int64) # 应用数据增强 if self.transform: image, masks, labels = self.transform(image, masks, labels) # 按Mask R-CNN输入格式返回 target = { 'boxes': self._get_boxes_from_masks(masks), # 从mask计算边界框 'labels': labels, 'masks': masks, 'image_id': torch.tensor([idx]) } return image, target def _get_boxes_from_masks(self, masks): """从mask计算目标边界框(xmin, ymin, xmax, ymax)""" boxes = [] for mask in masks: y, x = torch.where(mask == 1) if len(y) == 0: boxes.append(torch.tensor([0, 0, 0, 0], dtype=torch.float32)) continue xmin = x.min() ymin = y.min() xmax = x.max() ymax = y.max() boxes.append(torch.tensor([xmin, ymin, xmax, ymax], dtype=torch.float32)) return torch.stack(boxes) if boxes else torch.zeros((0, 4), dtype=torch.float32)

数据增强(简单示例)

class SimpleTransform:
defcall(self, image, masks, labels):
# 随机水平翻转(可根据需求扩展)
if torch.rand(1) > 0.5:
image = torch.flip(image, dims=[2])
masks = torch.flip(masks, dims=[2])
return image, masks, labels

初始化数据加载器

def get_data_loaders(img_dir, ann_dir, batch_size=4, train_split=0.8):
dataset = OccupiedRoadDataset(img_dir, ann_dir, transform=SimpleTransform())
# 划分训练集和验证集
train_size = int(train_split * len(dataset))
val_size = len(dataset) - train_size
train_dataset, val_dataset = torch.utils.data.random_split(dataset, [train_size, val_size])

train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, collate_fn=lambda x: tuple(zip(*x))) val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False, collate_fn=lambda x: tuple(zip(*x))) return train_loader, val_loader
  1. 模型定义与训练
    python
    from torchvision.models.detection import maskrcnn_resnet50_fpn
    from torchvision.models.detection.faster_rcnn import FastRCNNPredictor
    from torchvision.models.detection.mask_rcnn import MaskRCNNPredictor
    import torch.optim as optim
    import time

初始化Mask R-CNN模型

def get_mask_rcnn_model(num_classes):
# 加载预训练模型
model = maskrcnn_resnet50_fpn(pretrained=True)

# 替换分类器(适配自定义类别) in_features = model.roi_heads.box_predictor.cls_score.in_features model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes) # 替换mask预测器 in_features_mask = model.roi_heads.mask_predictor.conv5_mask.in_channels hidden_layer = 256 model.roi_heads.mask_predictor = MaskRCNNPredictor(in_features_mask, hidden_layer, num_classes) return model

训练函数

def train_model(model, train_loader, val_loader, device, num_epochs=10, lr=0.005):
# 优化器与学习率调度器
params = [p for p in model.parameters() if p.requires_grad]
optimizer = optim.SGD(params, lr=lr, momentum=0.9, weight_decay=0.0005)
lr_scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=3, gamma=0.1)

model.to(device) for epoch in range(num_epochs): start_time = time.time() model.train() train_loss = 0.0 # 训练轮次 for images, targets in train_loader: images = [img.to(device) for img in images] targets = [{k: v.to(device) for k, v in t.items()} for t in targets] # 前向传播与损失计算 loss_dict = model(images, targets) losses = sum(loss for loss in loss_dict.values()) # 反向传播与优化 optimizer.zero_grad() losses.backward() optimizer.step() train_loss += losses.item() * len(images) # 学习率更新 lr_scheduler.step() # 验证轮次(仅计算损失,可扩展为计算mAP) model.eval() val_loss = 0.0 with torch.no_grad(): for images, targets in val_loader: images = [img.to(device) for img in images] targets = [{k: v.to(device) for k, v in t.items()} for t in targets] loss_dict = model(images, targets) losses = sum(loss for loss in loss_dict.values()) val_loss += losses.item() * len(images) # 打印训练信息 train_avg_loss = train_loss / len(train_loader.dataset) val_avg_loss = val_loss / len(val_loader.dataset) epoch_time = time.time() - start_time print(f"Epoch [{epoch+1}/{num_epochs}], " f"Train Loss: {train_avg_loss:.4f}, " f"Val Loss: {val_avg_loss:.4f}, " f"Time: {epoch_time:.2f}s") # 保存训练好的模型 torch.save(model.state_dict(), "occupied_road_maskrcnn.pth") print("Model saved as 'occupied_road_maskrcnn.pth'") return model

主函数(执行训练)

ifname== “main”:
# 配置参数(需根据实际文件路径修改)
IMG_DIR = “./data/images” # 图像文件夹路径
ANN_DIR = “./data/annotations” # 标注文件夹路径
NUM_CLASSES = 3 # 背景(0)+ 2个自定义类别
BATCH_SIZE = 4
NUM_EPOCHS = 10
LR = 0.005

# 设备配置(优先使用GPU) device = torch.device("cuda" if torch.cuda.is_available() else "cpu") print(f"Training on {device}") # 加载数据 train_loader, val_loader = get_data_loaders(IMG_DIR, ANN_DIR, BATCH_SIZE) print(f"Train samples: {len(train_loader.dataset)}, Val samples: {len(val_loader.dataset)}") # 初始化模型并训练 model = get_mask_rcnn_model(NUM_CLASSES) trained_model = train_model(model, train_loader, val_loader, device, NUM_EPOCHS, LR)
  1. 代码说明
    数据加载部分:需将数据集按 “图像文件夹 + 标注文件夹” 结构存放,标注文件需包含目标 mask 路径和类别信息(可根据实际标注格式调整OccupiedRoadDataset类中的标注解析逻辑);
    模型部分:基于预训练的 Mask R-CNN(ResNet50-FPN backbone),替换分类器和 mask 预测器以适配 2 个自定义类别 + 1 个背景类;
    训练部分:使用 SGD 优化器和学习率调度器,打印每轮训练 / 验证损失,训练结束后保存模型权重;
    参数调整建议:可根据硬件配置调整BATCH_SIZE,根据训练效果调整NUM_EPOCHS和LR,也可添加更复杂的数据增强(如随机缩放、旋转)提升模型泛化能力。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 7:25:38

LeagueAkari核心能力解析:从入门到精通的实战手册

LeagueAkari核心能力解析:从入门到精通的实战手册 【免费下载链接】LeagueAkari ✨兴趣使然的,功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 副标题&#…

作者头像 李华
网站建设 2026/4/24 4:31:29

找不到百度网盘提取码很抓狂?这款智能工具让资源获取不再卡壳

找不到百度网盘提取码很抓狂?这款智能工具让资源获取不再卡壳 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为找不到百度网盘提取码而烦恼吗?收到分享链接却卡在验证环节,看着心仪的资…

作者头像 李华
网站建设 2026/4/23 0:33:36

极简安全的系统工具:专家级右键菜单优化指南提升Windows效率

极简安全的系统工具:专家级右键菜单优化指南提升Windows效率 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 当您右键点击文件时是否被20菜单项淹没&…

作者头像 李华
网站建设 2026/4/17 22:33:10

实测科哥开发的Emotion2Vec+,情感识别准确率真高

实测科哥开发的Emotion2Vec,情感识别准确率真高 1. 这不是实验室里的“玩具”,是能听懂人话的语音情绪助手 你有没有过这样的经历:客服电话里对方语气明显不耐烦,但系统却还在机械地问“请问还有什么可以帮您?”&…

作者头像 李华
网站建设 2026/4/17 19:23:49

LeagueAkari游戏辅助工具:让你轻松提升胜率的上分神器

LeagueAkari游戏辅助工具:让你轻松提升胜率的上分神器 【免费下载链接】LeagueAkari ✨兴趣使然的,功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 还在为错…

作者头像 李华
网站建设 2026/4/18 21:12:30

S32DS调试时无法连接目标?图解说明排查步骤

以下是对您提供的博文内容进行 深度润色与结构重构后的专业级技术文章 。全文严格遵循您的所有要求: ✅ 彻底去除AI痕迹,语言自然、老练、有工程师“人味”; ✅ 摒弃模板化标题(如“引言”“总结”),代…

作者头像 李华