【03】pytorch 自定义transform操作-踩坑记录

2023-10-31

1 椒盐噪声是什么

就是图片上出现的黑白点,类似于老式电视机出现雪花屏幕的感觉。
在这里插入图片描述
transforms是pytorch定义的一个类,对图像进行各种变换,进行图像变换的目的是数据增强,使得模型的鲁棒性更加的强,尽管pytorch已经提供了很多的类别供我们选择,但在实际工程中这些往往还不够。因此需要因地制宜,制作属于自己项目的数据集变换策略。比如,添加椒盐噪声。

2 实际中,怎么进行椒盐噪声的添加呢?

在一张图片上随机的选择像素点,令其像素值为255(黑色)或者0(白色)。如下图是一个3通道的tensor图片,你可以看成是这样子的:每一个小格子上存储的就是像素值,那么上述添加椒盐噪声的问题就转换成了随机选择一些小格子,改变其像素值的问题。

tips:这个图示不是很“完善”,我只想让你直观的感受一下,整个过程类似于一个大的矩阵乘法(请大家意会一下,不要很在意具体数值是啥哈,思想更关键)

在这里插入图片描述
其中,mask矩阵中{0,1,2}是按照概率产生的。

0表示该位置处原图像的像素替换为255(白色);
1表示该位置处原图像的像素替换为0(黑色);
2表示该位置处原图像中的像素不变。

变换以后就是最右边的图像啦,关键就是这个mask矩阵的设置。我们需要确定:

mask矩阵的维度:要和原图像的维度一致
mask矩阵里随机生成的数值:依概率生成{0,1,2}

接下来对原图像操作,关键是对应索引处像素值的替换.

找到mask==1和0的位置
记录这个index
带原图像中将对应的index处的像素值按照替换规则替换

为了使模型还是比较好的能识别原图像,我们根据信噪比的大小来控制0,1,2出现的概率.假设信噪比是0.8,那么上述过程中2出现的概率就是0.8,0,1出现的概率均为0.1(概率和为1哦).

整个思路理清楚了,下面就是代码的实现了。附上代码:

class AddPepperNoise(object):
    def __init__(self,snr,p):
        self.snr = snr
        self.p = p
    def __call__(self,img):
        # img是一个pil的图片格式,如果进行数据处理,就统一数据类型
        img_pro = np.asarray(img).copy()## 自己忘记了加.copy(),这里还是不太明白为什么要加入.copy()
        h,w,c = img_pro.shape
        if np.random.rand() < self.p:

            mask = np.random.choice((0,1,2), size = (h,w,1), p = [(1-self.snr)/2,(1-self.snr)/2],self.snr)
            # mask_noise = img * mask
            mask = np.repeat(mask,c,axis = 2)
            img_pro[mask == 0] = 255
            img_pro[mask == 1] = 0
            img_after = Image.fromarray(img_pro.astype('uint8')).convert('RGB')
        # 这里需要确定一下返回的数据的类型是什么,是tensor还是array呢?返回的是image PIL数据
        else:
            img_after = img
        return img_after

3 总结 自己存在的问题:

