pytorch学习(二) 维度操作,相关库

这篇博客介绍了图像处理和视频分析的多个库,包括PyTorch、PIL、PyAV和OpenCV。重点讲解了如何利用这些库进行图像序列操作、颜色模式转换、张量处理、数据增强以及神经网络操作。还提到了数据加载、缓和函数、内存管理和分布式训练的相关知识。
摘要由CSDN通过智能技术生成
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()添加一个新参数。 参数可以是可选的,必需的或定位的。

节省显存的方法

那些 0 成本节省显存的方法

  1. 技巧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像素对齐,从而保留这些像素的值

    image-20211117222024484

    使用一般的下采样可以用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

抠图网络的评估指标

抠图网络

推理

image-20211121221359965image-20211121221410165

  • 帧率最好与原图像保持一致,不然相当于快进

  • 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)

推理

image-20211121221359965image-20211121221410165

  • 帧率最好与原图像保持一致,不然相当于快进

  • downsample_ratio对推理结果影响很大
    

RVM视频抠图

  • 如果人像后面有动态物体,比如客车闪过,会对人像抠图造成很大的影响
  • 背景如果是动态的影响不是很大。
  • 人像运动时闪烁特别严重
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值