发布时间:2026/8/8 19:55:51
【Bug已解决】`transformers.image_transforms.resize` doesnot work for negative values 解决方案 【Bug已解决】transformers.image_transforms.resizedoesnot work for negative values 解决方案一、现象长什么样transformers.image_transforms.resize是图像预处理里把 PIL 图 resize 到目标尺寸的工具。当你传入负值作为目标尺寸时行为异常# 现象 A负值被当成绝对像素喂给 PIL直接报错 ValueError: width and height must be 0 # 传入 size(-1, 64) 或 size(64, -1)PIL.Image.resize 不接受负尺寸 # 现象 B负值的按比例语义没实现结果错 # 用户期望 size(256, -1) 表示宽 256、高按比例自动但代码直接把 -1 当尺寸 # resize 失败或产出错误形状 # 现象 C负坐标/负 crop 参数被静默接受图像被裁错 # resize 内部先 crop 再 resizecrop 框含负坐标PIL 行为未定义 - 图像错位 # 典型触发 from transformers.image_transforms import resize img resize(pil_image, size(-1, 224)) # 期望高 224、宽按比例实际报错最典型的指纹用户用负值表达某一维自动/按比例但resize没有这套语义把负值直接传给 PIL 导致报错或错误结果。二、背景图像 resize 在很多视觉 pipeline 里需要只固定一维、另一维按比例。常见约定如torchvision.transforms.Resizesize是单个 int → 短边缩放到该值长边按比例size是(h, w)元组且允许其中一个为-1表示该维自动按比例。但transformers.image_transforms.resize早期实现只支持两维都是正 int的简单情况没有处理一维为-1按比例负值应当报错或解释为相对/自动resize 前的 crop 步骤里出现的负坐标。于是负值要么被 PIL 拒绝现象 A要么被误当绝对尺寸现象 B要么在内部 crop 里产生未定义行为现象 C。三、根因根因有三类负值被直接传给 PIL.Image.resize。 PIL 的resize((w, h))要求w,h 0。image_transforms.resize没在调用 PIL 前把-1解析成按比例直接把(-1, 224)传进去 →ValueError: width and height must be 0。缺少一维 -1 自动的语义解析。 正确做法若size(256, -1)先算出当前图宽高比把-1替换成round(256 * 原高/原宽)。原实现没做这步 → 现象 B。内部 crop 的负坐标未裁剪/校验。 resize 流程有时先crop再 resize如先居中裁剪再缩。crop 框若含负坐标如(box[-10, 0, 100, 100])PIL 行为依赖于版本可能裁出错位图。应在 crop 前把负坐标 clamp 到[0, 边界]。四、最小可运行复现下面用纯 Python 模拟负值直接传给 PIL 报错而解析 -1 为按比例后正常from dataclasses import dataclass from typing import Tuple dataclass class FakePIL: w: int h: int def pil_resize(img: FakePIL, size: Tuple[int, int]): w, h size if w 0 or h 0: raise ValueError(width and height must be 0) return FakePIL(w, h) def resize_buggy(img: FakePIL, size: Tuple[int, int]): 有 bug直接把 size 传给 PIL。 return pil_resize(img, size) def resolve_neg(size: Tuple[int, int], img: FakePIL) - Tuple[int, int]: 修正把 -1 解析成按比例。 h, w size if h -1 and w ! -1: h round(img.h * w / img.w) elif w -1 and h ! -1: w round(img.w * h / img.h) return h, w def resize_fixed(img: FakePIL, size: Tuple[int, int]): h, w resolve_neg(size, img) return pil_resize(img, (h, w)) # 复现size(-1, 224) 直接传 PIL - 报错 img FakePIL(400, 300) try: resize_buggy(img, (-1, 224)) print(复现失败) except ValueError as e: print(复现成功(根因):, e) # 修正解析 -1 为按比例 out resize_fixed(img, (-1, 224)) print(按比例结果:, out.w, x, out.h) # 宽 224高应为 224 * 300/400 168 assert out.w 224 and out.h 168运行后buggy 版因-1直接传给 PIL 而ValueErrorfixed 版把-1解析成按比例224×300/400168复现并修复了根因 1/2。五、解决方案第一层最小直接修复最快的止血在调用PIL.Image.resize前先把-1解析成按比例的正尺寸并对 crop 负坐标做 clampfrom PIL import Image def safe_resize(image: Image.Image, size): 第一层修复支持 (256, -1) / (-1, 256) 按比例拒绝/修正负值。 # size 兼容 int 与 (h, w) 元组 if isinstance(size, int): size (size, size) h, w size oh, ow image.height, image.width # 解析 -1 - 按比例 if h -1 and w ! -1: h round(oh * w / ow) elif w -1 and h ! -1: w round(ow * h / oh) elif h -1 and w -1: raise ValueError(size 两维不能同时为 -1) # 防御其他负值直接报错非 -1 的负值无明确定义 if h 0 or w 0: raise ValueError(f解析后尺寸必须为正得到 ({h}, {w})) return image.resize((w, h)) # 使用 img Image.open(cat.jpg) resized safe_resize(img, (-1, 224)) # 宽 224高按比例第一层让用户立刻能用(256, -1)这类一维自动的写法负值不再崩。六、解决方案第二层结构性改进用ImageResizeNormalizer把负尺寸解析 crop 负坐标 clamp 异常类型统一收口from dataclasses import dataclass from typing import Tuple dataclass class ImageResizeNormalizer: 统一的图像 resize 参数归一化负号语义、crop 坐标校验。 def normalize_size(self, size, img_hw: Tuple[int, int]) - Tuple[int, int]: if isinstance(size, int): size (size, size) h, w size oh, ow img_hw if h -1 and w ! -1: h max(1, round(oh * w / ow)) elif w -1 and h ! -1: w max(1, round(ow * h / oh)) if h 0 or w 0: raise ValueError(fresize 目标尺寸必须为正得到 {(h, w)}) return h, w def clamp_crop_box(self, box, img_hw: Tuple[int, int]) - Tuple[int, int, int, int]: oh, ow img_hw left, top, right, bottom box # 负坐标 clamp 到 [0, 边界]避免 PIL 未定义行为 left max(0, left); top max(0, top) right min(ow, right); bottom min(oh, bottom) if right left or bottom top: raise ValueError(fcrop 框非法: {(left, top, right, bottom)}) return (left, top, right, bottom) # 使用 norm ImageResizeNormalizer() h, w norm.normalize_size((-1, 224), (300, 400)) box norm.clamp_crop_box((-10, 0, 100, 100), (300, 400))ImageResizeNormalizer把负尺寸语义 crop 负坐标收口resize 调用方不再各自处理避免遗漏。七、解决方案第三层断言 / CI 守护用 pytest 固化-1 按比例、非 -1 负值报错、crop 负坐标被 clampimport pytest def test_neg_one_means_proportional(): from img_resize_norm import ImageResizeNormalizer n ImageResizeNormalizer() h, w n.normalize_size((-1, 224), (300, 400)) assert w 224 and h 168 def test_both_neg_raises(): from img_resize_norm import ImageResizeNormalizer n ImageResizeNormalizer() with pytest.raises(ValueError): n.normalize_size((-1, -1), (300, 400)) def test_non_neg_one_negative_raises(): from img_resize_norm import ImageResizeNormalizer n ImageResizeNormalizer() with pytest.raises(ValueError): n.normalize_size((-5, 224), (300, 400)) # -5 不是 -1无定义 def test_crop_negative_clamped(): from img_resize_norm import ImageResizeNormalizer n ImageResizeNormalizer() box n.clamp_crop_box((-10, 0, 100, 100), (300, 400)) assert box[0] 0, 负 crop 坐标应被 clamp 到 0CI 跑pytest tests/test_image_resize.py以后只要有人又把负值裸传给 PIL或忘了按比例解析测试立刻红灯。八、排查清单当image_transforms.resize遇负值异常按顺序查width and height must be 0→ 负值被直接传给 PIL用safe_resize先解析-1为按比例。想只固定一维 → 用(256, -1)/(-1, 256)确保有解析逻辑。非-1的负值如-5→ 无明确定义应当报错而非静默。crop 后 resize 图像错位 → crop 框含负坐标用clamp_crop_box钳到[0, 边界]。长期方案用ImageResizeNormalizer统一负尺寸语义 crop 校验。九、小结transformers.image_transforms.resizedoesnot work for negative values 的根因是resize 没有实现一维-1表示按比例的语义把负值直接传给PIL.Image.resize要求 0导致报错同时内部 crop 的负坐标未被校验/clamp产生未定义行为。第一层调用 PIL 前把-1解析成按比例正尺寸并对 crop 负坐标 clamp立刻可用(256, -1)。第二层用ImageResizeNormalizer统一负尺寸语义 crop 坐标校验避免遗漏。第三层pytest 断言-1 按比例、非 -1 负值报错、crop 负坐标 clamp防止回归。记住图像 resize 的负值应只用于一维自动-1 按比例这一约定且必须在调用 PIL 前解析成正数其它负值无定义应明确报错而非静默传给底层库。

