终于把DETR搞懂了!Detection Transformer架构详解及使用方法说明

《博主简介》

小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。
更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~
👍感谢小伙伴们点赞、关注!

《------往期经典推荐------》

一、AI应用软件开发实战专栏【链接】

项目名称项目名称
1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】
3.【手势识别系统开发】4.【人脸面部活体检测系统开发】
5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】
7.【YOLOv8多目标识别与自动标注软件开发】8.【基于YOLOv8深度学习的行人跌倒检测系统】
9.【基于YOLOv8深度学习的PCB板缺陷检测系统】10.【基于YOLOv8深度学习的生活垃圾分类目标检测系统】
11.【基于YOLOv8深度学习的安全帽目标检测系统】12.【基于YOLOv8深度学习的120种犬类检测与识别系统】
13.【基于YOLOv8深度学习的路面坑洞检测系统】14.【基于YOLOv8深度学习的火焰烟雾检测系统】
15.【基于YOLOv8深度学习的钢材表面缺陷检测系统】16.【基于YOLOv8深度学习的舰船目标分类检测系统】
17.【基于YOLOv8深度学习的西红柿成熟度检测系统】18.【基于YOLOv8深度学习的血细胞检测与计数系统】
19.【基于YOLOv8深度学习的吸烟/抽烟行为检测系统】20.【基于YOLOv8深度学习的水稻害虫检测与识别系统】
21.【基于YOLOv8深度学习的高精度车辆行人检测与计数系统】22.【基于YOLOv8深度学习的路面标志线检测与识别系统】
23.【基于YOLOv8深度学习的智能小麦害虫检测识别系统】24.【基于YOLOv8深度学习的智能玉米害虫检测识别系统】
25.【基于YOLOv8深度学习的200种鸟类智能检测与识别系统】26.【基于YOLOv8深度学习的45种交通标志智能检测与识别系统】
27.【基于YOLOv8深度学习的人脸面部表情识别系统】28.【基于YOLOv8深度学习的苹果叶片病害智能诊断系统】
29.【基于YOLOv8深度学习的智能肺炎诊断系统】30.【基于YOLOv8深度学习的葡萄簇目标检测系统】
31.【基于YOLOv8深度学习的100种中草药智能识别系统】32.【基于YOLOv8深度学习的102种花卉智能识别系统】
33.【基于YOLOv8深度学习的100种蝴蝶智能识别系统】34.【基于YOLOv8深度学习的水稻叶片病害智能诊断系统】
35.【基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统】36.【基于YOLOv8深度学习的智能草莓病害检测与分割系统】
37.【基于YOLOv8深度学习的复杂场景下船舶目标检测系统】38.【基于YOLOv8深度学习的农作物幼苗与杂草检测系统】
39.【基于YOLOv8深度学习的智能道路裂缝检测与分析系统】40.【基于YOLOv8深度学习的葡萄病害智能诊断与防治系统】
41.【基于YOLOv8深度学习的遥感地理空间物体检测系统】42.【基于YOLOv8深度学习的无人机视角地面物体检测系统】
43.【基于YOLOv8深度学习的木薯病害智能诊断与防治系统】44.【基于YOLOv8深度学习的野外火焰烟雾检测系统】
45.【基于YOLOv8深度学习的脑肿瘤智能检测系统】46.【基于YOLOv8深度学习的玉米叶片病害智能诊断与防治系统】
47.【基于YOLOv8深度学习的橙子病害智能诊断与防治系统】48.【基于深度学习的车辆检测追踪与流量计数系统】
49.【基于深度学习的行人检测追踪与双向流量计数系统】50.【基于深度学习的反光衣检测与预警系统】
51.【基于深度学习的危险区域人员闯入检测与报警系统】52.【基于深度学习的高密度人脸智能检测与统计系统】
53.【基于深度学习的CT扫描图像肾结石智能检测系统】54.【基于深度学习的水果智能检测系统】
55.【基于深度学习的水果质量好坏智能检测系统】56.【基于深度学习的蔬菜目标检测与识别系统】
57.【基于深度学习的非机动车驾驶员头盔检测系统】58.【太基于深度学习的阳能电池板检测与分析系统】
59.【基于深度学习的工业螺栓螺母检测】60.【基于深度学习的金属焊缝缺陷检测系统】
61.【基于深度学习的链条缺陷检测与识别系统】62.【基于深度学习的交通信号灯检测识别】
63.【基于深度学习的草莓成熟度检测与识别系统】64.【基于深度学习的水下海生物检测识别系统】
65.【基于深度学习的道路交通事故检测识别系统】66.【基于深度学习的安检X光危险品检测与识别系统】

