首页 > 其他分享 >dataset.py代码阅读笔记

dataset.py代码阅读笔记

时间:2023-06-08 23:38:51浏览次数:37  
标签:random self py mask 笔记 dataset sample im np


#dataset.py

import logging
import os

#处理c语言类型和二进制的数据结构
import struct

#regular expression module
import re
import time

import numpy as np

#这个模块pip的时候有问题,但是按照提示出现换了pip文件名就好使了,叫做scikit-image
#skimage的文档,主要是一些图像读取,显示,还有一些图像处理算法
rgb转换成hsv import skimage.io as skio
import torch as th

#不知道为什么作者要注释掉这个代码,后面也没用到它
#from scipy.stats import ortho_group
#hsv是一种格式,hue色调, saturation饱和度, value亮度
from skimage.color import rgb2hsv, hsv2rgb

from torch.utils.data import Dataset
from torchlib.image import read_pfm
from torchlib.utils import Timer

#创建日志
log = logging.getLogger(“demosaic_data”)

class SRGB2Linear(object):
def init(self):

调用父类的方法

super函数详解使用super好处
python的继承顺序
super(SRGB2Linear, self).init()
self.a = 0.055
self.thresh = 0.04045
self.scale = 12.92
self.gamma = 2.4

#gamma矫正
def call(self, im):
#im貌似是一个输入量
#boardcast把小的矩阵或张量拓展成和大的那个一样的
#如果im的像素小于等于thresh,返回 im / self.scale
#如果im的像素大于thresh,则(im+a)/(1+a)幂上gamma
return np.where(im <= self.thresh,
im / self.scale,
np.power((np.maximum(im, self.thresh) + self.a) / (1 + self.a), self.gamma))

#应该是把伽马矫正变回来
class Linear2SRGB(object):
def init(self):
super(Linear2SRGB, self).init()
self.a = 0.055
# 这个阈值和上面那个不一样,不知道它是怎么确定的
self.thresh = 0.0031308049535603713
self.scale = 12.92
self.gamma = 2.4

clamp用法,一个钳位功能

dataset.py代码阅读笔记_数据结构

#算了一下,式子刚好是上面那个的反变换
def call(self, im):
return th.where(im <= self.thresh,
im * self.scale,
(1 + self.a)*th.pow(th.clamp(im, self.thresh), 1.0 / self.gamma) - self.a)

def bayer_mosaic(im):
“”“GRBG Bayer mosaic.”""

mos = np.copy(im)
#mask是和im一样大小的数组
mask = np.ones_like(im)

pycharm调试技巧 view as array是一个很好用的功能
#通道0田字格的右上保持原样,别的都是0

red

mask[0, ::2, 0::2] = 0
mask[0, 1::2, :] = 0

#通道1田字格的左上和右下保持原样,别的都是0

green

mask[1, ::2, 1::2] = 0
mask[1, 1::2, ::2] = 0

#通道0田字格的左下保持原样,别的都是0

blue

mask[2, 0::2, :] = 0
mask[2, 1::2, 1::2] = 0

#乘号是对应元素相乘
#返回两个值,用x,y就可以获取
return mos
mask, mask

def xtrans_mosaic(im):
“”"XTrans Mosaick.

G b G G r G
 r G r b G b
 G b G G r G
 G r G G b G
 b G b r G r
 G r G G b G

“”"
mask = np.zeros((3, 6, 6), dtype=np.float32)
g_pos = [(0,0), (0,2), (0,3), (0,5),
(1,1), (1,4),
(2,0), (2,2), (2,3), (2,5),
(3,0), (3,2), (3,3), (3,5),
(4,1), (4,4),
(5,0), (5,2), (5,3), (5,5)]
r_pos = [(0,4),
(1,0), (1,2),
(2,4),
(3,1),
(4,3), (4,5),
(5,1)]
b_pos = [(0,1),
(1,3), (1,5),
(2,1),
(3,4),
(4,0), (4,2),
(5,4)]

for y, x in g_pos:
mask[1, y, x] = 1

for y, x in r_pos:
mask[0, y, x] = 1

for y, x in b_pos:
mask[2, y, x] = 1

mos = np.copy(im)

