计算机视觉——引导APSF和梯度自适应卷积增强夜间雾霾图像的可见性算法与模型部署(C++/python)

摘要

在夜间雾霾场景中,可见性经常受到低光照、强烈光晕、光散射以及多色光源等多种因素的影响而降低。现有的夜间除雾方法常常难以处理光晕或低光照条件,导致视觉效果过暗或光晕效应无法被有效抑制。本文通过抑制光晕和增强低光区域来提升单张夜间雾霾图像的可见性。为了处理光晕效应,提出了一个光源感知网络来检测夜间图像的光源,并采用APSF(大气点扩散函数)引导的光晕渲染。该算法的框架在渲染图像上进行训练,实现了光晕的抑制。此外,还利用梯度自适应卷积来捕捉雾霾场景中的边缘和纹理。通过提取的边缘和纹理,在不丢失重要结构细节的情况下增强了场景的对比度。为了提升低光强度,算法的网络学习了一个注意力图,然后通过伽马校正进行调整。这个注意力图在低光区域有较高的值,在雾霾和光晕区域有较低的值。通过在真实的夜间雾霾图像上进行广泛的评估,算法的方法证明了其有效性。算法的实验表明,算法的方法在GTA5夜间雾霾数据集上达到了30.38dB的PSNR,比最先进的方法提高了13%。
在这里插入图片描述
论文地址:https://arxiv.org/pdf/2308.01738.pdf
源码地址:https://github.com/jinyeying/nighttime_dehaze
推理代码:https://download.csdn.net/download/matt45m/89110270

1. 论文贡献

夜间雾霾或雾图像通常遭受可见性降低的问题。除了夜间图像常见的问题,如低光、噪声、不均匀的光分布和多种光颜色外,夜间雾霾或雾图像还表现出强烈的光晕和颗粒遮蔽效应。尽管存在这些挑战,解决这些问题对于许多应用来说是至关重要的。这些应用包括自动驾驶汽车、自主无人机和监控等,因为夜间雾霾是自然现象,频繁且不可避免。日间雾霾去除方法无法处理夜间雾霾所独有的挑战。传统的非学习型日间除雾方法依赖于雾霾成像模型,但这个模型在夜间不适用,因为存在人造光源和照明颜色的复杂性。因此,与日间不同,算法不能假设大气光颜色是均匀的。此外,这个日间雾霾模型没有考虑到光晕的视觉表现。现有的夜间除雾方法产生了不令人满意的暗视觉或未缓解的光晕效应。非深度学习方法引入了对光晕的某些约束,但它们由于光晕和背景层的不精确分解或使用暗通道先验进行除雾,导致结果暗淡。基于学习的方法面临的主要挑战是缺乏真实世界的成对训练数据,因为获取包含光晕和多光源的夜间雾霾场景的清晰真实图像是不切实际的。算法的方法通过抑制光晕和增强低光区域来增强单张夜间雾霾图像的可见性。算法的光晕抑制包括两个主要部分:APSF引导的光晕渲染和梯度自适应卷积。算法的光晕渲染方法使用APSF引导的方法为各种光源创建光晕效应。算法采用光源感知网络来检测图像中光源的位置,然后对这些光源应用APSF引导的光晕渲染。算法的框架从渲染的图像中学习,因此可以抑制不同光源中的光晕效应。算法的梯度自适应卷积从雾霾图像中捕捉边缘和纹理。具体来说,通过计算相邻像素之间的像素差异来获取边缘,同时使用双边核来提取图像的纹理。边缘和纹理然后被输入到算法的框架中以增强图像细节。为了增强非光源区域的可见性,算法引入了一个新颖的注意力引导增强模块。雾霾区域的权重较低,而暗区域的权重较高。总体而言,算法的贡献可以总结如下:

  • 据算法所知,算法的方法是基于学习的网络,首次一站式处理夜间光晕和低光条件。
  • 算法提出了一个光源感知网络和APSF引导的光晕渲染,以模拟来自不同光源的光晕效应。通过从APSF引导的光晕渲染数据中学习,算法的框架有效地抑制了真实世界雾霾图像中的光晕效应。
  • 由于夜间图像对比度较低,算法采用梯度自适应卷积进行边缘增强和双边核进行纹理增强。

