基于UNnet(backbone=resnet34) 对 PASCAL VOC 的分割

news2024/12/23 23:18:44

目录

1. 介绍

2.  tools 代码文件夹

2.1 get_palette 

2.2 transform 

3. train 部分

4. 结果展示


1. 介绍

本文使用resnet 34作为backbone代替传统unet的 vgg,实现对PASCAL VOC的分割

训练了两百个epoch后,mean iou到达了0.4左右,没有达到预期的效果

完整的下载地址:基于UNnet 对 PASCAL VOC 的分割

目录结构如下:

2.  tools 代码文件夹

由于本人的习惯,这里放置项目需要的模块

本章,tools 文件夹主要有三个文件

  • confuseMatrix 通过混淆矩阵去评估网络的性能
  • get_palette 得到VOC数据集的调色板对照表
  • transforms 自定义的语义分割的数据增广实现

2.1 get_palette 

代码如下:

import json
import numpy as np
from PIL import Image

# 随机传入一张 label图片,读取mask标签,运行一次即可
target = Image.open('../data/SegmentationClass/2007_000032.png')

# 获取调色板
palette = target.getpalette()
print(palette)
palette = np.reshape(palette, (-1, 3)).tolist()
# 转换成字典子形式
pd = dict((i, color) for i, color in enumerate(palette))

json_str = json.dumps(pd)
with open("../json/palette.json", "w") as f:
    f.write(json_str)

这里Image.open 只需要传入一张图片就行了,且整个项目只需要运行一次,生成的json文件如下:

 

2.2 transform 

代码如下:

import numpy as np
import torch
from torchvision import transforms as T
from torchvision.transforms import functional as F


class Compose(object):
    def __init__(self, transforms):
        self.transforms = transforms

    def __call__(self, image, target):
        for t in self.transforms:
            image, target = t(image, target)
        return image, target


# 将图像和标签缩放
class Resize(object):
    def __init__(self, size:list):
        self.size = size

    def __call__(self, image, target):
        image = F.resize(image, self.size)
        target = F.resize(target, self.size, interpolation=T.InterpolationMode.NEAREST)
        return image, target


# 转为Tensor
class ToTensor(object):
    def __call__(self, image, target):
        image = F.to_tensor(image)
        target = torch.as_tensor(np.array(target), dtype=torch.int64)   # 不需要缩放,变成 tensor 就行
        return image, target


class Normalize(object):
    def __init__(self,mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5)):
        self.mean = mean
        self.std = std

    def __call__(self, image, target):
        image = F.normalize(image, mean=self.mean, std=self.std)
        return image, target

这里没有实现过多的预处理,只是实现了一个resize,原因如下

这里使用unet是官方实现的,导入的方式如下

import segmentation_models_pytorch as smp    
model = smp.Unet(encoder_name='resnet34',in_channels=3,classes=21)

这里需要保证输入的图像size是32的倍数,否则会报错:

 

3. train 部分

train 过程的实现较为简单,在可视化数据的时候,有几点需要注意

    # 可视化数据
    import numpy as np
    dataloader = next(iter(train_loader))
    img,label = dataloader
    print(img.shape,img.dtype)                  # torch.Size([2, 3, 384, 512]) torch.float32
    print(label.shape,label.dtype)              # torch.Size([2, 384, 512]) torch.int64
    print(np.unique(label))                     # [  0   4   6   7   9  12  15  20 255]
    plot(data_loader=dataloader)

因为使用的是交叉熵损失函数,所以label的维度需要比img的维度少1,且dtype是整型的,这里具体的可以参考:聊聊关于分类和分割的损失函数:nn.CrossEntropyLoss()

然后,label的灰度值只能是从0开始的自然数,如果是二分类就是0 1,这里pascal voc是20分类,所以最多是0-20之间的整数。至于255,是voc 自带的边界部分,忽略即可

展示的图像如下

 

这里使用的学习率下降策略是cos,这里实现了两次,因为第一次需要绘制下降的曲线图,如果没有定义第二次的话,绘制曲线的时候,学习率已经被迭代完了

 

4. 结果展示

