当前位置: 首页 > news >正文

目标检测-击穿黑夜的PE-YOLO

前言

当前的目标检测模型在许多基准数据集上取得了良好的结果,但在暗光条件下检测目标仍然是一个巨大的挑战。为了解决这个问题,作者提出了金字塔增强网络(PENet)并将其与YOLOv3结合,构建了一个名为PE-YOLO的暗光目标检测框架。
首先,PENet使用拉普拉斯金字塔将图像分解为4个具有不同分辨率的组件。具体来说,作者提出了一个细节处理模块(DPM)来增强图像的细节,其中包括上下文分支和边缘分支。此外,作者提出了一个低频增强滤波器(LEF)来捕获低频语义并防止高频噪声。

在这里插入图片描述

1、简介

近年来,卷积神经网络(CNN)的出现推动了目标检测领域的发展。大量的检测器被提出,针对基准数据集的性能也取得了令人满意的结果。然而,大多数现有的检测器都是在高质量图像和正常条件下进行研究的。而在实际环境中,往往存在许多恶劣的光照条件,如夜晚、暗光和曝光不足,导致图像质量下降,从而影响了检测器的性能。视觉感知模型使得自动系统能够理解环境并为后续任务(如轨迹规划)奠定基础,这需要一个稳健的目标检测或语义分割模型。
在这里插入图片描述
图1是一个暗光目标检测的示例。可以发现,如果能够适当地增强图像,并根据环境条件恢复原始模糊目标的更多潜在信息,那么目标检测模型就能够适应不同的暗光条件,这也是模型在实际应用中面临的重大挑战。

目前,已经提出了许多方法来解决暗场景中的鲁棒性问题。许多暗光增强模型被提出来恢复图像细节,减少恶劣光照条件的影响。然而,暗光增强模型的结构较为复杂,这不利于图像增强后检测器的实时性能。这些方法大多数不能与检测器进行端到端的训练,需要有配对的暗光图像和正常图像进行监督学习。

在暗光条件下的目标检测也可以看作是域自适应问题。一些研究者采用对抗学习将模型从正常光到暗光进行转换。但是他们关注的是数据分布的匹配,忽略了暗光图像中所包含的潜在信息。近几年,一些研究者提出了使用可微分图像处理(DIP)模块来增强图像,并以端到端的方式训练检测器。然而,DIP是传统的方法,如白平衡,对图像的增强效果有限。

为了解决以上问题,本文作者提出了一种金字塔增强网络(PENet),用于增强暗光图像并捕获有关目标的潜在信息。作者将PENet与YOLOv3结合,构建了一个名为PE-YOLO的端到端的暗目标检测框架。在PENet中,作者首先使用拉普拉斯金字塔将图像分解为多个不同分辨率的组成部分。在金字塔的每个尺度上,作者提出了细节处理模块(DPM)和低频增强滤波器(LEF)来增强这些组成部分。

DPM由上下文分支和边缘分支组成,上下文分支通过捕获远距离依赖关系全局增强组成部分,而边缘分支增强组成部分的纹理。LEF使用动态低通滤波器来获取低频语义信息,防止高频噪声以丰富特征信息。作者在模型训练过程中只使用正常的检测损失来简化训练过程,无需对图像进行清晰的标注。

作者在暗光目标检测数据集ExDark上验证了作者方法的有效性,结果显示与其他暗目标检测器和暗光增强模型相比,PE-YOLO取得了先进的结果,分别达到78.0%的mAP和53.6的FPS,适用于暗场景中的目标检测。

作者的贡献可以总结如下:

  • 作者构建了一个金字塔增强网络(PENet),用于增强不同的暗光图像。作者提出了详细处理模块(DPM)和低频增强滤波器(LEF)来增强图像组成部分。
  • 通过将PENet与YOLOv3结合,作者提出了一个端到端训练的暗目标检测框架PE-YOLO,以适应暗光条件。在训练过程中,作者只使用正常的检测损失。
  • 与其他暗目标检测器和暗光增强模型相比,作者的PE-YOLO在ExDark数据集上取得了先进的结果,实现了令人满意的准确性和速度。

2、相关方法

2.1 目标检测

目标检测模型可以分为3类:

  • 一阶段模型、
  • 两阶段模型
  • 基于Anchor-Free的模型。