相关新闻

2026/8/8 19:55:51

【Bug已解决】Checkpoint validation as an option 解决方案

【Bug已解决】Checkpoint validation as an option 解决方案 一、现象长什么样 你希望 save_pretrained / from_pretrained 提供可选的 checkpoint 校验(验证完整性、可加载性),但实际行为二选一,很难受: # 现象 A&…

2026/8/8 19:50:51

解决90%的常见问题:Blender VS Code故障排除与日志分析指南

解决90%的常见问题:Blender VS Code故障排除与日志分析指南 【免费下载链接】blender_vscode Visual Studio Code extension for Blender development. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_vscode Blender VS Code扩展是一款专为Blender开…

2026/8/8 19:50:51

Spoke:无需3D建模经验!快速创建自定义3D环境的终极指南

Spoke:无需3D建模经验!快速创建自定义3D环境的终极指南 【免费下载链接】Spoke Easily create custom 3D environments 项目地址: https://gitcode.com/gh_mirrors/spo/Spoke Spoke 是一款强大的开源工具,专为快速创建自定义3D环境而设…

2026/8/8 22:10:59

告别繁琐安装:LKY Office Tools如何实现一键自动化办公部署

告别繁琐安装:LKY Office Tools如何实现一键自动化办公部署 【免费下载链接】LKY_OfficeTools 一键自动化 下载、安装、激活 Office 的利器。 项目地址: https://gitcode.com/GitHub_Trending/lk/LKY_OfficeTools 在数字化办公时代,Microsoft Off…