2. 相关工作

早期的除雾方法利用多张图像或先验来估计大气光和传输。随着深度学习的出现,提出了许多网络来估计传输图或端到端输出清晰图像。最近,已经开发了全监督、半监督、零样本和无监督方法。然而,这些方法在夜间雾霾方面遇到了困难,因为它们面临非均匀、多色的人造光和缺乏干净的地面真实数据用于训练。基于优化的夜间除雾方法遵循大气散射模型、新的成像模型等。Pei和Lee将雾霾夜间图像的空气光颜色转移到日间,并使用DCP进行除雾。Ancuti等人引入了一种基于融合的方法和拉普拉斯金字塔分解来估计局部空气光。Zhang等人使用照明补偿、颜色校正和DCP进行除雾。Zhang等人提出了最大反射率先验(MRP)。Tang等人使用Retinex理论和泰勒级数展开。Liu等人使用正则化约束。Wang等人提出了灰色雾霾线先验和变分模型。现有的夜间除雾方法依赖于基于局部补丁的大气光估计,假设小补丁内的均匀性。因此,它们的性能对补丁大小敏感。这些方法在优化方面不自适应且耗时。与它们不同,算法的方法是基于学习的,更高效、实用和快速。最近,提出了基于学习的夜间除雾方法。Zhang等人通过使用合成的夜间雾霾图像进行全监督学习来训练网络。然而,这种方法无法有效抑制光晕,因为合成数据集没有考虑到光晕效应。Yan等人提出了一种半监督方法,使用高低频分解和灰度网络。然而,他们的结果往往较暗,丢失了细节。这是因为基于粗略频率的分解方法难以有效分离光晕,导致场景的亮度和可见性降低。DeGlow-DeHaze网络估计传输,然后是DehazeNet。然而,由DeHaze网络估计的大气光是从最亮的区域获得的,并被假定为全局均匀的,这在夜间是无效的。与它们相比,算法的结果可以抑制光晕,同时增强低光区域。点光源的光晕,称为大气点扩散函数(APSF),已经在各种工作中进行了研究。Narasimhan和Nayar首先引入APSF,并为多次散射光开发了一个基于物理的模型。Metari等人对APSF核进行了建模。Li等人使用层分离方法从输入图像中分解光晕,通过其平滑属性约束光晕,并使用DCP进行除雾。Park等人和Yang等人遵循夜间雾霾模型,并使用加权熵和超像素来估计大气光和传输图。然而,这些方法在去除光晕后,简单地将日间除雾应用于夜间除雾,导致他们的成果在可见性和颜色上存在失真。以前的工作主要集中在基于优化的方法上,而算法的作品是第一个将APSF先验纳入夜间学习网络的。

3. 提出的方法

图2展示了算法的流程,包括光晕抑制和低光增强。算法的光晕抑制有两个部分:deglowing网络和glow生成器。算法的deglowing网络将真实的雾霾图像转换为清晰的图像。算法使用一个鉴别器来判断生成的清晰图像和参考图像是真实的还是伪造的。算法的创新点在于这三个想法:APSF引导的光晕渲染、梯度自适应卷积和注意力引导增强。
在这里插入图片描述

3.1. 光源感知网络

夜间场景经常包含活动光源,如路灯、车头灯和建筑灯光。这些光源可以在雾霾夜间场景中造成强烈的光晕。夜间场景中的雾霾和光晕的出现可以建模为:
在这里插入图片描述

3.2 APSF引导的夜间光晕渲染

在获得光源图后,算法提出了一种基于APSF的方法来渲染夜间光晕效果。首先,算法计算APSF函数,并将其转换为2D格式,这使算法能够在光源图上执行2D卷积,从而产生光晕图像。然后,算法结合清晰和光晕图像来渲染最终图像中的逼真光晕效果。
在这里插入图片描述

3.3. 梯度自适应卷积