Faster RCNN 不再通过选择性搜索获得区域建议,而是通过区域提议网络(RPN)来实现。它使得候选区域提议、特征提取、分类和回归在同一个网络中端到端地进行训练。Cai等人提出了Cascade RCNN,它将多个检测头级联起来,当前级别将对前一级别的回归和分类结果进行改进。YOLOv3 提出了新的特征提取网络DarkNet-53。借鉴了特征金字塔网络(FPN)的思想,YOLOv3采用了多尺度特征融合。此外,最近出现了基于Anchor-Free的检测器,它们放弃了Anchor,并将其改变为基于关键点的检测。

2.2 暗光增强

暗光增强任务的目标是通过恢复图像细节和校正颜色失真来改善人类的视觉感知,并为目标检测等高级视觉任务提供高质量的图像。Zhang等人提出了Kind,它可以通过不同亮度级别的成对图像进行训练,而无需真实的GT。Guo等人提出了Zero DCE,它将暗光增强任务转化为图像特定曲线估计问题。Lv等人提出了多分支暗光增强网络MBLLEN,它在不同级别提取特征,并通过多分支融合生成输出图像。Cui等人提出了自适应照明Transformer(IAT),通过动态查询学习构建端到端的Transformer。暗光增强模型恢复图像细节后,会提高检测器的效果。然而,大多数暗光增强模型较为复杂,对检测器的实时性能有很大影响。

2.3 恶劣条件下的目标检测

在恶劣条件下的目标检测对于机器人的鲁棒感知至关重要,因此出现了一些针对恶劣条件的鲁棒目标检测模型。有些研究人员通过无监督领域自适应将检测器从源域迁移到目标域,以适应恶劣环境。刘等人提出了IA-YOLO,它通过自适应地增强每个图像来提高检测性能。他们使用了一个可微分图像处理(DIP)模块来适应恶劣天气,并使用一个小型卷积神经网络(CNN-PP)来调整DIP的参数。在IA-YOLO的基础上,Kalwar等人提出了GDIP-YOLO。GDIP提出了一个门控机制,允许多个DIP并行操作。Qin等人提出了检测驱动的增强网络(DENet),用于恶劣天气条件下的目标检测。Cui等人提出了用于暗光条件下的多任务自动编码转换(MAET),探索了光照转换背后的潜在空间。

3、本文方法

在这里插入图片描述
暗图像由于暗光干扰导致能见度较差,这影响了检测器的性能。为了解决这个问题,作者提出了金字塔增强网络(PENet)并联合YOLOv3构建了一个暗物体检测框架PE-YOLO。PE-YOLO框架的概览如图2所示。

3.1 PE-YOLO概述

PENet通过拉普拉斯金字塔将图像分解成不同分辨率的组件。在PENet中,作者通过提出的细节处理模块(DPM)和低频增强滤波器(LEF)来增强每个尺度的组件。

假设图像 I ∈ R h × w × 3 I\in R^{h\times w\times3} IRh×w×3作为输入,作者使用高斯金字塔获取不同分辨率的子图像。 G ( x ) = D o w n ( G a u s s i a n ( x ) ) G(x)=Down(Gaussian(x)) G(x)=Down(Gaussian(x))其中Down表示下采样,Gaussian表示高斯滤波器,高斯核的大小为5×5。在每个高斯金字塔操作后,图像的宽度和高度减半,这意味着分辨率是原始图像的1/4。显然,高斯金字塔的下采样操作是不可逆的。为了在上采样后恢复原始的高分辨率图像,需要恢复丢失的信息,这些丢失的信息构成了拉普拉斯金字塔的组件。拉普拉斯金字塔的定义如下: L i = G i − U p ( G i + 1 ) L_{i}=G_{i}-Up(G_{i+1}) Li=GiUp(Gi+1)其中 L i L_{i} Li,表示拉普拉斯金字塔的第i层, G i G_{i} Gi表示高斯金字塔的第i层,Up表示双线性上采样操作。在重建图像时,作者只需要执行公式(2)的逆操作,即可恢复高分辨率图像。
在这里插入图片描述
作者通过拉普拉斯金字塔获得了不同尺度的4个组件,如图3所示。作者发现拉普拉斯金字塔从底部到顶部更关注全局信息,而从顶部到底部更关注局部细节。它们都是在图像下采样过程中丢失的信息,也是作者PENet增强的目标。作者通过细节处理模块(DPM)和低频增强滤波器(LEF)来增强这些组件,DPM和LEF的操作是并行的。

