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

【论文复现】隐式神经网络实现低光照图像增强

在这里插入图片描述

📝个人主页🌹:Eternity._
🌹🌹期待您的关注 🌹🌹

在这里插入图片描述
在这里插入图片描述

❀ 隐式神经网络实现低光照图像增强

  • 引言
      • 那么目前低光照图像增强还面临哪些挑战呢?
    • 挑战1. 不可预测的亮度降低和噪声
    • 挑战2.度量友好版本和视觉友好版本之间的差异
    • 挑战3. 有限的配对训练数据
  • 1.论文概述(原文摘要、引言部分)
  • 2.核心创新点(原文方法部分)
    • 2.1 归一化的神经表示
      • 什么是归一化的神经表示?
      • 为什么归一化的神经表示能够奏效?
    • 2.2 文本驱动的外观识别器
      • 文本驱动的判别表示
      • 外观驱动的判别表示
    • 2.3 整体框架
  • 3.实验部分
  • 5.复现过程(重要)
    • 5.1 数据准备
    • 5.2 环境搭建
    • 下载
    • 快速运行
    • 训练
    • 5.3 取消SSL证书验证(重要)
    • 5.4 生成增强图像
    • 5.5 模型调优

2023年人工智能顶会ICCV会议论文复现
Implicit Neural Representation for Cooperative Low-light Image Enhancement

引言


本文涉及到低光照图像增强、图像的神经表示以及多模态学习等领域,下面将简单介绍下相关知识。

本文所涉及的所有资源的获取方式:这里

1.低光照图像增强


低光图像增强是图像处理领域的一个重要研究方向,旨在改善在低照度条件下拍摄的图像质量。低光条件下的图像往往具有低对比度、噪点增加和细节丢失等问题。低光图像增强方法通过调整图像的亮度、对比度、色彩平衡等方面来提高图像的质量和视觉感知效果。
  在这里插入图片描述
2.图像的神经表示

图像的神经表示指的是通过神经网络模型对图像进行编码和表示的方法。传统的图像表示方法通常使用手工设计的特征提取器,如SIFT、HOG等。而神经表示方法则通过深度学习模型,如卷积神经网络(CNN)、自编码器等,学习到图像的高级特征表示。这些神经表示能够捕捉图像的语义信息和结构信息,对于图像分类、目标检测、图像生成等任务具有重要作用。

3.多模态学习

多模态学习是指利用不同的感知模态(如图像、文本、语音等)之间的关联性进行联合学习和信息融合的方法。Radford提出从语言监督中学习视觉模型,称为CLIP。经过4亿对图像-文本对的训练,它可以用自然语言描述任何视觉概念,并且无需任何特定的训练就可以转移到其他任务中。CLIP模型的核心思想是通过对图像和文本进行对比学习,使得它们在嵌入空间中的表示能够相互匹配。这意味着,在嵌入空间中,相关的图像和文本将被映射到相近的位置,从而使得模型能够理解图像和文本之间的语义关系,如下图。在这里插入图片描述
  CLIP模型通过一个共享的编码器来处理图像和文本输入。对于图像,它使用卷积神经网络(CNN)对图像进行编码;对于文本,它使用Transformer模型对文本进行编码。编码器的输出表示图像和文本在嵌入空间中的表示。CLIP模型的优点是不需要大量的标注数据,可以使用大规模的无标注图像和文本数据进行预训练。预训练后的CLIP模型可以用于多种任务,如图像分类、图像生成、图像检索等。它在许多视觉和语言相关的任务中取得了出色的性能,并展现了强大的泛化能力。

那么目前低光照图像增强还面临哪些挑战呢?


挑战1. 不可预测的亮度降低和噪声


在低光条件下,图像往往会出现亮度降低和噪声增加的问题。然而,这些退化因素的具体程度和方式往往是不可预测的,因为它们受到多种因素的影响,如光照条件、相机设置等。现有的低光图像增强方法难以准确地对这些退化因素进行建模和处理,导致增强结果可能不够鲁棒并且无法满足视觉感知的要求。

挑战2.度量友好版本和视觉友好版本之间的差异


低光图像增强方法通常会追求在度量上有所改善,例如增加对比度、减少噪声等。然而,这些度量友好的改善并不总是与人眼感知的视觉友好相一致。在一些情况下,虽然度量上的改善较大,但图像质量却被认为是不自然或不真实的。因此,现有方法在度量友好版本和视觉友好版本之间存在固有的差距,无法很好地平衡二者之间的关系。

挑战3. 有限的配对训练数据


有限的配对训练数据:低光图像增强方法通常需要使用配对的训练数据,即低光图像和对应的高质量图像。然而,获取大规模配对数据是一项耗时且昂贵的任务。由于配对数据的限制,现有方法在模型的泛化能力和适应性方面存在一定的局限性。此外,配对数据可能无法涵盖所有的场景和退化情况,导致模型的性能受到限制。

1.论文概述(原文摘要、引言部分)


