矩池云搭建DeepLabV3Plus网络,预测无人机遥感语义分割数据集

news2025/5/18 7:11:27

先上效果图,效果是真不错呀!

 带大家复现这个过程

一、下载源码

代码下载地址:

链接:https://pan.baidu.com/s/1MkW7DOgNHD5h5sfXQ6L1HA 
提取码:ynev 

权重下载地址:

链接:https://pan.baidu.com/s/1lEt1t3KZVN7_k8ktPpnypA 
提取码:q070 

UAVid数据集下载地址:

链接:https://pan.baidu.com/s/1rAirhr1ZMsLm_815pv282A 
提取码:zegk 

二、租赁环境

 

 三、Vscode连接矩池云

教程:VS Code 远程连接矩池云机器教程 | 矩池云支持中心

四、上传数据

解压:

unzip DeepLabV3Plus-Pytorch.zip -d DeepLabV3Plus-Pytorch

 五、进入项目路径

 建立以下文件夹,并上传需要检测的图片到该文件夹下

上传数据后,会有以下的临时文件,需要删除以下临时文件。

 

 training_logs下创建checkpoint文件夹

 将训练好的权重上传到checkpoint文件夹中:

建立可视化文件夹 visualization

 在visualization文件夹下新建run_on_seq.py,并粘贴以下内容:

# camera-ready
import sys
sys.path.insert(0, '.')
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"

import torch
import torch.utils.data
import torch.nn as nn
from torch.autograd import Variable
import torch.optim as optim
import torch.nn.functional as F


import numpy as np
import pickle
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import cv2
import network
from newtools.dataset import DatasetSeq 
from newtools.utils import label_img_to_color

if __name__ =="__main__":

    batch_size = 2

    model_map = {
        'deeplabv3_resnet50': network.deeplabv3_resnet50,
        'deeplabv3plus_resnet50': network.deeplabv3plus_resnet50,
        'deeplabv3_resnet101': network.deeplabv3_resnet101,
        'deeplabv3plus_resnet101': network.deeplabv3plus_resnet101,
        'deeplabv3_mobilenet': network.deeplabv3_mobilenet,
        'deeplabv3plus_mobilenet': network.deeplabv3plus_mobilenet
    }
    network = model_map["deeplabv3plus_resnet101"](num_classes=8, output_stride=16)
    network.cuda()

    network.load_state_dict(torch.load("training_logs/checkpoint/model_DeeplabV3Plus_epoch_200.pth"))

    for sequence in ["0"]:
        print (sequence)

        val_dataset = DatasetSeq(uavid_data_path="datasets/UAVidDataset",
                                 uavid_meta_path="datasets/UAVidDataset",
                                 sequence=sequence)

        num_val_batches = int(len(val_dataset)/batch_size)
        print ("num_val_batches:", num_val_batches)

        val_loader = torch.utils.data.DataLoader(dataset=val_dataset,
                                                batch_size=batch_size, shuffle=False,
                                                num_workers=1)

        network.eval() # (set in evaluation mode, this affects BatchNorm and dropout)
        unsorted_img_ids = []
        for step, (imgs, img_ids) in enumerate(val_loader):
            with torch.no_grad(): # (corresponds to setting volatile=True in all variables, this is done during inference to reduce memory consumption)
                imgs = Variable(imgs).cuda() # (shape: (batch_size, 3, img_h, img_w))

                outputs = network(imgs) # (shape: (batch_size, num_classes, img_h, img_w))

                ####################################################################
                # save data for visualization:
                ####################################################################
                outputs = outputs.data.cpu().numpy() # (shape: (batch_size, num_classes, img_h, img_w))
                pred_label_imgs = np.argmax(outputs, axis=1) # (shape: (batch_size, img_h, img_w))
                pred_label_imgs = pred_label_imgs.astype(np.uint8)

                for i in range(pred_label_imgs.shape[0]):
                    pred_label_img = pred_label_imgs[i] # (shape: (img_h, img_w))
                    img_id = img_ids[i]
                    img = imgs[i] # (shape: (3, img_h, img_w))

                    img = img.data.cpu().numpy()
                    img = np.transpose(img, (1, 2, 0)) # (shape: (img_h, img_w, 3))
                    img = img*np.array([0.229, 0.224, 0.225])
                    img = img + np.array([0.485, 0.456, 0.406])
                    img = img*255.0
                    img = img.astype(np.uint8)

                    pred_label_img_color  = label_img_to_color(pred_label_img)
                    overlayed_img = 0.35*img + 0.65*pred_label_img_color
                    overlayed_img = overlayed_img.astype(np.uint8)

                    img_h = overlayed_img.shape[0]
                    img_w = overlayed_img.shape[1]

                    cv2.imwrite("training_logs/result" + "/" + img_id + ".png", img)
                    cv2.imwrite("training_logs/result" + "/" + img_id + "_pred.png", pred_label_img_color)
                    cv2.imwrite("training_logs/result" + "/" + img_id + "_overlayed.png", overlayed_img)

                    unsorted_img_ids.append(img_id)

        ############################################################################
        # create visualization video:
        ############################################################################
        out = cv2.VideoWriter("%s/stuttgart_%s_combined.avi" % ("training_logs/result", sequence), cv2.VideoWriter_fourcc(*"MJPG"), 20, (2*img_w, 2*img_h))
        sorted_img_ids = sorted(unsorted_img_ids)
        for img_id in sorted_img_ids:
            img = cv2.imread("training_logs/result" + "/" + img_id + ".png", -1)
            pred_img = cv2.imread("training_logs/result" + "/" + img_id + "_pred.png", -1)
            overlayed_img = cv2.imread("training_logs/result" + "/" + img_id + "_overlayed.png", -1)

            combined_img = np.zeros((2*img_h, 2*img_w, 3), dtype=np.uint8)

            combined_img[0:img_h, 0:img_w] = img
            combined_img[0:img_h, img_w:(2*img_w)] = pred_img
            combined_img[img_h:(2*img_h), (int(img_w/2)):(img_w + int(img_w/2))] = overlayed_img

            out.write(combined_img)

        out.release()