夜间雾霾图像通常对比度较低,缺失纹理,照明不均匀。普通的2D卷积可能不足以增强夜间雾霾图像。因此,算法使用梯度自适应卷积来捕捉雾霾图像中的边缘和纹理。
在这里插入图片描述
在这里插入图片描述

3.4. 网络和其他损失

算法的光晕抑制是基于CycleGAN网络。算法使用deglowing网络,它与鉴别器耦合。为了确保重建一致性,算法有另一个雾霾生成器与它的鉴别器耦合。算法的雾霾生成器将输出图像转换为重构的清晰图像。通过施加循环一致性约束,算法的deglowing网络学习去除真实世界的光晕。由于循环一致性约束,算法被允许使用未配对的数据来优化算法的deglowing网络,从而减少合成数据集和真实世界光晕图像之间的领域差距。除了自监督的光源一致性损失、梯度损失和双边核损失外,算法按照[102]的方法,使用其他损失来训练算法的网络。它们是对抗损失、循环一致性损失、身份损失,权重分别为{1, 10, 10}。

3.5. 低光区域增强

夜间除雾经常导致暗结果,这是由于低光条件造成的。为了解决这个问题,算法引入了一个低光增强模块来提高对象区域的可见性。算法的方法包括生成一个注意力图,突出这些区域,使算法的方法专注于增强它们的强度。然后,算法应用一个低光图像增强技术来增强区域,即使在场景光照较低的情况下。
在这里插入图片描述

4. 实验结果

4.1. 数据集

GTA5是一个由GTA5游戏引擎生成的合成夜间雾霾数据集。它包括864对配对图像,其中787对图像用作训练集,其余图像用作测试集。RealNightHaze是一个真实世界的夜间除雾数据集。它包括440张夜间雾霾图像,其中150张图像来自[98],200张图像来自[87],其余图像从互联网收集。

4.2. 在合成数据集上的比较

在本节中,将方法与现有的最先进方法进行比较,包括Yan [87]、Zhang [97]、Li [45]、Ancuti [1]、Zhang [96]、Yu [94]、Zhang [98]、Liu [51]和Wang [77]。主要区别的总结如表2所示。实验结果如表1所示。可以看出,该算法的方法实现了显著的性能提升。采用两个广泛使用的指标PSNR和SSIM。算法的方法达到了30.38dB的PSNR和0.904的SSIM,比Yan的方法[87]分别提高了14%和5%。

在这里插入图片描述

4.3. 在真实世界数据集上的比较

下图显示了不同夜间除雾方法在真实夜间雾霾场景上的定性结果。该算法显著增强了夜间雾霾图像的可见性。具体来说,大多数最先进的方法无法充分去除雾霾,因为它们的方法受到合成数据集和真实世界图像之间领域差距的影响。Yan等人提出了一种半监督框架来去除夜间雾效,可以去除大部分雾霾效果。然而,他们的方法过度抑制了雾霾图像,因此他们的输出结果变得太暗。相比之下,该算法处理了光晕和低光条件。如图9(b)所示,该算法不仅去除了输入图像的雾霾,还增强了光线。例如,树木和建筑物的细节是清晰的。这是因为该算法通过利用APSF来模拟光晕渲染,因此可以有效去除真实世界夜间雾霾图像中的雾霾或光晕。此外,该算法提出了一个梯度自适应卷积来捕捉雾霾图像中的边缘和纹理。捕获的边缘和纹理然后被用来增强图像的细节,从而实现更好的性能。此外,该算法引入了一个注意力图来增强低光区域。因此,该算法的方法实现了显著的性能提升。该算法还对真实世界的夜间雾霾图像进行了用户研究。实验结果如表3所示。可以看出,该算法的方法在所有方面都获得了最高分。
在这里插入图片描述

4.4. 消融研究

