计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解
概述
目标检测已经取得了长足的发展,尤其是随着基于 Transformer 的模型的兴起。RF-DETR,由 Roboflow 开发,就是这样一种模型,它兼顾了速度和精度。使用 Roboflow 的工具可以让整个过程变得更加轻松。他们的平台涵盖了从上传和标注数据到以正确格式导出数据的全过程。这意味着你可以节省设置的时间,将更多的时间用于训练和改进模型。
一、 模型变体、性能和基准测试
RF-DETR 是由 Roboflow 开发并以 Apache 2.0 许可证发布的实时、基于 Transformer 的目标检测模型架构。
RF-DETR 在微软 COCO 基准测试中可以超过 60 AP(平均精度),并且在基础尺寸下具有竞争力的性能。它还在 RF100-VL 目标检测基准测试中达到了最先进的性能,该基准测试衡量模型对现实问题的领域适应性。RF-DETR 的速度与当前的实时目标检测模型相当。
RF-DETR 提供两种模型尺寸:RF-DETR-Base(29M 参数)和 RF-DETR-large(128M 参数)。基础版本最适合快速推理,而大型版本最适合最准确的预测,但其计算时间比基础版本更长。
RF-DETR 足够小,可以在边缘设备上运行,使其非常适合需要强大精度和实时性能的部署。
RF-DETR 在 coco 和 RF100 VL 基准测试中的性能
模型 | 参数量 (M) | mAP(coco) @0.50:0.95 | mAP(rf100-vl) 平均 @0.50 | mAP(rf100-vl) 平均 @0.50:0.95 | 总延迟(ms) T4, bs = 1 |
D-FINE-M | 19.3 | 55.1 | N/A | N/A | 6.3 |
LW-DETR-M | 28.3 | 52.5 | 84.0 | 57.5 | 6.0 |
YOLO11m | 20.0 | 51.5 | 84.9 | 59.7 | 5.7 |
YOLOv8m | 28.9 | 50.6 | 85.0 | 59.8 | 6.3 |
RF-DETR-B | 29.0 | 53.3 | 86.7 | 60.3 | 6.0 |
二、 架构概览
CNN 仍然是许多最佳实时目标检测方法的核心组件,包括像 D-FINE 这样利用 CNN 和 Transformer 的模型。
最近,随着 2023 年 RT-DETR 的推出,DETR 系列模型通过 Transformer 架构在端到端目标检测任务中展示了可比甚至超越的结果,消除了 Faster-RCNN 等框架中标准的手动设计组件,如锚点生成和非最大抑制(NMS)。
尽管 DETR 模型具有优势,但它存在两个显著的局限性:
- 收敛速度慢
- 对小目标的检测性能差
Deformable DETR,RF-DETR 基于此架构构建。
RF-DETR 使用基于 Deformable DETR 模型的架构来弥补上述局限性。然而,与使用多尺度自注意力机制的 Deformable DETR 不同,RF-DETR 从单尺度主干中提取图像特征图。
RF-DETR 结合了 LW-DETR 和预训练的 DINOv2 主干。利用 DINOv2 预训练主干提供了出色的适应新领域的能力,基于预训练模型中存储的知识。
让我们来审视一下 LW-DETR 架构的细节,RF-DETR 采用了与之相同的架构以及 DINOv2。DINOv2 的架构细节超出了本文的范围。对于那些有兴趣了解 DINOv2 的理念和架构的人,可以访问我们的文章,其中涵盖了论文解释和道路分割实现。
LW-DETR
LW-DETR 的架构由一个简单的 ViT 编码器堆叠、一个投影器和一个浅层 DETR 解码器组成。它探索了纯 ViT 主干和 DETR 框架在实时检测中的可行性。
编码器:
论文的作者使用了普通的 ViT 作为检测编码器。一个普通的 ViT 包括一个分块层和 Transformer 编码器层。初始 ViT 中的 Transformer 编码器层包含一个对所有标记进行全局自注意力的层和一个 FFN 层。全局自注意力的计算成本很高,其时间复杂度与标记数量的平方成正比。
ViT 编码器
因此,作者引入了窗口自注意力来降低计算复杂度;他们还提出了聚合编码器中的多级特征图,形成更强的编码特征图。
解码器:
解码器是 Transformer 解码器层的堆叠。每一层都包含自注意力、交叉注意力和 FFN。我们采用可变形交叉注意力以提高计算效率。DETR 及其变体通常采用六个解码器层。然而,作者解释说,只使用三个 Transformer 解码器层可以使时间从 1.4 ms 减少到 0.7 ms,与他们方法中剩余部分的 1.3 ms 时间成本相比,这是一个显著的减少。
他们采用了混合查询选择方案来形成对象查询,除了内容查询和空间查询之外。内容查询是可学习的嵌入,类似于 DETR。空间查询基于一个两阶段方案:从 Projector 的最后一层中选择顶部 K 个特征,预测边界框,并将相应的框转换为嵌入作为空间查询。
C2f 块(来自 YOLOv8)
投影器:
投影器连接编码器和解码器。它以编码器的聚合编码特征图为输入。投影器是一个在 YOLOv8 中实现的 C2f 块。
对于 LW-DETR 的大版本和特大版本,投影器被修改为输出两尺度特征图,并相应地使用多尺度解码器。投影器包含两个并行的 C2f 块。一个处理通过反卷积上采样获得的 ⅛ 特征图,另一个处理通过步长卷积下采样获得的 1/32 图。
单尺度(a)和多尺度(b)投影器
三、推理结果
让我们通过编写一个简单的推理脚本来查看模型的开箱即用性能,该脚本由 Roboflow 提供。
目标检测前的推理图像
我们将使用下面的脚本来检测上面提供的图像中的目标。
需要注意的一点是,我们将使用由 Roboflow 创建和维护的 Supervision 库。这个库易于使用,不需要花费太多精力去理解它为对象检测任务提供的各种功能。无论你需要从硬盘加载数据集、在图像或视频上绘制检测结果,还是统计某个区域中的检测数量,都可以依靠 Supervision!
让我们开始编写代码。 :)
在进行推理之前,需要安装一些依赖项。如果你在 VS code 或终端中工作,强烈建议你创建虚拟环境并在其中进行操作,以确保更好的一致性并减少依赖项问题。
!pip install -q rfdetr==1.1.0
如果你在 Colab 中工作,像下面这样将 Roboflow 的 API 密钥集成到你的工作环境中。
import os
from google.colab import userdataos.environ["ROBOFLOW_API_KEY"] = userdata.get("ROBOFLOW_API_KEY")
现在,我们已经准备好开始推理了。
# 导入必要的库
from rfdetr import RFDETRBase
import supervision as sv
from rfdetr.util.coco_classes import COCO_CLASSES
import numpy as np
from PIL import Image# 实例化模型对象,初始化时会自动加载对应的 COCO 预训练检查点
model = RFDETRBase()# 使用 Pillow 库读取图像,也可以使用 OpenCV 或 Matplotlib
image = Image.open("path_to_your_input_image")# 执行推理,阈值决定了每个边界框的最小置信度
detections = model.predict(image, threshold=0.5)# 使用 Supervision 库可视化结果
color = sv.ColorPalette.from_hex(["#ffff00", "#ff9b00", "#ff8080", "#ff66b2", "#ff66ff", "#b266ff","#9999ff", "#3399ff", "#66ffff", "#33ff99", "#66ff66", "#99ff00"
])
text_scale = sv.calculate_optimal_text_scale(resolution_wh=image.size)
thickness = sv.calculate_optimal_line_thickness(resolution_wh=image.size)bbox_annotator = sv.BoxAnnotator(color=color, thickness=thickness)
label_annotator = sv.LabelAnnotator(color=color,text_color=sv.Color.BLACK,text_scale=text_scale,smart_position=True
)labels = [f"{COCO_CLASSES[class_id]} {confidence:.2f}"for class_id, confidence in zip(detections.class_id, detections.confidence)
]# 显示结果
annotated_image = image.copy()
annotated_image = bbox_annotator.annotate(annotated_image, detections)
annotated_image = label_annotator.annotate(annotated_image, detections, labels)
annotated_image
四、在水下数据集上进行微调
虽然 RF-DETR 在通用基准测试(如 COCO)上表现出色,并且在领域适应性方面显示出潜力,但挑战在于将其应用于特定的、小众的领域。
在水下图像数据集上对 RF-DETR 进行微调是一种强大的方法,可以将模型适应新的环境和目标类别。利用 Roboflow 的工具和资源,你可以从数据集准备到训练配置以及可视化结果的整个流程中受益。
在我们开始对水下数据集进行微调之前,需要注意的是,Roboflow 设计其微调流程时,仅允许使用 COCO 格式的数据集进行训练。COCO 格式如下:
underwater_COCO_dataset/
├── train/
│ ├── images/
│ │ ├── image1.jpg
│ │ ├── image2.jpg
│ │ └── ...
│ └── _annotations.coco.json
├── val/
│ ├── images/
│ │ ├── image1.jpg
│ │ ├── image2.jpg
│ │ └── ...
│ └── _annotations.coco.json
└── test/├── images/│ ├── image1.jpg│ ├── image2.jpg│ └── ...└── _annotations.coco.json
挑战:水下动物检测
我们选择的数据集包含各种水下动物的图像,如 fish
(鱼)、jellyfish
(水母)、penguin
(企鹅)、puffin
(海鹦)、shark
(鲨鱼)、starfish
(海星)和 stingray
(黄貂鱼)。
与典型的陆地图像数据集相比,该领域存在不同的挑战,具体如下:
- 可见性变化
- 拟态
- 尺度变化:检测远处的小鱼和近处的大鱼
该数据集可在 Kaggle 平台上公开获取,可以将其保存到本地机器上,也可以导入到新的 Kaggle 笔记本中。
关于该数据集的一些重要细节如下:
- 已经分为训练集、验证集和测试集
- 包含 638 张图像。标注(真实值)以 YOLO 格式提供(
class_id
、x_centre
、y_centre
、width
、height
) - 对每张图像应用的预处理步骤:
- 自动定向像素数据(剥离 EXIF 方向信息)
- 调整大小至 1024 x 1024(在此范围内适配)
现在我们知道数据集必须是 COCO 格式,让我们开始编写脚本,将我们的水下数据集从 YOLO 格式转换为 COCO 格式。我们还将在此博客中提供转换脚本,你可以下载并使用它。
让我们开始吧……
import json
import os
from PIL import Image
在导入所有必需的库之后,第一步是定义一个类别列表,其中包含类别名称和对应的 ID 作为 dict_keys
。
# 包含 supercategory 是可选的,可以省略
categories = [{"id": 0, "name": 'fish', "supercategory": "animal"},{"id": 1, "name": 'jellyfish', "supercategory": "animal"},{"id": 2, "name": "penguin", "supercategory": "animal"},{"id": 3, "name": "puffing", "supercategory": "animal"},{"id": 4, "name": "shark", "supercategory": "animal"},{"id": 5, "name": "stingray", "supercategory": "animal"},{"id": 6, "name": "starfish", "supercategory": "animal"}
]# 创建 COCO 格式架构
coco_dataset = {"info": {},"licenses": [],"categories": categories,"images": [],"annotations": []
}
在实例化 COCO 格式架构之后,我们将创建一个图像字典,存储诸如 image_id
、filename
等信息,并最终将其追加到我们的 COCO 架构字典的 images
键中。
annotation_id = 0
image_id_counter = 0for image_fol in os.listdir(train_dir_images):image_path = os.path.join(train_dir_images, image_fol)image = Image.open(image_path)width, height = image.sizeimage_id = image_id_counterimage_dict = {"id": image_id,"width": width,"height": height,"file_name": image_fol}coco_dataset["images"].append(image_dict)
从上面的代码块中,我们可以很容易地推断出,对于所有标注(真实值标签),也会创建类似的字典。因此,在相同的 for 循环中继续,我们现在将处理真实值。
# 使用 with open 语句读取 YOLO 格式文本文件中的行with open(os.path.join(train_dir_labels,f"{image_fol.split('.jpg')[0]}.txt")) as f:annotations = f.readlines()for ann in annotations:category_id = int(ann[0])x, y, w, h = map(float, ann.strip().split()[1:])x_min, y_min = int((x - w / 2) * width), int((y - h / 2) * height)x_max, y_max = int((x + w / 2) * width), int((y + h / 2) * height)bbox_width = x_max - x_minbbox_height = y_max - y_minann_dict = {"id": len(coco_dataset["annotations"]),"image_id": image_id,"category_id": category_id,"bbox": [x_min, y_min, x_max - x_min, y_max - y_min],"area": bbox_height * bbox_width,"iscrowd": 0}coco_dataset["annotations"].append(ann_dict)annotation_id += 1# 以下代码行在 for 循环之外image_id_counter += 1
最后,我们将把我们的 “coco_dataset” 对象转储到 _annotations.coco.json 文件中,这是 COCO 格式标准的文件命名方式,用于存储真实值标注。另外,output_dir 是一个目录,我们将在本地机器上的该目录中存储 _annotations.coco.json 文件。
with open(os.path.join(output_dir, '_annotations.coco.json'), 'w') as f:json.dump(coco_dataset, f)
在将我们的数据集转换为 COCO 格式之后,我们现在可以继续进行模型训练。正如 Roboflow 在其流程中创建的那样,实现起来非常简单,即使是初学者也能方便地理解。我们的实现(正如他们在官方 Colab 笔记本 中提到的训练和推理实现)使用了 Supervision 库。
from rfdetr import RFDETRBase
import supervision as svmodel = RFDETRBase(pretrain_weights="./checkpoints/checkpoint_best_regular.pth")# 定义我们的类别,与前面代码块中提到的类似
categories = [{"id": 0, "name": 'fish', "supercategory": "animal"},{"id": 1, "name": 'jellyfish', "supercategory": "animal"},{"id": 2, "name": "penguin", "supercategory": "animal"},{"id": 3, "name": "puffing", "supercategory": "animal"},{"id": 4, "name": "shark", "supercategory": "animal"},{"id": 5, "name": "stingray", "supercategory": "animal"},{"id": 6, "name": "starfish", "supercategory": "animal"}
]# 定义回调函数用于处理视频帧
def callback(frame, index):annotated_frame = frame.copy()detections = model.predict(annotated_frame, threshold=0.6)labels = [f"{categories[class_id]['name']} {confidence:.2f}"for class_id, confidence in zip(detections.class_id, detections.confidence)]annotated_frame = sv.BoxAnnotator().annotate(annotated_frame, detections)annotated_frame = sv.LabelAnnotator().annotate(annotated_frame, detections, labels)return annotated_frame# 处理视频并保存结果
sv.process_video(source_path="./video_3.mp4",target_path="./output_annotations_4.mp4",callback=callback,
)
process_video
函数将回调函数应用于每一帧,并将结果保存到目标视频文件中。
名称 | 类型 | 描述 | 默认值 |
source_path | str | 源视频文件路径 | 必填 |
target_path | str | 目标视频文件路径 | 必填 |
callback | Callable[[ndarray, int], ndarray] | 一个函数,它接收视频帧的 numpy ndarray 表示和帧的索引(int),并返回处理后的 numpy ndarray 表示。 | 必填 |
为了评估微调后的 RF-DETR 模型在水下数据集上的性能,我们绘制了 50 个训练周期的关键评估指标。这些指标图表提供了有关模型学习行为、精度和泛化性能的宝贵见解。图表比较了 基础模型 和 指数移动平均(EMA)模型,后者有助于稳定训练,通常可以实现更好的泛化。
带 EMA 模型的指标图表
在总结本博客之前,下面的图像展示了在微调训练期间的 CPU/GPU 消耗情况。我们在 Kaggle 平台上利用 P100 GPU 进行了所有实验。
Kaggle 平台上的 GPU/CPU 消耗
五、 关键要点
- RF-DETR 是由 Roboflow 开发的实时目标检测模型,它基于 Deformable DETR 和 LW-DETR 的优势,并整合了 DINOv2 主干,以实现卓越的领域适应性。
- 该模型消除了传统检测组件(如锚点框和 NMS)的需求,利用基于 Transformer 的架构实现端到端目标检测。
- 两种模型变体 —— 基础版(29M)和大型版(128M)—— 在速度和精度之间提供了灵活性,使 RF-DETR 既适合边缘部署,也适合高性能场景。
- Roboflow 的 Supervision 库 简化了整个训练和可视化工作流程。
- 该模型可以 针对特定领域进行有效微调,如通过水下数据集进行微调,利用其预训练知识。
六、 结论
RF-DETR 证明了其在通用任务和特定领域任务中进行实时目标检测的多功能性和高性能。其强大的架构,由 Deformable DETR 和 LW-DETR 等基于 Transformer 的架构以及 DINOv2 等预训练主干提供支持,使其成为开发人员处理自定义检测问题的良好选择。
通过将 RF-DETR 与强大的工具(如 Supervision)结合使用,AI 爱好者可以快速构建高质量、生产就绪的模型,这些模型能够很好地适应新领域。无论你是部署在边缘设备上还是进行研究实验,RF-DETR 都提供了灵活性和性能,以推动你的计算机视觉项目向前发展。
原文地址:https://learnopencv.com/rf-detr-object-detection/
相关文章:
计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解
概述 目标检测已经取得了长足的发展,尤其是随着基于 Transformer 的模型的兴起。RF-DETR,由 Roboflow 开发,就是这样一种模型,它兼顾了速度和精度。使用 Roboflow 的工具可以让整个过程变得更加轻松。他们的平台涵盖了从上传和标…...
JS 应用算法逆向三重断点调试调用堆栈BP 插件发包安全结合
# 前置知识 1 、作用域:(本地 & 全局) 简单来说就是运行后相关的数据值 2 、调用堆栈:(由下到上) 简单来说就是代码的执行逻辑顺序 3 、常见分析调试: - 代码全局搜索 - 文件流程断点…...
从零开始在Win上添加一块QEMU开发板(四)实现简单USART
文章目录 一、前言背景二、QEMU的字符设备模拟三、USART的发送1. USART发送的QEMU字符设备模拟2. MMIO设计3. 中断连接4. 复位 三、代码验证1. 输出到serial控制台2. 输出到文件 一、前言背景 QEMU是一款开源的模拟器及虚拟机管理器。而QEMU内置支持了一些开发板,我…...
目标检测篇---faster R-CNN
目标检测系列文章 第一章 R-CNN 第二篇 Fast R-CNN 目录 目标检测系列文章📄 论文标题🧠 论文逻辑梳理1. 引言部分梳理 (动机与思想) 📝 三句话总结🔍 方法逻辑梳理🚀 关键创新点🔗 方法流程图关键疑问解答…...
【计算机视觉】CV实战项目- 深度解析FaceAI:一款全能的人脸检测与图像处理工具库
深度解析FaceAI:一款全能的人脸检测与图像处理工具库 项目概述核心功能与技术实现1. 人脸检测与识别2. 数字化妆与轮廓标识3. 性别与表情识别4. 高级图像处理 实战指南:项目运行与开发环境配置典型应用示例常见问题与解决方案 学术背景与相关研究项目扩展…...
Linux下编译opencv-4.10.0(静态链接库和动态链接库)
1. 安装依赖 在编译之前,确保系统中安装了必要的依赖工具和库。运行以下命令安装: sudo apt update sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config sudo apt-get install libavcodec-dev libavforma…...
OpenBMC:BmcWeb login创建session
OpenBMC:BmcWeb login认证-CSDN博客 完成用户的认证后,还需要为该用户创建session,从而为后续的rest api访问铺平道路 inline void handleLogin(const crow::Request& req,const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {...auto session =persisten…...
Java高频面试之并发编程-07
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:线程之间有哪些通信方式? 在 Java 多线程编程中,线程间通信(Inter-Thread Communica…...
四、Python编程基础04
这里写目录标题 一、集合[了解]二、函数1. 函数定义与调用2. 函数返回值 三、模块和包1. 登录案例2.登录案例优化3. 随机数案例 四、异常五、web自动化测试1、selenium介绍2、环境搭建具体安装步骤请看 3、入门案例3.1 自动化测试步骤3.2 案例 一、集合[了解] 1, 集合 set, 表…...
专家系统的一般结构解析——基于《人工智能原理与方法》的深度拓展
不同的专家系统,其功能与结构都不尽相同,但一般都包括人机接口、推理机、知识库及其管理系统、数据库及其管理系统、知识获取机构、解释机构这六个部分,如下图所示。 一、人机接口(Human-Computer Interface, HCI) (一)基本思想与定义 1. 核心思想:双向交互的桥梁 人…...
手搓雷达图(MATLAB)
看下别人做出来什么效果 话不多说,咱们直接开始 %% 可修改 labels {用户等级, 发帖数, 发帖频率, 点度中心度, 中介中心度, 帖子类型计分, 被列为提案数}; cluster_centers [0.8, 4.5, 3.2, 4.0, 3.8, 4.5, 4.2; % 核心用户0.2, 0.5, 0.3, 0.2, 0.1, 0.0, 0.0;…...
FastMCP与FastAPI:构建自定义MCP服务器
FastMCP与FastAPI:构建自定义MCP服务器 模型上下文协议(Model Context Protocol, MCP)是一种让AI模型与外部工具和服务交互的标准。本文将介绍FastMCP和FastAPI,并通过实例展示如何创建自定义MCP服务器。 MCP基础概念 MCP允许语言模型: 访问外部工具…...
基于 springboot+vue+elementui 的办公自动化系统设计(
基于 springbootvueelementui 的办公自动化系统设计(前端代码在oa文件夹里) 系统主要功能: 1、统一的信息发布平台:公告栏,公司活动,项目进度,公司周报 2、统一的文件管理平台:收文管理、发文管理。文件查询…...
Java发展史及版本详细说明
Java发展史及版本详细说明 1. Java 1.0(1996年1月23日) 核心功能: 首个正式版本,支持面向对象编程、垃圾回收、网络编程。包含基础类库(java.lang、java.io、java.awt)。支持Applet(浏览器嵌入…...
高企复审奖补!2025年合肥市高新技术企业重新认定奖励补贴政策及申报条件
一、合肥市高新技术企业重新认定奖励补贴政策 (一)高新区高新技术企业重新认定复审补贴奖励 重新认定为国家高新技术企业的给予5万元一次性奖励。 (二)经开区高新技术企业重新认定复审补贴奖励 对重新认定的企业,给…...
elementui日历显示红点及根据日程范围判断是否有红点
生成指定日期范围内的所有日期 generateDateRange(startStr, endStr) {const dates []; 日期列表const start new Date(startStr); 日程开始日期const end new Date(endStr); 日程结束日期end.setHours(23, 59, 59, 999); 结束的那一天设置为23点59分59秒// 生成日期范围内…...
第六章 QT基础:5、QT的UDP网络编程
在 Qt 中,QUdpSocket 类用于实现基于 UDP 协议的网络通信。UDP(用户数据报协议)是一种无连接的协议,与 TCP 不同,它不需要建立连接,因此它的传输速度较快,但也不保证数据的可靠传输。 1. Qt UDP…...
JAVA设计模式——(五)享元模式(Flyweight Pattern)
JAVA设计模式——(五)享元模式(Flyweight Pattern) 概念理解实现创建内部状态定义享元工厂测试 适用性 概念 使共享对象可以有效的支持大量的细粒度对象。主要采用池技术实现。 理解 享元模式主要解决大量对象的共享࿰…...
电竞俱乐部护航点单小程序,和平地铁俱乐部点单系统,三角洲护航小程序,暗区突围俱乐部小程序
电竞俱乐部护航点单小程序开发,和平地铁俱乐部点单系统,三角洲护航小程序,暗区突围俱乐部小程序开发 端口包含: 超管后台, 老板端,打手端,商家端,客服端,管事端&#x…...
mybatis log convert使用
1. idea 搜索插件 mybatis log convert. 安装后重启idea 启动程序. 日志打印后选中输出的内容右键。这里随意选中一段日志做演示 必须要在console中复制才能使用这个日志解析 2. 还有一种用法。没找到...
[U-Net]DA-TRANSUNET
论文题目:DA-TRANSUNET: INTEGRATING SPATIAL AND CHANNEL DUAL ATTENTION WITH TRANSFORMER U-NET FOR MEDICAL IMAGE SEGMENTATION ∗ 中文题目:DA-TRANSUNET:结合空间和通道双注意力与Transformer U-NET的医学图像分割算法 0摘要 精确的医学图像分割对疾病定量和治疗评…...
AI大模型从0到1记录学习 数据结构和算法 day20
4.3 分治算法 4.3.1 概述 分治算法的基本思想为:将原问题递归的分解为若干个(通常是两个以上)规模较小、相互独立且性质相同的子问题,直到子问题足够简单,简单到可以直接求解。然后再返回结果,逐个解决上层…...
面阵相机中M12镜头和远心镜头的区别及性能优势
以下是关于面阵相机中M12镜头和远心镜头的区别及性能优势的详细分析,结合知识库内容整理如下: 一、M12镜头与远心镜头的核心区别 1. 设计原理与光学特性 特性M12镜头远心镜头光学设计标准镜头设计,无特殊光学校正,依赖传统光路。…...
[创业之路-385]:企业法务 - 初创公司如何做好商业秘密的管理
一、商业秘密的定义与价值 定义: 商业秘密是企业的核心资产,包括技术信息(如算法、配方)和经营信息(如客户名单、定价策略),具有非公开性、商业价值、保密性三大特征。价值: 初创公…...
Qt5.15.2+OpenCV4.9.0开发环境搭建详细图文教程(OpenCV使用Qt自带MinGW编译的全过程,包教包会)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》 《实用硬件方案设计》 《结构建模设…...
怎么实现RAG检索相似文档排序:similarities
怎么实现RAG检索相似文档排序:similarities top_5_indices = similarities.argsort()[-5:][::-1] 这行代码的作用是从一组相似度得分中获取相似度最高的5个元素的索引。 similarities:这是一个包含了某个问题与所有文档之间余弦相似度得分的一维数组(假设 similarities 是通…...
NLP高频面试题(五十三)——深度学习正则化详解
一、动因篇 为什么要正则化? 深度神经网络通常包含数以万计甚至数以亿计的参数,模型容量极大,极易在有限的训练数据上“记住”噪声与异常样本,从而出现过拟合(overfitting)现象。过拟合导致模型在训练集上表现优异,但在测试集或真实场景中泛化能力大幅下降。正则化(r…...
2.idea查看某个类的方法名称和实现
2.idea查看某个类的方法名称和实现 ctrl鼠标左键单击类名 点击侧边栏Structure可看到方法名称的统计,这样直观...
FeignClient用法笔记
1. FeignClient简介 在微服务架构中总需要各个服务相互调用,各个服务又是以接口方式暴露,所以需要Http远程调用;为了简化调用,Spring Cloud OpenFeign 库提供了org.springframework.cloud.openfeign.FeignClient 注解:…...
【Redis】 Redis中常见的数据类型(二)
文章目录 前言一、 List 列表1. List 列表简介2.命令3. 阻塞版本命令4. 内部编码5. 使用场景 二、Set 集合1. Set简单介绍2. 普通命令3 . 集合间操作4. 内部编码5. 使用场景 三、Zset 有序集合1.Zset 有序集合简介2. 普通命令3. 集合间操作4. 内部编码5. 使用场景 结语 前言 在…...
电力作业安全工器具全解析:分类、配置与检查要点
在电力行业,每一次作业都面临潜在危险,安全工器具是保障作业人员生命安全的关键。今天,金能电力带大家深入了解电力作业中常见的安全工器具,以及它们的检查与使用要点。 电力作业中安全工器具种类繁多。绝缘安全工器具因直接关联带…...
PowerBI-使用参数动态修改数据源路径
PowerBI-使用参数动态修改数据源路径 在PowerQuery中可以使用参数,通过参数我们可以将多个文件路径相同的字符串进行替换。 以一个案例分享下过程: 第一步,导入一个含有多个sheet表的EXCEL工作薄,点击转换数据,如图…...
Temperature
模型中Temperature参数的详细解释 Temperature 是生成模型(如GPT、LLaMA等)中用于控制输出多样性和随机性的关键超参数。它通过调整模型预测概率分布的平滑程度,直接影响生成文本的创造性与稳定性。 模型中Temperature参数的详细解…...
C++ 日志系统实战第二步:不定参数函数解析
全是通俗易懂的讲解,如果你本节之前的知识都掌握清楚,那就速速来看我的项目笔记吧~ 相关技术知识补充 不定参宏函数 在 C 语言中,不定参宏函数是一种强大的工具,它允许宏接受可变数量的参数,类似于不定参函数&#…...
【高并发】 MySQL锁优化策略
在数据库高并发场景中,行锁、表锁和高并发处理是密切相关的概念,它们共同影响着系统的并发性能和数据一致性。以下是三者的详细解释及高并发处理的策略: 1. 行锁(Row-Level Locking) 行锁是数据库中最小的锁粒度&…...
C语言——填充矩阵
C语言——填充矩阵 一、问题描述二、格式要求1.输入形式2.输出形式3.样例 三、实验代码 一、问题描述 编程实现自动填充nn矩阵元素数值,填充规则为:从第一行最后一列矩阵元素开始按逆时针方向螺旋式填充数值1,2,…,nn…...
CSS3 基础(背景-文本效果)
二、背景效果 属性功能示例值说明background设置背景颜色或渐变background: linear-gradient(45deg, #4CAF50, #FF5722);设置背景颜色、图片或渐变效果。background-size调整背景图片大小background-size: cover;设置背景图片的显示大小,如 cover 或 contain。back…...
点云配准算法之NDT算法原理详解
一、算法概述 NDT(Normal Distributions Transform)最初用于2D激光雷达地图构建(Biber & Straer, 2003),后扩展为3D点云配准。它将点云数据空间划分为网格单元(Voxel),在每个体…...
springboot在eclipse里面运行 run as 是Java Application还是 Maven
在 Eclipse 里运行 Spring Boot 项目时,既可以选择以“Java Application”方式运行,也可以通过 Maven 命令来运行,下面为你详细介绍这两种方式及适用场景。 以“Java Application”方式运行 操作步骤 在项目中找到带有 SpringBootApplicat…...
Redis 基础和高级用法入门
redis 是什么? Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型。Redis提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上:…...
使用vue2开发一个在线旅游预订平台-前端静态网站项目练习
hello,大家好,今天给大家再分享一个前端vue2练习项目-在线旅游预订平台。我们在学习编程的时候,除了学习编程的基础知识,为了让我们快速的掌握一门编程技术,肯定离不开各种项目的练习,今天分享的这个前端练习项目&…...
Ext Direct 功能与使用详解
Ext Direct 是 Ext JS 框架中的一个功能模块,旨在简化前端 JavaScript 应用与后端服务器之间的通信。其核心思想是通过远程过程调用(RPC)协议,将服务器端的方法透明地映射为前端可直接调用的 JavaScript 函数,从而减少手动编写 Ajax 请求和处理响应的代码量。 一、Ext Dir…...
Android移动应用开发入门示例:Activity跳转界面
介绍如何使用LinearLayout布局实现基本的UI设计,并实现两个Activity之间的跳转,适合刚接触Android Studio的新手学习。我们将使用Java语言开发,布局采用XML文件。以下为完整源码与运行说明: 案例前的准备工作: 1.1XM…...
【hadoop】HBase分布式数据库安装部署
一、HBase集群的安装与配置 步骤: 1、使用XFTP将HBase安装包hbase-1.2.0-bin.tar.gz发送到master机器的主目录。 2、解压安装包: tar -zxvf ~/hbase-1.2.0-bin.tar.gz 3、修改文件夹的名字,将其改为hbase,或者创建软连接也可…...
理解npm的工作原理:优化你的项目依赖管理流程
目录 什么是npm npm核心功能 npm 常用指令及其作用 执行npm i 发生了什么? 1. 解析命令与参数 2. 检查依赖文件 3. 依赖版本解析与树构建 4. 缓存检查与包下载 5. 解压包到 node_modules 6. 更新 package-lock.json 7. 处理特殊依赖类型 8. 执行生命周期脚本 9. …...
【Python笔记 04】输入函数、转义字符
一、Input 输入函数 prompt是提示,会在控制台显示,用作提示函数。 name input("请输入您的姓名:") print (name)提示你输入任意信息: 输入input test后回车,他输出input test 二、常用的转义字符 只讲…...
MySQL数据库基本操作-DQL-基本查询
数据库的操作中,查询是最重要的 一、基本查询-数据准备 -- 数据准备 create database if not exists mydb2; use mydb2; create table product( pid int primary key auto_increment, pname varchar(20) not null, price double, category_id varchar(20) …...
13、性能优化:魔法的流畅之道——React 19 memo/lazy
一、记忆封印术(React.memo) 1. 咒语本质 "memo是时间转换器的记忆晶石,冻结无意义的能量波动!" 通过浅层比较(shallowCompare)或自定义预言契约,阻止组件在props未变时重新渲染。 …...
低代码平台开发手机USB-HID调试助手
项目介绍 USB-HID调试助手是一种专门用于调试和测试USB-HID设备的软件工具。USB-HID设备是一类通过USB接口与计算机通信的设备,常见的HID设备包括键盘、鼠标、游戏控制器、以及一些专用的工业控制设备等。 主要功能包括: 数据监控:实时监控和…...
Langchain_Agent+数据库
本处使用Agent数据库,可以直接执行SQL语句。可以多次循环查询问题 前文通过chain去联系数据库并进行操作; 通过链的不断内嵌组合,生成SQL在执行SQL再返回。 初始化 import os from operator import itemgetterimport bs4 from langchain.ch…...