运行:

python visualization/run_on_seq.py

报错:

  File "/mnt/DeepLabV3Plus-Pytorch/DeepLabV3Plus-Pytorch/./network/backbone/mobilenetv2.py", line 2, in <module>
    from torchvision.models.utils import load_state_dict_from_url
ModuleNotFoundError: No module named 'torchvision.models.utils'


解决办法:将错误语句换为以下语句

from torch.hub import load_state_dict_from_url

再运行:

python visualization/run_on_seq.py

可生成预测结果。保存在training_logs/result目录下。

 

六、DeeplabV3Plus论文解读

论文地址:https://arxiv.org/pdf/1802.02611.pdf

DeepLabv 3+通过添加一个简单而有效的解码器模块来扩展DeepLabv 3,以细化分割结果,特别是对象边界。

我们改进了DeepLabv 3,它采用了空间金字塔池化模块(a),具有编码器-解码器结构(b)。所提出的模型DeepLabv 3+包含来自编码器模块的丰富语义信息,而详细的对象边界由简单而有效的解码器模块恢复。编码器模块允许我们通过应用atrous卷积以任意分辨率提取特征。

空间金字塔池化参考资料:https://zhuanlan.zhihu.com/p/64510297

总结:SPP的本质就是多层maxpool,只不过为了对于不同尺寸大小 的featur map 生成固定大小的输出。

  1. 可以提取不同尺寸的空间特征信息,可以提升模型对于空间布局和物体变性的鲁棒性。
  2. 可以避免将图片resize、crop成固定大小输入模型的弊端。

我们提出的DeepLabv3+通过采用编码器解码器结构扩展了DeepLabv3。编码器模块通过在多个尺度上应用atrous卷积来编码多尺度上下文信息,而简单而有效的解码器模块沿着对象边界细化分割结果。 

Atrous卷积是一个强大的工具,它允许我们显式控制深度卷积神经网络计算出的特征图分辨率,并调整滤波器的Atrous rate以捕获多尺度信息 。

DeeplabV3Plus总结:

编码器:

1. 在图像分类中,下采样倍率是32,语义分割中,下采样倍率一般为16或8,对于语义分割的任务,比如 可以在ResNet中,通过移除最后一个(或两个)块中的步幅并相应地应用atrous卷积(例如,对于输出stride= 8,我们将空洞卷积率= 2和空洞卷积率= 4分别应用于最后两个块)

