论文阅读:Deep Hybrid Camera Deblurring for Smartphone Cameras
今天介绍一篇 ACM SIGGRAPH 2024 的文章,关于手机影像中的去模糊的文章。
- Deep Hybrid Camera Deblurring for Smartphone Cameras
Abstract
手机摄像头尽管取得了显著的进步,但由于传感器和镜头较为紧凑,在低光环境下的成像仍存在困难,这会导致曝光时间变长以及出现运动模糊的情况。传统的盲去卷积方法和基于学习的去模糊方法可能是消除模糊的潜在解决方案。然而,要达到实际应用中的良好性能仍然是一个挑战。为了解决这一问题,我们提出了一种基于学习的智能手机去模糊框架,将广角和超广角摄像头用作混合摄像头系统。我们同时拍摄一张长曝光的广角图像和一组短曝光的连拍超广角图像,并利用连拍的超广角图像对广角图像进行去模糊处理。
为了充分利用连拍的超广角图像,我们提出了 HCDeblur(混合摄像头去模糊),这是一个实用的去模糊框架,其中包括新颖的去模糊网络 HC-DNet 和 HC-FNet。HC-DNet 利用从连拍图像中提取的运动信息对广角图像进行去模糊处理,而 HC-FNet 则将连拍图像作为参考图像,进一步增强去模糊后的输出效果。
为了对所提出的方法进行训练和评估,我们引入了 HCBlur 数据集,该数据集由合成数据集和真实场景数据集组成。我们的实验表明,HCDeblur 实现了 SOTA 的去模糊效果。
Introduction
- 图 1 我们的混合相机系统及去模糊结果。我们从智能手机上同时拍摄一张长曝光的广角图像W和一组短曝光的连拍超广角图像U,并利用这些连拍图像对图像W进行去模糊处理。与最先进的单张图像去模糊方法 NAFNet - 64 [Chen 等人,2022] 相比,我们的方法所得到的结果明显更加清晰。
尽管手机摄像头已经有了显著的改进,但由于其传感器和镜头较小,在低光环境下它们仍然表现不佳,这会导致曝光时间变长,并且因手部移动或移动物体而产生运动模糊。为了消除模糊,单张图像去模糊方法已得到了广泛研究。最近,基于学习的去模糊方法极大地提高了去模糊的性能。然而,如图 1 − ( c ) 1-(c) 1−(c) 所示,单张图像去模糊的性能仍然有限,尤其是对于严重的模糊情况。
为了提高去模糊性能,人们已经提出了几种利用额外输入信息的方法,比如短曝光图像和事件数据。基于参考图像的去模糊方法会采用一张额外的短曝光图像作为参考图像,对长曝光图像进行去模糊处理。这些方法会对模糊图像和参考图像进行对齐和融合,以恢复出高质量的去模糊图像。然而,由于难以准确地将严重模糊的图像与参考图像进行对齐,它们在恢复清晰细节方面往往存在困难,尤其是对于严重模糊的图像。
事件引导的去模糊方法使用由 RGB 相机和事件相机组成的特殊设计的双摄像头,同时捕捉模糊图像和事件数据,并利用从事件数据中提取的运动信息实现显著的去模糊效果。然而,这些方法需要额外配备一个事件相机,而大多数商用相机通常并没有配备这种相机。
在本文中,我们提出了 HCDeblur,这是一个专门为苹果 iPhone 和三星 Galaxy 系列等现代智能手机设计的实用图像去模糊框架。如今,这些智能手机通常配备了多摄像头系统。我们的方法将此类多摄像头系统用作混合摄像头系统,该系统由主摄像头和帧率更高的副摄像头组成。混合摄像头系统会同时拍摄一张长曝光图像和一组短曝光连拍图像。这些连拍图像提供了曝光期间逐像素级别的相机和物体运动的关键信息,而从单张图像中获取这些信息颇具挑战,不过这些信息能显著提升去模糊性能。此外,连拍图像还包含高频细节,可弥补模糊图像中丢失的高频细节。HCDeblur 充分利用了连拍图像中的运动和细节信息,在图像去模糊方面取得了无与伦比的性能,如图 1 - (d).
混合相机去模糊的概念最早由本 - 埃兹拉(Ben - Ezra)和纳亚尔(Nayar)[本 - 埃兹拉和纳亚尔,2003 年] 提出,旨在解决图像去模糊问题中的不适定性。具体而言,他们提议使用一台低分辨率高速相机作为副相机。通过这台低分辨率高速相机,他们拍摄一组短曝光图像。然后利用这些图像估计一个均匀的运动模糊核,该模糊核随后用于对主相机拍摄的模糊图像进行非盲去卷积处理。 Tai 等人 [2008 年;2010 年] 进一步拓展了这一理念,使其能够处理非均匀去模糊和视频去模糊问题。
然而,这些方法依赖于经典的模糊模型和优化方法,这极大地限制了它们的性能。相比之下,我们的方法是一种基于学习的方法,采用了混合相机系统。我们的方法是专门为现实世界中的智能手机相机量身定制的,在实际场景中表现出卓越的性能。
如图 1 所示,我们的框架分别将智能手机的广角相机和超广角相机用作主相机和副相机。广角相机通常是智能手机中的主摄像头,它以较慢的快门速度拍摄图像。相反,超广角相机由于其具有更宽的视野(FOV),能够为广角相机所拍摄图像的整个区域收集运动和细节信息。这台副相机同时以较高的快门速度和帧率拍摄一组低分辨率图像。
在拍摄完一张广角图像和一组超广角连拍图像后,我们的框架会借助这些超广角连拍图像来估计出广角图像的去模糊版本。为此,我们引入了一个深度神经网络,它包含两个子网络:混合相机去模糊网络(HC - DNet)和融合网络(HC - FNet)。
HC - DNet 利用连拍图像构建逐像素的模糊核,并利用这些模糊核来得到广角图像的去模糊版本。由于使用了模糊核,与以往的单图像去模糊方法相比,HC - DNet 能产生质量更优的去模糊结果。然而,由于模糊导致的信息丢失以及模糊核估计不准确,其结果可能仍会存在伪影和残留模糊。为了缓解这一问题,受连拍成像技术的启发,HC-FNet 将整组连拍图像作为参考图像,对 HC-DNet 的输出进行优化。
为了对我们的方法进行训练和评估,我们还推出了 HCBlur 数据集,它由两个子数据集组成:HCBlur - Syn 和 HCBlur - Real。HCBlur - Syn 是一个用于训练和评估的合成数据集,包含 8568 对模糊的广角图像与对应的真实清晰图像,以及与之对应的清晰超广角连拍图像。另一方面,HCBlur-Real 是一个用于评估的真实数据集,提供了 471 对现实世界中的模糊广角图像和超广角连拍图像,但没有对应的真实清晰图像。我们使用 HCBlur 数据集进行的实验结果表明,我们的方法显著优于现有的最先进去模糊方法。
综上所述,我们的贡献包括:
- HCDebur(混合相机去模糊框架),这是一个专门为智能手机相机设计的基于学习的混合相机去模糊框架;
- HC-DNet(混合相机去模糊网络)和 HC-FNet(融合网络),前者利用超广角连拍图像对输入的广角图像进行去模糊处理,后者则利用超广角连拍图像对去模糊后的广角图像进行优化处理;
- HCBlur 数据集,用于训练和评估混合相机去模糊方法。
Deep Hybrid Camera Deblurring
- 图 2 HCDeblur 概述。我们的框架将一张长曝光的广角图像W和一组短曝光的超广角连拍图像U作为输入。我们估计一个单应性矩阵 H ^ \hat{H} H^,用于在视场对齐过程中对齐图像U(3.2 节),并计算逐像素的运动轨迹P(3.2 节)。HC - DNet 通过利用由运动轨迹P构建的模糊核K来执行基于核的去模糊操作(3.3 节)。去模糊处理之后,采用一个额外的对齐步骤,将连拍图像与去模糊后的广角图像 W D W_D WD进行对齐。HC - FNet 通过使用连拍图像的整个序列作为参考图像,进一步增强去模糊后的图像(3.4 节)。
图 2 展示了 HCDeblur 的整体架构。HCDeblur 将由我们的混合相机系统(3.1 节)拍摄的一张长曝光广角图像 W W W 和一组短曝光超广角图像 U = { U 1 , ⋯ , U N } U = \{U_1, \cdots, U_N\} U={U1,⋯,UN} 作为输入,其中 U i U_i Ui 是第 i i i 张超广角图像, N N N 是超广角图像的数量。广角相机和超广角相机具有不同的视野(FOV)和光心,这导致它们之间存在几何上的不对齐。因此,为了从 U U U 中获取与 W W W 对齐的模糊核,我们使用视野对齐方法(3.2 节)对 W W W 和 U U U 进行对齐。我们还计算了 U U U 中各像素的运动轨迹(3.2 节),以便构建模糊核。然后,我们在 HC - DNet(3.3 节)中使用根据运动轨迹构建的模糊核进行基于核的去模糊处理,从而得到一张去模糊后的图像 W D W_D WD。接着,我们使用 HC - FNet(3.4 节),借助 U U U 中的细节信息对 W D W_D WD 进一步优化,得到最终结果 W F W_F WF。接下来,我们将更详细地描述 HCDeblur 的各个组成部分。
3.1 Hybrid Camera System
对于混合相机系统,在我们的实验中使用了苹果 iPhone 13 Pro Max 的广角相机和超广角相机,它们的焦距分别为 26 毫米和 13 毫米。为了同时拍摄 W 和 U,我们使用多相机应用程序编程接口(API)开发了一款 IOS 应用程序。我们的应用程序以 4K 分辨率(2160×3840)拍摄广角图像,曝光时间在 1/15 秒到 1/2 秒之间。与此同时,该应用程序以每秒 60 帧(FPS)的帧率拍摄一组分辨率为 720P(720×1280)的超广角图像。由于广角图像的焦距是超广角图像的两倍,并且在水平和垂直轴上的像素数量是超广角图像的 3 倍,所以广角图像中的物体看起来比超广角图像中的物体大 6 倍。为了防止连拍图像出现模糊,我们将超广角相机的最大曝光时间限制为 1/120 秒。由于硬件的限制,两台相机的曝光时间无法做到完全同步。因此,为了使来自这两台相机的图像同步,我们还记录了广角相机和超广角相机曝光开始和结束的时间戳。
3.2 FOV Alignment and Motion Estimation
FOV Alignment,一旦拍摄到一张广角图像 W W W 和一组超广角图像 U U U,我们首先在视野对齐步骤中将 U U U 与 W W W 进行对齐。为此,我们使用平面扫描方法 [柯林斯(Collins),1996 年] 找到一个能使 W W W 和 U U U 达到最佳对齐的单应性矩阵。具体来说,我们首先通过求解以下式子来找到最佳深度 d ^ \hat{d} d^:
d ^ = argmin d ∈ D MSE ( W , W ( U avg , H d ) ) (1) \hat{d} = \underset{d\in D}{\text{argmin}} \text{MSE}(W,\mathbb{W}(U_{\text{avg}},H_d)) \tag{1} d^=d∈DargminMSE(W,W(Uavg,Hd))(1)
其中, D D D 是一组深度候选值,MSE 表示均方误差, W \mathbb{W} W 是一个 warp(变换)函数。 U a v g U_{avg} Uavg 是 U U U 这组图像的平均图像。我们使用 U a v g U_{avg} Uavg 来考虑 W W W 中的模糊情况。 H d H_d Hd 是用于反向 warp 的单应性矩阵,其定义为 H d = K u E d K w − 1 H_d = K_uE_dK_w^{-1} Hd=KuEdKw−1 ,其中 K u K_u Ku 和 K w K_w Kw 分别是超广角相机和广角相机的内参矩阵, E E E 是相对外参矩阵。 K w K_w Kw、 K u K_u Ku 和 E E E 通过立体校准获得。一旦找到 d ^ \hat{d} d^ ,我们就计算出用于对齐 U U U 的单应性矩阵 H d ^ H_{\hat{d}} Hd^ ,我们将其记为 H ^ \hat{H} H^ 。
请注意,清晰图像与模糊图像之间的对齐是一项具有挑战性的任务,尤其是在模糊程度较大的情况下,这限制了以往基于参考图像的去模糊方法的性能。相比之下,我们的方法能够实现更精确的对齐,因为我们可以从一组超广角参考图像中合成生成 U a v g U_{avg} Uavg。同样需要注意的是,我们的视野对齐方法(使用单个单应性矩阵来对齐 W W W 和 U U U)可能会导致一些残余的未对齐情况。然而,我们的方法在设计上对这类问题具有鲁棒性。这是因为 HC-DNet 使用单应性矩阵并非为了直接将细节从 U U U 转移到 W W W,而是为了对齐模糊核。这些模糊核通常在空间上变化较为平滑,这使得它们对轻微的未对齐不太敏感。此外,一旦 HC-DNet 生成了去模糊图像 W D W_D WD,我们可以通过估计 W D W_D WD 和 U U U 之间的光流来实现它们之间的精确对齐,并将其用于 HC-FNet。
Pixel-wise Motion Trajectories Estimation,除了视野对齐外,我们还会估计超广角图像 U U U 中的逐像素运动轨迹,这些轨迹将用于构建模糊核,以及在 HC - FNet 中对超广角图像进行对齐。为此,我们要估计 U U U 中相邻图像之间的光流。具体来说,我们用 c c c 表示 U U U 中时间上处于中间位置图像的索引。然后,对于 i < c i < c i<c 的情况,我们估计从 U i + 1 U_{i + 1} Ui+1 到 U i U_i Ui 的光流;对于 i > c i > c i>c 的情况,我们估计从 U i − 1 U_{i - 1} Ui−1 到 U i U_i Ui 的光流。这样,我们就得到了 N − 1 N - 1 N−1 个光流图。根据估计得到的光流图,我们通过累积这些光流图来构建逐像素运动轨迹 P = { P 1 , ⋯ , P N } P = \{P_1, \cdots, P_N\} P={P1,⋯,PN} 。具体而言,在每个像素位置, P P P 包含一条由 N N N 个位移向量组成的运动轨迹,其中第 i i i 个向量是从中间图像到第 i i i 个图像的二维位移向量。在实验中,我们采用 RAFT 方法 [蒂德(Teed)和邓(Deng),2020 年] 来进行光流估计。
3.3 Kernel-based Deblurring using HC-DNet
Blur Kernel Construction,为了使用 HC-DNet 对 W W W 进行去模糊处理,我们利用从 U U U 估计得到的运动轨迹来构建模糊核。为此,我们首先使用单应性矩阵 H ^ \hat{H} H^对运动轨迹进行变换,得到变换后的运动轨迹 P ^ = { P ^ 1 , ⋯ , P ^ N } \hat{P} = \{\hat{P}_1, \cdots, \hat{P}_N\} P^={P^1,⋯,P^N}。由于运动轨迹的长度N会因曝光时间而变化,而 HC-DNet 接受的是固定通道尺寸的输入张量。因此,我们通过对运动轨迹进行重采样,从这些运动轨迹中构建出长度固定的模糊核。
为了获得与广角图像W的曝光时间精确同步的模糊核,我们在考虑广角图像和超广角图像的时间戳的情况下,对运动轨迹进行重采样。具体来说,我们将第 i i i 张超广角图像曝光开始和结束的时间戳分别记为 t i , s t_{i,s} ti,s和 t i , e t_{i,e} ti,e。我们首先按如下方式计算相对时间戳 r i r_i ri:
r i = ( t i , s + t i , e ) / 2 − t s W t s W − t e W (2) r_i = \frac{(t_{i,s} + t_{i,e})/2 - t_s^W}{t_s^W - t_e^W} \tag{2} ri=tsW−teW(ti,s+ti,e)/2−tsW(2)
其中, t s W t_s^W tsW和 t e W t_e^W teW分别表示图像W曝光开始和结束的时间戳。然后,我们通过对预先定义的九个时间戳集合对应的运动轨迹进行插值,来构建模糊核 K = { K 0 , K 0.125 , ⋯ , K 0.875 , K 1 } K = \{K_0, K_{0.125}, \cdots, K_{0.875}, K_1\} K={K0,K0.125,⋯,K0.875,K1}。具体而言, K t K_t Kt的计算方式如下:
K t = ( t − r i ) ⋅ P ^ i + 1 − P ^ i r i + 1 − r i + P ^ i (3) K_t = (t - r_i)\cdot\frac{\hat{P}_{i + 1}-\hat{P}_{i}}{r_{i + 1}-r_{i}}+\hat{P}_{i} \tag{3} Kt=(t−ri)⋅ri+1−riP^i+1−P^i+P^i(3)
其中, t ∈ { 0 , 0.125 , … , 0.875 , 1 } t \in \{0, 0.125, \ldots, 0.875, 1\} t∈{0,0.125,…,0.875,1}, r i r_i ri 和 r i + 1 r_{i + 1} ri+1 是相对于每个 t t t, U U U 中最近的相对时间戳, P ^ i \hat{P}_i P^i和 P ^ i + 1 \hat{P}_{i + 1} P^i+1分别是与 r i r_i ri和 r i + 1 r_{i + 1} ri+1对应的位移矢量图。最后,我们将所有t对应的 K t K_t Kt连接起来,得到通道大小为 18 的模糊核 K K K。图 3 展示了一个估计的模糊核示例。
- 图 3 由逐像素运动轨迹构建的模糊核
HC-DNet,HC - DNet 将广角图像 W W W 和逐像素模糊核 K \mathbf{K} K 作为输入,并输出去模糊后的广角图像 W D W_D WD(图 4)。该网络采用 U 型网络(U - Net)架构,我们在编码器和解码器网络的每一层中都使用了 NAFBlocks 模块。为了利用模糊核K,我们设计了一种新颖的核可变形模块(KDB),并将其连接在编码器的每一层之前。在 KDB 中,首先通过 NAFBlocks 模块提取图像 W W W 和模糊核 K \mathbf{K} K 的特征。然后,根据图像 W W W 和模糊核 K \mathbf{K} K 的特征计算通道注意力机制,该机制关注模糊核的特征,以避免使用可能不准确的模糊核。随后,经过注意力处理的模糊核 K \mathbf{K} K 的特征被用于预测可变形卷积层的偏移量和权重,该可变形卷积层根据模糊核 K \mathbf{K} K 自适应地处理图像 W W W 的特征,从而在去模糊过程中更有效地利用模糊核 K \mathbf{K} K。最后,图像 W W W 的特征和可变形卷积层的输出被连接起来,然后通过一个卷积层进行处理。
3.4 Burst Image-based Refinement using HC-FNet
将图像 U U U 与去模糊后的广角图像 W D W_D WD 对齐。为了融合图像 U U U 和 W D W_D WD,我们将图像 U U U 与 W D W_D WD 下采样 6 倍后的图像 W D , 6 ↓ W_{D,6\downarrow} WD,6↓ 对齐。为此,我们使用单应性矩阵 H ^ \hat{H} H^ 下采样 6 倍后的版本 H ^ 6 ↓ \hat{H}_{6\downarrow} H^6↓,对图像 U U U 和运动轨迹 P P P 进行变换,从而得到视场(FOV)对齐的超广角图像 U ~ = { U ~ 1 , ⋯ , U ~ N } \tilde{U} = \{\tilde{U}_1, \cdots, \tilde{U}_N\} U~={U~1,⋯,U~N}和运动轨迹 P ~ = { P ~ 1 , ⋯ , P ~ N } \tilde{P} = \{\tilde{P}_1, \cdots, \tilde{P}_N\} P~={P~1,⋯,P~N}。请注意, U ~ \tilde{U} U~并没有进行下采样,只是进行了对齐处理,以匹配广角图像的视场。然后,为了实现更精确的对齐,我们估计 W D , 6 ↓ W_{D,6\downarrow} WD,6↓与 U ~ \tilde{U} U~的中心帧 U ~ c \tilde{U}_c U~c之间的光流 F ~ \tilde{F} F~。最后,通过结合 P ~ i \tilde{P}_i P~i和 F ~ \tilde{F} F~,我们计算从 W D , 6 ↓ W_{D,6\downarrow} WD,6↓到第i个视场对齐的超广角图像 U ~ i \tilde{U}_i U~i的光流 P ~ i W \tilde{P}_i^W P~iW 。
HC - FNet。图 5 展示了 HC - FNet 的整体架构,它基于连拍增强网络和 NAFBlock 模块的架构。HC - FNet 将视场对齐后的超广角图像 U ~ \tilde{U} U~ 和去模糊后的广角图像 W D W_D WD 作为输入,并输出经过优化的广角图像 W F W_F WF。HC - FNet 还将原始广角图像W作为额外输入,以获取 W D W_D WD 中可能缺失的信息。然后,HC - FNet 使用 NAFBlock 模块从每个 U ~ i \tilde{U}_i U~i 中提取特征,并使用 P ~ i W \tilde{P}_i^W P~iW 将特征图与 W D W_D WD 对齐。对齐后,将 W D W_D WD 和 W W W 的特征连接到每个视场对齐的超广角图像 U ~ i \tilde{U}_i U~i 的特征图上。接着,每个超广角图像的这些组合特征会通过 NAFBlock 模块以逐帧的方式进行处理。之后,我们使用时间和空间注意力模块(TSA)将得到的特征合并为单帧。最后,合并后的特征会通过额外的 NAFBlock 模块和上采样层进一步处理和上采样。
HCBLUR DATASET
在本节中,我们将介绍 HCBlur - Syn 和 HCBlur - Real 数据集。为了构建 HCBlur - Syn 数据集,我们同时拍摄了清晰的广角和超广角视频,并通过对广角视频帧进行平均来合成模糊的广角图像。我们开发了一款 iOS 应用程序来同时拍摄广角和超广角视频。我们使用 iPhone 13 Pro Max 的广角和超广角摄像头作为我们的摄像系统。超广角摄像头以 60 帧每秒(FPS)的帧率拍摄分辨率为 720P(720×1280)的视频。同时,广角摄像头以 30 帧每秒(FPS)的帧率拍摄 4K 分辨率(2160×3840)的视频,这是多摄像头应用程序编程接口(API)所支持的最高帧率。简单地对 30 帧每秒的广角视频帧进行平均可能会由于帧之间的显著运动而导致模糊效果不连续。为了解决这个问题,我们估计广角视频连续帧之间的光流,并排除最大位移大于 36 像素的帧。然后,通过对广角视频中剩余的帧进行平均来生成模糊的广角图像W,并选择它们的时间中心帧作为真实图像(真值图像)。平均帧的数量是从集合 {5, 7, 9, 11, 13} 中随机采样得到的。
然后,对于每一张模糊的广角图像 W W W,我们根据时间戳从超广角视频中提取与 W W W 对应的超广角图像。之后,我们从这些提取出的连拍图像中随机选择一个子集,其帧数范围在 5 到 14 帧之间,以保持合理数量的连拍图像。为了模拟图像上的噪声,我们使用从我们的摄像系统中校准得到的散粒噪声和读出噪声参数,在W和U图像上合成泊松 - 高斯噪声。此外,我们采用了 Rim 等人提出的一种逼真的模糊合成流程,以提高 HCBlur - Syn 数据集对真实世界图像的泛化能力。这个流程包括帧插值和饱和像素合成。关于合成 HCBlur - Syn 数据集的更多细节可以在补充材料中找到。通过上述过程,我们收集了 1176 对涵盖各种室内、白天和夜间场景的广角和超广角视频,并合成了 8568 对广角模糊图像和一系列超广角图像,用于构建 HCBlur - Syn 数据集。为了训练和评估去模糊方法,我们将 HCBlur - Syn 数据集划分为训练集、验证集和测试集,它们分别包含 5795 对、880 对和 1731 对图像。HCBlur - Real 数据集提供了来自 157 个不同夜间和室内场景的 471 对真实世界的W和U图像。为了收集这个数据集,我们使用用于混合相机拍摄的 iOS 应用程序(第 3.1 节)同时拍摄广角图像和超广角图像。由于该数据集中不包含真实图像(真值图像),我们使用 HCBlur - Real 数据集通过无参考指标进行评估。
相关文章:
论文阅读:Deep Hybrid Camera Deblurring for Smartphone Cameras
今天介绍一篇 ACM SIGGRAPH 2024 的文章,关于手机影像中的去模糊的文章。 Deep Hybrid Camera Deblurring for Smartphone Cameras Abstract 手机摄像头尽管取得了显著的进步,但由于传感器和镜头较为紧凑,在低光环境下的成像仍存在困难&am…...
Redis 三主三从集群部署的完整方案
一、架构设计原理 分布式数据分片 哈希槽机制:Redis Cluster 将数据划分为 16384 个槽位,每个主节点负责部分槽位(如主节点1管理槽0-5460,主节点2管理5461-10922等)。 自动负载均衡:数据按哈希值分配…...
C++项目:高并发内存池_上
目录 1. 项目介绍 2. 内存池概念 2.1 池化技术 2.2 内存池和内存碎片 2.3 细看malloc 3. 定长内存池的实现 ObjectPool.hpp 4. 高并发内存池框架 5. thread cache测试 5.1 thread cache框架 5.2 ConcurrentAlloc.hpp 6. central cache测试 6.1 central cache框架 …...
『Plotly实战指南』--折线图绘制基础篇
在数据分析的世界中,折线图是一种不可或缺的可视化工具。 它能够清晰地展示数据随时间或其他变量的变化趋势,帮助我们快速发现数据中的模式、趋势和异常。 无论是金融市场分析、气象数据监测,还是业务增长趋势预测,折线图都能以直…...
【css酷炫效果】纯CSS实现波浪形分割线
【css酷炫效果】纯CSS实现波浪形分割线 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u011561335/90492023 缘 创作随缘,不定时更新。 创作背景 刚看到csdn出活动了&…...
【资料分享】全志科技T113-i全国产(1.2GHz双核A7 RISC-V)工业核心板规格书
核心板简介 创龙科技SOM-TLT113 是一款基于全志科技T113-i 双核ARM Cortex-A7 玄铁C906 RISC-V HiFi4 DSP 异构多核处理器设计的全国产工业核心板,ARM Cortex-A7 处理单元主频高达1.2GHz。核心板 CPU、ROM、RAM、电源、晶振等所有元器件均采用国产工业级方案&…...
Coco AI 智能检索 Hugo Blog 集成指南
在此前的文章中,我们介绍了如何使用 Coco Server 连接 Notion,实现智能内容检索。本次,我们将进一步探索如何在 Coco Server 最新版本 中集成 Hugo Site,以便对 Hugo 站点 进行高效检索。 Coco Server 部署方式 要在本地或服务器…...
【MySQL数据库】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法
在DQL的基础查询中,我们已经学过了多表查询的一种:联合查询(union)。本文我们将系统的讲解多表查询。 笛卡尔积现象 首先,我们想要查询emp表和stu表两个表,按照我们之前的知识栈,我们直接使用…...
jmeter将返回的数据写入csv文件
举例说明,我需要接口返回体中的exampleid与todoid的数据信息(使用边界提取器先将其提取),并将其写入csv文件进行保存 使用后置处理器BeanShell 脚本实例如下 import java.io.*;// 设置要写入的文件路径 String filePath "…...
AI如何在财务工作中提升效率的一些看法
文章目录 1. 自动化重复性任务2. 财务预测与分析3. 欺诈检测与风险管理4. 智能报表与决策支持5. 税务管理优化6. 提升团队协作与客户体验未来的趋势与挑战结论 随着人工智能(AI)技术的迅猛发展,其正全方位地革新各行各业的运作模式࿰…...
OpenCV入门指南:从安装到基本操作
引言 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它包含了数百种计算机视觉算法,广泛应用于图像处理、视频分析、物体检测、人脸识别等领域。本文将带你从安装OpenCV开始,逐步了解其基…...
简单以太网配置
display arp //查看路由器mac地址 交换机配置命令: system-view // 从用户视图进入系统视图 dis mac-address //查看mac地址表 路由器配置命令: system-view // 从用户视图进入系统视图 int GigabitEthernet 0/0/0 //进入G口 0/0/0 进入之后配置网关: ip addre…...
蓝桥杯嵌入式组第十四届省赛题目解析+STM32G431RBT6实现源码
文章目录 1.题目解析1.1 分而治之,藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 LED模块1.3.3 LCD模块1.3.4 TIM模块1.3.4.1 频率变化处理1.3.4.1 占空比计算 1.3.5 ADC模块 2.源码2.1cubemx配置3.第十四届题目 前言:STM32G431RBT6实现嵌入…...
让双向链表不在云里雾里
又来博客留下我的足迹了,哈哈哈,这次是对于双向链表的理解 目录 创建双向链表: 申请结点: 双向链表初始化: 双向链表插入结点: 双向链表删除结点: 双向链表的打印: 双向链表…...
基于django+vue的购物商城系统
开发语言:Python框架:djangoPython版本:python3.8数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 系统首页 热卖商品 优惠资讯 个人中心 后台登录 管理员功能界面 用户管理 商品分类管理…...
在Vue3中使用Echarts的示例
1.常用-引用ts文件方式 1.1 导出ts文件-一个简单的柱状图 export const baseBarChart (xdata: string[], data: number[][], legendData: string[]) > {if (data.length 0) {return noData;}// 定义颜色数组const color [#00CCCC,#FF9900,#1677DC,#FF6666,#B366FF,#666…...
TCP协议的多线程应用、多线程下的网络编程
DAY13.2 Java核心基础 多线程下的网络编程 基于单点连接的方式,一个服务端对应一个客户端,实际运行环境中是一个服务端需要对应多个客户端 创建ServerSocketNable类,多线程接收socket对象 public class ServerSocketNable implements Run…...
每日学习Java之一万个为什么(待补充)
Git分支操作 git branch 分支名 git branch -v git checkout -b 分支名 git checkout 分支名 git merge 分支名 git branch -d | -D 分支名Git冲突 git同名文件合并的最基本单位是行。同名文件同一行不同就会发生冲突。 解决办法:及时沟通,手动更改&…...
设计C语言的单片机接口
一、主要内容 (一)控制引脚 1、定义管脚 // 定义管脚的结构体 struct pin{ int id; // 管脚编号 int mode; // 模式,输入为1,输出为0 int pull; // 输入电阻 int driver; // 功率 } 2、输出电平 语法: void pin_output(s…...
博客迁移----宝塔面板一键迁移遇到问题
前景 阿里云轻量级服务器到期了,又免费领了个ESC, 安转了宝塔面板。现在需要迁移数据,使用宝塔面板一键迁移功能,完成了数据的迁移,改了域名的解析,现在进入博客是显示502 bad grateway 宝塔搬家参考链接…...
抽象工厂模式 (Abstract Factory Pattern)
抽象工厂模式 (Abstract Factory Pattern) 是一种创建型设计模式,它提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 一、基础 1. 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 2. …...
LeetCode 第14~16题
目录 LeetCode 第14题:最长公共前缀 LeetCode 第15题:三数之和 LeetCode 第16题:最接近的三数之和 LeetCode 第14题:最长公共前缀 题目描述 编写一个函数来查找字符数组中的最长公共前缀。如果不存在公共前缀,返回字符…...
深入了解Linux —— git三板斧
版本控制器git 为了我们方便管理不同版本的文件,就有了版本控制器; 所谓的版本控制器,就是能够了解到一个文件的历史记录(修改记录);简单来说就是记录每一次的改动和版本迭代的一个管理系统,同…...
再学:abi编码 地址类型与底层调用
目录 1.内置全局变量及函数 2.abi 3.地址类型 4.transfer 1.内置全局变量及函数 2.abi data就是abi编码 abi描述:以json格式表明有什么方法 3.地址类型 4.transfer x.transfer:合约转给x call 和 delegatecall 是 Solidity 中用于底层合约调用的函数࿰…...
Redis的消息队列是怎么实现的
Redis 本身并不是一个专门的消息队列系统,但它的 List、Pub/Sub 和 Stream 数据结构可以用来实现消息队列的功能。以下是 Redis 实现消息队列的几种常见方式: 1. 基于 List 实现消息队列 Redis 的 List 是一个双向链表,支持在头部和尾部进行高效的插入和删除操作,非常适合…...
图论入门【数据结构基础】:什么是树?如何表示树?
图论是计算机科学和数学中的一个重要分支,研究图的结构及其性质。之前我们介绍了图的基本概念和表示:图论入门【数据结构基础】:什么是图?如何表示图?,本文将介绍树的基本概念、性质及其在计算机科学中的应…...
微信小程序订阅消息发送消息,点击消息进入小程序页面
1、在小程序官网订阅消息选用或创建消息模板获取模板ID可多个 如图: 2、微信小程序前端页面发送请求订阅权限 请求模板id的权限可以是一个可以是多个,用户同意订阅,获取code传递给后端——后端拿到code生成唯一的openid用于发送订阅消息 注…...
基于小参数量大语言模型(Small Language Models) ---- 在制造业落地降本增效应用:可行性研究初探
文章大纲 一、引言二、小参数量模型概述基本技术要求小参数量大语言模型在制造业场景中的适用性分析(一)排产优化(二)错误根因分析三、制造业小参数量大语言模型开源解决方案简介Bert 系列 模型Google微软MetaMistral AI国产解决方案四、技术实现方案进行逻辑(一)模型选择…...
pandas中excel自定义单元格颜色
writerpd.ExcelWriter(filepathf05教师固定学生占比1月{today}.xlsx,engineopenpyxl) df.to_excel(writer,sheet_name明细) piv1.to_excel(writer,sheet_name1月分布) wswriter.book.create_sheet(口径) ws.cell(1,1).value综合占比: ws.cell(1,2).value固定学生占比…...
MySQL事务:确保数据一致性的关键机制
目录 1. 为什么需要事务? 2. 什么是事务? 3. 事务的四大特性 3.1 原子性(Atomicity) 3.2 一致性(Consistency) 3.3 隔离性(Isolation) 3.4 持久性(Durability&…...
图论入门【数据结构基础】:什么是图?如何表示图?
图(Graph) 是一种非线性数据结构,用于表示对象之间的关系。图由 顶点(Vertex) 和 边(Edge) 组成,其中顶点表示对象,边表示对象之间的关系。图广泛应用于计算机科学、数学…...
SpringBoot中使用AJ-Captcha实现行为验证码(滑动拼图、点选文字)
简介 AJ-Captcha行为验证码,包含滑动拼图、文字点选两种方式,UI支持弹出和嵌入两种方式。后端提供Java、Golang实现,前端提供了php、angular、html、vue、uni-app、flutter、android、ios等代码示例。点击前往AJ-Captcha代码仓库 引入Maven…...
【国际研讨会】2025年3-5月通信、算法、电气工程、自动化等领域国际学术会议征稿开启!大型学术盛宴!
【国际研讨会】2025年3-5月通信、算法、电气工程、自动化等领域国际学术会议征稿开启!大型学术盛宴! 【国际研讨会】2025年3-5月通信、算法、电气工程、自动化等领域国际学术会议征稿开启!大型学术盛宴! 文章目录 【国际研讨会】…...
AI战略家:X厂三年复盘大纲——业务与组织双视角深度拆解
一、业务负责人视角:从0到1与从1到100的核心能力模型 (一)阶段能力要求与问题预判 1. 从0到1:破局能力 核心能力升级框架: 需求洞察三阶漏斗: 行业需求池:广泛收集行业内的各种需求ÿ…...
LuaJIT 学习(4)—— FFI 语义
文章目录 C Language SupportC Type Conversion RulesConversions from C types to Lua objects例子:访问结构体成员 Conversions from Lua objects to C typesConversions between C types例子:修改结构体成员 Conversions for vararg C function argum…...
剑指 Offer II 078. 合并排序链表
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20078.%20%E5%90%88%E5%B9%B6%E6%8E%92%E5%BA%8F%E9%93%BE%E8%A1%A8/README.md 剑指 Offer II 078. 合并排序链表 题目描述 给定一个链表数组,每个链…...
go回调函数的使用
在Go语言中,回调函数可以有参数,也可以没有参数。它们的定义和使用方式略有不同,但本质上都是将函数作为参数传递给另一个函数,并在适当的时候调用它。以下是带参数和不带参数的回调函数的示例和说明。 1. 不带参数的回调函数 不…...
CBNet:一种用于目标检测的复合骨干网架构之论文阅读
摘要 现代顶级性能的目标检测器在很大程度上依赖于骨干网络,而骨干网络的进步通过探索更高效的网络结构带来了持续的性能提升。本文提出了一种新颖且灵活的骨干框架——CBNet,该框架利用现有的开源预训练骨干网络,在预训练-微调范式下构建高…...
k8s中PAUSE容器与init容器比较 local卷与hostpath卷比较
目录 一、PAUSE容器与INIT容器比较 1. Pause 容器 作用 特点 示例 2. Init 容器 作用 特点 示例 3. Pause 容器 vs Init 容器 4. 总结 这两个哪个先启动呢? 详细启动顺序 为什么 Pause 容器最先启动? 示例 总结 二、local卷与hostpath卷…...
施耐德PLC仿真软件Modbus tcp通讯测试
安装仿真软件:EcoStruxure™ Control Expert - PLC 仿真器 下载地址:https://www.schneider-electric.cn/zh/download/document/EIO0000001719/ 配置CPU: 切换至仿真模式,系统托盘中出现仿真器图标 新建变量test,地址…...
TCP、UDP协议的应用、ServerSocket和Socket、DatagramSocket和DatagramPacket
DAY13.1 Java核心基础 TCP协议 TCP 协议是面向连接的运算层协议,比较复杂,应用程序在使用TCP协议之前必须建立连接,才能传输数据,数据传输完毕之后需要释放连接 就好比现实生活中的打电话,首先确保电话打通了才能进…...
【HarmonyOS Next】常见的字节转换
【HarmonyOS Next】常见的字节转换 字节转换、位运算在实际开发中具有广泛的应用价值,特别是在处理字节级数据时发挥着重要作用。例如,在网络通信中用于大小端序转换,在数据解析时进行位提取操作。这些特性使得位运算在USB通信、蓝牙&#x…...
Redis-锁-商品秒杀防止超卖
一、秒杀(Seckill) 1. 定义 秒杀:短时间内(如1秒内)大量用户同时抢购 限量低价商品 的营销活动。典型场景:双11热门商品抢购、小米手机首发、演唱会门票开售。 2. 技术挑战 挑战点说明后果…...
RHCE(RHCSA复习:npm、dnf、源码安装实验)
七、软件管理 7.1 rpm 安装 7.1.1 挂载 [rootlocalhost ~]# ll /mnt total 0 drwxr-xr-x. 2 root root 6 Oct 27 21:32 hgfs[rootlocalhost ~]# mount /dev/sr0 /mnt #挂载 mount: /mnt: WARNING: source write-protected, mounted read-only. [rootlocalhost ~]# [rootlo…...
KNN算法性能优化技巧与实战案例
KNN算法性能优化技巧与实战案例 K最近邻(KNN)在分类和回归任务中表现稳健,但其计算复杂度高、内存消耗大成为IT项目中的主要瓶颈。以下从 算法优化、数据结构、工程实践 三方面深入解析性能提升策略,并附典型应用案例。 一、核心性…...
安装并使用anaconda(宏观版)
conda安装 windows 安装 1 官网下载-下载地址 2 配置环境 - 安装目录 bin,script 三个填入环境变量(windows “系统属性” -> “高级系统设置” -> “环境变量” ) 这些值可以被运行在操作系统上的程序使用。它是一个通用的概念,在不同的操作系统和应用程序…...
Qwen2.5-VL 开源视觉大模型,模型体验、下载、推理、微调、部署实战
一、Qwen2.5-VL 简介 Qwen2.5-VL,Qwen 模型家族的旗舰视觉语言模型,比 Qwen2-VL 实现了巨大的飞跃。 欢迎访问 Qwen Chat (Qwen Chat)并选择 Qwen2.5-VL-72B-Instruct 进行体验。 1. 主要增强功能 1)直观地理解事物&…...
【sql靶场】第18-22关-htpp头部注入保姆级教程
目录 【sql靶场】第18-22关-htpp头部注入保姆级教程 1.回顾知识 1.http头部 2.报错注入 2.第十八关 1.尝试 2.爆出数据库名 3.爆出表名 4.爆出字段 5.爆出账号密码 3.第十九关 4.第二十关 5.第二十一关 6.第二十二关 【sql靶场】第18-22关-htpp头部注入保姆级教程…...
SpringBoot实现发邮件功能+邮件内容带模版
发送简单邮件模版邮件 1.pom引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>2.5.13</version></dependency><dependency><groupId&…...
C# NX二次开发:矩形阵列和线性阵列等多种方法讲解
大家好,今天讲一些关于阵列相关的UFUN函数。 UF_MODL_create_linear_iset (view source):这个函数为创建矩形阵列。 intmethodInputMethod: 0 General 1 Simple 2 Identicalchar *number_in_xInputNumber in XC direction.char *distance_xInputSpac…...