二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~

《------正文------》

目录

  • 引言
  • DETR与以前目标检测不同之处
  • DETR架构
    • backbone
      • 位置编码:
    • Transformer编码器
    • Transformer解码器
    • 预测头
    • 基准测试结果
    • 使用预训练的DETR模型进行图像推理
    • 推理结果分析
    • 视频推理
      • 推理1
      • 推理2
      • 推理3
  • 结论

引言

在开创性的论文“attention is all you need”中,Transformers架构被引入NLP中的序列到序列任务。像Bert,GPT这样的模型是建立在Transformers架构之上的,该架构成为各种NLP任务中的SOTA。2020年在题为“An Image is Worth 16×16 Words”的论文中引入的视觉转换器在图像识别任务中使用了Transformer架构,这显示了将Transformer架构用于计算机视觉任务的有效性。不久之后,DETR(Detection Transformer) 在Facebook AI的论文“使用Transformer的端到端对象检测”中引入,该论文使用变压器架构进行对象检测任务。

DETR与以前目标检测不同之处

  • YOLO(You Only Look Once)、Faster R-CNNSSD这样的模型的架构通常使用多个卷积层,然后是用于对象检测的专用层。DETR还在主干中使用CNN进行特征提取,但这些特征随后被传递到Transformer编码器和解码器层。
  • 以前的模型需要一些手工设计的先验知识,比如YOLO中的锚框,R-CNN中的区域建议。DETR消除了对任何此类手工设计先验的需要。
  • DETR模型不需要NMS(非最大抑制)作为后处理技术来删除不相关的边界框,这在基于CNN的模型中是需要的。

DETR的基本结构如下:
This image shows the overview of DETR. DETR inference.

DETR架构

DETR体系结构有4个主要组成部分:

  • backbone主干
  • Transformer编码器
  • Transformer解码器
  • 前馈网络(Feed Forward Networks)

在下面的小节中,我们将详细介绍每个组件。

backbone

This image shows the backbone block of DETR architecture.

DETR模型从卷积神经网络(CNN)主干开始,通常是ResNet架构。这个主干充当特征提取器,处理原始输入图像以产生丰富的视觉特征集。DETR通常使用ResNet-50或ResNet-101作为其主干。

位置编码:

在学习Transformer Encoder之前,我们需要解释一下位置编码。沿着骨干网络的输出,即从原始图像中提取的特征,我们还将位置编码传递给Transformer Encoder。这些编码注入了关于像素空间位置的信息,以帮助模型保持对2D图像中位置的感知。

Transformer编码器

This image shows the encoder block for DETR architecture. 图3:Transformer编码器

骨干网络的输出,沿着位置编码,然后通过一系列的Transformer编码器。Transformer编码器的每一层都包含-

  • 多头自注意力:有助于同时注意图像的各个部分,捕捉长距离的依赖关系。
  • 前馈网络:帮助提取主要特征。

这有助于学习图像的不同区域中的对象之间的上下文关系。

Transformer解码器

This image shows the decoder block for DETR architecture. 图4:Transformer解码器

Transformer解码器是DETR中的一项关键创新,这在Vision Transformers中并不存在。Transformer解码器接受两个输入,即来自编码器的编码特征和一组学习对象查询

就像编码器层一样,解码器层也有多头自注意和FFN(前馈网络)。它还具有多头交叉注意力,也称为编码器-解码器注意力。多头交叉注意允许对象查询与来自编码器的编码特征“交互”。

Transformer解码器的输出是一组学习对象查询,其以嵌入的形式表示图像中的潜在对象。

预测头

This block shows the prediction head block for DETR architecture.

预测头是DETR架构的最后一个组件。解码器层的输出作为预测头的输入给出。预测头将学习到的对象查询作为输入,并且对于每个对象查询,预测头沿着预测对象的边界框来预测是否存在对象。

正是在架构的这个组件中,我们计算了用于训练整个网络的损失。总体损失是分类损失和边界框损失的组合。

基准测试结果

Benchmark results from DETR paper, compared with Faster-RCNN.

上表比较了DETR、Faster RCNN及其变体在COCO 2017数据集上的性能。R101代表使用ResNet-101作为主干。DC 5指的是扩张卷积的用法。DETR-DC 5-R101模型使用ResNet-101主干沿着扩展卷积,步长为5。

使用预训练的DETR模型进行图像推理