2. 此外,DeepLabv3PLus 使用了 Atrous空间金字塔池化模块,该模块通过应用具有不同速率的Atrous卷积来探测多个尺度的卷积特征。

解码器:

因此,我们提出了一种简单而有效的解码器模块,如图2所示。.编码器特征首先以因子4进行双线性上采样,然后与来自网络主干的具有相同空间分辨率的对应低级特征进行级联[73](例如,在ResNet-101中跨步之前的Conv 2 [25])。在级联之后,我们应用一些3 × 3卷积来细化特征,然后再进行一次简单的双线性上采样,采样系数为4。

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

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

相关文章

Java - 欢迎使用spring中的Base64Utils!

&#x1f335;如果项目技术栈中包含spring&#xff0c;同时又有Base64编码的需求&#xff0c;那么Base64Utils工具类将会是你的最好选择&#xff01;⤵️ 什么是Base64编码&#xff1f;⤵️ 基本转换针对URL的转换 &#xff08;/替换为-_&#xff09; Base64Utils公开的AP…

工业软件上云:有“数据之根”方能向阳生长

有人说&#xff0c;数字化时代&#xff0c;所有的事情都值得用云的方式重新做一遍。 深以为然。作为拥有全球工业门类最为齐全的国家&#xff0c;中国近年来正在从制造大国向制造强国迈进。随着《中国制造2025》国家战略的稳步推进&#xff0c;制造业的数字化转型和智能化升级…

【倒计时2天】CCIG文档图像智能分析与处理论坛开启直播预约,共探智能文档处理前沿技术

文档是人们在日常生活、工作中产生的信息的重要载体&#xff0c;各领域从业者几乎每天都要与金融票据、商业规划、财务报表、会议记录、合同、简历、采购订单等文档“打交道”。让计算机具备阅读、理解和解释这些文档图像的能力&#xff0c;在智能金融、智能办公、电子商务等许…

9:00面试,9:03就出来了 ,问的实在是太变态了···

从外包出来&#xff0c;没想到竟然死在了另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以我也就忍了。没想到12月一纸通知&#xff0c;所有人都不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个…

BRC20懂Web3?探寻宗教式社区建设- Yuga Labs「猿」宇宙案例解析

前言 早前&#xff0c;NFT 领域最强IP 缔造者Yuga Labs官宣&#xff1a;将基于Ordinal 协议在比特币区块链上推出NFT 系列「TwelveFold 」&#xff0c;为比特币NFT 生态添加了催化剂。所以以太坊失宠了吗&#xff1f;事实上&#xff0c;据欧科云链OKLink多链浏览器数据显示&am…

单精度浮点数与十进制数据相互转换

一、float基础&#xff1a; Float类型占4个字节,也就是32bit,其中最高位是符号位,2~9位是指数位,后边的23bit是数值位.如下所示 大部分数据的二进制形式都可以用科学计数法表示,即1.m*2^n这种形式,只要知道m和n,就能确定一个数值 二、小数位如何转变为二进制&#xff1a; 下面…

工业主板定制选型的要点都有哪些呢?

工业主板是工控机的核心部件。工控机通过工业主板将CPU等各种器件和外部设备有机地结合起来&#xff0c;形成一套完整的系统&#xff0c;因此工控机的整体运行速度和稳定性在相当程度上取决于工业主板的性能。工业主板应用范围广泛&#xff0c;使用环境复杂&#xff0c;因此用户…

键树_Trie树_介绍和C语言实现_20230511

键树_Trie树形式_树介绍及C语言实现 前言 上一篇提到键树有两种不同的表示方法&#xff0c;它们分别是双链树和Trie树&#xff0c;在上文中对双链树的数据结构以及在键树上的C语言实现做了详细的分析与讨论。如若键树中的结点的度较大&#xff0c;则采用Trie树结构较双链结构…

【软件工程】期末复习总结(通俗易懂,学不会来打我)

【软件工程】期末复习总结&#xff08;通俗易懂&#xff0c;学不会来打我&#xff09; 第一章 1.1 软件工程的发展历程 1.1.1 软件危机&#xff08;日子没法过了&#xff09; 软件危机&#xff08;Software Crisis&#xff09;是指在计算机软件开发、运行、维护和管理过程中…

