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

计算机视觉——引导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, cthis->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 npclass nighttime_dehaze:def __init__(self, modelpath):# Initialize modelself.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].shapedef 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.5input_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 castoutput_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_imageif __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)+255combined_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]将成为该算法未来研究的焦点。

相关文章:

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

摘要 在夜间雾霾场景中&#xff0c;可见性经常受到低光照、强烈光晕、光散射以及多色光源等多种因素的影响而降低。现有的夜间除雾方法常常难以处理光晕或低光照条件&#xff0c;导致视觉效果过暗或光晕效应无法被有效抑制。本文通过抑制光晕和增强低光区域来提升单张夜间雾霾…...

git bash用法-批量修改文件名

在win系统上安装git bash可以使用命令行模式操作&#xff0c;比较方便 1.原始文件名 2.代码 for file in *3utr*; do mv "$file" "$(echo "$file" | sed s/3utr/5utr/)"; done3.修改后的文件名...

分布式社交媒体:探索Web3对社交媒体的改变

在数字化时代&#xff0c;社交媒体已成为人们日常生活中不可或缺的一部分。然而&#xff0c;传统的社交媒体平台往往由中心化的机构或公司掌控&#xff0c;用户的数据和内容受到限制&#xff0c;引发了一系列的隐私和安全问题。随着区块链技术的发展&#xff0c;分布式社交媒体…...

vue的监视属性

目录 1. 场景引入2. watch3. 深度监视4. 监视属性简写5. 小结 1. 场景引入 在实际开发中&#xff0c;有时开发者需要根据某个属性的变化&#xff0c;做出相应的决策&#xff0c;因此Vue为开发者提供了watch.这一监视属性&#xff0c;用于实现此类需求。比如下面这个场景&…...

外包干了15天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…...

防止邮箱发信泄露服务器IP教程

使用QQ邮箱,网易邮箱,189邮箱,新浪邮箱,139邮箱可能会泄露自己的服务器IP。 泄露原理&#xff1a;服务器通过请求登录SMTP邮箱服务器接口&#xff0c;对指定的收件人发送信息。 建议大家使用商业版的邮箱&#xff0c;比如阿里云邮箱发信等 防止邮件发信漏源主要关注的是确保邮件…...

鸿蒙HarmonyOS开发实战:【分布式音乐播放】

介绍 本示例使用fileIo获取指定音频文件&#xff0c;并通过AudioPlayer完成了音乐的播放完成了基本的音乐播放、暂停、上一曲、下一曲功能&#xff1b;并使用DeviceManager完成了分布式设备列表的显示和分布式能力完成了音乐播放状态的跨设备分享。 本示例用到了与用户进行交…...

【iOS ARKit】App 中嵌入 AR Quick Look

AR Quick Look 功能强大&#xff0c;但在应用中嵌入并使用它实现 AR体验却非常简单&#xff0c;如其他所有QuickLook使用一样&#xff0c;简单到只需要提供一个文件名就可以达到目标。 AR Quick Look 支持.usdz 和.reality 两种格式文件&#xff0c;如果在 Xcode 工程中引入了 …...

【Web开发】jquery图片放大镜效果制作变焦镜头图片放大

jquery图片放大镜效果制作变焦镜头图片放大实现 整体步骤流程&#xff1a; 1. 前端html实现 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"…...

RTC实时显示时间(备份电源 备份域的作用)

RTC初始化配置 系统复位后&#xff0c;可通过 PWR 电源控制寄存器 (PWR_CR) 的 DBP 位保护 RTC 寄存器以防止 非正常的写访问。必须将 DBP 位置 1 才能使能 RTC 寄存器的写访问。 上电复位后&#xff0c;所有 RTC 寄存器均受到写保护。通过向写保护寄存器 (RTC_WPR) 写入一个…...

【YOLOv9】完胜V8的SOTA模型Yolov9(论文阅读笔记)

官方论文地址: 论文地址点击即可跳转 官方代码地址: GitCode - 开发者的代码家园 官方代码地址点击即可跳转 1 总述 当输入数据经过各层的特征提取和变换的时候,都会丢失一定的信息。针对这一问题:...

学生管理系统详细需求文档

文章目录 1. 引言1.1 目的1.2 范围 2. 功能性需求2.1 用户认证2.1.1 登录 2.2 学生信息管理2.2.1 学生档案2.2.2 学籍管理 2.3 课程管理2.3.1 课程信息2.3.2 选课系统 2.4 成绩管理2.4.1 成绩录入2.4.2 成绩查询 2.5 课程进度和通知2.5.1 课程日历2.5.2 通知和提醒 2.6 学生活动…...

产品经理功法修炼(4)之产品管理

点击下载《产品经理功法修炼(4)之产品管理》 产品经理功法修炼(1)之自我管理 产品经理功法修炼(2)之专业技能 产品经理功法修炼(3)之产品设计 产品经理功法修炼(4)之产品管理 产品经理功法修炼(5)之团队管理 1. 前言 产品经理的能力修炼并非局限于某一技能的…...

【LeetCode热题100】【二叉树】二叉树展开为链表

题目链接&#xff1a;114. 二叉树展开为链表 - 力扣&#xff08;LeetCode&#xff09; 就先序遍历的顺序&#xff0c;其实就是简单的深度遍历顺序&#xff0c;装进一个容器里面再前一个后一个串连起来&#xff0c;注意容器的size是个无符号数&#xff0c;无符号数和有符号运行…...

云原生__K8S

createrepo --update /var/localrepo/# 禁用 firewall 和 swap [rootmaster ~]# sed /swap/d -i /etc/fstab [rootmaster ~]# swapoff -a [rootmaster ~]# dnf remove -y firewalld-*[rootmaster ~]# vim /etc/hosts 192.168.1.30 harbor 192.168.1.50 master 192.168.1.…...

nginx配置证书和私钥进行SSL通信验证

文章目录 一、背景1.1 秘钥和证书是两个东西吗&#xff1f;1.2 介绍下nginx配置文件中参数ssl_certificate和ssl_certificate_key1.3介绍下nginx支持的证书类型1.4 目前nginx支持哪种证书格式&#xff1f;1.5 nginx修改配置文件目前方式也会有所不同1.6 介绍下不通格式的证书哪…...

【面试题】微博、百度等大厂的排行榜如何实现?

背景 现如今每个互联网平台都会提供一个排行版的功能&#xff0c;供人们预览最新最有热度的一些消息&#xff0c;比如百度&#xff1a; 再比如微博&#xff1a; 我们要知道&#xff0c;这些互联网平台每天产生的数据是非常大&#xff0c;如果我们使用MySQL的话&#xff0c;db实…...

com.intellij.diagnostic.PluginException 问题

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、 推荐阅读 一、导读 遇到…...

Altair® (澳汰尔)Inspire™ Render —— 强大的 3D 渲染和动画工具

Inspire Render 是一种全新 3D 渲染和动画工具&#xff0c;可供创新设计师、建筑师和数字艺术家以前所未有的速度快速制作精美的产品演示。 借助基于物理特性的内置高品质全局照明渲染引擎 Thea Render&#xff0c;可以快速创建、修改和拖放各种材质并添加照明环境&#xff0c…...

虚幻引擎启动报错记录

0x00007FFEF0C8917C (UnrealEditor-CoreUObject.dll)处(位于 UnrealEditor.exe 中)引发的异常: 0xC0000005: 写入位置 0x0000000000000030 时发生访问冲突。 解决办法&#xff1a;首先查看堆栈信息&#xff0c;我的项目启动是因为默认场景编译不过&#xff0c;进到编辑器配置文…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...