首页/新闻资讯/正文详情

Kornia RandomRain 雨滴增强修复解析:均匀起始位置与“最后一行/列可被绘制”

发布时间:2026/9/24 20:45:38 来源:云帆数科 栏目:资讯中心
Kornia RandomRain 雨滴增强修复解析:均匀起始位置与“最后一行/列可被绘制”
计算机视觉人工智能深度学习图像处理【免费下载链接】kornia Geometric Computer Vision Library for Spatial AI项目地址https://gitcode.com/gh_mirrors/ko/kornia点击查看免费下载RandomRain是 Kornia 随机增强模块kornia.augmentation中用于为图像叠加雨滴纹理的强度类变换。本篇文章以 changelog.d/4612.fixed.md 这一修复记录为主体深入解析本次变更的核心内容——雨滴起始位置改为在“所有能让整条雨滴完整落在图像内”的候选位置间均匀分布从而使得图像的最后一行与最后一列首次可以被绘制。读完本文你将掌握RandomRain的参数语义、雨滴在图像上的绘制几何、起始位置合法域的推导方式以及对应的源码实现与测试验证路径可直接用于在实际增强流水线中规避边界无法命中、尺寸越界等陷阱。变更记录说了什么该 changelog 片段全文只有一句话RandomRainnow places drops uniformly over every start position that keeps the drop inside the image, so the last row and column can be painted.它描述了一次针对bug 的行为修正修复前某些合法的起始位置无法被命中导致雨滴永远画不到图像的最后一行与最后一列修复后每个“能把整条雨滴保持在图像内”的起始位置被等概率选取。注意其中两个关键词uniformly均匀不是简单地“允许”画到最后一行而是所有合法起始位置共享同等概率keeps the drop inside the image保持雨滴完整在图像内合法域的判定标准是雨滴的“远端”不越界而不是起点不越界。这段记录属于 Kornia 的 changelog.d 碎片化变更机制每个带用户可见变更的 PR 在changelog.d下以PR.type.md命名4612.fixed.md即 PR 4612 的fixed类条目发布时由 Towncrier 汇总进CHANGELOG.md。因此本文所述行为以当前仓库源码为准。RandomRain 是什么RandomRain定义在 kornia/augmentation/_2d/intensity/random_rain.py继承自IntensityAugmentationBase2D构造签名如下RandomRain( number_of_drops: tuple[int, int] (1000, 2000), drop_height: tuple[int, int] (5, 20), drop_width: tuple[int, int] (-5, 5), same_on_batch: bool False, p: float 0.5, keepdim: bool False, )各参数的含义与约束均来自类文档字符串参数默认值语义与约束number_of_drops(1000, 2000)每张图像的雨滴数量区间闭区间均匀整数采样drop_height(5, 20)雨滴高度对应图像行方向采样值须严格小于图像高度drop_width(-5, 5)雨滴宽度对应图像列方向可正可负绝对值须严格小于图像宽度same_on_batchFalse为True时整批样本共享相同的雨滴数量、尺寸与坐标p0.5应用该变换的概率keepdimFalse是否保持输入维度与IntensityAugmentationBase2D约定一致输入形状为(C, H, W)或(B, C, H, W)输出统一为(B, C, H, W)。前向时输入通道数必须是 1 或 3否则抛出“Number of color channels should be 1 or 3.”。一个可直接运行的例子取自类文档import torch import kornia as K torch.manual_seed(0) input torch.rand(1, 1, 5, 5) rain K.augmentation.RandomRain( p1.0, drop_height(1, 2), drop_width(1, 2), number_of_drops(1, 1) ) rain(input) # 输出形状仍为 (1, 1, 5, 5)部分像素被替换为 200/255雨滴的绘制几何span 是“跨度”而非“数量”要理解“最后一行能否被画到”必须先理解雨滴的绘制模型。在 apply_transform 中每条雨滴的线条形状通过torch.linspace生成size_of_line max(height_of_drop, abs(width_of_drop)) lines[i, 0, :size_of_line] torch.linspace(0, height_of_drop, stepssize_of_line, dtypetorch.long) lines[i, 1, :size_of_line] torch.linspace(0, width_of_drop, stepssize_of_line, dtypetorch.long)由此可推出几个关键几何事实跨度而非数量一条drop_heighth、drop_widthw的雨滴其行/列偏移量取自linspace(0, h, stepsmax(h, |w|))端点包含在内。当max(h, |w|) 2时雨滴实际占h 1行或|w| 1列当两者都 1时只有一个采样点雨滴退化为单像素。尺寸差会导致内部空隙由于步数是max(h, |w|)当两尺寸不等时被涂色的格子在该跨度内并不连续。例如drop_height5, drop_width0在6 x 10图像上涂色的行是[0, 1, 2, 3, 5]行 4 有空隙。尺寸以图像为参照drop_height沿行方向、drop_width沿列方向负的drop_width使雨滴向另一侧倾斜——参数命名的是图像坐标轴而非雨滴局部坐标。雨滴值是常量被涂像素固定写为200 / 255与图像内容无关见 random_rain.py 的赋值语句因此对任意取值范围的输入“雨”都表现为深色痕迹。这一点由测试 test_convention_random_rain_drop_value_is_two_hundred_over_255 固定全2.0的图像经处理后min200/255、max2.0。修复核心起始位置的合法域与均匀性合法域的推导关键代码在 random_rain.py 的 meta 构造段last_dy, last_dx (height_of_drop, width_of_drop) if size_of_line 1 else (0, 0) meta[i, 0] image_height - last_dy # 行方向允许的起始范围 meta[i, 1] image_width - abs(last_dx) # 列方向允许的起始范围 meta[i, 2] max(-last_dx, 0) # 负宽度时的列偏移last_dy/last_dx即雨滴线条的“最远端偏移量”端点包含在采样中。合法域要求起始行 最远行偏移 ≤ image_height - 1即起始行 ∈[0, image_height - last_dy]列同理且负宽度时起点还需加上max(-last_dx, 0)使远端而非起点约束生效。注释对此的概括是“a drop may start anywhere its far end stays inside the image”——雨滴可在远端仍留在图内的任意位置起始。均匀采样与 MPS 钳制起始坐标来自生成器产出的coordinates_factor形状(B, max_drops, 2)取值[0, 1]由 random_rain.py 的 start 计算段 换算start_rows torch.minimum((coordinates[..., 0] * rows_c).long(), rows_c - 1) start_cols torch.minimum((coordinates[..., 1] * cols_c).long(), cols_c - 1) shift_c坐标在[0, 1]上均匀采样乘以合法范围后再取整因此每个合法起始位置被等概率选中——这正是 changelog 中 “uniformly over every start position” 的落地方式。torch.minimum(..., rows_c - 1)的钳制针对 MPS 半精度rand可能恰好返回1.0的问题源码注释引用 #4553它把这种采样保留在最后一个合法起始位置而不是越界到范围之外。于是对高度H的图像最大起始行为H - h - 1雨滴占据h 1行末端恰好落在第H - 1行——最后一行可达同理最后一列也可达。修复前部分合法起点被排除导致最后一行/列永远画不上这正是本片段修复的 bug。边界行为一览来自类文档与测试尺寸等于图像尺寸drop_height H或abs(drop_width) W会在前向抛出BaseError“Height of drop should be greater than zero and less than image height.” / “Width of drop should be less than image width.”比图像小 1 个像素则正常运行。校验发生在forward此时才知道图像形状构造阶段不报错——见测试 test_convention_random_rain_rejects_a_drop_as_large_as_the_image。由于默认drop_height(5, 20)、drop_width(-5, 5)的上界对尺寸规则“实时生效”20 像素高的图像或 5 像素宽的图像在部分随机种子下会抛错高度 ≤ 5 像素的图像则因不存在任何合法高度而必然抛错。均匀性还带来一个推论跨度内部的空隙可能使某列仍未被涂到——例如drop_height5, drop_width9作用于6 x 10图像时只有一个合法起点且列 8 永远不会被画到。“可达”指可由某个起点命中而非必然被涂色。参数生成器闭区间均匀整数采样起始坐标之外number_of_drops、drop_height、drop_width三个整数区间也要求“闭区间均匀”。实现位于 kornia/augmentation/random_generator/_2d/random_rain.py 的RainGenerator_closed_integer_range把闭区间(lo, hi)转成半开采样区间[lo, hi 1)并拒绝小数、颠倒区间lower upper与非有限值_draw_closed_integer使用floor()而非向零截断并对上端点hi 1做clamp。注释给出了一个精妙的数值分析对float32下最大的u 1 - 2**-245 u * 16恰好等于21.0若不加钳制约每2**24次采样会有一次越界到21而向零截断则会让(-1, 0)与(0, 1)都折叠到0使0被抽到两倍概率。因此默认drop_height(5, 20)可以抽到20drop_width(-5, 5)可以抽到-5与50不比任何其他宽度权重更大。该行为由 test_convention_random_rain_integer_ranges_are_closed_and_uniform 用 22000 次采样验证每个整数出现次数与均匀期望偏差在 15% 以内且极值hi确实会被抽到。值得注意的是这段闭区间修复本身是另一个 changelog 条目changelog.d/4568.fixed.md的主题与本文的起始位置修复互为表里前者保证“参数值可被均匀抽到”后者保证“抽到的值能均匀落位”。源码级实现批量化光栅化与单次索引写入本次修复所依托的apply_transform采用了一次批量化重写源码注释引用 #4530。核心手段包括主机端一次性构建所有雨滴形状lines(B, 2, longest_line)与meta(B, 5)合法起始行、合法起始列、列偏移、线条长度、雨滴数量在 CPU 上按样本填充再以一次拼接拷贝上设备host torch.cat([lines.reshape(-1), meta.reshape(-1)]).to(device)避免每样本一次的主机-设备拷贝。显式固定 CPU 设备中间缓冲区用devicecpu显式指定避免调用方设置torch.set_default_device后主机循环退化为逐样本设备启动或产生无法从meta张量拷贝的问题。单一nonzero完成掩码解析drop_valid雨滴序号 该样本雨滴数与step_valid步序号 线条长度按位与后展平用一次nonzero()取得有效索引再从扁平位置算术反推批次号避免对三个张量分别做布尔索引而触发三次nonzero。一次索引赋值写入所有有效 (batch, channel, row, col) 一次性执行output[...] 200 / 255。由于所有像素写的是同一个常量写入顺序不影响结果。这版实现与“逐条雨滴逐步写入”的朴素参考实现做了逐像素相等对比见测试 test_batched_rasterisation_matches_per_drop_reference_4530——只要重写版移动了哪怕一个像素断言都会失败。测试如何锁定新行为围绕本次修复的行为仓库提供了多层次的回归保护tests/augmentation/test_augmentation.py 的 TestRandomRain覆盖形状保持test_cardinality、尺寸边界等于图像尺寸时报错、小 1 像素正常、零概率p0.0透传、same_on_batchTrue时全批参数一致以及构造时不受环境默认设备影响的特性test_construction_ignores_the_ambient_default_device在torch.device(meta)上下文内构造仍得到 CPU 上的采样器。tests/augmentation/test_conventions_intensity_ops.py以“约定测试”形式固定行列命名drop_height沿行、drop_width沿列换轴后外延随之互换、常量雨滴值200/255、跨度语义h尺寸的雨滴占h1行、尺寸等于图像时报错、闭区间均匀性以及1 - 2**-24端点钳制行为。这些测试共同构成对该修复语义含“最后一行/列可绘制”在内的整套边界约定的完整契约。相关修复脉络与使用建议RandomRain的近期修复构成一条连贯的演进线阅读本文后可顺藤摸瓜changelog.d/migration-017.fixed.md#4453same_on_batchTrue时整批共享同一雨滴数量changelog.d/migration-018.fixed.md拒绝等于图像高度的drop_height与等于图像宽度的drop_widthchangelog.d/4568.fixed.md#4567/#4568三个整数区间改为闭区间均匀采样changelog.d/4612.fixed.md本文起始位置在所有合法落点间均匀分布最后一行/列可绘制changelog.d/4675.fixed.md全部雨滴批量化单次索引写入。实际使用时请记住雨滴尺寸含默认值必须严格小于图像对应轴尺寸且由于跨度含端点比图像小 1 的雨滴已经能覆盖整条边对接近图像尺寸的输入建议按图像分辨率收敛drop_height/drop_width上界避免随机种子偶发触发前向校验错误。若需要更强的可复现性可固定torch.manual_seed并配合same_on_batchTrue使用。赞分享计算机视觉人工智能深度学习图像处理【免费下载链接】kornia Geometric Computer Vision Library for Spatial AI项目地址https://gitcode.com/gh_mirrors/ko/kornia点击查看免费下载相关推荐Kornia RandomRain 批内一致性修复解析same_on_batchTrue 下雨水数量采样行为详解Kornia RandomRain 批内一致性修复解析 same_on_batchTrue 下雨水数量采样行为详解 导读 本篇文章围绕 Kornia 2D计算机视觉深度学习人工智能图像处理Oh My Posh 怎么配置 transient 瞬态提示符Oh My Posh 怎么配置 transient 瞬态提示符 配置好 Oh My Posh 之后每次执行命令上一条完整提示符路径、git 状态等都会计算机视觉深度学习人工智能图像处理免费开源 Web 思维导图 SimpleMindMap本地部署与 7 种布局实战指南免费开源 Web 思维导图 SimpleMindMap本地部署与 7 种布局实战指南 SimpleMindMap思绪思维导图是一个开源的 Web 思维导图计算机视觉人工智能深度学习图像处理上一篇RealSense 点云生成完整实操深度相机到三维数据下一篇如何用MathLive打造专业数学公式编辑体验从入门到精通创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