126-Linux_git安装及使用

文章目录 一.git基本概念1.什么是git2.git的特点3.git工作流程4.文件的四种状态 二.git的安装1.在ubuntu上测试有没有安装2.使用命令 sudo apt install git 进行安装3.安装后查看版本,检查是否安装成功 三.git的使用1.git常用命令(1)创建一个目录(2)使用git init 命令将其变为一…

Netty编程入门超级详细,有这篇就足够了

目录 前言一、简介二、为什么使用Netty2.1 NIO的缺点2.2 Netty的优点 三、架构图四、永远的Hello Word4.1引入Maven依赖4.2 创建服务端启动类4.3 创建服务端处理器4.4 创建客户端启动类4.5 创建客户端处理器4.6 测试 五、Netty的特性与重要组件5.1 taskQueue任务队列5.2 schedu…

MyBatis的CRUD

0-基础知识 id&#xff1a;唯一标识 type&#xff1a;映射的类型&#xff0c;支持别名 java里的命名规则是驼峰&#xff0c;而sql里面是下划线&#xff0c;如何对数据库表的字段起别名&#xff1f; 数据库表的字段名称和实体类的属性名称 不一样&#xff0c;则不能自动封装数据…

算法套路十五——最长公共子序列LCS

算法套路十五——最长公共子序列LCS 算法示例&#xff1a;LeetCode1143. 最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&am…

Windows系统配置Anaconda虚拟环境,并安装Numpy、Scipy和Matplotlib等模块方法

有些项目不是必须在Ubuntu系统下进行的&#xff0c;对大部分人来说更熟悉Window系统&#xff0c;且查阅电脑中相关文件和使用微信更方便&#xff0c;因此记录一下Windows系统配置Anaconda虚拟环境步骤和安装Numpy、Scipy及Matplotlib等模块方法。 一、Anaconda安装 Anaconda可以…

异步电机速度估计-模型参考自适应MRAS法(补充)

导读&#xff1a;前期文章已经介绍过模型参考自适应MRAS进行速度估计的方法&#xff0c;本期文章主要是对MRAS实现的细节做一下补充。 若需要文章的仿真模型&#xff0c;关注微信公众号&#xff1a;浅谈电机控制&#xff0c;获取。 一、MRAS知识点回顾 1.1 基本原理 MRAS 模…

Calico的BGP打通Kubernetes网络和局域网

1、项目背景 随着云原生技术的不断发展&#xff0c;容器化应用已成为企业构建云原生架构的重要方式。而随着集群规模不断扩大&#xff0c;跨主机通信的需求也越来越重要。在 Kubernetes 集群中&#xff0c;Pod 是最小的调度和管理单位&#xff0c;而网络也是 Kubernetes 中最重…

双链表——“数据结构与算法”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰又回来了&#xff0c;到了好久没有更新的数据结构与算法专栏&#xff0c;最近确实发现自己有很多不足&#xff0c;需要学习的内容也有很多&#xff0c;所以之后更新文章可能不会像之前那种一天一篇或者一天两篇啦&…

浅谈 Node.js

Node.js 是什么&#xff1f; Node.js 是一个开源、跨平台的 JavaScript 运行时环境。 官网&#xff1a;https://nodejs.org/zh-cn 更多精彩内容&#xff0c;请微信搜索“前端爱好者“&#xff0c; 戳我 查看 。 Node.js ≠ JavaScript Node.js中&#xff0c;没有BOM和DOM。…

【LLM】LangChain基础使用(构建LLM应用)

note LangChain应用开发框架&#xff0c;支持python和typescript语言&#xff1b;可以帮助生成prompt模板&#xff0c;并通过代理充当其他组件&#xff08;如提示模板、其他大语言模型、外部数据和其他工具&#xff09;的中央接口。LangChain可以直接与 OpenAI 的 text-davinc…

BGW协议(算数共享)

概述 BGW协议可以用于对域上包含加法、乘法、常数乘法门的算术电路求值&#xff0c;此协议强依赖Shamir秘密分享方案&#xff0c;利用其同态特性对各个秘密份额进行适当的处理&#xff0c;就可以在秘密值上进行安全计算。 加法门 算数加法共享&#xff08;两方&#xff09; …