由于我们已经介绍了DETR的架构和理论细节,让我们开始动手并进行一些实现。我们将使用Hugging Face Transformers库来加载DETR模型对象检测。

我们将对从COCO数据集中选择的一些随机图像进行推断。演示中使用的示例图像可以使用命令下载。

!wget "https://www.dropbox.com/scl/fi/ekllt8pwum1cu41ohsddh/inference_data.zip ?rlkey=b1iih9q1mct5vcnwiyw98ouup&st=uncr8qho&dl=1" -O inference_data.zi

这将下载zip文件并将其保存为inference_data. zip。要解压缩下载的文件,请运行以下命令-

!unzip inference_data.zip

这将为我们提供5个图像,我们将使用它们来测试DETR模型。以下是5张图片-

[coco_dataset_1_detr_inference – LearnOpenCV

coco_dataset_5_detr_inference – LearnOpenCV

coco_dataset_2_detr_inference – LearnOpenCV

coco_dataset_3_detr_inference – LearnOpenCV

coco_dataset_4_detr_inference – LearnOpenCV

让我们从transformers库导入DETR类开始-

from transformers import DetrForObjectDetection, DetrImageProcessor

我们还需要一些其他的库-

import torch
import cv2
import matplotlib.pyplot as plt
import numpy as np
from glob import glob
import os

在下一个单元格中,我们将初始化模型和图像处理器。处理器将输入图像的大小调整为(800,1333)。

model = DetrForObjectDetection.from_pretrained("facebook/detr-resnet-50")
processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-50")

为了加载和预处理图像,我们将使用以下代码块-

image = cv2.imread(image_path)
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
inputs = processor(images=image_rgb, return_tensors="pt")

这里,image_path是我们要运行推理的图像的路径。我们使用函数cv2.cvtColor将BGR图像转换为RGB图像,该图像是cv 2默认加载的。函数处理器用于对输入图像进行预处理。

在随后的代码中,我们将把这些输入传递给模型。torch.no_grad()确保我们不为这一步执行反向传播,因为它只是用于评估。

with torch.no_grad(): outputs = model(**inputs)

输出包含模型的预测。对于每个预测,它给出预测的分数,连同其边界框一起沿着。边界框的格式为center_x,center_y,width,height,我们需要将其转换为标准的coco格式。为此,我们使用以下代码块-

target_sizes = torch.tensor([image_rgb.shape[:2]])  # Image size (height, width)
results = processor.post_process_object_detection(outputs, target_sizes=target_sizes)[0]

变量“results”是一个字典列表,每个字典包含模型预测的批次中图像的置信度、标签和框。

该模型将为每个图像提供n=100个预测框。默认情况下,n被设置为100,它表示预测头中存在的对象查询的数量。并非所有预测都是需要的,我们需要删除冗余的预测。

# Filter boxes based on confidence score (threshold can be adjusted)
threshold = 0.9
scores = results["scores"].numpy()
keep = scores > threshold
boxes = results["boxes"].numpy()[keep]
labels = results["labels"].numpy()[keep]
scores = scores[keep]

在上面的代码块中,我们过滤掉得分大于阈值的预测,阈值设置为0.9。行keep = scores > threshold将创建一个二进制数组,其中1表示得分大于threshold的预测,0表示其余预测。

一旦我们有了过滤后的预测,我们就可以通过在图像上绘制边界框来可视化它们。

for box, label, score in zip(boxes, labels, scores):xmin, ymin, xmax, ymax = boxbox_width = xmax - xminbox_height = ymax - yminimg_width, img_height = image_rgb.shape[:2]font_scale = calculate_label_size(box_width, box_height, img_width, img_height, max_scale=1)label_text = f"{model.config.id2label[label]}: {score:.2f}"(text_width, text_height), baseline = cv2.getTextSize(label_text,cv2.FONT_HERSHEY_SIMPLEX,font_scale,1)# Get the color for this labelcolor = get_label_color(label)# Draw rectangle and label with the same color for the same classcv2.rectangle(image_rgb, (int(xmin), int(ymin)), (int(xmax), int(ymax)), color, max(2, int(font_scale * 3)))cv2.rectangle(image_rgb, (int(xmin), int(ymin) - text_height - baseline - 5), (int(xmin) + text_width, int(ymin)), color, -1)cv2.putText(image_rgb, label_text, (int(xmin), int(ymin) - baseline - 2), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 0, 0), max(1, int(font_scale * 1.5)), cv2.LINE_AA) plt.figure(figsize=(10, 10))
plt.imshow(image_rgb)
plt.axis("off")  # Hide axes
plt.show()

在上面的代码块中,我们将迭代过滤后的预测,并将其与边界框的标签一起沿着绘制在图像上。函数 get_label_color and calculate_label_size 是辅助函数,用于帮助选择边界框的颜色和标签文本的相对大小。

我们把上面所有的代码块放在一个函数中。这需要输入图像路径,并执行我们上面讨论的所有过程。

# Function to predict and plot bounding boxes
def predict_and_plot_boxes(image_path, threshold=0.9):# Step 1: Load and preprocess the imageimage = cv2.imread(image_path)image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)inputs = processor(images=image_rgb, return_tensors="pt")# Step 2: Run inferencewith torch.no_grad():outputs = model(**inputs)# Step 3: Post-process the results# Convert the outputs (logits) into bounding boxes and labelstarget_sizes = torch.tensor([image_rgb.shape[:2]])  # Image size (height, width)results = processor.post_process_object_detection(outputs, target_sizes=target_sizes)[0]# Filter boxes based on confidence score (threshold can be adjusted)scores = results["scores"].numpy()keep = scores > thresholdboxes = results["boxes"].numpy()[keep]labels = results["labels"].numpy()[keep]scores = scores[keep]for box, label, score in zip(boxes, labels, scores):xmin, ymin, xmax, ymax = boxbox_width = xmax - xminbox_height = ymax - yminimg_width, img_height = image_rgb.shape[:2]font_scale = calculate_label_size(box_width, box_height, img_width, img_height, max_scale=1)label_text = f"{model.config.id2label[label]}: {score:.2f}"(text_width, text_height), baseline = cv2.getTextSize(label_text,cv2.FONT_HERSHEY_SIMPLEX,font_scale,1)# Get the color for this labelcolor = get_label_color(label)# Draw rectangle and label with the same color for the same classcv2.rectangle(image_rgb, (int(xmin), int(ymin)), (int(xmax), int(ymax)), color, max(2, int(font_scale * 3)))cv2.rectangle(image_rgb, (int(xmin), int(ymin) - text_height - baseline - 5), (int(xmin) + text_width, int(ymin)), color, -1)cv2.putText(image_rgb, label_text, (int(xmin), int(ymin) - baseline - 2), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 0, 0), max(1, int(font_scale * 1.5)), cv2.LINE_AA) # Step 5: Plot the image with bounding boxesplt.figure(figsize=(10, 10))plt.imshow(image_rgb)plt.axis("off")  # Hide axesplt.show()

上述函数可以被称为predict_and_plot_boxes('image.jpeg')

我们在一些图像上测试了DETR模型,这是我们得到的结果-

[coco_dataset_1_output_detr_inference – LearnOpenCV coco_dataset_2_output_detr_inference – LearnOpenCV coco_dataset_3_output_detr_inference – LearnOpenCV coco_dataset_4_output_detr_inference – LearnOpenCV coco_dataset_5_output_detr_inference – LearnOpenCV

推理结果分析

虽然我们在前4张图像中得到了几乎完美的结果,但我们可以看到,在最后一张图像中,一些香蕉没有被检测到。这可以通过降低置信度阈值的值来改善。下图显示了同一图像的输出,但使用了较低的阈值0.85。

predict_and_plot_boxes('/inference_data/images/000000052123.jpg', threshold=0.85)

coco_dataset_5a_output_detr_inference – LearnOpenCV

视频推理

我们修改了上面的代码来处理视频。这是一个功能,需要输入一个视频,并预测的对象,并保存在给定的目录视频-

def process_video(video_path, output_path):"""Process a video file using GPU acceleration (if available) for object detection."""device = torch.device("cuda" if torch.cuda.is_available() else "cpu")print(f"Using device: {device}")model.to(device)cap = cv2.VideoCapture(video_path)if not cap.isOpened():raise ValueError("Error opening video file")frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))fps = int(cap.get(cv2.CAP_PROP_FPS))total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))fourcc = cv2.VideoWriter_fourcc(*'mp4v')out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))pbar = tqdm(total=total_frames, desc="Processing frames",unit="frames", dynamic_ncols=True)frame_count = 0 # To count total frames.total_fps = 0 # To get the final frames per second.try:while cap.isOpened():ret, frame = cap.read()if not ret:break# Start timing for this framestart_time = time.time()frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)inputs = processor(images=frame_rgb, return_tensors="pt")inputs = {k: v.to(device) for k, v in inputs.items()}with torch.no_grad():outputs = model(**inputs)target_sizes = torch.tensor([frame_rgb.shape[:2]]).to(device)results = processor.post_process_object_detection(outputs, target_sizes=target_sizes)[0]scores = results["scores"].cpu().numpy()threshold = 0.9keep = scores > thresholdboxes = results["boxes"].cpu().numpy()[keep]labels = results["labels"].cpu().numpy()[keep]scores = scores[keep]# Draw bounding boxesfor box, label, score in zip(boxes, labels, scores):xmin, ymin, xmax, ymax = boxbox_width = xmax - xminbox_height = ymax - yminfont_scale = calculate_label_size(box_width, box_height, frame_width, frame_height)label_text = f"{model.config.id2label[label]}: {score:.2f}"(text_width, text_height), baseline = cv2.getTextSize(label_text,cv2.FONT_HERSHEY_SIMPLEX,font_scale,1)cv2.rectangle(frame,(int(xmin), int(ymin)),(int(xmax), int(ymax)),(0, 255, 0),max(1, int(font_scale * 2)))cv2.rectangle(frame,(int(xmin), int(ymin) - text_height - baseline - 5),(int(xmin) + text_width, int(ymin)),(0, 255, 0),-1)cv2.putText(frame,label_text,(int(xmin), int(ymin) - baseline - 2),cv2.FONT_HERSHEY_SIMPLEX,font_scale,(0, 0, 0),max(1, int(font_scale * 1.5)),cv2.LINE_AA)end_time = time.time()# Get the current fps.fps = 1 / (end_time - start_time)# Add `fps` to `total_fps`.total_fps += fps# Increment frame count.frame_count += 1# Add FPS counter to frameadd_fps_counter(frame, fps, frame_width)out.write(frame)pbar.update(1)if pbar.n % 100 == 0:torch.cuda.empty_cache()gc.collect()except Exception as e:print(f"An error occurred: {e}")raisefinally:pbar.close()cap.release()out.release()cv2.destroyAllWindows()torch.cuda.empty_cache()gc.collect()model.to('cpu')print("nVideo processing completed!")