作者将在下一节中介绍DPM和LEF。通过分解和重建拉普拉斯金字塔,PENet可以变得轻量且有效,这有助于提高PE-YOLO的性能。

3.2 细节信息增强

作者提出了一个细节处理模块(DPM)来增强拉普拉斯金字塔中的组件,它由上下文分支和边缘分支组成。
在这里插入图片描述
DPM的详细信息如图4所示。上下文分支通过捕捉远程依赖性来获取上下文信息,并全局增强组件。边缘分支使用两个不同方向的Sobel算子来计算图像梯度,获取边缘并增强组件的纹理。

3.2.1 上下文分支

作者使用残差块来在获取远程依赖性之前和之后处理特征,并且残差学习允许丰富的低频信息通过跳过连接进行传递。第一个残差块将特征的通道从3变为32,第二个残差块将特征的通道从32变为3。捕捉场景中的全局信息已被证明对于低级别的视觉任务(如暗光增强)是有益的。

上下文分支的结构如图4所示,其定义如下: C B ( x ) = x + γ ( F 1 ( x ^ ) ) CB(x)=x+\gamma(F_1(\hat{x})) CB(x)=x+γ(F1(x^))在上述公式中, x ^ \hat{x} x^表示上下文分支的输出, F F F是带有3×3卷积核的卷积层,γ是Leaky ReLU激活函数,σ是Softmax函数。

3.2.2 Edge branch

S o b e l Sobel Sobel算子是一种离散算子,它同时使用了高斯滤波和差分求导。它通过计算梯度近似来找到边缘。作者在水平和垂直方向上都使用 S o b e l Sobel Sobel算子来通过卷积滤波器重新提取边缘信息,并使用残差来增强信息的流动。该过程表示为: E B ( x ) = F 3 ( S o b e l h ( x ) + S o b e l w ( x ) ) + x EB(x)=F_3(Sobel_h(x)+Sobel_w(x))+x EB(x)=F3(Sobelh(x)+Sobelw(x))+x在上述公式中, S o b e l h ( x ) Sobel_h(x) Sobelh(x) S o b e l w ( x ) Sobel_w(x) Sobelw(x)分别代表垂直和水平方向上的 S o b e l Sobel Sobel操作。这两个操作分别应用于输入特征,以计算垂直和水平方向上的梯度近似,从而提取图像中的边缘信息。在DPM中,作者使用这两个Sobel操作来获取边缘信息,并将其与原始输入特征相加,以增强特征表示。

3.3 低频增强滤波器

在每个尺度的分量中,低频分量包含了图像中的大部分语义信息,它们是检测器预测的关键信息。为了丰富重建图像的语义信息,作者提出了低频增强滤波器(LEF)来捕捉组成部分中的低频信息。LEF的细节如图5所示。
在这里插入图片描述
假设组成部分 f ∈ R h × w × 3 f\in R^{h\times w\times3} fRh×w×3,作者首先通过一个卷积层将其转换为 f ∈ R h × w × 3 f\in R^{h\times w\times3} fRh×w×3。作者使用动态低通滤波器来捕捉低频信息,并且使用平均池化进行特征滤波,只允许低于截止频率的信息通过。

不同语义的低频阈值是不同的。考虑到Inception的多尺度结构,作者使用大小为 1 × 1 1×1 1×1 2 × 2 2×2 2×2 3 × 3 3×3 3×3 6 × 6 6×6 6×6的自适应平均池化,并在每个尺度末尾使用上采样来恢复特征的原始大小。不同卷积核大小的平均池化形成了低通滤波器。作者通过通道分离将f划分为4个部分,即 { f 1 , f 2 , f 3 , f 4 } \{f_{1},f_{2},f_{3},f_{4}\} {f1,f2,f3,f4}。每个部分使用不同大小的池化进行处理,具体描述如下: F i l t e r ( f i ) = U p ( β s ( f i ) ) Filter(f_i)=Up(\beta_s(f_i)) Filter(fi)=Up(βs(fi))其中 f i f_i fi f f f在通道上划分的部分, U p Up Up是双线性插值采样, β s \beta_s βs是不同大小 s × s s×s s×s的自适应平均池化。最后,在张量拼接每个 { f i , i = 1 , 2 , 3 , 4 } \{f_{i},i=1,2,3,4\} {fi,i=1,2,3,4}后,作者将它们恢复为 f ∈ R h × w × 3 f\in R^{h\times w\times3} fRh×w×3