该算法的框架包括三个核心部分:APSF引导的光晕渲染、梯度自适应卷积和注意力引导增强。为了证明每个部分的有效性,该算法在真实世界的夜间雾霾图像上进行了消融研究。APSF引导的光晕渲染如图5(底部)所示,该算法可以看到该算法的方法可以准确地检测到光源的位置(中间)。此外,渲染结果有效地模拟了光晕效果。梯度自适应卷积如图6所示,显示了梯度边缘图(中间)和纹理(底部)的结果。图11(b)和(c)显示了没有梯度损失L𝐴?和没有核损失L𝐴?的结果,(d)是带有梯度捕获卷积的。该算法可以看到该算法的梯度捕获卷积可以有效地保留雾霾图像的结构细节。通过充分利用梯度图和纹理,该算法的框架生成了更清晰的结果。低光增强如图10所示,显示了从(b)到(d)的低光增强结果。

5.模型部署

官方提供了预训练的模型,可以拿官方的模型转onnx之后用onnxruntime进行推理,这里使用的onnxruntime版本是1.15 。

C++代码推理:

#include "NighttimeDehaze.h"

NighttimeDehaze::NighttimeDehaze(string model_path)
{
	std::wstring widestr = std::wstring(model_path.begin(), model_path.end());  windows写法
	///OrtStatus* status = OrtSessionOptionsAppendExecutionProvider_CUDA(sessionOptions, 0);   ///如果使用cuda加速,需要取消注释

	sessionOptions.SetGraphOptimizationLevel(ORT_ENABLE_BASIC);
	ort_session = new Session(env, widestr.c_str(), sessionOptions); windows写法
	ort_session = new Session(env, model_path.c_str(), sessionOptions); linux写法

	size_t numInputNodes = ort_session->GetInputCount();
	size_t numOutputNodes = ort_session->GetOutputCount();
	AllocatorWithDefaultOptions allocator;
	for (int i = 0; i < numInputNodes; i++)
	{
		input_names.push_back(ort_session->GetInputName(i, allocator));
		Ort::TypeInfo input_type_info = ort_session->GetInputTypeInfo(i);
		auto input_tensor_info = input_type_info.GetTensorTypeAndShapeInfo();
		auto input_dims = input_tensor_info.GetShape();
		input_node_dims.push_back(input_dims);
	}
	for (int i = 0; i < numOutputNodes; i++)
	{
		output_names.push_back(ort_session->GetOutputName(i, allocator));
		Ort::TypeInfo output_type_info = ort_session->GetOutputTypeInfo(i);
		auto output_tensor_info = output_type_info.GetTensorTypeAndShapeInfo();
		auto output_dims = output_tensor_info.GetShape();
		output_node_dims.push_back(output_dims);
	}
	this->inpHeight = input_node_dims[0][2]; /// n, h, w, c
	this->inpWidth = input_node_dims[0][3];
}

void NighttimeDehaze::preprocess(Mat img)
{
	Mat rgbimg;
	cvtColor(img, rgbimg, COLOR_BGR2RGB);
	resize(rgbimg, rgbimg, cv::Size(this->inpWidth, this->inpHeight));
	vector<cv::Mat> rgbChannels(3);
	split(rgbimg, rgbChannels);
	for (int c = 0; c < 3; c++)
	{
		rgbChannels[c].convertTo(rgbChannels[c], CV_32FC1, 1.0 / (255.0 * 0.5), -1.0);
	}

	const int image_area = this->inpHeight * this->inpWidth;
	this->input_image.resize(3 * image_area);
	size_t single_chn_size = image_area * sizeof(float);
	memcpy(this->input_image.data(), (float*)rgbChannels[0].data, single_chn_size);
	memcpy(this->input_image.data() + image_area, (float*)rgbChannels[1].data, single_chn_size);
	memcpy(this->input_image.data() + image_area * 2, (float*)rgbChannels[2].data, single_chn_size);
}