我们将在下载的数据集中的视频上调用此函数。推理结果如下:

推理1

在这里插入图片描述

推理2

在这里插入图片描述

推理3

在这里插入图片描述

结论

在本文中,我们介绍了DETR的架构,并介绍了DETR与基于CNN的计算机视觉模型的不同之处。我们还对图像和视频进行了推断,并查看了模型给出的结果。


在这里插入图片描述

在这里插入图片描述

好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Calling short variants with GATK4

计算生物学实验5: Calling short variants with GATK4 1. 实验目的 本实验目的是利用 GATK4 工具准确高效地检测出基因组中的短变异。通过该工具对样本基因组进行分析,旨在发现单核苷酸变异(SNV)和小的插入缺失(Indel&#xff0…

S32K324 DTCM/DTCM Backdoor使用及测试

文章目录 前言S32K324的Memory mapDTCM的原理DTCM的使用DTCM/DTCM backdoor测试总结 前言 S32K324的Ram在选型手册上给的是512K,但实际上sram只有320k,项目中对ram的需求更大,所以需要拓展一下ram的使用。本文分析DTCM的使用方案及测试结果 S32K324的M…

Pytorch猴痘病识别

Pytorch猴痘病识别 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 电脑系统:Windows11 显卡型号:NVIDIA Quadro P620 语言环境:python 3.9.7 编译器:jupyte…

网络安全渗透实际案例

目录 案例场景案例目标和工具 案例操作步骤Step 1:信息收集与识别**结果分析** Step 2:漏洞扫描**预期结果** Step 3:漏洞利用与权限验证Step 4:后渗透测试Step 5:报告生成和修复建议**修复建议** 案例总结 下面是一个…

快消零售行业的培训创新:构建在线培训知识库

在快速消费品(FMCG)行业中,员工的培训和发展对于保持竞争力至关重要。随着电子商务的兴起和消费者行为的变化,快消零售行业需要不断适应新的市场趋势。在线培训知识库作为一种有效的培训工具,可以帮助企业提升员工技能…

软考(中级-软件设计师)计算机网络篇(1101)

第五章:计算机网络基础 **考纲要求**根据开始大纲中相应的考核要求,要求考生掌握一下方面的内容: 1、计算机网络基础知识 网络体系结构传输介质、传输技术、传输方法、传输控制常用网络设备和各类通信设备的特点Client-Server结构、Browser…

【毫米波雷达(四)】车载毫米波雷达下线EOL标定流程

汽车控制器下线EOL标定流程 一、概述二、标定的目的三、雷达标定的要求1、车辆的要求2、标定环境要求四、以软件的角度分析前雷达的EOL标定 一、概述 由于雷达的安装误差会影响雷达对目标位置的检测,导致报警及功能性能下降。因此雷达进行预安装后必须进行角度标定…

免费插件集-illustrator插件-Ai插件-闭合开放路径

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件,加强illustrator使用人员工作效率,实现图形编辑中闭合开放路径。首先从下载网址下载这款插件https://download.csdn.net/download/m0_67316550/8789…

LDA 线性分类

线性判别分析是一种经典的线性分类方法,将高维空间投射到低维空间,如下图。 LDA 的目标就是简单累内距离变小,把类间的距离变大,这样就可以把相似的数据聚集在一起。 u1 和 u2 类间距离,S1、S2 为类内数据点之间的距…

面试必会50题

基础篇 01 和 equals 的区别是什么 : 可以比较基本数据类型也可以比较引用数据类型 , 比较基本数据类型是比较值是否相等, 比较引用数据类型是比较引用地址是否相等 (基本数 据类型 比较的是值,引用数据类型 比较的是内存地址) equals() : 一般用于对象的比较…

Python 工具库每日推荐 【Sphinx】

文章目录 引言文档工具的重要性今日推荐:Sphinx 文档生成工具主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:为 Python 项目生成 API 文档案例分析高级特性自定义主题国际化支持扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript …

Pinctrl子系统中Pincontroller构造过程驱动分析:imx_pinctrl_soc_info结构体

往期内容 本专栏往期内容: Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析 input子系统专栏: 专栏地址:input子系统input角度:I2C触摸屏驱动分析…

第十五章 Vue工程化开发及Vue CLI脚手架

目录 一、引言 二、Vue CLI 基本介绍 三、安装Vue CLI 3.1. 安装npm和yarn 3.2. 安装Vue CLI 3.3. 查看 Vue 版本 四、创建启动工程 4.1. 创建项目架子 4.2. 启动工程 五、脚手架目录文件介绍 六、核心文件讲解 6.1. index.html 6.2. main.js 6.3. App.vue 一、…

Rust 力扣 - 2841. 几乎唯一子数组的最大和

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历长度为k的窗口,用一个哈希表记录窗口内的所有元素(用来对窗口内元素去重),我们取哈希表中元素数量大于等于m的窗口总和的最大值 题解代码 use std::coll…

Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)