_, h, w = mos.shape
mask = np.tile(mask, [1, np.ceil(h / 6).astype(np.int32), np.ceil(w / 6).astype(np.int32)])
mask = mask[:, :h, :w]

return mask*mos, mask

class DemosaicDataset(Dataset):
def init(self, filelist, add_noise=False, max_noise=0.1, transform=None,
augment=False, linearize=False):
self.transform = transform

self.add_noise = add_noise
self.max_noise = max_noise

self.augment = augment

#如果设置了线性化,就让self.linearizer等于被线性化伽马矫正过的numpy图像
if linearize:
self.linearizer = SRGB2Linear()
else:
self.linearizer = None

#分离文件路径//文件名和拓展名
# 这边应该要给filelist赋初值吧?
if not os.path.splitext(filelist)[-1] == ".txt":
  raise ValueError("Dataset should be speficied as a .txt file")

self.root = os.path.dirname(filelist)
self.images = []
#读取filelist里面的图像
with open(filelist) as fid:
  for l in fid.readlines():
    im = l.strip()
    self.images.append(os.path.join(self.root, im))
self.count = len(self.images)

def len(self):
return self.count

#没移植可真离谱
def make_mosaic(self, im):
return NotImplemented

def getitem(self, idx):
impath = self.images[idx]

# read image
im = skio.imread(impath).astype(np.float32) / 255.0

# if self.augment:
#   # Jitter the quantized values
#   im += np.random.normal(0, 0.005, size=im.shape)
#   im = np.clip(im, 0, 1)

if self.augment:
  if np.random.uniform() < 0.5:
    im = np.fliplr(im)
  if np.random.uniform() < 0.5:
    im = np.flipud(im)

  im = np.rot90(im, k=np.random.randint(0, 4))

  # Pixel shift
  if np.random.uniform() < 0.5:
    shift_y = np.random.randint(0, 6)  # cover both xtrans and bayer
    im = np.roll(im, 1, 0)
  if np.random.uniform() < 0.5:
    shift_x = np.random.randint(0, 6)
    im = np.roll(im, 1, 1)

  # Random Hue/Sat
  if np.random.uniform() < 0.5:
    shift = np.random.uniform(-0.1, 0.1)
    sat = np.random.uniform(0.8, 1.2)
    im = rgb2hsv(im)
    im[:, :, 0] = np.mod(im[:, :, 0] + shift, 1)
    im[:, :, 1] *= sat
    im = hsv2rgb(im)

  im = np.clip(im, 0, 1)

if self.linearizer is not None:
  im = self.linearizer(im)

# Randomize exposure
if self.augment:
  if np.random.uniform() < 0.5:
    im *= np.random.uniform(0.5, 1.2)

  im = np.clip(im, 0, 1)

  im = np.ascontiguousarray(im).astype(np.float32)

im = np.transpose(im, [2, 1, 0])

# crop boundaries to ignore shift
c = 8
im = im[:, c:-c, c:-c]

# apply mosaic
mosaic, mask = self.make_mosaic(im)

# TODO: separate GT/noisy
# # add noise
# std = 0
# if self.add_noise:
#   std = np.random.uniform(0, self.max_noise)
#   im += np.random.normal(0, std, size=im.shape)
#   im = np.clip(im, 0, 1)

sample = {
    "mosaic": mosaic,
    "mask": mask,
    # "noise_variance": np.array([std]),
    "target": im,
    }

# Augment
if self.transform is not None:
  sample = self.transform(sample)

return sample
def repr(self):
 s = “Dataset\n”
 s += " . {} images\n".format(len(self.images))
 return sclass ToBatch(object):
 def call(self, sample):
 for k in sample.keys():
 if type(sample[k]) == np.ndarray:
 sample[k] = np.expand_dims(sample[k], 0)
 return sample

dataset.py代码阅读笔记_数据结构_02


array型转换成Tensor

Python NumPy ndarray 入门指南 class ToTensor(object):
 def call(self, sample):
 for k in sample.keys():
 if type(sample[k]) == np.ndarray:
 sample[k] = th.from_numpy(sample[k])
 return sample