这里训练了 200个epoch,batch size = 4,初始学习率为0.0002,经过200个epoch,衰减为初始的0.1倍

 

train 的loss曲线以及test 上的miou结果为:

预测单张图像:

 

 

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

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

相关文章

如何管理银行多网点监控?用这方法就够了!

随着科技进步和生活水平的不断提高,人们对于餐饮消费的需求也逐渐变得多样化和个性化。 高校食堂现状分析 01.信息化水平低,学校管理难,无法精准就餐; 02用户满意度低,学生取餐环节效率低; 03.管理效率低…

音视频入门

1 音视频核心知识 1.1 视频录制原理 1.2 视频(音频视频)播放原理 2 图像基础概念 2.1 像素 2.2 分辨率 隔行扫描 逐行扫描 2.3 位深 RGB 通常每个通道用8bit表示 每个通道位深越大,能够表示的颜色值就越大 2.4 帧率 帧率越高&#xff…

Web的基本漏洞--CSRF漏洞

目录 一、CSRF漏洞介绍 1.CSRF漏洞原理 2.CSRF漏洞的类型 3.漏洞识别 4.漏洞攻击 5.CSRF漏洞的危害 6.CSRF漏洞防御 7.CSRF和XSS的区别 一、CSRF漏洞介绍 1.CSRF漏洞原理 CSRF(cross site request forgery)是指跨站请求伪造,是指利用受害者尚未…

智慧工厂~经典开源项目数字孪生智慧工厂——开源工程及源码

以领先的数字孪生技术为基础,全面打造智慧工厂。现有云南某大型汽车加工厂工程和源码免费赠送! 项目介绍 智慧工厂基于数字孪生技术创建了一个真实的三维模型场景。通过对传感器和机器的数据采集、分析处理,实时监控各生产环节,优…

CS5523规格书|MIPI 转DP/eDP转换芯片|DSI转DP/eDP转换芯片

ASL CS5523是MIPI DSI输入、DP/e DP输出转换芯片。MIPI DSI最多支持4个通道,每个通道的最大运行速度为1.5Gps。对于DP 1.2输出,它由4个数据通道组成,支持1.62Gbps和2.7Gbps的链路速率。支持1.62Gbps和2.7Gbps的链路速率。它支持2560的最高分辨…

chatgpt赋能python:Python中最大公约数的函数介绍

Python中最大公约数的函数介绍 在数学中,最大公约数(GCD)是两个或多个整数的最大公约数。 Python是一种高级编程语言,具有内置的GCD函数。在本篇文章中,我们将介绍Python中的最大公约数函数,以及如何使用它…

【C++】类和对象 - 封装 - 属性和行为,访问权限,class 和 struct区别,成员属性私有化

No.Contents1【C】基础知识 - HelloWorld,注释,变量,常量,关键字,标识符2【C】数据类型 - 整型,sizeof,实型,字符型,转义字符,字符串类型,布尔类型…

web前端 -- javascript(02) -- 数据类型转换、常见运算符及顺序、选择和循环结构

数据类型转换 &#xff08;1&#xff09;自动类型转换&#xff1a; 特点&#xff1a;低类型自动向高类型进行转换 boolean < int < float < string PS&#xff1a; boolean类型如果与数值型进行运算&#xff1a;true 1&#xff1b;false 0其他基本数据类型与字符串…

whistle以及谷歌插件Proxy SwitchyOmega实现代理

whistle提供本地服务器&#xff0c;以及代理 Proxy SwitchyOmega拦截浏览器的网络请求&#xff0c;指向whistle服务 ip 为什么要用它们呢&#xff1f; 其实一开始使用的是mac的charles&#xff0c;但是出现了网页上传文件数据的时候会被篡改&#xff0c;也可能是我配置的原因…

声明式事务控制

声明式事务控制 编程式事务控制相关对象 PlatformTransactionManager PlatformTransactionManager接口是spring的事务管理器&#xff0c;它里面提供了常用的操作事务的方法 方法说明TransactionStatus getTransaction(TransactionDefaultion defination)获取事务的状态信息…

外贸跨境商城系统-后台采集-外贸跨境电商平台搭建