最新最全2026软件测试面试笔试100道题目
最新最全2026软件测试面试笔试100道题目

高频问题: 1、工作中印象深刻的 BUG 2、项目中负责的模块?并说一下你设计的用例?(包括功能和接口, 考验基本功) 3、怎么设计用例(功能和接口都问) 4、对测试流程改进以及测试质量保证提过哪些意见建议?(意思就 是除… · 2026/9/24 20:45:25

CANN算子开发中InferShape形状推导工具集:Broadcast、Elewise与Reduce实战
CANN算子开发中InferShape形状推导工具集:Broadcast、Elewise与Reduce实战

1. 算子形状推导到底在解决什么问题做算子开发的人都有一个共识:InferShape 写得好不好,直接决定了整个网络的编译能不能过、跑起来会不会崩。我在刚接触 CANN 算子开发那会儿,觉得 InferShape 就是个"算输出维度"的体力活&#xf… · 2026/9/24 20:45:19

企业级RAG架构:知识空间与Serverless Agent双引擎
企业级RAG架构:知识空间与Serverless Agent双引擎

1. 这不是又一个“AI聊天框”,而是一套能嵌进ERP、CRM、工单系统的智能中枢 你有没有遇到过这样的场景:客服团队每天重复回答“发票怎么开”“订单为什么没发货”“售后流程走哪一步”,新员工培训要花两周背SOP文档,IT部门被业务方… · 2026/9/24 20:45:18

AI Agent 与大模型区别解析:从零搭建智能体实战指南
AI Agent 与大模型区别解析:从零搭建智能体实战指南

1. 从大模型到智能体:AI agent 到底在解决什么问题这两年但凡跟技术沾点边的场合,几乎都绕不开 AI agent 这个词。但很多人第一次听到它的时候,脑子里冒出来的第一个问题往往是:这跟 ChatGPT、DeepSeek 这些大模型到底有什么区别&… · 2026/9/24 22:10:09

腾讯云部署DeepSeek Harness与dsh-market插件市场全流程指南
腾讯云部署DeepSeek Harness与dsh-market插件市场全流程指南

我是在一次给团队搭共享开发环境时,开始研究 DeepSeek Harness 和它的插件市场组件 dsh-market 的。最初图省事直接装在本地笔记本上,结果发现团队协作要共用一套智能体配置、插件和模型密钥,本机方案根本没法搞。于是我把整套环境挪到了腾讯… · 2026/9/24 22:10:09

Canvas 2D 游戏开发:轻量级交互与毫秒级控制实践
Canvas 2D 游戏开发:轻量级交互与毫秒级控制实践

1. 为什么非得绕开游戏引擎做《逃离鸭科夫》?——从“轻量级交互”到“可控性优先”的底层逻辑你可能已经看过不少用 Phaser、PixiJS 甚至 Three.js 做的像素风搜打撤(Search-Grab-Escape)小游戏:角色跑动带粒子、门锁有动画反馈、… · 2026/9/24 22:10:09

Stable Diffusion漫画助手v6:脚本化批量出图与跨页一致性实战
Stable Diffusion漫画助手v6:脚本化批量出图与跨页一致性实战

简介:这份资源是面向Stable Diffusion漫画创作场景的脚本助手工具包,主要服务于希望借助AI绘画批量生成漫画内容、提升出图效率的创作者与爱好者。它针对漫画分镜、角色一致性等常见痛点,提供可嵌入SD工作流的辅助脚本,适合具备一… · 2026/9/24 22:10:09

纯Canvas 2D游戏开发实战:从零实现搜打撤玩法
纯Canvas 2D游戏开发实战:从零实现搜打撤玩法

1. 项目概述:为什么一个“鸭科夫”能跑在 Canvas 里?你有没有试过点开一个网页,没加载 Unity 或 Phaser 的巨大包,页面却突然跳出一只歪嘴鸭子,叼着公文包在像素走廊里狂奔,身后追着三只戴圆框眼镜的鹅——… · 2026/9/24 22:10:09

基于阿里云ECS与百炼Qwen的定时比价报告机器人
基于阿里云ECS与百炼Qwen的定时比价报告机器人

前阵子我想入手一块显卡,每天在几个平台之间来回切换比价,手动复制粘贴到表格里,折腾了两周还是没等到理想价格。后来索性写了一个跑在阿里云ECS上的定时任务,用百炼平台上的Qwen模型自动汇总价格数据、生成比价报告,每… · 2026/9/24 22:09:56

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码