包 | ||
---|---|---|
tqdm | 进度条 | |
pyav | 学习资源 | |
pims | 将多张图像转化为一个图像序列 | 学习资源 |
argparse |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
pims
可以处理将多张图片存为一个序列对象
pims.ImageSequence()
pims.PyAVVideoReader(path)
待整理
numpy
np.asarray()
: 将其他类型转化为np.array类型
PIL
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
av.open(path, mode: 'r'\'w')-> av.InputContainer
.add_stream
os
os.listdir(path)
os.path.join()
os.path.isfile()
easing_functions
作者使用的缓和函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J2VENYiR-1638283583141)(https://raw.githubusercontent.com/Quincy756/picutres/main/img/RVM/ease_functions.png)]
Pytorch
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()
添加一个新参数。 参数可以是可选的,必需的或定位的。
节省显存的方法
- 技巧1
Dataloader(pin_memory=True)
pin_memory: bool , 是否先把数据加载到缓存再加载到GPU.
pin_memory开启了,数据放入GPU的时候把non_blocking 开启。这样如果你只把数据放入GPU而不把数据从GPU拿出来再做计算的话就会加快很多(据用户报告可加速50%)。就算你把GPU中数据拿出来(ie.用了.cpu()命令,最坏的结果也是与non_blocking=False相当:
与numpy等的数据类型的转换
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()
- resize
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
- 颜色抖动(color jitter)
'''
调整亮度
调整对比度
调整饱和度
调整色调
'''
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。输出特征的数量等于输入平面的数量。
plt
subplot
- plt.tight_layout() 自动调整子图间距
json
json.load
:
python
fliter()
函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
any()
any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。
>>> any(('a', 'b', '', 'd')) # 元组tuple,存在一个为空的元素
True
>>> any((0, '', False)) # 元组tuple,元素全为0,'',false
False
训练相关
horovod 分布式训练
基本概念
from torch import distributed as dist
分布式训练 distribute
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
自动混合精度AMP
autocast、GradScaler
见文件demo_amp.py
pytorch 工具函数
torch.utils.tensorboard
- SummayWriter
concurrent.futures
抠图网络的评估指标
推理
-
帧率最好与原图像保持一致,不然相当于快进
-
downsample_ratio对推理结果影响很大
RVM视频抠图
- 如果人像后面有动态物体,比如客车闪过,会对人像抠图造成很大的影响
- 背景如果是动态的影响不是很大。
- 人像运动时闪烁特别严重
nk_v31_ecpm-5-88913630.first_rank_v2_pc_rank_v29&utm_term=%E6%8A%A0%E5%9B%BE%E7%BD%91%E7%BB%9C%E8%AF%84%E4%BC%B0%E6%8C%87%E6%A0%87+MAD&spm=1018.2226.3001.4187)
推理
-
帧率最好与原图像保持一致,不然相当于快进
-
downsample_ratio对推理结果影响很大
RVM视频抠图
- 如果人像后面有动态物体,比如客车闪过,会对人像抠图造成很大的影响
- 背景如果是动态的影响不是很大。
- 人像运动时闪烁特别严重