class GreenOnly(object):
 def call(self, sample):
 sample[“target”][0] = 0
 sample[“target”][2] = 0
 return sampleclass BayerDataset(DemosaicDataset):
 def make_mosaic(self, im):
 return bayer_mosaic(im)class XtransDataset(DemosaicDataset):
 def make_mosaic(self, im):
 return xtrans_mosaic(im)


标签:random,self,py,mask,笔记,dataset,sample,im,np
From: https://blog.51cto.com/u_16131692/6444133

相关文章

  • demosaicnet-master的包代码阅读笔记
    init.py我在学init用法时候的笔记该文件里面都是导入模块,其中从dataset.py是导入所有模块,因为模糊导入的__all__没有定义。from.modulesimportBayerDemosaickfrom.modulesimportXTransDemosaickfrom.mosaicimportxtransfrom.mosaicimportbayerfrom.mosaicim......
  • python 爬虫某东网商品信息 | 没想到销量最高的是
    哈喽大家好,我是咸鱼好久没更新python爬虫相关的文章了,今天我们使用selenium模块来简单写个爬虫程序——爬取某东网商品信息网址链接:https://www.jd.com/完整源码在文章最后元素定位我们需要找到网页上元素的位置信息(xpth路径)我们首先需要知道搜索框和搜索按钮的位置,然......
  • gprc python调用c++远程服务
      客户端和服务端之间不是直接通信的,需要通过生成的代码和protocolbuffers传输协议(可使用其他传输协议替换)进行通信。开发步骤:  1..proto文件----message和servicemessage是消息类型,定义参数,service是接口类型,定义远程服务的方法在grpc中有四种类型的服务方法:参考......
  • 《人件》读书笔记
    概要:社会的复杂性远比技术上的挑战难处理得多,并且很多时候社会因素比技术因素更重要。而团队是一个非常重要的因素,如何管理团队,项目、改善工作环境,形成高效团队这是不可避免和忽略的。1、管理团队:一个项目的失败,可能是技术导致、也有可能是团队因素导致,也可能两者都有。在工作......
  • 神经网络的k和b初始化方式问题笔记
    初始化是为了防止梯度消失和爆炸编写代码,假设输入是512的行向量,经过10个512x512的矩阵,计算输出的平均值和标准差。输入行向量,每个矩阵,都是标准正态分布importtorch#随机生成一个512的输入值,服从正态分布x=torch.randn(512)y=xforiinrange(10):a=torch.rand......
  • 手写pytorch线性回归
    Python下划线的五种用法手写线性回归教程地址未解决的问题:plt.show()会阻塞importtorchfromIPythonimportdisplayfrommatplotlibimportpyplotaspltimportnumpyasnpimportrandomfromtqdmimporttqdmfrommultiprocessingimportPool#generatedatasett......
  • 《人件》读书笔记2
    改善工作环境:工作环境的质量直接关系开发者的效率。一般来说,除了新手,经验对产出效率影响不大。反倒是,和身边的人有关;如果他们表现好,你也会自然表现好。这也就是环境同化,好的工作环境真的很重要。好的工作环境:工作空间宽敞、光亮、安静、具有私密性、不容易受到打扰并且具有窗户(不......
  • 阅读笔记之《构建之法》四
    第八章需求分析8.1软件需求①获取和引导需求:软件团队需要找到软件的利益相关者,了解和挖掘他们对软件的需求,引导他们表达出对软件的需求;需求还可以来自各种管理机构;需求不仅来自外界,还可以来自软件企业本身;需求还可以来自技术团队本身;有些需求的目的是要更好地了解用户的行为和......
  • 阅读笔记之《构建之法》三
    第六章敏捷流程6.1敏捷的流程①敏捷开发原则:(1)尽早并持续地交付有价值的软件以满足顾客需求(2)敏捷流程欢迎需求的变化,并利用这些变化来提高用户的竞争优势(3)经常发布可用的软件,发布间隔可以从几周到几个月,能短则短(4)业务人员和开发人员在项目开发过程中应该每天共同工作(5)以有......
  • python爬虫学习记录
    浏览器工具web请求过程http协议数据解析目的提取有效的数据信息四种解析方式re解析:正则表达式解析,效率特别高bs4解析:老项目的解析方式xpath解析:高级,简单方便速度快pyquery解析:模仿前端的jQuery函数库的解析方式正则表达式RegularExpression一种使用表达式对字符......