news 2026/4/18 10:32:19

基于 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/18 3:30:43

解锁3个被忽略的高速下载引擎:打破云存储速度牢笼

解锁3个被忽略的高速下载引擎:打破云存储速度牢笼 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在忍受百度网盘几十KB/s的龟速下载?重要文件因速度…

作者头像 李华
网站建设 2026/4/18 3:31:10

7个深度探索技巧:解锁NVIDIA Profile Inspector隐藏性能

7个深度探索技巧:解锁NVIDIA Profile Inspector隐藏性能 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 当我们深入显卡驱动层会发现,官方控制面板仅展示了不到30%的可调参数。N…

作者头像 李华
网站建设 2026/4/18 3:36:13

Qwen2.5-0.5B如何支持多轮对话?部署与调优完整指南

Qwen2.5-0.5B如何支持多轮对话?部署与调优完整指南 1. 为什么小模型也能做好多轮对话? 很多人第一眼看到“0.5B”这个参数量,会下意识觉得:这么小的模型,真能记住上下文、理解你前几轮说了什么吗?它会不会…

作者头像 李华
网站建设 2026/4/18 3:36:19

Keil C51环境下STC12C5A60S2串口编程实战案例

以下是对您提供的技术博文进行 深度润色与重构后的专业级技术文章 。全文已彻底去除AI生成痕迹,强化了工程师视角的实战逻辑、教学节奏与工程语感;摒弃模板化结构,以自然递进的叙事方式串联硬件原理、编译机制、误差建模与产线问题闭环&…

作者头像 李华
网站建设 2026/4/18 3:33:48

告别代码!用Qwen-Image-2512-ComfyUI图形化生成图片

告别代码!用Qwen-Image-2512-ComfyUI图形化生成图片 1. 为什么这次真的不用写一行代码? 你有没有过这样的经历:看到一个惊艳的AI生图效果,兴冲冲点开教程,结果第一行就是“创建虚拟环境”,第二行是“pip …

作者头像 李华