Mat NighttimeDehaze::predict(Mat srcimg)
{
	const int srch = srcimg.rows;
	const int srcw = srcimg.cols;
	this->preprocess(srcimg);

	std::vector<int64_t> input_img_shape = { 1, 3, this->inpHeight, this->inpWidth };
	Value input_tensor_ = Value::CreateTensor<float>(memory_info_handler, this->input_image.data(), 
		this->input_image.size(), input_img_shape.data(), input_img_shape.size());

	Ort::RunOptions runOptions;
	vector<Value> ort_outputs = this->ort_session->Run(runOptions, this->input_names.data(), &input_tensor_, 1, this->output_names.data(), output_names.size());
	/nighttime_dehaze_realnight_Nx3xHxW.onnx和nighttime_dehaze_realnight_1x3xHxW.onnx在run函数这里会出错
	float* pdata = ort_outputs[0].GetTensorMutableData<float>();
	std::vector<int64_t> outs_shape = ort_outputs[0].GetTensorTypeAndShapeInfo().GetShape();
	const int out_h = outs_shape[2];
	const int out_w = outs_shape[3];
	const int channel_step = out_h * out_w;
	Mat rmat(out_h, out_w, CV_32FC1, pdata);
	Mat gmat(out_h, out_w, CV_32FC1, pdata + channel_step);
	Mat bmat(out_h, out_w, CV_32FC1, pdata + 2 * channel_step);

	vector<Mat> channel_mats(3);
	channel_mats[0] = bmat;
	channel_mats[1] = gmat;
	channel_mats[2] = rmat;

	Mat dstimg;
	merge(channel_mats, dstimg);
	resize(dstimg, dstimg, cv::Size(srcw, srch));
	dstimg.convertTo(dstimg, CV_8UC3);
	return dstimg;
}

python部署:

import argparse
import cv2
import onnxruntime
import numpy as np


class nighttime_dehaze:
    def __init__(self, modelpath):
        # Initialize model
        self.onnx_session = onnxruntime.InferenceSession(modelpath)
        self.input_name = self.onnx_session.get_inputs()[0].name
        _, _, self.input_height, self.input_width = self.onnx_session.get_inputs()[0].shape

    def detect(self, image):
        input_image = cv2.resize(cv2.cvtColor(image, cv2.COLOR_BGR2RGB), dsize=(
            self.input_width, self.input_height))
        input_image = (input_image.astype(np.float32) / 255.0 - 0.5) / 0.5
        input_image = input_image.transpose(2, 0, 1)
        input_image = np.expand_dims(input_image, axis=0)

        result = self.onnx_session.run(None, {self.input_name: input_image})
        ###nighttime_dehaze_realnight_Nx3xHxW.onnx和nighttime_dehaze_realnight_1x3xHxW.onnx在run函数这里会出错
        # Post process:squeeze, RGB->BGR, Transpose, uint8 cast
        output_image = np.squeeze(result[0])
        output_image = output_image.transpose(1, 2, 0)
        output_image = cv2.resize(output_image, (image.shape[1], image.shape[0]))
        output_image = cv2.cvtColor(output_image.astype(np.uint8), cv2.COLOR_RGB2BGR)
        return output_image


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--imgpath', type=str,
                        default='n1.jpg', help="image path")
    parser.add_argument('--modelpath', type=str,
                        default='models/nighttime_dehaze_720x1280.onnx', help="onnx path")
    args = parser.parse_args()

    mynet = nighttime_dehaze(args.modelpath)
    srcimg = cv2.imread(args.imgpath)

    dstimg = mynet.detect(srcimg)

    if srcimg.shape[0] > srcimg.shape[1]:
        boundimg = np.zeros((10, srcimg.shape[1], 3), dtype=srcimg.dtype)+255  ###中间分开原图和结果
        combined_img = np.vstack([srcimg, boundimg, dstimg])
    else:
        boundimg = np.zeros((srcimg.shape[0], 10, 3), dtype=srcimg.dtype)+255
        combined_img = np.hstack([srcimg, boundimg, dstimg])
    winName = 'Deep Learning in onnxruntime'
    cv2.namedWindow(winName, 0)
    cv2.imshow(winName, combined_img)  ###原图和结果图也可以分开窗口显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

在这里插入图片描述

6. 结论

