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

news/2024/7/21 3:43:26 标签: python, 计算机视觉, 图像处理

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

 带大家复现这个过程

一、下载源码

代码下载地址:

链接: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,并粘贴以下内容:

python"># 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">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">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.niftyadmin.cn/n/312076.html

相关文章

举例说明Java中代码块的执行顺序

结论 这里先把整理好的结论抛给大家&#xff0c;然后来验证我们的结论 在Java类被new的过程中&#xff0c;执行顺序如下&#xff1a; 实现自身的静态属性和静态代码块。&#xff08;根据代码出现的顺序决定谁先执行&#xff09; 实现自身的非静态属性和非静态代码块。 执…

java通过redis实现排行榜功能

1. 数据存储规划 在排行榜中&#xff0c;每个用户都会有一个唯一的标识&#xff08;ID&#xff09;&#xff0c;同时需要记录该用户的积分&#xff08;Score&#xff09;。因此&#xff0c;我们可以将每个用户的ID作为有序集合中的一个元素&#xff0c;将用户的积分作为该元素…

从零开始学习机器学习和深度学习:基础知识、编程工具和实践经验

当涉及到机器学习和深度学习时&#xff0c;许多人可能感到不知所措。本文将为您提供入门机器学习和深度学习的基础知识。 什么是机器学习&#xff1f; 机器学习是人工智能的一个分支&#xff0c;其主要目的是通过训练算法来实现任务&#xff0c;而不是手动编程来实现任务。机器…

常见的基础模块电路,你都能看懂吗?

文章开始前&#xff0c;先来考考大家~ 下面的五副电路图&#xff0c;你能看懂几个&#xff1f; 目录 01.电源电路 02.运算放大器电路 03.信号产生电路 04.信号处理电路 05.传感器及其应用电路 06.显示电路 TDA2030电路图 34063电路图 555电路 TDA2030电路图 三极管分立元…

Linux——进程信号1

信号和信号量是俩个东西&#xff0c;俩者无关系。 信号 信号本质是一种通知机制&#xff0c;用户or操作系统通过发送一定的信号&#xff0c;通知进程&#xff0c;某些事件已经发送&#xff0c;让进程进行后续处理。 结合进程&#xff0c;信号结论&#xff1a; 进程要处理信号&a…

黑客的真实生活是怎样的?他们真的能挣很多钱么?

作者&#xff1a;l浪费的时间 黑客这一群体&#xff0c;在普通人眼中就是神一般的存在。 黑客差钱吗&#xff1f;他们不差钱。当然是靠装逼活着&#xff0c;很多黑客只想钻研技术攻破个大公司玩玩&#xff0c;搞得轰轰烈烈&#xff0c;就能吹一辈子牛了。 一、黑客靠什么赚钱…

C++ Primer第五版_第十六章习题答案(21~30)

文章目录 练习16.21练习16.22练习16.23练习16.24练习16.25练习16.26练习16.27练习16.28shared_ptrunique_ptr 练习16.29练习16.30 练习16.21 编写你自己的 DebugDelete 版本。 #ifndef DEBUGDELETE_H #define DEBUGDELETE_H#include <iostream>class DebugDelete { publi…

堆排序创建

堆排序创建 一、介绍1、什么是堆2、大项堆&#xff08;排序前&#xff09;3、小项堆&#xff08;排序前&#xff09;4、排序思想 二、大项堆排序案例1、流程2、讲解 三、总结 一、介绍 1、什么是堆 堆是一种叫做完全二叉树的数据结构&#xff0c;可以分为大项堆&#xff0c;小…