一、外贸跨境商城系统框架 欢迎名片交流 JAVA语言 后端: SpringBoot, Mysql8.0, Redis, Nginx 手机端&#xff1a;uniapp, H5, App打包 前端布局&#xff1a;H5端、PC电脑端、APP端、小程序端 后台&#xff1a;总后台管理、商家后台管理 二、外贸跨境商城基础功能架构…

Chrome浏览器的自动播放限制策略(原文)

客户&#xff1a;为什么明明我设为自动播放了&#xff0c;却无法自动播放&#xff1f;我&#xff1a;#$%^#~客户&#xff1a;为什么其他浏览器可以自动播放&#xff0c;Chrome浏览器不能自动播&#xff0c;您们产品有问题...我&#xff1a;^$&*^(*&^(*% 好吧&#xff…

【CesiumJS入门】(0)专栏介绍&项目搭建

前言 开了一个新的专栏&#xff0c;叫【CesiumJS入门】&#xff0c;因为自己也是初学者&#xff0c;所以专栏主要是记录自己学习CesiumJS的过程&#xff0c;如果还能给后来者带来一点参考那就真是太好了。 本项目的仓库地址&#xff1a;https://gitee.com/cswwww/cesium-tyro…

Python入门教程+项目实战-13.1节-集合基础概念

目录 13.1.1 理解集合类型 13.1.2 集合的类型名 13.1.3 集合的定义 13.1.4 在循环中遍历集合 13.1.5 集合的元素输出顺序 13.1.6 知识要点 13.1.7 系统学习python 13.1.1 理解集合类型 集合类型与字典类型非常接近&#xff0c;Python中的集合类型也是用{}符号括住的一个…

Zemax Lumerical | 二维光栅出瞳扩展系统优化(下)

简介 本文提出并演示了一种以二维光栅耦出的光瞳扩展&#xff08;EPE&#xff09;系统优化和公差分析的仿真方法。 在这个工作流程中&#xff0c;我们将使用3个软件进行不同的工作 &#xff0c;以实现优化系统的大目标。首先&#xff0c;我们使用 Lumerical 构建光栅模型并使用…

封装设计!抽象BasePage,提升WEB自动化测试用例质量和效率

目录 前言&#xff1a; 一、什么是抽象BasePage 二、BasePage中的属性和方法 三、BasePage中的代码实现 四、抽象Page对象 五、测试用例 六、总结 前言&#xff1a; 对于测试工程师来说&#xff0c;WEB自动化测试是非常重要的一部分。然而&#xff0c;WEB自动化测试的开…

软件测试实用案例上机报告一

文章目录 一、上机内容&#xff08;单元测试&#xff09;二、简单计算机测试1、题目2、编码&#xff08;源代码&#xff09;3、HTMLTestRunner生成可视化报告4、coverage查看覆盖情况 三、基本覆盖路径法测试1、题目2、编码&#xff08;源代码&#xff09;3、复读 &#x1f414…

【构造+数论+Tree】CF1627C

Problem - 1627C - Codeforces 题意&#xff1a; 给定一棵树的形态&#xff0c;让你给这棵树的边赋值&#xff0c;使得每对相邻的边的边权和都是质数 思路&#xff1a; 一开始模拟了一下样例&#xff0c;Sample3告诉我们如果有三条边相邻就是无解&#xff08;可以猜的结论&a…

详解.NET IL代码

IL是什么&#xff1f; Intermediate Language &#xff08;IL&#xff09;微软中间语言 C#代码编译过程&#xff1f; C#源代码通过LC转为IL代码&#xff0c;IL主要包含一些元数据和中间语言指令&#xff1b; JIT编译器把IL代码转为机器识别的机器代码。如下图 语言编译器&am…

让代码创造童话,共建快乐世界

六一儿童节即将到来&#xff0c;小朋友们开心的笑容弥漫了整个城市。对于大多数孩子来说&#xff0c;六一儿童节意味着玩具和糖果。但尽管这些看起来微不足道&#xff0c;却是他们幼小而纯真心灵的欢笑。而心怀童真的大人们则用他们手中的代码&#xff0c;创造出一个快乐而幸福…