在本文中,该算法提出了一种新颖的夜间可见性增强框架,同时解决了光晕和低光条件问题。该算法的框架包括三个核心思想:APSF引导的光晕渲染、梯度自适应卷积和注意力引导的低光增强。该算法的框架通过从APSF引导的光晕渲染数据中学习来抑制光晕效应。由于该算法的APSF引导的光晕渲染,该算法允许使用半监督方法来优化该算法的网络,从而处理不同光源中的光晕效应。该算法提出的梯度自适应卷积用于从夜间雾霾图像中捕捉边缘或纹理。得益于捕获的边缘或纹理,该算法的框架有效地保留了结构细节。该算法的低光区域增强通过注意力图提高了暗或过度抑制区域的强度。定量和定性实验表明,该算法的方法实现了显著的性能提升。此外,消融研究证明了每个核心思想的有效性。处理具有多样化领域偏移的场景[99]将成为该算法未来研究的焦点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/530650.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

掌握网络抓取技术:利用RobotRules库的Perl下载器一览小红书的世界

引言 在信息时代的浪潮下&#xff0c;人们对于获取和分析海量网络数据的需求与日俱增。网络抓取技术作为满足这一需求的关键工具&#xff0c;正在成为越来越多开发者的首选。而Perl语言&#xff0c;以其卓越的文本处理能力和灵活的特性&#xff0c;脱颖而出&#xff0c;成为了…

LabVIEW厂房漏水检测监控系统

LabVIEW厂房漏水检测监控系统 随着信息技术和智能制造的快速发展&#xff0c;对于精密仪器和重要物品存放场所的环境监控日益重要&#xff0c;特别是防止漏水带来的潜在风险。漏水不仅可能导致珍贵资料或仪器的损坏&#xff0c;还可能引发安全事故&#xff0c;给企业和研究机构…

C语言 | 字符函数和字符串函数

目录&#xff1a; 1. 字符分类函数 2. 字符转换函数 3. strlen的使用和模拟实现 4. strcpy的使用和模拟实现 5. strcat的使用和模拟实现 6. strcmp的使用和模拟实现 7. strncpy函数的使用 8. strncat函数的使用 9. strncmp函数的使用 10. strstr的使用 11. strtok函…

数据库 06-03 时间戳,多版本MVCC,快照隔离,幻读

01.什么是时间戳 “时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。 02.用时间戳实现调度 定义 数据库给予一个事务一个时…

美国B2987A是德科技静电计

181/2461/8938产品概述&#xff1a; 图形皮安计/静电计&#xff0c;可自信地测量低至0.01 fA和高达10 PΩ的电流 是德科技B2981A和B2983A毫微微/皮安计以及B2985A和B2985A静电计/高阻计不仅提供同类最佳的测量性能&#xff0c;还提供前所未有的功能来最大限度地提高您的测量信…

网络广播系统是什么?网络广播的作用及应用

网络广播系统是什么?网络广播的作用及应用 商场广播的目的&#xff1a;提醒人员有序、监控配合点对点呼叫、物品遗失广播、背景音乐防噪、紧急情况呼叫等等&#xff0c;各个场景有各个场景的需求模式&#xff0c;广播系统的建设重点在于突发情况的应对&#xff0c;国家已经把广…

更改el-cascade默认的value和label的键值

后端返回的树结构中&#xff0c;label的key不是el-cascade默认的label&#xff0c;我需要改成对应的字段&#xff0c;但是一直没有成功&#xff0c;我也在文档中找到了说明&#xff0c;但是我没注意这是在props中改&#xff0c;导致一直不成功 这是我一开始错误的写法&#xf…

vue快速入门(十二)v-key索引标志

注释很详细&#xff0c;直接上代码 上一篇 新增内容 v-key的使用场景数组筛选器的使用 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, i…

03-JAVA设计模式-适配器模式

适配器模式 设么是适配器模式 它属于结构型模式&#xff0c;主要用于将一个类的接口转换成客户端所期望的另一种接口&#xff0c;从而使得原本由于接口不兼容而无法协同工作的类能够一起工作。 适配器模式主要解决的是不兼容接口的问题。在软件开发中&#xff0c;经常会有这…

C#操作MySQL从入门到精通(6)——对查询数据进行排序