案例背景 虽然在效果上,传统的逻辑回归模型通常不如现代的机器学习模型,但在风控领域,解释性至关重要。逻辑回归的解释性是这些“黑箱”模型所无法比拟的,因此,研究传统的评分卡模型依然是有意义的。 传统的评分卡模型…

免费送源码:Java+Springboot+MySQL Springboot酒店客房管理系统的设计与实现 计算机毕业设计原创定制

摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对酒店客房管理等问题,对酒店客房…

力扣每日一题 超级饮料的最大强化能量 动态规划(dp)

来自未来的体育科学家给你两个整数数组 energyDrinkA 和 energyDrinkB,数组长度都等于 n。这两个数组分别代表 A、B 两种不同能量饮料每小时所能提供的强化能量。 你需要每小时饮用一种能量饮料来 最大化 你的总强化能量。然而,如果从一种能量饮料切换到…

Linux高阶——1027—守护进程

1、守护进程的基本流程 1、父进程创建子进程,父进程退出 守护进程是孤儿进程,但是是工程师人为创建的孤儿进程,低开销模式运行,对系统没有压力 2、子进程(守护进程)脱离控制终端,创建新会话 …

抗疫物资管理:SpringBoot技术应用案例

目 录 摘 要 1 前 言 2 第1章 概述 2 1.1 研究背景 3 1.2 研究目的 3 1.3 研究内容 4 第二章 开发技术介绍 5 2.1相关技术 5 2.2 Java技术 6 2.3 MySQL数据库 6 2.4 Tomcat介绍 7 2.5 Spring Boot框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行…

pandas——数据结构

一、series (一)创建series import pandas as pd#1.使用列表或数组创建Series # 使用列表创建Series,索引默认从0开始 s1 pd.Series([1, 2, 3]) print(s1) # 使用列表和自定义索引创建Series s2 pd.Series([1, 2, 3], index[a, b, c]) pr…