1.腾讯T2I-adapter源码分析(3)-训练源码分析
2.图像处理(十一)exposure fusion 图像曝光融合
3.常ç¨çå大pythonå¾åå¤çå·¥å
·
4.Matlab值法亚像素边缘检测源码,图像梯度GUI,源码解析
5.Pytorch深入剖析 | 1-torch.nn.Module方法及源码
6.SIFT算法原理与源码分析
腾讯T2I-adapter源码分析(3)-训练源码分析
随着stable-diffusion和midjourney等AI技术展现令人惊叹的图像梯度艺术创作,人们对AI可控绘图的源码追求日益高涨。为提升AI图像生成的图像梯度可控性,Controlnet和T2I-adapter等解决方案应运而生。源码配合源码系列文章将从T2I-adapter的图像梯度源码出发,深入剖析其训练部分的源码实现原理。
本篇我们将聚焦于训练源码的图像梯度解析,通过代码结构的源码梳理,了解T2I-Adapter的图像梯度训练流程。
训练代码的源码运行涉及数据处理、模型加载、图像梯度优化器设置以及实际训练过程。源码在第一部分,图像梯度我们首先设置参数并加载数据,如DepthDataset,它从txt文件中读取、对应的深度图和文本描述。
在模型加载阶段,我们区分了stable-diffusion模型和adapter。stable-diffusion模型加载时,其配置与推理阶段有所差异,如增加调度器参数、提高精度、调整分辨率和训练相关参数。adapter模型的加载则遵循推理过程中的初始化方法,通过构建不同模块来实现。
训练过程中,adapter模型的关键结构包括下采样、卷积和ResnetBlock的使用,相比controlnet,T2I-adapter的参数更少,没有注意力层,这使得训练更为高效。模型放入GPU后,使用adamW优化器进行训练,同时设置学习率和数据保存路径。云豹源码生成app
状态恢复部分,程序会判断是否从头开始或恢复训练,设置log信息。接下来,代码进入实际的训练循环,包括条件编码、隐藏状态生成、adapter结果附加至sd模型以及adapter梯度计算。
loss函数定义在模型配置中,采用L2损失来衡量生成图像与给定时间点加噪ground truth的接近程度。训练过程中,loss计算和模型保存都在代码中明确体现。
总的来说,T2I-adapter的训练源码展示了精细的结构和参数设置,确保了AI绘画的可控性和性能。在AI艺术的探索中,每一行代码都承载着技术进步的点滴痕迹。
图像处理(十一)exposure fusion 图像曝光融合
本意是为了学习HDR,高动态范围成像,但HDR概念对我来说太复杂了,涉及到硬件和软件。我的目标是跳过硬件和tone mapping,只做最简单的多曝光融合,如下列图像
融合成一张
搜索曝光融合,出现的是《exposure fusion》这篇文章,像素级别的融合,再加上多尺度的平滑处理,从现在的眼光来看,是非常简单的,OpenCV也实现了这个算法,在lightroom中也有应用。
尽管原理简单,但实现上有坑,C++写了好几遍过不了,换成Python也错误,看了官方的matlab源码才知道坑。
论文提出了三种计算每个像素融合权重的账户管理的源码的方法
对比度
在过曝图像或严重低曝光的区域,图像都基本是或0,因此这些区域是很平滑的,梯度信息几乎为0,这些也是曝光融合中要舍弃的区域——过曝部分缺乏细节,低曝光区域缺乏细节和亮度。因此,论文提出用laplace算子提取图像的梯度信息,梯度信息越小的像素在融合时占据的比重就越小,相反梯度信息越大的像素的比重就越大。对输入的第[公式]张图像[公式]
[公式]
饱和度
同样针对过曝或严重低曝光,二者的饱和度是接近于0的,而那些饱和度高的区域常常是需要保留的区域,因此论文通过三通道的标准差来衡量饱和度大小,以此得到不同的比重
[公式]
亮度
亮度越接近0或者的,很可能就是处在过曝或严重低曝光区域,而亮度在附近的常常可以认为是曝光良好的区域,这些区域的信息在融合过程中要尽量保留,比重尽量大,如下
[公式]
[公式]是方差,论文中取0.2。以上公式是我具体实现时使用的,三通道的比重相乘,为了简单,也可以提取出YCrCb通道,用Y通道算也可以。良好曝光不一定取0.5。
上面是人为提出的一些先验知识,接下来验证下是否有效
可以看出,对于严重低曝光的图像,响应值比较高的就是光源附近的细节,这些细节得以保留,而过曝图像往往在这些地方是没有细节的
同上,以亮度为例,该图在天空区域的曝光是良好的,而且具有一定的细节,得以保留
对于这一类局部过曝的图像,背光区域反而得到了较好的权证源码怎么写曝光,所以图中气球的细节和亮度响应值比较高,得以保留,而天空和光源部分的灰度值偏离、梯度也较小,因此这些过曝的区域的响应值(比重)很小,在融合时被舍弃。
上面根据对比度、饱和度、曝光三方面可以得到每个像素点在融合时的比重,三者合在一起
[公式]
为了防止多张图像融合,出现过高或者过低的值,要对[公式]进行归一化
[公式]
多张图像[公式],各自对应一张归一化的比重图[公式],融合
[公式]
上面的方法非常简单,但会得到十分粗糙的结果。我在具体实现时,得到的结果会出现很多黑色和纯白色的斑点(灰度值为0),而且存在一些光晕,如下:
经过我追本溯源,发现这是由于多张图像之间的灰度跳变太大导致的——假设现在有图像序列[公式],在点[公式]处,比重值分别是[公式],因此在融合时,[公式]点的灰度值主要取决于[公式];在旁边一个点,[公式]的比重值却是[公式],融合时就主要取决于[公式],而从[公式]的灰度值跳变太大,因此最后看起来有很多噪声。相邻点的比重相差会这么大,个人看法是比重由对比度、饱和度、亮度相乘得到,实际上,很多区域都是接近于0,差不多1e-4的值,三个相乘量级就到了1e-,任意一个指标突然变大变小,cb图指标源码权重就一边倒了,基本集中在某一张图像上。理想情况是一系列对比度、饱和度、亮度平滑变化的图像,就不会出现这种问题,但实际也不可能拍这么多精细的图像。
如何解决?一个很直观的想法就是对每张图的权重图做平滑处理,缓解灰度跳变,重新归一化后,再融合,效果如下:
看得出来,有所改善,但还是不够平滑,存在一定程度的光晕,继续加大力度
又好一点了,但天空还是很明显
好像又好一点了!但还是存在一些光晕(后面怎么解决的还不清楚)。
但是每次都对原始分辨率做这么大的计算吗?
这又回到了上次总结的拉普拉斯金字塔融合,构造金字塔解决分辨率过大和滤波核过大的问题,这也是论文提出的方法
使用laplace金字塔,对每张图像分解出laplace金字塔,对应的比重图分解出高斯金字塔,根据比重对laplace金字塔做融合,从低分辨率开始上采样叠加同尺度的融合后laplace细节,即可得到结果,如下:
效果有点惊艳,不仅融合了多张图像中的细节,还保持了良好的曝光,和之前的对比还是很明显的,如过曝这个区域的细节还是很不错的!但为什么和之前直径的高斯模糊相比,解决了光晕,这一点是我暂时无法理解的。
算法十分简单,只要按部就班算出每个点的对比度、饱和度、曝光,结合起来,再加一个laplace金字塔分解,问题貌似就解决了。但我在实际写的时候,得到的结果却是这样的:
饱和度太高了,而且细节也没有得到保留。。。。。。一开始还以为是C++,我索引写错了之类的,重写了几遍都过不了,换成python也是一样的,也是错的,后面还是参考了官方的matlab代码,才发现不同:
即下面两张图的对比
当我把上采样的对象改成了官方的形式,就正常了。
至于为什么会这么差,我想可能是因为一路上采样,丢失的信息太多了,所以采用之前的高斯金字塔的次一级分辨率上采样可以减少信息损失。
代码见我的github
Python 3
鬼影
本篇讨论的多曝光图像融合,默认都是对齐的,但实际上不同时间拍的图像,会因相机抖动和环境的风吹草动,而导致内容有差别,使得最后的融合结果可能出现鬼影,而鬼影(ghost effect)也是HDR融合要解决的主要问题之一。
移动
考虑下面这个例子
可以看到画面中的三个人物都存在较明显的移动,经过上面的exposure fusion像素级融合,就会得到下面的结果
这一类情况下,不保证像素级的对齐,就会出现鬼影。
模糊
和多曝光融合类似的是多焦点融合,不同图像存在不同的局部模糊
保留对比度、饱和度,不计算曝光,得到的融合结果如下:
效果感觉还行,但又不很行 ! 如IMAGE块区域,第一张图有点类似于运动模糊的效果了,在曝光融合这里就近似于"没对齐",因此融合的结果有一些虚影、鬼影 !
虽然存在如上问题,但这个方法还是给后续的一些研究提供了思路,融合不断频段的信息做图像融合,不仅仅是曝光融合,多焦点融合等。
参考资料
常ç¨çå大pythonå¾åå¤çå·¥å ·
åææ é¢ï¼ Python image manipulation tools.
ä½è | Parul Pandey
ç¿»è¯ | å®å ¶ç½ä¹å°ãJimmyHua
ä»å¤©ï¼å¨æ们çä¸çéå 满äºæ°æ®ï¼å¾åæ为ææè¿äºæ°æ®çéè¦ç»æé¨åãä½æ 论æ¯ç¨äºä½ç§ç¨éï¼è¿äºå¾åé½éè¦è¿è¡å¤çãå¾åå¤çå°±æ¯åæåå¤çæ°åå¾åçè¿ç¨ï¼ä¸»è¦æ¨å¨æé«å ¶è´¨éæä»ä¸æåä¸äºä¿¡æ¯ï¼ç¶åå¯ä»¥å°å ¶ç¨äºæç§ç¨éã
å¾åå¤çä¸ç常è§ä»»å¡å æ¬æ¾ç¤ºå¾åï¼åºæ¬æä½å¦è£åªã翻转ãæ转çï¼å¾ååå²ï¼åç±»åç¹å¾æåï¼å¾åæ¢å¤åå¾åè¯å«ãPythonæ为è¿ç§å¾åå¤çä»»å¡æ¯ä¸ä¸ªæ°å½éæ©ï¼è¿æ¯å 为å®ä½ä¸ºä¸ç§ç§å¦ç¼ç¨è¯è¨æ£å¨æ¥çæ®åï¼å¹¶ä¸å¨å ¶çæç³»ç»ä¸å è´¹æä¾è®¸å¤æå è¿çå¾åå¤çå·¥å ·ä¾å¤§å®¶ä½¿ç¨ã
让æ们çä¸ä¸å¯ä»¥ç¨äºå¾åå¤çä»»å¡ä¸çå¸¸ç¨ Python åºæåªäºå§ã
1.scikit-image
scikit-imageæ¯ä¸ä¸ªå¼æºçPythonå ï¼éç¨äºnumpyæ°ç»ãå®å®ç°äºç¨äºç 究ï¼æè²åå·¥ä¸åºç¨çç®æ³åå®ç¨å·¥å ·ãå³ä½¿æ¯é£äºåæ¥è§¦Pythonçæç³»ç»ç人ï¼å®ä¹æ¯ä¸ä¸ªç¸å½ç®åç´æ¥çåºãæ¤ä»£ç æ¯ç±æ´»è·çå¿æ¿è 社åºç¼åçï¼å ·æé«è´¨éååè¡è¯å®¡çæ§è´¨ã
èµæº
ææ¡£éè®°å½äºä¸°å¯çä¾ååå®é ç¨ä¾ï¼é 读ä¸é¢çææ¡£ï¼
/abidrahmank/OpenCV2-Python-Tutorials
ç¨æ³
ä¸é¢æ¯ä¸ä¸ªä¾åï¼å±ç¤ºäºOpenCV-Python使ç¨éåå¡æ¹æ³å建ä¸ä¸ªå为âOrappleâçæ°æ°´æå¾åèåçåè½ã
6. SimpleCV
SimpleCV ä¹æ¯ä¸ä¸ªç¨äºæ建计ç®æºè§è§åºç¨ç¨åºçå¼æºæ¡æ¶ãæäºå®ï¼ä½ å°±å¯ä»¥è®¿é®å 个é«æ§è½ç计ç®æºè§è§åºï¼å¦OpenCVï¼èä¸ä¸éè¦å å¦ä¹ äºè§£ä½æ·±åº¦ãæä»¶æ ¼å¼ãé¢è²ç©ºé´çã
å®çå¦ä¹ æ²çº¿å¤§å¤§å°äºOpenCVï¼æ£å¦å®ä»¬çå£å·æ说â计ç®æºè§è§åå¾ç®åâãä¸äºæ¯æSimpleCVçè§ç¹æï¼
å³ä½¿æ¯åå¦è ä¹å¯ä»¥ç¼åç®åçæºå¨è§è§æµè¯æåæºãè§é¢æ件ãå¾ååè§é¢æµé½æ¯å¯äºæä½çèµæº
å®æ¹ææ¡£é常容æç解ï¼èä¸æ大éçä¾åå使ç¨æ¡ä¾å»å¦ä¹ ï¼
/hhatto/pgmagick
ç¨æ³
使ç¨pgmagickå¯ä»¥è¿è¡çå¾åå¤çæ´»å¨å¾å°ï¼æ¯å¦ï¼
å¾å缩æ¾
è¾¹ç¼æå
. Pycairo
Pycairoæ¯å¾åå¤çåºcairoçä¸ç»Pythonæç»ãCairoæ¯ä¸ä¸ªç¨äºç»å¶ç¢éå¾å½¢ç2Då¾å½¢åºãç¢éå¾å½¢å¾æ趣ï¼å 为å®ä»¬å¨è°æ´å¤§å°æ转æ¢æ¶ä¸ä¼å¤±å»æ¸ æ°åº¦ ãPycairoæ¯cairoçä¸ç»ç»å®ï¼å¯ç¨äºä»Pythonè°ç¨cairoå½ä»¤ã
èµæº
PycairoçGitHubåºæ¯ä¸ä¸ªå¾å¥½çèµæºï¼æå ³äºå®è£ å使ç¨ç详ç»è¯´æãè¿æä¸ä¸ªå ¥é¨æåï¼å ¶ä¸æä¸ä¸ªå ³äºPycairoçç®çæç¨ã
åºï¼/pygobject/pycairoæåï¼https://pycairo.readthedocs.io/en/latest/tutorial.htmlç¨æ³
使ç¨Pycairoç»å¶çº¿æ¡ãåºæ¬å½¢ç¶åå¾å梯度ï¼
æ»ç»
æä¸äºæç¨ä¸å è´¹çPythonå¾åå¤çåºå¯ä»¥ä½¿ç¨ï¼æçæ¯ä¼æå¨ç¥çï¼æçå¯è½å¯¹ä½ æ¥è¯´æ¯æ°çï¼è¯çå¤å»äºè§£å®ä»¬ã
Matlab值法亚像素边缘检测源码,GUI,解析
数字图像处理中的关键步骤——边缘检测,对于图像分析至关重要。随着需求的提升,传统的像素级检测已无法满足精密测量的精度要求。本文着重介绍亚像素边缘检测技术,它通过将像素细化为亚像素,提升检测精度。
亚像素定位基于图像中像素间的连续变化,通过多项式拟合等手段获取边缘点的精确位置。这种方法在保持硬件基本条件的前提下,通过软件算法提升了分辨率,是提高边缘检测精度的有效手段。亚像素定位依赖于目标的灰度分布、几何形状等特性,对目标进行识别和定位,定位精度远超整像素级。
亚像素边缘检测算法大致分为矩方法、插值法和拟合法。插值法通过灰度值插值增强信息,如二次插值、B样条插值,适合实时检测;矩方法如Zernike正交矩,虽计算量小但对噪声敏感;拟合法如最小二乘拟合,对噪声不敏感但模型复杂。例如,基于改进形态学梯度和Zernike矩的算法结合了两者优点,抗噪并精确定位,适合实时图像测量系统。
虽然提高硬件分辨率是直接提升精度的途径,但成本高昂且受限于硬件条件。因此,研究亚像素边缘检测的软件方法,通过算法优化如形态学梯度与样条插值,为节省成本和适应不同应用提供了创新思路。然而,通用的亚像素检测方法仍需进一步研究,因领域特性而异。
至于具体源代码和运行结果的展示,我们将在后续章节详细探讨和提供。这不仅展示了技术的理论基础,也期待能为实际应用提供实用的解决方案。
Pytorch深入剖析 | 1-torch.nn.Module方法及源码
torch.nn.Module是神经网络模型的基础类,大部分自定义子模型(如卷积、池化或整个网络)均是其子类。torch.nn.Parameter是继承自torch.tensor的子类,用以表示可训练参数。定义Module时,可以使用个内置方法,例如add_module用于添加子模块,children和named_children用于获取子模块,modules和named_modules用于获取所有模块,register_parameter用于注册参数,parameters和named_parameters用于获取参数,get_parameter用于获取指定参数等。Module还支持数据格式转换,如float、double、half和bfloat,以及模型的设备移动,如cpu、cuda和xpu。训练模式调整可以通过train和eval方法实现。模型参数的梯度可以使用zero_grad方法清零。
模型的前向传播由forward方法定义,而apply方法允许应用特定函数到模型的所有操作符上。模型状态可以通过state_dict和load_state_dict方法进行保存和加载,常用于保存模型参数。此外,模型可以设置为训练模式或评估模式,影响特定模块如Dropout和BatchNorm的行为。
在PyTorch中,hook方法用于在前向和反向传播过程中捕获中间变量。注册hook时,可以使用torch.Tensor.register_hook针对张量注册后向传播函数,torch.nn.Module.register_forward_hook针对前向传播函数,torch.nn.Module.register_forward_pre_hook用于在前向传播之前修改输入张量,以及torch.nn.Module.register_backward_hook用于捕获中间层的梯度输入和输出。
通过这些方法,开发者可以灵活地调整、监控和优化神经网络模型的行为,从而实现更高效、更精确的模型训练和应用。利用hook方法,用户可以访问中间变量、修改输入或输出,以及提取特征图的梯度,为模型的定制化和深入分析提供了强大的工具。
SIFT算法原理与源码分析
SIFT算法的精密解析:关键步骤与核心原理
1. 准备阶段:特征提取与描述符生成 在SIFT算法中,首先对box.png和box_in_scene.png两张图像进行关键点检测。利用Python的pysift库,通过一系列精细步骤,我们从灰度图像中提取出关键点,并生成稳定的描述符,以确保在不同尺度和角度下依然具有较高的匹配性。 2. 高斯金字塔构建计算基础图像的高斯模糊,sigma值选择1.6,先放大2倍,确保模糊程度适中。
通过连续应用高斯滤波,构建高斯金字塔,每层图像由模糊和下采样组合而成,每组octave包含5张图像,从底层开始,逐渐减小尺度。
3. 极值点检测与极值点定位在高斯差分金字塔中寻找潜在的兴趣点,利用邻域定义,选择尺度空间中的极值点,这些点具有旋转不变性和稳定性。
使用quadratic fit细化极值点位置,确保匹配点的精度。
4. 特征描述与方向计算从细化的位置计算关键点方向,通过梯度方向和大小统计直方图,确定主次方向,以增强描述符的旋转不变性。
通过描述符生成过程,旋转图像以匹配关键点梯度与x轴,划分x格子并加权叠加,生成维的SIFT特征描述符。
5. 精度校验与匹配处理利用FLANN进行k近邻搜索,执行Lowe's ratio test筛选匹配点,确保足够的匹配数。
执行RANSAC方法估计模板与场景之间的homography,实现3D视角变化适应。
在场景图像上标注检测到的模板并标识SIFT匹配点。
SIFT的独特性:它提供了尺度不变、角度不变以及在一定程度上抵抗3D视角变化的特征,是计算机视觉领域中重要的特征检测和描述算法。