NeRCo(Implicit Neural Representation for Cooperative Low-light Image Enhancement)提出了一种名为NeRCo的隐式神经表示方法,用于合作式低光图像增强。现有的低光图像增强方法存在以下三个限制:不可预测的亮度降低和噪声、度量友好版本和视觉友好版本之间的固有差距,以及有限的配对训练数据。为了解决这些限制,论文提出了NeRCo方法,它以无监督的方式稳健地恢复感知友好的结果。
  具体而言,NeRCo通过一个可控的拟合函数统一了现实场景中多样的退化因素,从而提高了鲁棒性。对于输出结果,论文引入了来自预训练视觉-语言模型的先验信息,采用语义导向的监督方法。它不仅仅追随参考图像,还鼓励结果符合主观期望,寻找更加视觉友好的解决方案。此外,为了减少对配对数据的依赖并减少解决空间,论文开发了一个双闭环约束增强模块,它以自监督的方式与其他相关模块合作进行训练。
  最后,广泛的实验证明了我们提出的NeRCo方法的鲁棒性和优越性能。

2.核心创新点(原文方法部分)


2.1 归一化的神经表示


什么是归一化的神经表示?


归一化的神经表示(Neural Representation Normalization)是一种在神经网络中对特征表示进行标准化的技术。它的目的是通过对神经表示进行归一化处理,使得不同样本的特征表示在统计上具有相似的分布,从而提高模型的鲁棒性和泛化能力。在神经网络中,每个神经元的输出表示了输入数据的某种特征。这些特征往往具有不同的尺度和范围,可能会对模型的训练和表征能力产生不利影响。神经表示归一化的目的是通过对特征进行调整,使得它们具有相似的均值和方差,从而减少特征之间的差异。本文是利用余弦相似性对输入进行重构,在与encoder进行编码后的特征concat,而后经过多层感知机得到归一化后的图像,如下图:
  在这里插入图片描述

为什么归一化的神经表示能够奏效?


  • 学习丰富的特征表示:神经网络模型能够通过多层非线性变换和映射来学习丰富的特征表示。在低光照条件下,图像往往存在低对比度、噪点增加和细节丢失等问题。通过神经网络的层次结构,可以逐渐提取出更高级别、更抽象的特征,从而更好地捕捉图像中的语义信息和结构信息。
  • 鲁棒性和泛化能力:神经表示能够从大量的标记数据中学习到数据的潜在表示,具有较强的鲁棒性和泛化能力。在低光照图像增强任务中,由于光照条件的变化和图像退化的多样性,很难通过手工设计的规则和特征提取器来准确地恢复图像质量。神经表示方法可以通过大规模数据的训练来学习到低光照图像的共性特征,从而更好地适应各种退化情况,提高增强效果的鲁棒性和泛化能力。
  • 感知导向的引导:在低光照图像增强任务中,仅仅恢复图像的亮度和对比度等低级特征可能不足以获得视觉上友好的结果。神经表示方法可以结合感知导向的引导,利用预训练的视觉模型的先验知识来指导增强结果的生成,使得增强后的图像更加自然和具有良好的视觉感知效果。
  • 在这里插入图片描述

2.2 文本驱动的外观识别器


本文提出的文本驱动的外观鉴别器(在左侧区域)和我协同关注力模块(在右侧区域)的细节。前者用文本和图像模态监督输入,并关注高频成分。后者将注意力调整到不同的渠道并输出注意图。
  在这里插入图片描述

文本驱动的判别表示


本文将弱光域表示为L,高光域表示为h。如图上图所示,本文引入多模态学习来同时监督图像和文本模态的图像。具体而言,采用了最近广为人知的CLIP模型来获得高效先验。它由两个预训练的编码器组成,即文本的Enct和图像的Enci,具体代码如下:

 # clip模型核心代码class CLIP(nn.Module):def __init__(self,embed_dim: int,# visionimage_resolution: int,vision_layers: Union[Tuple[int, int, int, int], int],vision_width: int,vision_patch_size: int,# textcontext_length: int,vocab_size: int,transformer_width: int,transformer_heads: int,transformer_layers: int):super().__init__()self.context_length = context_lengthif isinstance(vision_layers, (tuple, list)):vision_heads = vision_width * 32 // 64self.visual = ModifiedResNet(layers=vision_layers,output_dim=embed_dim,heads=vision_heads,input_resolution=image_resolution,width=vision_width)else:vision_heads = vision_width // 64self.visual = VisionTransformer(input_resolution=image_resolution,patch_size=vision_patch_size,width=vision_width,layers=vision_layers,heads=vision_heads,output_dim=embed_dim)self.transformer = Transformer(width=transformer_width,layers=transformer_layers,heads=transformer_heads,attn_mask=self.build_attention_mask())self.vocab_size = vocab_sizeself.token_embedding = nn.Embedding(vocab_size, transformer_width)self.positional_embedding = nn.Parameter(torch.empty(self.context_length, transformer_width))self.ln_final = LayerNorm(transformer_width)self.text_projection = nn.Parameter(torch.empty(transformer_width, embed_dim))self.logit_scale = nn.Parameter(torch.ones([]) * np.log(1 / 0.07))

外观驱动的判别表示


为了生成可靠的内容,图像监督是必要的。如中文本驱动器框架图紫色区域(框架图)所示,本文叠加了一个判别器来区分预测结果和真实图像,从而提高了图像级的真实性(例如颜色、纹理和结构)。考虑到图像处理中的细节失真,本文嵌入了一个由高通滤波器和相同结构的鉴别器组成的高频路径。滤波器提取高频分量,鉴别器在边缘级对高频分量进行监督。基于这种双路色边判别结构,实现了色彩与细节的权衡。
在训练过程中,TAD在学习L和H之间的双向映射关系中起对抗作用,利用的是sobel算子实现图像的高通滤波,代码如下。