2026/8/8 22:10:59

Fastjson反序列化漏洞深度解析与实战修复指南

1. 项目概述:一次典型的fastjson漏洞应急响应复盘 2020年5月28日,对于所有使用fastjson的Java开发者来说,又是一个需要绷紧神经的日子。那天,fastjson官方发布了一个新的安全公告,披露了存在于1.2.68及之前版本中的一个…

2026/8/8 22:10:59

Apache Doris实战指南:从MPP架构解析到生产环境部署与优化

1. 项目概述:从“Drois”到Apache Doris,一个高性能MPP数据库的实战解析 最近在数据圈里,一个名字被频繁提及,虽然有时会被误写为“Drois”,但它的正确身份是 Apache Doris 。如果你正在为海量数据的实时分析、报表查…

2026/8/8 22:05:59

计算机组成原理实验 MIPS RAM设计

一、设计要求 Logisim中RAM组件只能提供固定的地址位宽,数据输出也只能提供固定的数据位宽,访问时无法同时支持字节/半字/字三种访问模式,实验要求利用4个4K * 8 位的 RAM 组件进行扩展,设计完成既能按照8位、也能按照16位、也…

2026/8/7 19:43:11

如何用免费工具突破游戏窗口限制:SRWE完整使用指南

如何用免费工具突破游戏窗口限制:SRWE完整使用指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否遇到过这样的困扰?想为心爱的游戏截图,却发现游戏不支持自定义分辨率…

2026/8/8 0:04:22

Java图像处理实战指南

要执行这些 Java AWT 图像处理程序,你需要将它们分别保存为独立的 .java 文件,并使用 javac 编译,然后使用 java 运行。以下是每个程序的核心执行步骤、依赖关系和要点。 通用执行步骤 保存文件:将每个 listing 的代码复制到文本…

2026/8/8 0:04:23

昇腾AI代理实现多号通话自动化

基于昇腾(Ascend)硬件与AtomGit AI社区的开源生态,结合AI Agent技术,可以实现一个模拟“通话重复使用机号复制”功能的安卓手机应用原型。其核心是利用AI Agent进行意图理解、任务编排和自动化操作,模拟或管理多号码的…

2026/8/8 0:04:23

2026年Graph+AI Agents最新创新思路

本次围绕GraphAI Agents这个方向筛选了15篇高质量论文,都是近年来具有较高引用价值或方法创新的研究工作,其中部分来自IJCAI、AAAI、ICRA。 对于论文er来说,这些论文方法结构清晰、可复现性较强,在多个任务上都有可延展的空间。如…

2026/8/7 9:44:18

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/7 19:03:32

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/8 2:17:42

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…