前言 在和MySql数据库交互的过程中,查询数据是使用最频繁的操作,并且我们经常需要对查询到的数据进行排序后输出,比如我想查询1列数据的最小值,那么我可以将查询到的数据进行升序(从小到大)排列,然后取第一个数据就是最小值。本文详细介绍了对查询数据进行排序的各种操…

第一届长城杯初赛部分wp(个人解题思路)

目录 Black web babyrsa2 APISIX-FLOW cloacked 本人不是很擅长ctf&#xff0c;这只是我自己做出的西部赛区部分题的思路&#xff0c;仅供参考 Black web 访问http://192.168.16.45:8000/uploads/1711779736.php 蚁剑连接 访问/var/www/html/u_c4nt_f1nd_flag.php babyr…

C语言 | Leetcode C语言题解之第17题电话号码的字母组合

题目&#xff1a; 题解&#xff1a; char phoneMap[11][5] {"\0", "\0", "abc\0", "def\0", "ghi\0", "jkl\0", "mno\0", "pqrs\0", "tuv\0", "wxyz\0"};char* digits…

Win11 使用 WSL2 安装 linux 子系统 ubuntu,删除 linux 子系统 ubuntu

Win11 使用 WSL2 安装 linux 子系统 ubuntu&#xff0c;删除 linux 子系统 ubuntu 1、用 部署映像服务和管理工具 dism.exe 命令&#xff0c;开启 WSL2 按【WIN R】&#xff0c;打开【运行】&#xff0c;输入&#xff1a;【cmd】&#xff0c;管理员打开【命令行提示符】。 …

Vue项目打包配置生产环境去掉console.log语句的方法

一、Vue2项目 使用webpack内置的 terser 工具&#xff0c;在vue.config.js文件加上相应的配置即可。 二、Vue3项目 同样是使用 terser 工具&#xff0c;不过vite没有内置terser&#xff0c;需要手动安装依赖 安装完后在vite.config.js文件加上相应的配置即可。 2024-4-9

SWM341系列应用(RTC、FreeRTOS\RTTHREAD应用和Chip ID)

SWM341系列RTC应用 22.1、RTC的时钟基准 --liuzc 2023-8-17 现象:客户休眠发现RTC走的不准&#xff0c;睡眠2小时才走了5分钟。 分析与解决&#xff1a;经过排查RTC的时钟源是XTAL_32K&#xff0c;由于睡眠时时设置XTAL->CR0&#xff1b;&#xff0c;会把XTAL_32K给关…

AIoT人工智能物联网----刷机、系统安装、示例、摄像头等

软件链接见文末 1. jetson nano硬件介绍 载板 模组卡座:放置核心板 micro SD卡接口:插SD卡,将操作系统写入SD卡,然后插入;建议至少为32GB。当然根据使用情况可以是64GB;卡的质量一定要好,读写速度快。之前买了同品牌128G的比64G的慢很多。所以大小合适就好M.2 Key E …

Matlab进阶绘图第50期—气泡堆叠蝴蝶图

气泡堆叠蝴蝶图是堆叠蝴蝶图与气泡图的组合—在堆叠蝴蝶图每根柱子上方添加大小不同的气泡&#xff0c;用于表示另外一个数据变量&#xff08;如每根柱子各组分的平均值&#xff09;的大小。 本文利用自己制作的BarBubble工具&#xff0c;进行气泡堆叠蝴蝶图的绘制&#xff0c…

Redis 详细考点

Redis 哪些地方用到 Redis 点赞、关注、登录验证码、登录的凭证、用户 redis 的 key 设计 package com.conquer.community.util;import com.conquer.community.entity.User;public class RedisKeyUtil {private static final String SPLIT ":";private static f…

ArcGIS Desktop使用入门(四)工具箱——属性域

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

实时多目图像拼接算法

实时多目图像拼接算法可以用于将多个视角的图像拼接成一个全景图像或者视频。 以下是一种常见的实时多目图像拼接算法的基本实现步骤: 特征提取与匹配: 对于每个输入图像,使用特征提取算法(如SIFT、ORB等)来提取图像中的特征点。然后,使用特征描述符(如ORB描述符)来描述…