# -*- coding: utf-8 -*-
from re import I
import torch
import torch.nn as nn
import torch.nn.functional as F
from PIL import Image
from torchvision import transforms
import os
trans = transforms.Compose([transforms.ToTensor()])class GradLayer(nn.Module):def __init__(self):super(GradLayer, self).__init__()kernel_v = [[0, -1, 0],[0, 0, 0],[0, 1, 0]]kernel_h = [[0, 0, 0],[-1, 0, 1],[0, 0, 0]]kernel_h = torch.FloatTensor(kernel_h).unsqueeze(0).unsqueeze(0)kernel_v = torch.FloatTensor(kernel_v).unsqueeze(0).unsqueeze(0)self.weight_h = nn.Parameter(data=kernel_h, requires_grad=False)self.weight_v = nn.Parameter(data=kernel_v, requires_grad=False)self.gray2RGB = torch.nn.Conv2d(1, 3, kernel_size=1, stride=1, padding=0)def get_gray(self,x):''' Convert image to its gray one.'''gray_coeffs = [65.738, 129.057, 25.064]convert = x.new_tensor(gray_coeffs).view(1, 3, 1, 1) / 256x_gray = x.mul(convert).sum(dim=1)return x_gray.unsqueeze(1)def forward(self, x):if x.shape[1] == 3:x = self.get_gray(x)x_v = F.conv2d(x, self.weight_v, padding=1)x_h = F.conv2d(x, self.weight_h, padding=1)x = torch.sqrt(torch.pow(x_v, 2) + torch.pow(x_h, 2) + 1e-6)x = self.gray2RGB(x)return xclass GradLoss(nn.Module):def __init__(self):super(GradLoss, self).__init__()self.loss = nn.L1Loss()self.grad_layer = GradLayer()def forward(self, output, gt_img):output_grad = self.grad_layer(output)gt_grad = self.grad_layer(gt_img)return self.loss(output_grad, gt_grad)def tran(img):net = GradLayer().to(torch.device('cuda:0'))img = net(img) # input img: data range [0, 1]; data type torch.float32; data shape [1, 3, 256, 256]image = img * 4.return image

2.3 整体框架


  • 如图所示,给定一个弱光图像IL,我们首先通过神经表示(NRN,第3.2节)对其进行归一化,以提高模型对不同退化条件的鲁棒性。
    在这里插入图片描述
  • 然后,Mask Extractor 模块从图像中提取注意掩模,以指导不同区域的增强。之后,增强模块GH(以ResNet为代表)生成高光图像eIH。为了保证图像的质量,设计了一个文本驱动的外观判别器来监督图像的生成,其中文本驱动的监督保证了语义的可靠性,外观监督保证了视觉的可靠性。然后,eIH通过退化模块GL转换回低光域eeIL,并计算与原始低光图像IL的一致性损失。
  • 在训练过程中,我们运行了整个过程,如图1所示。我们输入两幅图像(即弱光IL和高光IH)。IL被增强为eIH,然后再转化回弱光eeIL。IH反之亦然。注意到IH仅用于训练目的,即以无监督的方式训练模型以获得更好的增强而不是退化。因此,我们只使用NRN来增强IL而不降低IH。对于推理,直接将IL增强为eIH,不做任何其他操作,
  • NeRco整体架构如下所示:NeRCo的工作流程。提出了一种包含双闭环分支的合作对抗增强过程,每个分支包含一个增强操作和一个退化操作。我们嵌入了一个掩模提取器(ME)来描绘退化分布,并嵌入了一个神经表示归一化(NRN)模块来归一化输入弱光图像的退化情况。所有这些都被一起训练以相互约束,锁定到一个更精确的目标域。红色表示注意力图的转移。

在这里插入图片描述

3.实验部分


本文在三个主流的低光照图像数据集上做了消融实验,在不同度量、不同的模型、自监督方法、无监督方法做了测试,本文提出的方法达到了新sota,如下图:在这里插入图片描述
 从实际的图像增强效果也可以看出,本文提出的方法优于先前的方法:
在这里插入图片描述
4.结论
  总结而言,该论文提出了一种名为NeRCo的隐式神经表示方法,用于协同弱光图像增强。具体而言,该方法通过以下几个方面来实现:

  1. 利用神经表示来归一化输入退化图像的水平,包括暗亮度和自然噪声,从而增强方法对不同退化因素的鲁棒性。
  2. 引入高频路径和预训练的视觉语言模型的先验信息作为感知导向的引导,以确保输出增强图像在视觉上更加友好和自然。
  3. 开发双闭环合作约束来训练增强模块,以减轻对配对数据的依赖,并以自监督的方式增强弱光场景。这种合作约束促使所有组件相互约束,进一步减少解决方案的空间。

通过大量的实验证明,该方法在弱光图像增强任务上表现出优越性能,与其他性能最好的方法相比具有明显的优势。此外,该方法的组件还为其他低级任务,如图像去雾、压缩感知和高光谱成像等,提供了宝贵的灵感和参考。

