包 | ||
---|---|---|
tqdm | 进度条 | |
pyav | 学习资源 | |
pims | 将多张图像转化为一个图像序列 | 学习资源 |
argparse |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
可以处理将多张图片存为一个序列对象
pims.ImageSequence()
pims.PyAVVideoReader(path)
numpy
np.asarray()
: 将其他类型转化为np.array类型
with Image.open(path) as img:
img.load()
img.convert('RGB')
img.convert('L')
img.resize
Image.fromarray()
将np.array类型转化为Image image类型
基本概念
PIL中有九种不同颜色模式。分别为1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
1:1位像素,表示黑和白,但是存储的时候每个像素存储为8bit。
L:8位像素,表示黑和白。
P:8位像素,使用调色板映射到其他模式。
RGB:3x8位像素,为真彩色。
RGBA:4x8位像素,有透明通道的真彩色。
CMYK:4x8位像素,颜色分离。
YCbCr:3x8位像素,彩色视频格式。
I:32位整型像素。
F:32位浮点型像素。
av.open(path, mode: 'r'\'w')-> av.InputContainer
.add_stream
os
os.listdir(path)
os.path.join()
os.path.isfile()
作者使用的缓和函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J2VENYiR-1638283583141)(https://raw.githubusercontent.com/Quincy756/picutres/main/img/RVM/ease_functions.png)]
pytorch:torchvision.transforms.functional
nn.module
model.eval():将模型设为评估模式 =self.train(False)
, 返回模型本身
将模型转化为
torch.jit.script
torch.jit.freeze
isinstance(a, torch.Tensor)
torch.div(input, output)
输出input/output
torch.unsqueeze()
a=torch.randn(2, 3, 4, 5)
a=a.unsqueeze(1)
a.shape
torch.Size([2, 1, 3, 4, 5])
a=torch.randn(2, 3, 4, 5)
a=a.unsqueeze(2)
a.shape
torch.Size([2, 3, 1, 4, 5])
tensor.gt(n)
:大于n为True, 否则为False
其他
用于编号图片
'2'.zfill(4)
输出 ‘0002’:输出四位,余下的用0填充
a.shape[n] = a.size(n)
argparse
linux 可以通过嵌入式命令程序文件名 + 设置的参数
PC机 可以通过cmd命令python + 程序文件名 + 设置的参数
使用ArgumentParser
创建一个解析器,并使用add_argument()
添加一个新参数。 参数可以是可选的,必需的或定位的。
那些 0 成本节省显存的方法
Dataloader(pin_memory=True)
pin_memory: bool , 是否先把数据加载到缓存再加载到GPU.
pin_memory开启了,数据放入GPU的时候把non_blocking 开启。这样如果你只把数据放入GPU而不把数据从GPU拿出来再做计算的话就会加快很多(据用户报告可加速50%)。就算你把GPU中数据拿出来(ie.用了.cpu()命令,最坏的结果也是与non_blocking=False相当:
numpy.array -> torch.tensor
tensor.numpy()
numpy.array <- torch.tensor
torch.from_numpy(numpy.array)
Image.fromarray()
将np.array类型转化为Image image类型
Image --> tensor, transforms.ToTensor()
参考
dim不指定:对整个数据进行操作
dim < 0:等于 维度数+dim的结果,比如一个数据为5维,那么dim=-1的效果=dim=4, dim=-2的效果=dim (-2+5)= dim 3的效果
dim > 0:
a
Out[79]:
tensor([[0, 1],
[2, 3]])
torch.sum(a, dim=1)
Out[81]: tensor([1, 5])
torch.sum(a, dim=0)
Out[82]: tensor([2, 4])
torch.sum(a, dim=-1)
Out[83]: tensor([1, 5])
torch.sum(a, dim=-2)
Out[84]: tensor([2, 4])
交换维数
多维交换
tensor.permute
两维的交换
tensor.transpose
升高维度
tensor.unsqueeze
降低维度
维度重复
repeat
升高维度
删除某一个维度
tensor.unbind(Tensor: input, int: dim)
tensor.view()
import trochvision.transforms.functional as F
F.resize():能够使张量改变为任意形状,如果size后的元素总数超出原来的元素总数,那么进行双线性插值处理。
interpolate
与reshape不同,reshape后与之前的像素总数相同
使数据在某一个范围
tensor.clamp(min, max): 小于最小的值都设为最小值,大于最大的值都设为最大值
tensor.clamp_()两种相同
ToTensor的作用
使numpy的array或者PIL的Image在(0, 255)范围内的整型数据变为(0.0, 1.0)内的浮点型数据
转换为张量
from torchvision.transforms import functional as F
tensor = torch.stack([F.to_tensor(array) for array in arrays])
normalize——归一化
normalize = T.Normalize(mean = [0.485, 0.456, 0.406],
std = [0.229, 0.224, 0.225])
上面的参数的含义是使四维的变量T归一化到(-1, 1)之间。
flatten与unflatten
torch.flatten(input, start_dim=0, end_dim=-1) → Tensor
可以指定两个维数之间的数据进行展平
a.shape
Out[56]: torch.Size([1, 2, 5, 5, 2])
a.flatten().shape
Out[57]: torch.Size([100])
a.flatten(start_dim=1).shape
Out[58]: torch.Size([1, 100])
a.flatten(start_dim=2).shape
Out[59]: torch.Size([1, 2, 50])
a.flatten(end_dim=2).shape
Out[60]: torch.Size([10, 5, 2])
unflatten(dim, sizes)
sizes中的元素总数必须与未展平的原始dim中的元素数相匹配,有点相当于指定维数reshape
a.shape
Out[65]: torch.Size([100])
b = a.unflatten(dim=0, sizes=(10, 10))
b.shape
Out[69]: torch.Size([10, 10])
b.unflatten(dim=1, sizes=(2, 5)).shape
Out[71]: torch.Size([10, 2, 5])
from torchvision import transforms
from torchvision.transforms import functional as F
'''
调整亮度
调整对比度
调整饱和度
调整色调
'''
F.adjust_brightness
F.adjust_contrast
F.adjust_saturation
F.adjust_hue
随机裁剪
transforms.RandomResizeCrop.get_params()
F.resized_crop()
锐化
F.adjust_sharpness()
模糊(blur)
F.gaussian_blur() # 高斯模糊
仿射
随机仿射变换
config = dict(degrees=(-10, 10), translate=(0.1, 0.1),
scale_ranges=(0.9, 1.1), shears=(-5, 5), img_size=imgs[0][0].size)
angleA, (transXA, transYA), scaleA, (shearXA, shearYA) = transforms.RandomAffine.get_params(**config)
F.affine()
加噪声
水平翻转
F.hflip()
灰度值
F.rgb_to_grayscale()
torch.stack(Tuple[tensor]: s, dim: int)
与torch.cat的区别
>> a.shape
Out[1]:torch.Size([10])
>> b.shape
Out[2]:torch.Size([10])
>> torch.stack([a, b], dim=0).shape
Out[3]: torch.Size([2, 10])
>> torch.stack([a, b], dim=1).shape
Out[4]: torch.Size([10, 2])
>> torch.cat([a, b], dim=0).shape
Out[5]: torch.Size([20])
>> torch.cat([a, b], dim=1).shape
Out[5]: 报错
tensor.scatter_()
填充函数
F.pad(input, padding, mode="constant")
填充的模式有3中:(mode=“constant”)表示全部填充0;(mode=“reflect”)表示全部填充平滑拟合值;(mode=“replicate”)表示填充值是复制的相邻值。
平均池化
nn.AvgPool2d(kernel, stride)
上采样层
nn.Upsample(size, scale_factor, mode)
align_corners: True时, 输入和输出张量的corner像素对齐,从而保留这些像素的值
使用一般的下采样可以用interpolate()
卷积层
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)
自适应均值池化
对于任何输入大小,输出大小为 H x W。输出特征的数量等于输入平面的数量。
json.load
:
fliter()
函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
any()
any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。
>>> any(('a', 'b', '', 'd')) # 元组tuple,存在一个为空的元素
True
>>> any((0, '', False)) # 元组tuple,元素全为0,'',false
False
官方概念
from torch import distributed as dist
DistributedSampler
from torch.nn.parallel import DistributedDataParallel as DDP
from torch.utils.data.distributed import DistributedSampler
from torch import multiprocessing as mp
nn.SyncBatchNorm.convert_sync_batchnorm
DDP技术
DistributedDataParallel
dist.destroy_process_group()
torch.cuda.amp
autocast、GradScaler
见文件demo_amp.py
torch.utils.tensorboard
抠图网络
帧率最好与原图像保持一致,不然相当于快进
downsample_ratio对推理结果影响很大
帧率最好与原图像保持一致,不然相当于快进
downsample_ratio对推理结果影响很大