4、实验

4.1 实验结果

为了验证PE-YOLO的有效性,作者在ExDark数据集上进行了许多实验。首先,作者将PE-YOLO与其他暗光增强模型进行比较。由于暗光增强模型缺乏检测能力,作者将使用与PE-YOLO相同的检测器对所有增强后的图像进行实验。

作者将mAP的IoU阈值设置为0.5,并且性能比较结果如表1所示。作者发现直接在YOLOv3之前使用暗光增强模型并没有显著提高检测性能。作者的PE-YOLO在mAP上比MBLLEN和Zero-DCE分别高出1.2%和1.1%,取得了最佳结果。
在这里插入图片描述

作者将不同暗光增强模型的检测结果进行了可视化,如图6所示。作者发现虽然MBLLEN和Zero DCE可以显著提高图像的亮度,但它们也会放大图像中的噪声。PE-YOLO主要捕捉暗光图像中目标的潜在信息,同时抑制高频组件中的噪声,因此PE-YOLO具有更好的检测性能。
在这里插入图片描述

作者将PE-YOLO与其他暗光检测器进行了性能比较,如表2所示。此外,作者还可视化了暗光检测器和PE-YOLO的检测结果,如图7所示,清楚地展示了PE-YOLO在目标检测方面更准确。与使用LOL数据集进行预训练的DENet和IAT-YOLO相比,PE-YOLO在mAP上高出0.7%和0.2%,而且作者的PE-YOLO在FPS上几乎是最高的。以上数据表明,PE-YOLO更适用于在暗光条件下检测物体。
在这里插入图片描述
在这里插入图片描述

4.2 消融实验

在这里插入图片描述
为了分析PE-YOLO中每个组件的有效性,作者进行了消融研究,结果如表3所示。在采用上下文分支后,PE-YOLO的mAP从76.4%增加到77.0%,表明捕捉远程依赖关系对于增强有效。在采用边缘分支后,mAP从77.0%增加到77.6%,表明边缘分支可以增强组件的纹理,并增强增强图像的细节。在采用LEF后,mAP从77.6%增加到78.0%,表明捕捉低频分量有助于获得图像中的潜在信息。

最后,作者的模型在mAP上从76.4%提高到78.0%,仅降低了0.4个FPS。

相关文章:

目标检测-击穿黑夜的PE-YOLO

前言 当前的目标检测模型在许多基准数据集上取得了良好的结果,但在暗光条件下检测目标仍然是一个巨大的挑战。为了解决这个问题,作者提出了金字塔增强网络(PENet)并将其与YOLOv3结合,构建了一个名为PE-YOLO的暗光目标检…...

优化性能压力测试的关键策略和技巧

在现代软件开发中,性能压力测试是不可或缺的一环。它可以帮助开发团队评估系统在负载压力下的性能表现,识别潜在的性能瓶颈,并采取适当的措施进行优化。然而,仅仅进行性能压力测试是不够的,关键的在于如何优化测试的过…...

VMware Linux 可视化增加磁盘

1、VMware 增加磁盘 2、disks挂载磁盘 此处我挂载的是20G磁盘,截图只是用5G的做过程演示例子。 3、验证挂载磁盘...

从 axios 源码学习设计模式

文章目录 一、源码分析1.1 axios 为什么可以多种方式调用1.2 拦截器实现注册使用:promise链式调用 二、从 axios 看设计模式axios 的精髓在哪2.1 抽象工厂axios.create -- 创建新实例的工厂 2.2 微内核设计2.3 适配器思想2.4 责任链模式2.5 桥接模式举例&#xff1a…...

输出不同程序执行的时间