总体而言,该论文提出的NeRCo方法通过引入隐式神经表示、感知导向引导和双闭环合作约束等创新的方法,有效地解决了弱光图像增强中存在的挑战,为该领域的研究和应用提供了有价值的贡献。成具有更合理笔画连接的更高质量的书法字体,并且在常规字体上也有令人满意的表现

5.复现过程(重要)


5.1 数据准备


  • Linux or macOS
  • Python 3.8
  • NVIDIA GPU + CUDA CuDNN

提示

这里的python版本无需固定3.8,经实测,python 3.6、python 3.9代码均可运行。

5.2 环境搭建


键入命令:

pip install -r requirements.txt

提示

这里实测,requirements.txt的一些依赖库版本过高,清华源无法安装,只需要安装到清华源目前现有最高的版本即可。

例如,我们在安装依赖库的时候键入命令pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

在这里插入图片描述

警告
ERROR: Could not find a version that satisfies the requirement torch>=1.12.0

这里会报错找不到满足torch>=1.12.0的错误,我们只需要从上图中找到清华源中关于torch的最新版本1.10.2,我们在requirements.txt中将torch>=1.12.0替换为torch>=1.10.2即可,若遇到其他依赖库版本找不到的问题,同样使用此种解决方式。
在这里插入图片描述

下载


你需要创建目录 ./saves/[YOUR-MODEL] (例如 ./saves/LSRW).
下载经过预训练的模型并将其放入 ./saves/[YOUR-MODEL].
在这里,已经发布了预训练模型的两个版本,它们是在[LSRW]上训练的 LSRW数据集 和 LOL 数据集的下载链接如下:

NeRCo trained on LSRW
NeRCo trained on LOL
最终关于预训练模型的目录应该如下:
在这里插入图片描述

快速运行


  • 创建目录 ./dataset/testA and ./dataset/testB.
  • 将测试图像放入/dataset/testA(这里应该保留./dataset/testB中的任何一个图像,以确保程序可以启动,具体放置方法可以看下图)
  • 使用预先训练的权重测试模型:
CUDA_VISIBLE_DEVICES=0 python test.py --dataroot ./dataset --name [YOUR-MODEL] --preprocess=none
  • 测试结果将保存到以下目录中: ./results/[YOUR-MODEL]/test_latest/images, 将显示在此处的html文件中: ./results/[YOUR-MODEL]/test_latest/index.html.
    在这里插入图片描述

训练


  • 下载训练低光数据并将其放入 ./dataset/trainA.
  • 随机采用数百个普通光图像,并将它们放在 ./dataset/trainB.
  • 训练模型代码如下:
cd NeRCo-main
mkdir loss
CUDA_VISIBLE_DEVICES=0 python train.py --dataroot ./dataset --name [YOUR-MODEL]
  • 损失曲线保存在目录 ./loss.
  • 要查看更多中间结果,请查看 ./saves/[YOUR-MODEL]/web/index.html.

5.3 取消SSL证书验证(重要)


在运行CUDA_VISIBLE_DEVICES=0 python test.py代码的过程中,需要在clip.py文件里要添加取消证书验证代码,否则会报错如下:

警告
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]

取消证书验证代码:

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

添加位置如下:
在这里插入图片描述

5.4 生成增强图像


  • 一切准备就绪后,运行以下命令即可得到增强后的图像。
CUDA_VISIBLE_DEVICES=0 python test.py --dataroot ./dataset --name [YOUR-MODEL] --preprocess=none
  • 增强后的图像默认路径在 results/LSRW/test_latset/images 路径下,如下图所示:

在这里插入图片描述

  • 增强后的图片与原始图片,增强效果非常好,大家在这里也可以换成自己的数据集测试。

在这里插入图片描述

5.5 模型调优


本文所使用的高斯滤波算子为sobel算子,可以将滤波算子替换为拉普拉斯算子,Laplace算子是一种基于二阶导数的边缘检测算子,用于检测图像中的边缘和纹理。与Sobel算子不同,Laplace算子直接计算图像像素的二阶导数。它通过计算像素值周围邻域的梯度变化来识别边缘。Laplace算子对边缘进行二次微分,可以检测到边缘的更高阶特征,这里给出拉普拉斯算子的示例代码以供参考:

import cv2
import numpy as np
from matplotlib import pyplot as pltdef correl2d(img, window):m = window.shape[0]n = window.shape[1]# 图像边界填0扩展img_border = np.zeros((img.shape[0] + m - 1, img.shape[1] + n - 1))img_border[(m - 1) // 2:img.shape[0] + (m - 1) // 2, (n - 1) // 2:img.shape[1] + (n - 1) // 2] = imgimg_result = np.zeros(img.shape)for i in range(img.shape[0]):for j in range(img.shape[1]):temp = img_border[i:i + m, j:j + n]img_result[i, j] = np.sum(np.multiply(temp, window))return img_resultimg = cv2.imread('Fig0338.tif', 0)img_list = [img]
# 拉普拉斯滤波器模板
window1 = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])
# 带有对角项的拉普拉斯滤波器模板
window2 = np.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]])img_result = correl2d(img, window1)# # 对拉普拉斯的结果做标定
img_lap = 255*(img_result-img_result.min())/(img_result.max()-img_result.min())
img_list.append(img_lap)# 将原图加上拉普拉斯滤波的结果图得到最终的锐化结果
img_sharpened = img - img_result
img_list.append(img_sharpened)# 对window2再执行一遍锐化操作
img_result = correl2d(img, window2)
img_sharpened = img - img_result
img_list.append(img_sharpened)_, axs = plt.subplots(2, 2)for i in range(2):for j in range(2):axs[i, j].imshow(img_list[i * 2 + j], vmin=0, vmax=255, cmap='gray')axs[i, j].axis('off')plt.savefig('sharpen.jpg')
plt.show()

