PyTorch的合并与分割

一、合并

1. cat 函数

  1. 规则:
    1. 所合并的数据的dim一致
    2. 要合并的维度上shape可以不一致,其余的shape必须一致
    3. 理解:[class,student]合并=>[class,student],合并后的班级在含以上相同
  2. 例子
a = torch.rand(4,3,16,32)
b = torch.rand(4,3,16,32)
# 第一参数,list,第二参数,再哪个维度合并
print(torch.cat([a,b],dim=2).shape)
# out: torch.Size([4, 3, 32, 32])

2.stack函数

  1. 规则:
    1. 要合并的两个维度必须一致
    2. 会在合并的维度前插入一个新的维度
    3. 理解:[class,student]合并=>[class_id,class,student],相当于合并后两个班级分开,意义上不同,比如dim=0维度上的班级是尖子班,dim=1维度上的班级是普通班。
  2. 例子
print(' stack ')
print(torch.stack([a,b],dim=2).shape) # torch.Size([4, 3, 2, 16, 32]) ,在dim2插入一个新的维度

a = torch.rand(3,5)
b = torch.rand(3,5)
print(torch.stack([a,b],dim=0).shape)
# out : torch.Size([2, 3, 5])

二、分割

1. split函数

  1. 规则:
    1. 给定在某一维度拆分后长度
    2. 给定在某一维度拆分后的每个长度
  2. 例子
a = torch.rand(32,8)
b = torch.rand(32,8)
c = torch.stack([a,b],dim=0)
aa,bb = c.split([1,1],dim=0) # 给定要拆分的dim=0的shape
print('aa.shape=',aa.shape,' bb.shape=',bb.shape)
# aa.shape= torch.Size([1, 32, 8])  bb.shape= torch.Size([1, 32, 8])
aa,bb = c.split(1,dim=0) #在0维度差分成长度为1
print('aa.shape=',aa.shape,' bb.shape=',bb.shape)
# aa.shape= torch.Size([1, 32, 8])  bb.shape= torch.Size([1, 32, 8])

c = torch.rand(9,4)
aa,bb,cc = c.split(3,dim=0) # 拆分成3个size[3,4]
print(aa.shape,bb.shape,cc.shape)
# torch.Size([3, 4]) torch.Size([3, 4]) torch.Size([3, 4])
aa,bb,cc = c.split([2,3,4],dim=0)
print(aa.shape,bb.shape,cc.shape)
# torch.Size([2, 4]) torch.Size([3, 4]) torch.Size([4, 4])

2. chuck函数

  1. 规则
    1. 参数:要分割的数量(不足的向上取整),和维度
  2. 例子
a = torch.rand(4,5,2)
aa,bb = a.chunk(2,dim=0)
print('aa.shape=',aa.shape,' bb.shape=',bb.shape)
# aa.shape= torch.Size([2, 5, 2])  bb.shape= torch.Size([2, 5, 2])
aa,bb = a.chunk(2,dim=1)
print('aa.shape=',aa.shape,' bb.shape=',bb.shape)
# aa.shape= torch.Size([4, 3, 2])  bb.shape= torch.Size([4, 2, 2])
### 实现图像分割原始图像叠加 在 PyTorch 中实现图像分割并把分割结果原始图像叠加显示涉及多个步骤,包括读取图像、执行分割操作以及将分割掩膜应用到原始图像上。 #### 准备开发环境 为了确保所有必要的库都已安装并且可以正常导入,建议先设置好开发环境。这通常涉及到一些基础包的引入: ```python import os import torch from torchvision import transforms from PIL import Image import numpy as np import matplotlib.pyplot as plt ``` #### 加载待分割的图片 加载一张用于演示目的的图片,并对其进行预处理以便于后续的操作。这里假设已经有一个名为 `read_image` 的函数来完成这项任务[^1]。 ```python img_path = "/content/semantic_example_highway.jpg" img_original = read_image(img_path) # 将图像转换成适合模型输入的形式 transform = transforms.Compose([ transforms.ToTensor(), ]) img_tensor = transform(Image.open(img_path)) batch_img = torch.unsqueeze(img_tensor, 0).float() ``` #### 执行图像分割 利用训练好的神经网络模型来进行预测,得到对应的类别标签矩阵作为分割的结果。此处简化表示为调用某个预先定义好的模型实例 `model` 进行推理的过程。 ```python with torch.no_grad(): model.eval() # 设置模型评估模式 output = model(batch_img) segmentation_mask = torch.argmax(output.squeeze(), dim=0).numpy().astype(np.uint8) ``` #### 创建颜色映射表 对于不同的对象类别赋予特定的颜色值,从而使得最终可视化效果更加直观清晰。例如,如果目标是标记车辆,则可以选择蓝色代表此类别[^2]。 ```python color_map = {0: [0, 0, 0], # 背景设为黑色 1: [0, 0, 255]} # 类别1(比如汽车)设为红色 mask_rgb = np.zeros((segmentation_mask.shape[0], segmentation_mask.shape[1], 3), dtype=np.uint8) for key in color_map.keys(): mask_rgb[segmentation_mask == key] = color_map[key] ``` #### 合并分割结果原图 通过调整透明度参数 alpha 来控制两个图像层之间的混合程度,进而达到视觉上的融合效果。 ```python alpha = 0.6 # 控制透明度的比例因子 overlayed_img = cv2.addWeighted(mask_rgb, alpha, np.array(img_original.convert('RGB')), 1-alpha, 0) plt.imshow(overlayed_img) plt.axis('off') plt.show() ``` 上述过程展示了如何基于 PyTorch 构建一个简单的图像分割流程,并实现了将分割后的区域以不同色彩覆盖回原始图像之上进行展示的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值