PyTorch实现:统计一组图像内所有不同的全局像素值
问题原因
原代码逐图计算单图内的唯一像素值后,直接将存储单图结果的张量列表转为集合,该操作仅会对列表中的张量对象本身去重,不会提取张量内部的元素做全局合并去重,因此无法得到整个图像集的全局唯一像素值。
修正代码
只需要在收集完所有单图的唯一值后,先将所有单图的唯一值张量拼接为一维张量,再做一次全局去重即可,完整代码如下:
import glob from PIL import Image import numpy as np import torch all_unique = [] for img_path in glob.glob('/content/Maschere/*png'): img = Image.open(img_path) img_data = torch.from_numpy(np.asarray(img)) # 统计单张图内的唯一值,加入收集列表 single_unique = torch.unique(img_data) all_unique.append(single_unique) # 拼接所有单图唯一值后做全局去重 global_unique = torch.unique(torch.cat(all_unique)) print(global_unique)
运行后输出结果和你期望的格式完全一致:
tensor([ 2, 3, 9, 255], dtype=torch.uint8)
补充说明
- 该写法先收集单图局部唯一值、最后统一做全局去重,比循环内每次迭代都更新全局值的效率更高,处理大批量图像时速度优势更明显
- 常规语义分割任务的标注掩码均为单通道格式,上述代码可直接运行;如果是多通道掩码,需要先根据你的校验需求确定是按通道分别统计,还是先将多通道值合并为单值后再统计
内容的提问来源于stack exchange,提问作者Simone
相关产品推荐
相关产品推荐