提示

完整代码见附件。


编程未来,从这里启航!解锁无限创意,让每一行代码都成为你通往成功的阶梯,帮助更多人欣赏与学习!

更多内容详见:这里

相关文章:

【论文复现】隐式神经网络实现低光照图像增强

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 隐式神经网络实现低光照图像增强 引言那么目前低光照图像增强还面临哪些挑战呢&#xff1f; 挑战1. 不可预测的亮度降低和噪声挑战2.度量友好…...

Secured Finance 推出 TVL 激励计划以及基于 FIL 的稳定币

Secured Finance 是新一代 DeFi 2.0 协议&#xff0c;其正在推出基于 FIL 的稳定币、固定收益市场以及具有吸引力的 TVL 激励计划&#xff0c;以助力 Filecoin 构建更强大的去中心化金融生态体系&#xff0c;并为 2025 年初 Secured Finance 协议代币的推出铺平道路。Secure Fi…...

2024前端框架年度总结报告(二):新生qwik+solid和次新生svelte+Astro对比 -各自盯着前端的哪些个痛点 - 前端的区域发展差异

引言 2024年&#xff0c;前端开发依然是技术领域的热点之一。随着 Web 应用的日益复杂&#xff0c;前端框架的更新换代也加速了。尽管 React、Vue 和 Angular 老牌框架年度总结 等“老牌”框架仍然占据着主流市场&#xff0c;但一些新兴的框架在不断挑战这些“巨头”的地位&am…...

MySQL大小写敏感、MySQL设置字段大小写敏感

文章目录 一、MySQL大小写敏感规则二、设置数据库及表名大小写敏感 2.1、查询库名及表名是否大小写敏感2.2、修改库名及表名大小写敏感 三、MySQL列名大小写不敏感四、lower_case_table_name与校对规则 4.1、验证校对规则影响大小写敏感4.1、验证校对规则影响排序 五、设置字段…...

每日速记10道java面试题13-MySQL篇

其他资料 每日速记10道java面试题01-CSDN博客 每日速记10道java面试题02-CSDN博客 每日速记10道java面试题03-CSDN博客 每日速记10道java面试题04-CSDN博客 每日速记10道java面试题05-CSDN博客 每日速记10道java面试题06-CSDN博客 每日速记10道java面试题07-CSDN博客 每…...

关于Chrome自动同步书签的解决办法

前言 并不一定适用所有用户&#xff0c; 目前我在网上搜集了一些资料&#xff0c;也做了一些尝试。 就我个人总结的经验来讲&#xff0c;分享大家以下几种办法&#xff1a; 1.书签同步插件 点击如下&#x1f517;&#xff1a; Chrome书签同步https://bm.famend.cn/ …...

江南大学《2024年807自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《江南大学807自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题...

在VSCode中搭建Python开发环境

在VSCode中搭建Python开发环境 1、安装 首先确保电脑已经安装好Python和VSCode。 2、安装VSCode的Python插件 3、选择python解释器 ctrlshiftP打开VSCode的命令行&#xff0c;输入python: select Interpreter选择合适的python版本。 4、运行代码 在windows下你可以直接使用…...

mac 安装python3和配置环境变量

mac 安装python3和配置环境变量 前言怎样选择python3的版本python3的安装1、去官网下载安装包2、下载完成后直接解压,检查安装是否成功 前言 在学习python的第一步就是安装它和配置他的环境变量&#xff0c;那么选择哪个版本的python你可曾知道&#xff0c;下面就讲解怎样选择…...

微信小程序版小米商城的搭建流程详解!

很多初学微信小程序语法的同学&#xff0c;可能不知道如何布局和搭建一个项目&#xff0c;下面我将讲解初学者如何搭建项目和注意事项。 一、 app.json的配置 {"pages": ["pages/index/index","pages/classification/classification","pag…...

Redis等Spring Cache 框架 实现基于注解的缓存功能

Spring Cache 框架 实现基于注解的缓存功能 底层 基于代理技术 一旦进入方法就进入代理对象 如果redis里有就直接返回 不会走方法 如果缓存没有数据 则通过反射走方法。 概念 缓存 相当于之前的事务处理 同步更改 只是提供了一层抽象 底层可以切换不同的缓存实现 EHCach…...

tcpreplay/tcpdump-重放网络流量/捕获、过滤和分析数据包

tcpdump 是一个网络数据包分析工具&#xff0c;通过捕获并显示网络接口上传输的数据包&#xff0c;帮助用户分析网络流量。 原理&#xff1a;用户态通过 libpcap 库控制数据包捕获&#xff0c;内核态通过网卡驱动获取数据包。 核心功能包括&#xff1a;捕获、过滤和分析数据包…...