简单的测试工具代码,它可以输出不同程序执行的时间。我们可以使用Python的time模块来实现这个功能。 import timedef test_function(func, *args, **kwargs):"""测试函数执行时间的工具函数:param func: 待测试的函数:param *args: 函数的位置参数:…...

HDU 6391 组合数学 + DP

题意 传送门 HDU 6391 Lord Li’s problem 题解 仅考虑 S i ≠ T i S_i\neq T_i Si​Ti​ 的数量 m m m,最后答案除以 ( n m ) \binom{n}{m} (mn​) 即可。考虑 X X X 的排列,最后答案除以 k ! k! k! 即可。 d p [ i 1 ] [ j ] dp[i1][j] dp[…...

StopWatch与ThreadLocal

目录 1、StopWatch 1、1作用: 1、2方法: 1、3使用方法 2、ThreadLocal 2、1什么是ThreadLocal 2、2简单例子 2、3使用ThreadLocal带来的四个好处 2、4主要方法 2、5ThreadLocal内存泄漏问题 1、StopWatch 1、1作用: 统计代码块耗时时…...

20. 有效的括号

给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括…...

微信小程序原生写法传递参数

微信小程序原生写法传递参数 data-xxx 自定义参数名 ,接收参数:方法(变量名) checkVip:function(event) {let that thisconsole.log(event,event)console.log(event.currentTarget.dataset.idx,index)let index Number(eve…...

JavaWeb+jsp+Tomcat的教务查询系统

点击以下链接获取源码: https://download.csdn.net/download/qq_64505944/88134601?spm1001.2014.3001.5503 jsp/tomcat7.05/MySQL5.7或8版本/ssm框架/spring/ Web框架:SpringBoot/ORM框架:Mybatis/安全框架:Shiro/分页插件&am…...

C# FTP下载 采用Ssh.Net方式

不要再用FTPClient了 nuget下载Ssh.Net 然后代码如下&#xff1a; /// <summary>/// SFTP操作类/// </summary>public class SFTPHelper{#region 字段或属性private SftpClient sftp;/// <summary>/// SFTP连接状态/// </summary>public bool Conne…...

【C++】做一个飞机空战小游戏(三)——模块化程序设计

[导读]本系列博文内容链接如下&#xff1a; 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动【C】做一个飞机空战小游戏(三)——模块化程设设计 在前两讲当中&#xff0c;介绍了利用…...

Django使用WebSocket

1、websocket 相关 实现一个系统&#xff0c;20 个用户同时打开网站&#xff0c;呈现出来一个群聊界面 解决方案 轮询&#xff1a;让浏览器每隔2s向后台发送一次请求&#xff0c;缺点&#xff1a;延迟&#xff0c;请求太多网站压力大 长轮询&#xff1a;客户端向服务端发送请…...

看完这篇 教你玩转渗透测试靶机Vulnhub——HarryPotter:Nagini

Vulnhub靶机HarryPotter:Nagini渗透测试详解 Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;漏洞发现&#xff1a;③&#xff1a;SSRF漏洞利用&#xf…...

IPO要收紧?业内人士未予以完全确认

“IPO全面收紧、吃穿住等行业标的基本劝退&#xff08;除非行业龙头&#xff09;、科创板第五套标准暂停受理……”在上周末&#xff0c;一篇关于IPO收紧的“小作文”在投行圈内疯狂转发。 距离全面注册制正式实施已过去了5个半月&#xff0c;IPO节奏是否在发生较大变化&#…...

stable difussion Pytorch实现与测试

引言: Stable Diffusion是目前最火的AI绘画工具之一,它是一个免费开源的项目,可以被任何人免费部署和使用。通过Stable Diffusion,可以很轻松的通过文字描述,生成对应的图片。由于它是一个开源项目,开源社区(如:GitHub)中有很多插件和训练好的模型,我们可以直接使用。…...

Redis简述

Redis是什么Redis数据类型Redis应用场景缓存计数器分布式会话排行榜最新列表分布式锁消息队列 Redis出现的问题穿透击穿雪崩 Redis为什么速度快 Redis是什么 redis是一种高速缓存数据库 Redis数据类型 string hash list set zset Redis应用场景 缓存 Redis作为缓存层&…...

Redis 操作List

【分布式】Redis 分布式之List_redissonclient.getlist_比嗨皮兔的博客-CSDN博客 说明 配置文件参考&#xff1a;https://blog.csdn.net/qq_38428623/article/details/123217001?utm_sourceapp&app_version5.1.1&codeapp_1562916241&uLinkIdusr1mkqgl919blen ——…...

多个List 合并变成一个List+一个List 根据某个字段相等的另一个字段相加,并排序变成新的List

List<CurveTimeAndValueDomain> curves new ArrayList<>();for (int i 0; i < columnNames.size(); i){if (columnNames.get(i).equals(PlantConstant.TENDOWNFX) || columnNames.get(i).equals(PlantConstant.TENDOWNQP)) {//10千伏以下 数据 进行缓慢处理cu…...

华为流程体系:流程架构「OES方法」

目录 内容简介 OES方法 端到端的流程 专栏列表 CSDN学院 作者简介 内容简介 今天继续来谈谈华为流程体系中的流程架构。 在前期的内容已经介绍过 POS 流程架构的方法。 这里就先回顾一下 POS 方法的相关内容&#xff1a; 关于 POS&#xff0c;大家可以参看上面的这张图…...

c# 创建一个未定义类的临时对象列表

使用场景&#xff1a;要使用的数据太多&#xff0c;列表/字典无法满足需求&#xff0c;需要传入对象&#xff0c;但是又不想创建模型 new[] 是一种用于创建匿名类型数组的写法。它是 C# 中的一种语法糖&#xff0c;用于简化数组的初始化过程。 在下面代码示例中&#xff0c;ne…...

el-button增加下载功能

vue3和element-plus <el-uploadv-model:file-list"fileList"action"/api/upload"multiple:limit"1":headers"headers" ><el-button type"primary">选择文件</el-button><template #file"{ file …...

prometheus和cAdvisor组合

文章目录 docker内部署PromethuesPrometheuscAdvisorPrometheus和cAdvisor关系配置 docker内部署Promethues Prometheus Prometheus是一个开源的系统监控和报警工具&#xff0c;由SoundCloud开发并在2012年捐赠给了Cloud Native Computing Foundation (CNCF)。它被广泛用于监…...

计算机网络(2) --- 网络套接字UDP

计算机网络&#xff08;1&#xff09; --- 网络介绍_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131967378?spm1001.2014.3001.5501 目录 1.端口号 2.TCP与UDP协议 1.TCP协议介绍 1.TCP协议 2.UDP协议 3.理解 2.网络字节序 发送逻辑…...

Idea 结合docker-compose 发布项目

Idea 结合docker-compose 发布项目 这里写目录标题 Idea 结合docker-compose 发布项目Docker 开启远程访问功能 添加相应端口配置IDEA 链接Docker配置项目 docker-compose.yml本地还需要安装 dockerwin11 安装本地Docker 可能存在问题 Linux内核不是最新 Docker 开启远程访问功…...

django

django学习 初识Django1.安装django2.创建项目2.1 在终端2.2 Pycharm 3. 创建app4.快速上手4.1 再写一个页面4.2 templates模板4.3 静态文件4.3.1 static目录4.3.2 引用静态文件 5.模板语法案例&#xff1a;伪联通新闻中心6.请求和响应案例&#xff1a;用户登录7.数据库操作7.1…...

c++游戏框架

游戏类 class Sprite { public:Sprite(int x, int y, int w, int h, const char* imagePath);~Sprite();void render(SDL_Renderer* renderer);void move(int x, int y); private:SDL_Texture* texture_;SDL_Rect rect_; }; 物理引擎类 class PhysicsEngine { public:Physi…...

v-model绑定checkbox无法动态更新视图

在vue2中使用v-model绑定checkbox <input type"checkbox" v-model"isChecked" :valueisChecked change"handleCheckboxChange" />监听change事件&#xff0c;并在change事件中做一些特殊处理&#xff0c;比如用户在登录时有没有阅读过隐私…...

原生html—摆脱ps、excel 在线绘制财务表格加水印(html绘制表格js加水印)

文章目录 ⭐前言⭐html标签&#x1f496;table表格的属性&#x1f496;实现财务报表 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享原生html——绘制表格报表加水印。 背景&#xff1a;解决没有ps的情况下使用前端html制作表格报表。 html介绍 HTML&#xf…...

微信小程序配置上传多个u-upload上传

微信小程序配置上传多个u-upload上传 使用的是uView框架 微信小程序配置上传多个u-upload上传图片 场景需求&#xff1a;根据PC端配置项追加图片配置 小程序根据配置的图片数量&#xff0c;图片名称&#xff0c;进行上传图片 难度在于 我们不知道用户会追加多少个图片配置字段 …...