ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Kornia 图像缩放掩码语义修复:Resize(antialias=True) 不再模糊标签掩码

Kornia 图像缩放掩码语义修复:Resize(antialias=True) 不再模糊标签掩码 计算机视觉深度学习人工智能图像处理【免费下载链接】kornia 空间人工智能的几何计算机视觉库项目地址https://gitcode.com/kornia/kornia点击查看免费下载导读本文围绕 Kornia 变更日志条目 changelog.d/4540.fixed.md 展开Resize(antialiasTrue)在旧版本中会把抗锯齿滤波作用到掩码mask上导致离散的标签集被模糊稀释本次修复后抗锯齿默认只作用于图像掩码标签集被完整保留。读者将掌握掩码在Resize中的默认采样规则、如何在容器中通过extra_args[DataKey.MASK]显式开启软掩码滤波以及如何用测试用例验证这一行为。变更背景一个关于标签保真的 bug在 Kornia 的 2D 几何增强基类 GeometricAugmentationBase2D 的文档约定中明确记录了一条行为边界Masks are resampled with nearest neighbour whateverresamplethe augmentation uses for images, unlessresampleis passed explicitly totransform_masksorinverse_masks— which is whatextra_args[DataKey.MASK]does in a container. Antialiasing is disabled for masks by default, even when it is enabled for images.问题出在旧版Resize(antialiasTrue)当用户在容器中使用该增强时antialias标志会从图像的 flags 中透传到掩码处理路径掩码因此在缩放过程中被高斯预滤波downscaling 前滤波。对于语义分割掩码这类离散标签图这种滤波会产生介于两个标签之间的插值值破坏标签集的完整性后续阈值化处理还需要额外的恢复步骤。本次修复的核心行为Resize(antialiasTrue)不再对掩码启用抗锯齿掩码默认走最近邻nearest采样标签集被完整保留只有在用户显式传入antialiasTrue时软掩码soft mask如概率图、权重图才会被滤波。掩码默认采样规则nearest 关闭抗锯齿修复的具体实现在 kornia/augmentation/_2d/geometric/base.py 的transform_masks方法中def transform_masks( self, input: torch.Tensor, params: Dict[str, torch.Tensor], flags: Dict[str, Any], transform: Optional[torch.Tensor] None, **kwargs: Any, ) - torch.Tensor: # Nearest is the mask default, but an explicit resample wins, matching inverse_masks. if resample not in kwargs and resample in (self.flags if flags is None else flags): kwargs[resample] Resample.get(nearest) # Disable antialiasing by default for masks so discrete labels are preserved, # while allowing an explicit override for soft masks. if antialias not in kwargs and antialias in (self.flags if flags is None else flags): kwargs[antialias] False return super().transform_masks(input, params, flags, transformtransform, **kwargs)关键点resample 默认值只要调用方没有显式传入resample掩码一律使用Resample.NEAREST最近邻与图像使用的bilinear/bicubic无关antialias 默认值只要调用方没有显式传入antialias掩码路径强制antialiasFalse即使self.flags[antialias]为True也不透传显式覆盖优先调用方容器通过extra_args或直接调用transform_masks传入的resample与antialias会被保留这为软掩码场景留出了明确的显式通道双向一致inverse_masks同样遵循 nearest 默认保证逆变换不会引入新的标签污染。这里需要澄清一点Resize类本身kornia/augmentation/_2d/geometric/resize.py的apply_transform只负责把antialias传给底层kornia.geometry.transform.resize处理图像掩码走的是基类transform_masks路径因此本次修复位于基类层对Resize、LongestMaxSize、SmallestMaxSize等所有派生类统一生效。容器中的显式覆盖extra_args[DataKey.MASK]在AugmentationSequential等容器中使用时每个数据键的处理参数通过extra_args传入。该参数在 kornia/augmentation/container/augment.py 中定义其语义在文档字符串中有详细说明extra_args: a dict keyed bykornia.constants.DataKeythatreplacesthe default{DataKey.MASK: {resample: Resample.NEAREST, align_corners: None}}rather than merging into it, so an override that omits a key drops that keys default.这意味着两点使用前提按 DataKey 分键extra_args的键必须是kornia.constants.DataKey枚举成员。DataKey.MASK的定义位于 kornia/constants.pyMASK 1与INPUT 0、BBOX 2、KEYPOINTS 5等并列整体替换而非合并一旦你为DataKey.MASK传入了字典它会替换默认值{resample: Resample.NEAREST, align_corners: None}而不是与之合并。因此如果你的覆盖字典省略了resample掩码将不再有 nearest 默认会退化回图像重采样模式这点需要在写配置时特别注意。软掩码soft mask的显式滤波示例当掩码是软掩码如边界概率图、注意力权重图、连续的 alpha 图时标签保真不再是首要约束你希望掩码与图像一样经历双线性插值与抗锯齿滤波。此时需要在容器中显式开启import torch import kornia as K from kornia.augmentation import Resize from kornia.constants import DataKey, Resample aug K.AugmentationSequential( K.Resize((6, 8), antialiasTrue), data_keys[input, mask], extra_args{ DataKey.MASK: { resample: Resample.BILINEAR, align_corners: True, antialias: True, } }, ) image torch.rand(1, 3, 12, 16) soft_mask torch.rand(1, 1, 12, 16) # 连续的软掩码 out_image, out_mask aug(image, soft_mask)其中extra_args中resample、align_corners、antialias三个键会被透传到掩码的采样路径掩码将与图像保持一致的双线性 抗锯齿行为。直接调用 transform_masks如果不经过容器也可以直接调用增强实例的transform_masks方法效果等价from kornia.augmentation import Resize resize Resize((6, 8), antialiasTrue) # 需要先生成参数 params resize.forward_parameters(torch.empty(1, 3, 12, 16).shape) out_mask resize.transform_masks( soft_mask, params, resize.flags, antialiasTrue, resamplebilinear )行为对照离散掩码 vs 软掩码配置场景掩码采样方式标签集适用场景Resize(antialiasTrue)默认本次修复后nearest无抗锯齿完整保留语义分割标签、实例掩码、bool 掩码Resize(antialiasTrue)extra_args中resamplebilinear, antialiasTrue双线性 抗锯齿会产生插值中间值软掩码、概率图、注意力图Resize(antialiasFalse)默认参数即关闭nearest完整保留任何离散掩码值得注意的是即使掩码是浮点 dtype只要走默认路径Resize(antialiasTrue)也不会模糊它——修复前该行为与直觉相悖用户以为只有图像被滤波实际掩码标签也被稀释了。源码级佐证测试如何验证标签保真仓库测试 tests/augmentation/container/test_augmentation_sequential.py 对本次修复提供了两处直接验证。测试一antialiasTrue 不再破坏标签集test_resize_antialias_preserves_mask_labels_4479构造了一个棋盘格状掩码torch.float32、torch.int64、torch.bool三种 dtype 分别参数化without_antialias K.AugmentationSequential( K.Resize((6, 8), antialiasFalse), data_keys[input, mask], ) with_antialias K.AugmentationSequential( K.Resize((6, 8), antialiasTrue), data_keys[input, mask], ) expected_mask without_antialias(image, mask)[1] out_image, out_mask with_antialias(image, mask) assert out_mask.dtype mask_dtype assert torch.equal(out_mask, expected_mask) assert set(out_mask.unique().tolist()) set(mask.unique().tolist()) self.assert_close(out_image, expected_image)断言逻辑对应修复目标torch.equal(out_mask, expected_mask)antialiasTrue与antialiasFalse的掩码输出逐元素完全一致证明抗锯齿没有作用于掩码set(out_mask.unique()) set(mask.unique())输出标签集与输入标签集完全相同离散标签没有被稀释出中间值图像输出则与kornia.geometry.transform.resize(..., antialiasTrue)的独立结果保持一致证明图像路径的抗锯齿仍然生效。测试二显式 antialias 覆盖生效test_resize_mask_explicit_antialias_override_4479验证显式传入antialiasTrue时软掩码确实被滤波aug K.AugmentationSequential( K.Resize((6, 8), antialiasTrue), data_keys[input, mask], extra_args{ DataKey.MASK: { resample: Resample.BILINEAR, align_corners: True, antialias: True, } }, ) out_mask aug(image, mask)[1] expected resize(mask, (6, 8), bilinear, align_cornersTrue, antialiasTrue) without_antialias resize(mask, (6, 8), bilinear, align_cornersTrue, antialiasFalse) self.assert_close(out_mask, expected) assert not torch.equal(out_mask, without_antialias)输出与独立resize(mask, ..., antialiasTrue)结果一致且与antialiasFalse的版本不同——说明显式覆盖优先级高于默认禁用逻辑软掩码滤波通道是真实可用的。相关参考变更条目changelog.d/4540.fixed.md掩码默认采样与显式覆盖实现kornia/augmentation/_2d/geometric/base.pyResize及其派生类实现kornia/augmentation/_2d/geometric/resize.py容器extra_args语义kornia/augmentation/container/augment.pyDataKey枚举定义kornia/constants.py底层resize函数签名kornia/geometry/transform/affwarp.py行为验证测试tests/augmentation/container/test_augmentation_sequential.py赞分享计算机视觉深度学习人工智能图像处理【免费下载链接】kornia 空间人工智能的几何计算机视觉库项目地址https://gitcode.com/kornia/kornia点击查看免费下载相关推荐InQL与Burp Suite无缝集成提升API安全测试效率的7个技巧InQL与Burp Suite无缝集成提升API安全测试效率的7个技巧 InQL作为一款强大的开源Burp Suite扩展专为高级GraphQL测试设计通Kornia Boxes.to_mask 列表填充通道保持为空坐标变换后掩码语义的修复实践Kornia Boxes.to_mask 列表填充通道保持为空坐标变换后掩码语义的修复实践 Kornia 在 migration 024.fixed.md计算机视觉深度学习人工智能图像处理Kornia 修复 bbox_to_mask 半精度精度问题float16/bfloat16 大图掩码像素网格坍缩与 float32 网格方案Kornia 修复 bbox_to_mask 半精度精度问题float16/bfloat16 大图掩码像素网格坍缩与 float32 网格方案 导读 本文围绕计算机视觉深度学习人工智能图像处理上一篇《isd 项目安装与配置指南》下一篇Source Han Mono 字体项目安装与配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表