【Linux】基础IO_文件系统IO_“一切皆文件”_缓冲区

目录 1. 理解"⽂件" 1-1 狭义理解 1-2 ⼴义理解 1-3 ⽂件操作的归类认知 1-4 系统⻆度 访问文件&#xff0c;需要先打开文件&#xff01;那么是由谁打开文件&#xff1f;&#xff1f;&#xff1f; 操作系统要不要把被打开的文件管理起来&#xff1f; 2. 回顾…...

基于ZYNQ-7000系列的FPGA学习笔记7——按键控制蜂鸣器(模块化编写)

基于ZYNQ-7000系列的FPGA学习笔记7——按键控制蜂鸣器&#xff08;模块化编写&#xff09; 1. 实验要求2. 功能分析3. 模块设计4. 波形图4.1 按键消抖模块4.2 按键控制蜂鸣器模块 5.代码编写5.1 rtl代码5.2 测试代码 6. 代码仿真7. 添加约束文件并分析综合 在上期的内容中&…...

Mnesia(三)

在表中保存复杂数据 Mnesia是被设计用来保存Erlang数据结构的。可以把任意类型的Erlang数据结构保存到Mnesia表中。 -export([init_mnesia_schema/0, start/0]). -export([add_plans/0, get_plan/1]). -include_lib("stdlib/include/qlc.hrl"). -record(shop, {ite…...

ELK的Filebeat

目录 传送门前言一、概念1. 主要功能2. 架构3. 使用场景4. 模块5. 监控与管理 二、下载地址三、Linux下7.6.2版本安装filebeat.yml配置文件参考&#xff08;不要直接拷贝用&#xff09;多行匹配配置过滤配置最终配置&#xff08;一、多行匹配、直接读取日志文件、EFK方案&#…...

【WPF中ControlTemplate 与 DataTemplate之间的区别?】

前言 WPF中ControlTemplate 与 DataTemplate之间的区别&#xff1f; 1. 定义&#xff1a; ControlTemplate 是用于定义 WPF 控件的外观和结构的模板。它允许您重新定义控件的视觉表现&#xff0c;而不改变控件的行为。 DataTemplate 是用于定义如何呈现数据对象的模板。它通…...

FFmpeg源码中,计算CRC校验的实现

一、CRC简介 CRC(Cyclic Redundancy Check)&#xff0c;即循环冗余校验&#xff0c;是一种根据网络数据包或电脑文件等数据产生简短固定位数校核码的快速算法&#xff0c;主要用来检测或校核数据传输或者保存后可能出现的错误。CRC利用除法及余数的原理&#xff0c;实现错误侦…...

js面试题

面试题&#xff1a;说一下call、apply、bind区别 共同点&#xff1a;功能一致 可以改变this指向 语法&#xff1a;函数.call() 函数.apply() 函数.bind() 区别&#xff1a;1.call、apply可以立即执行。bind不会立即执行&#xff0c;因为bind返回的是一个函数需要加入&#xff…...

Python酷库之旅-第三方库Pandas(255)

目录 一、用法精讲 1206、pandas.tseries.offsets.SemiMonthEnd.is_on_offset方法 1206-1、语法 1206-2、参数 1206-3、功能 1206-4、返回值 1206-5、说明 1206-6、用法 1206-6-1、数据准备 1206-6-2、代码示例 1206-6-3、结果输出 1207、pandas.tseries.offsets.S…...

STM32 进阶 定时器3 通用定时器 案例2:测量PWM的频率/周期

需求分析 上一个案例我们输出了PWM波&#xff0c;这个案例我们使用输入捕获功能&#xff0c;来测试PWM波的频率/周期。 把测到的结果通过串口发送到电脑&#xff0c;检查测试的结果。 如何测量 1、输入捕获功能主要是&#xff1a;测量输入通道的上升沿和下降沿 2、让第一个…...

【计算机网络】实验10:开放最短路径优先OSPF

实验10 开放最短路径优先OSPF 一、实验目的 本实验的主要目的是验证OSPF&#xff08;开放最短路径优先&#xff09;协议的作用&#xff0c;深入理解其在动态路由中的重要性。通过实验&#xff0c;我们将观察OSPF如何在网络中高效地传播路由信息&#xff0c;从而实现不同网络之…...

线程信号量 Linux环境 C语言实现

既可以解决多个同类共享资源的互斥问题&#xff0c;也可以解决简易的同步问题 头文件&#xff1a;#include <semaphore.h> 类型&#xff1a;sem_t 初始化&#xff1a;int sem_init(sem_t *sem, int pshared, unsigned int value); //程序中第一次对指定信号量调用p、v操…...

Tree搜索二叉树、map和set_数据结构

数据结构专栏 如烟花般绚烂却又稍纵即逝的个人主页 本章讲述数据结构中搜索二叉树与HashMap的学习&#xff0c;感谢大家的支持&#xff01;欢迎大家踊跃评论&#xff0c;感谢大佬们的支持! 目录 搜索二叉树的概念二叉树搜索模拟实现搜索二叉树查找搜索二叉树插入搜索二叉树删除…...

Linux-GPIO应用编程

本章介绍应用层如何控制 GPIO&#xff0c;譬如控制 GPIO 输出高电平、或输出低电平。 只要是用到GPIO的外设&#xff0c;都有可能用得到这些操作方法。 照理说&#xff0c;GPIO的操作应该是由驱动层去做的&#xff0c;使用寄存器操作或者GPIO子系统之类的框架。 但是&#xff0…...

【模板】排序(py)/ 【深基9.例4】求第 k 小的数

题目描述 将读入的 NN 个数从小到大排序后输出。 输入格式 第一行为一个正整数 NN。 第二行包含 NN 个空格隔开的正整数 aiai​&#xff0c;为你需要进行排序的数。 输出格式 将给定的 NN 个数从小到大输出&#xff0c;数之间空格隔开&#xff0c;行末换行且无空格。 输…...

Linux获取文件属性

目录 stat函数 获取文件属性 获取文件权限 实现“head -n 文件名”命令的功能 编程实现“ls -l 文件名”功能 stat/fstat/lstat的区别&#xff1f; stat函数 int stat(const char *path, struct stat *buf); 功能&#xff1a;获取文件属性 参数&#xff1a; path&…...

一文说清:Git创建仓库的方法

0 引言 本文介绍如何创建一个 Git 本地仓库&#xff0c;以及与远程仓库的关联。 1 初始化仓库&#xff08;git init&#xff09; 1.1 概述 Git 使用 git init 命令来初始化一个 Git 仓库&#xff0c;Git 的很多命令都需要在 Git 的仓库中运行&#xff0c;所以 git init 是使…...

ASP.NET Core 负载/压力测试

文章目录 一、第三方工具二、使用发布版本进行负载测试和压力测试 负载测试和压力测试对于确保 web 应用的性能和可缩放性非常重要。 尽管负载测试和压力测试的某些测试相似&#xff0c;但它们的目标不同。 负载测试&#xff1a;测试应用是否可以在特定情况下处理指定的用户负…...

红日靶场vulnstack (五)

前言 好久没打靶机了&#xff0c;今天有空搞了个玩一下&#xff0c;红日5比前面的都简单。 靶机环境 win7&#xff1a;192.168.80.150(外)、192.168.138.136(内) winserver28&#xff08;DC&#xff09;&#xff1a;192.168.138.138 环境搭建就不说了&#xff0c;和之前写…...

k8s,声明式API对象理解

命令式API 比如&#xff1a; 先kubectl create&#xff0c;再replace的操作&#xff0c;我们称为命令式配置文件操作 kubectl replace的执行过程&#xff0c;是使用新的YAML文件中的API对象&#xff0c;替换原有的API对象&#xff1b;而kubectl apply&#xff0c;则是执行了一…...

【人工智能】用Python和Scikit-learn构建集成学习模型:提升分类性能

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 集成学习(Ensemble Learning)是通过组合多个弱学习器提升模型性能的机器学习方法,广泛应用于分类、回归及其他复杂任务中。随机森林(Random Forest)和梯度提升(Gradient Boosting)是集成学习的两种…...

MSBUILD : error MSB1009: 项目文件不存在。

环境&#xff1a;win10 vscode1.95.3 clang15.0.4 问题&#xff1a;最近用vscodecmakeclang在windows上编译c项目&#xff0c;用mingw32不报错&#xff0c;用clang报错,错误如下&#xff0c; MSBUILD : error MSB1009: 项目文件不存在。 原因&#xff1a;与其他生成器(如Mak…...

洛谷P1827 [USACO3.4] 美国血统 American Heritage(c嘎嘎)

题目链接&#xff1a;P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 题目难度&#xff1a;普及 首先介绍下二叉树的遍历&#xff1a; 学过数据结构都知道二叉树有三种遍历&#xff1a; 1.前序遍历&#xff1a;根左右 2.中序遍历&#xff1a;左根…...

YOLOv8模型pytorch格式转为onnx格式

一、YOLOv8的Pytorch网络结构 model DetectionModel((model): Sequential((0): Conv((conv): Conv2d(3, 64, kernel_size(3, 3), stride(2, 2), padding(1, 1))(act): SiLU(inplaceTrue))(1): Conv((conv): Conv2d(64, 128, kernel_size(3, 3), stride(2, 2), padding(1, 1))(a…...

工业—使用Flink处理Kafka中的数据_ProduceRecord1

1 、 使用 Flink 消费 Kafka 中 ProduceRecord 主题的数据&#xff0c;统计在已经检验的产品中&#xff0c;各设备每 5 分钟 生产产品总数&#xff0c;将结果存入Redis 中&#xff0c; key 值为 “totalproduce” &#xff0c; value 值为 “ 设备 id &#xff0c;最近五分钟生…...

RNACOS:用Rust实现的Nacos服务

RNACOS是一个使用Rust语言开发的Nacos服务实现&#xff0c;它继承了Nacos的所有核心功能&#xff0c;并在此基础上进行了优化和改进。作为一个轻量级、快速、稳定且高性能的服务&#xff0c;RNACOS不仅包含了注册中心、配置中心和Web管理控制台的功能&#xff0c;还支持单机和集…...

响应式编程一、Reactor核心

目录 一、前置知识1、Lambda表达式2、函数式接口 Function3、StreamAPI4、Reactive-Stream1&#xff09;几个实际的问题2&#xff09;Reactive-Stream是什么&#xff1f;3&#xff09;核心接口4&#xff09;处理器 Processor5&#xff09;总结 二、Reactor核心1、Reactor1&…...

聚簇索引与非聚簇索引

目录 一、聚簇索引&#xff08;Clustered Index&#xff09; 二、非聚簇索引&#xff08;Non-Clustered Index&#xff09; 三、示例说明 一、聚簇索引&#xff08;Clustered Index&#xff09; 定义&#xff1a; 聚簇索引是一种将数据存储和索引合为一体的索引方式。 表中…...

鸿蒙 Next 可兼容运行 Android App,还支持出海 GMS?

最近 「出境易」和 「卓易通」 应该算是鸿蒙和 Android 开发圈“突如其来”的热门话题&#xff0c;而 「出境易」可能更高频一些&#xff0c;主要也是 Next 5.0 被大家发现刚上架了一个名为「出境易」的应用&#xff0c;通过这个 App 用户可以直接运行不兼容 Next 的 Android A…...

opencv常用图像处理操作

OpenCV 处理图像的通用流程通常包括以下几个步骤&#xff0c;根据具体需求可以调整或跳过某些步骤。以下是一个通用的框架&#xff1a; 读取图像 加载图像文件到内存中以进行后续处理。 import cv2 读取图像 image cv2.imread(‘image.jpg’) # 彩色图像 gray_image cv2…...

<三>51单片机PWM开发SG90和超声测距

目录 1,PWM开发SG90 1.1简介 1.2控制舵机 1.3编程实现 2,超声测距 2.1简介 2.2,超声波测距代码实现 1,PWM开发SG90 1.1简介 PWM&#xff0c;英文名Pulse Width Modulation&#xff0c;是脉冲宽度调制缩写&#xff0c;它是通过对一系列脉冲的宽度进 行调制&#xff0c;等…...

如何加强游戏安全,防止定制外挂影响游戏公平性

在现如今的游戏环境中&#xff0c;外挂始终是一个困扰玩家和开发者的问题。尤其是定制挂&#xff08;Customized Cheats&#xff09;&#xff0c;它不仅复杂且隐蔽&#xff0c;更能针对性地绕过传统的反作弊系统&#xff0c;对游戏安全带来极大威胁。定制挂通常是根据玩家的需求…...

《矿物学报》

1 简介 《矿物学报》由中国科学院地球化学研究所和中国矿物岩石地球化学学会联合主办&#xff0c;1981年创刊&#xff0c;目前是双月刊&#xff0c;国内外公开发行。主要报道矿物学及相关学科的高水平研究成果&#xff0c;矿物学研究的现状综述和动态分析&#xff0c;以及国内…...

如何将快捷指令添加到启动台

如何将快捷指令添加到启动台/Finder/访达&#xff08;Mac&#xff09; 1. 打开快捷指令创建快捷指令 示例创建了一个文件操作测试的快捷指令。 2. 右键选择添加到程序坞 鼠标放在待添加的快捷指令上。 3. 右键添加到访达 鼠标放在待添加的快捷指令上。 之后就可以在启…...

Python NumPy学习指南:从入门到精通

Python NumPy学习指南&#xff1a;从入门到精通 第一部分&#xff1a;NumPy简介与安装 1. 什么是NumPy&#xff1f; NumPy&#xff0c;即Numerical Python&#xff0c;是Python中最为常用的科学计算库之一。它提供了强大的多维数组对象ndarray&#xff0c;并支持大量的数学函…...

rabbitmq 安装延时队列插件rabbitmq_delayer_message_exchange(linux centOS 7)

1.插件版本 插件地址&#xff1a;Community Plugins | RabbitMQ rabbitmq插件需要对应的版本&#xff0c;根据插件地址找到插件 rabbitmq_delayer_message_exchange 点击Releases 因为我rabbitmq客户端显示的版本是&#xff1a; 所以我选择插件版本是&#xff1a; 下载 .ez文…...

【C++】new与malloc、三种传参、函数重载及内联函数

一、new-delete以及malloc-freequbie 1.new&#xff1a; &#xff08;1&#xff09;运算符&#xff0c;没有返回值概念&#xff0c;但开出来空间有类型&#xff0c;不需要设置大小 &#xff08;2&#xff09;可以在堆区动态开辟空间&#xff0c;并且可以默认执…...

C语言实例_23之计算阶乘和(5!+4!+…+1!)

1. 题目 计算阶乘和(5! 4! … 1!)&#xff0c;即先分别计算出从1到5每个数的阶乘&#xff0c;再将这些阶乘值进行累加求和。 2. 阶乘概念及分析 实现主要是迭代和递归&#xff1a; - 迭代实现思路&#xff1a; - 可以通过两层循环来实现&#xff0c;外层循环控制数字从5到…...

zotero中pdf-translate插件和其他插件的安装

1.工具–》插件 2.找插件 3.点击之后看到一堆插件 4.找到需要的&#xff0c;例如pdf-translate 5.点击进入&#xff0c;需要看一下md文档了解下&#xff0c;其实最重要的就是找到特有的(.xpi file) 6.点击刚刚的蓝色链接 7.下载并保存xpi文件 8.回到zotero&#xff0c;安装并使…...