mask矩阵的张量的shape不清楚,其实是(h,w,c);
在对原图像操作的时候,数据类型不正确;
因为transform接收的是一个数据,输出的也是一个数据,且都是PIL image格式的数据,所以在整个过程中要尤其注意:
\quad 读取image PIL格式数据;
\quad 转换成numpy格式的ndarray;
\quad 进行数学操作;
\quad 再转换为image PIL格式的数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【03】pytorch 自定义transform操作-踩坑记录 的相关文章

  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 如何在 Python 中检索 for 循环中的剩余项目?

    我有一个简单的 for 循环迭代项目列表 在某些时候 我知道它会破裂 我该如何退回剩余的物品 for i in a b c d e f g try some func i except return remaining items if s
  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • 使用 Tkinter 显示 numpy 数组中的图像

    我对 Python 缺乏经验 第一次使用 Tkinter 制作一个 UI 显示我的数字分类程序与 mnist 数据集的结果 当图像来自 numpy 数组而不是我的 PC 上的文件路径时 我有一个关于在 Tkinter 中显示图像的问题 我为
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • MyEclipse/Eclipse 在编辑java时快捷键

    MyEclipse 快捷键1 CTRL Ctrl 1 快速修复 Ctrl D 删除当前行 Ctrl Q 定位到最后编辑的地方 Ctrl L 定位在某行 Ctrl O 快速显示 OutLine Ctrl T 快速显示当前类的继承结构 Ctrl
  • java安全框架-Shiro和Spring Security基础dome

    代码不就不复制了 直接去下拉吧 https github com zyh yb Security Shiro Framework maven security
  • int指针和char指针

    int类型的指针使用需要初始化 不然会段错误 字符串常量传递的是它的首地址 int num num 10 这样的写法是错误的 因为指针num没有地址 是导致段错误 需要int num int a 10 num a num 20 这样才ok
  • 基于Levenberg-Marquardt训练算法的BP网络Python实现

    基于Levenberg Marquardt训练算法的BP网络Python实现 分类 统计机器学习算法理论 2013 07 15 23 40 430人阅读 评论 0 收藏 举报 经过一个多月的努力 终于完成了BP网络 参考的资料为 1 Tra
  • http://localhost:8080 请求用户名和密码。信息为: “XDB”

    http localhost 8080 请求用户名和密码 信息为 XDB 安装tomcat后 访问8080端口 被要求输入xdb验证 然后报Unauthorized错误 问题最有效解决办法 问题 我tomcat的jsp环境 可是在访问808
  • ffmpeg合并两路rtmp流并推送

    ffmpeg实现两路流的覆盖 实现两路流的覆盖可以使用ffmpeg的overlay参数 将一路流覆盖到另外一路流之上 overlay参数简介 overlay x y 这里x和y表示距离左上角的坐标偏移 例子 ffmpeg i rtmp ip
  • UniApp原生插件制作

    参考1 UniApp官网 原生插件开发 参考2 uniapp Android 原生插件开发 一 下载安装Android Studio 本部分不在赘述 二 下载UniApp离线SDK 下载地址 Android 离线SDK 正式版 uni小程序
  • linux 基础 --进程管理 ps

    查看进程 静态 ps 观察进程 ps aux head 5 静态查看进程ps USER PID CPU MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0 0 0 6 127948 6520 S
  • STM32低功耗停止模式 以及简述判断中断的两种方式

    include wkup h include led h include delay h 本程序只供学习使用 未经作者许可 不得用于其它任何用途 ALIENTEK战舰STM32开发板 待机唤醒 代码 正点原子 ALIENTEK 技术论坛 w
  • 【Python】欧氏距离和余弦距离

    一 欧几里得距离 Euclidean Distance 欧氏距离是最常见的距离度量 衡量的是多维空间中各个点之间的绝对距离 公式如下 因为计算是基于各维度特征的绝对数值 所以欧氏度量需要保证各维度指标在相同的刻度级别 比如对身高 cm 和体
  • 安卓视频播放器——ijkPlayer(Bilibili开源)

    作为一个B站 Bilibili 用户 特别喜欢B站的播放器 凑巧 发现了b站的github的地址 嘿嘿 B站github地址f 发现了ijkplayer播放器 支持android 和ios 我们用AndroidStudio新建project
  • 马上:硬件开关机

    马上 硬件开关机 通过多年与RK3288不同产品的方案公司的接触 梳理并总结RK3288方案常用开关机的方案 PMU RTC 方案 PMU RK808 RTC hym8563 纽扣电池供电 硬件上需要把RTC的中断脚接到RK808的开机引脚
  • Feign负载均衡写法

    Feign主要为了面向接口编程 feign是web service客户端 是接口实现的 而ribbon是通过微服务名字访问通过RestTemplate调用的 如下 在Feign的实现下 我们只需要创建一个接口并使用注解的方式来配置它 类似于
  • 新的分享之路开启,感谢您的陪伴

    分享之初 新学期即将到来之时 我开启了新的分享之路 第一次尝试在微信公众号上分享原创知识 起初 我一直是拒绝的 因为读博异常忙碌 哪有时间去经营一个新的学习天地 并且经过十年的CDSN分享 慢慢养成了力争每一篇文章都是干货 都对得起读者的喜
  • 在Android Studio中添加com.android.support:design的支持

    关于Material Design Google在2015的IO大会上 给我们带来了Material Design的设计规范 同时 也给我们带来了全新的Android Design Support Library 利用这个库在Android
  • window系统默认编码格式GBK怎么理解

    window系统默认编码格式GBK怎么理解 对我们在window 平台编码有什么影响呢 在说明这个问题之前 我们先搞清楚 文件编码格式 编程语言中字节数组转字符串默认使用的编码格式 操作系统默认的编码格式 1 文件编码格式 指的是我们编写的
  • 递归问题

    1 题目分析 1 问题描述 一个人赶着鸭子去每个村庄卖 每经过一个村子卖去所赶鸭子的一半又一只 这样他经过了七个村子后还剩两只鸭子 问他出发时共赶多少只鸭子 经过每个村子卖出多少只鸭子 分析 卖家在经过七个村子后剩下2只鸭子 令duck 2
  • C语言,一维数组实验五

    A C语言实验 最值 描述 有一个长度为n的整数序列 其中最大值和最小值不会出现在序列的第一和最后一个位置 请写一个程序 把序列中的最小值与第一个数交换 最大值与最后一个数交换 输出转换好的序列 输入 输入包括两行 第一行为正整数n 1 n
  • 7-14 求整数段和 (15分)

    7 14 求整数段和 15分 给定两个整数A和B 输出从A到B的所有整数以及这些数的和 输入格式 输入在一行中给出2个整数A和B 其中 100 A B 100 其间以空格分隔 输出格式 首先顺序输出从A到B的所有整数 每5个数字占一行 每个
  • 【03】pytorch 自定义transform操作-踩坑记录

    1 椒盐噪声是什么 就是图片上出现的黑白点 类似于老式电视机出现雪花屏幕的感觉 transforms是pytorch定义的一个类 对图像进行各种变换 进行图像变换的目的是数据增强 使得模型的鲁棒性更加的强 尽管pytorch已经提供了很多的