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

2025 CCF BDCI|“基于TPU平台的OCR模型性能优化”一等奖作品

2024年12月,中国计算机学会在海南博鳌成功举办了第十二届CCF大数据与计算智能大赛(简称2024 CCF BDCI)。本届比赛的算能赛道吸引了1748名选手报名,经过激烈角逐,北京航空航天大学的“常务副SOTA”团队脱颖而出,荣获大赛最佳算法能力奖。

本届CCF BDCI大赛中,算能赛道推出了“基于TPU平台的OCR模型性能优化”的赛题,旨在探索如何通过高效的TPU硬件平台— Duo系列开发板,以及先进的算法优化技术,实现OCR模型在精度、速度和资源消耗等方面的全面优化,进而精确识别目标文本。

针对该赛题,“常务副SOTA”团队选择了YOLOv8关键点模型和PPOCRv2-Rec作为基础模型,因其在速度和精度上的优越表现。团队通过通道剪枝、算子融合和词表剪裁等技术,显著减少了计算量和推理时间。在模型转换中,使用TPU-MLIR工具确保高效运行并保持精度。同时,优化前后处理环节,如使用RVV加速图像处理,进一步提升性能。最终,检测模型和识别模型的推理速度分别提升了近4.9倍和3.5倍,单图推理时间缩短至700ms以内。

以下为“常务副SOTA”团队的研究技术报告,供开发者们参考与学习!

团队简介

我们团队由四位深度学习技术爱好者组成,队名为“常务副SOTA”,希望通过比赛来促进队员的成长,也希望提出的方案能为实际应用添砖加瓦。

摘要

随着深度学习的快速发展,OCR(Optical Character Recognition,光学字符识别)技术已广泛应用于文本识别、自动化办公、信息提取等多个领域。然而,由于OCR任务对计算资源的需求较高,如何在低功耗设备上实现高效的OCR模型成为了一个重要挑战。本文基于TPU平台MilkV-Duo部署,针对OCR模型的性能进行优化,涉及模型选择、优化、转换及前后处理等方面。通过一系列的优化手段,包括通道剪枝、模型量化、算子融合、前处理加速等,成功提升了模型的推理速度和精度,最终实现了在端侧设备上的高效运行。

关键词

OCR,TPU-MLIR,MilkV-Duo 部署,量化

1.比赛分析

本次比赛的目标是将OCR模型优化并部署到TPU平台上,达到高效运行的要求。OCR任务通常包括图像输入、前处理、检测、矫正、分类和识别等步骤。在比赛中,参赛队伍需要对OCR模型进行优化,减少模型的计算量和存储需求,同时提高推理速度和准确率。

比赛提供了一个基线模型,该模型的OCR流程如下:

  1. 图像输入:读取输入图像并进行预处理。
  2. 检测前处理:对图像进行一些基本的预处理,例如灰度化、二值化等。
  3. 检测模型:通过模型输出二值图,进一步进行目标区域的识别。
  4. 连通域算法:寻找图像中的目标区域并提取最小外接旋转矩形。
  5. 仿射变换:将图像旋转拉正为矩形。
  6. 分类前处理:对图像进行分类处理,输出旋转角度。
  7. 识别前处理:进一步对图像进行旋转,确保识别模型的准确性。
  8. 识别模型:最后通过识别模型输出识别结果。

比赛的要求是要在TPU平台上实现高效的推理,因此需要优化各个环节,特别是模型的计算量和推理速度。

2.模型选择

为了在TPU平台上实现高效的OCR模型,我们首先从多个候选模型中进行选择。考虑到OCR任务的特点,如需要获取目标的不规则四边形输出,最终我们在PPOCR系列,YOLO目标检测系列,以及YOLO关键点检测系列模型中进行选型。

通过简单的速度实验对比,我们发现PPOCRv4-Det检测模型存在参数量大,模型后处理复杂,且推理速度较慢等明显问题,640*640的输入下端到端需要1080ms才能完成推理,相比之下,YOLOv8检测模型端到端只需要820ms,YOLOv8关键点模型端到端只需要840ms,总的来说使用检测和关键点模型在推理速度上更加有优势。

在选择识别模型时,我们还同时还考虑了精度与速度的平衡,比如PPOCRv4-Rec虽然在精度上有一定提升,但引入Transformer结构后,推理速度较慢,因此我们选择了更早版本,且没有使用Transformer结构的PPOCRv2-Rec作为识别模型。

除此之外,我们考虑到资源占用问题,由于赛题要求在端侧设备上运行,尽量减少OCR任务中的pipeline模型个数,最终我们没有使用方向分类模型,这可以降低资源Milkv-Duo的资源占用。

最终,我们选择使用YOLOv8关键点模型和PPOCRv2-Rec识别模型最为我们团队的OCR任务基座模型,然后在这基础上最更多的优化工作。

3.模型优化

在模型选择之后,我们分别对关键点模型和识别模型进行了多方面的优化,以提高其在TPU平台上的运行效率。具体优化策略如下:

1. 通道剪枝:通过通道剪枝技术,我们减少了YOLOv8n-pose模型的通道为原来的一半,减少了计算量,从而加速了模型的推理速度。我们通过重新训练的方法让通道剪枝能够在不显著降低精度的情况下,减小模型的计算量。

2. 增加特征尺度:在模型的训练过程中,增加了对特征尺度P2(下图黄色部分)的融合,使得模型能够在多个尺度下进行特征提取,从而提高模型对多尺度目标的适应性,进而提升了识别精度。

图1:增加特征尺度

3. 模型算子融合:我们通过算子融合,将多个操作合并为一个操作,如连续的卷积或反卷积和批归一化层、连续的卷积或反卷积和线性变化层等合并为一个算子,还通过将多个复杂琐碎的算子如被拆散的层归一化算子融合为单独的层归一化算子降低了多个算子的计算和访存,通过这一方案,我们成功减少了计算图的复杂性,减小了模型的计算开销。

4. 模型的算子移除:我们通过将一些复杂的后处理算子,如和置信度计算的sigmoid激活以及和提取分类标签的softmax算子从模型中移除,通过和int8输出的反量化融合来减少计算的开销。

5. 词表剪裁:对模型的词表进行了剪裁,将原始的6625个类别减少至3952个,减少了40%的词表大小,缩短了匹配时间。

6. 关键点模型的后处理减枝:我们通过将YOLOv8-pose模型后处理完整裁剪,通过提前使用置信度阈值过滤不必要的计算来提升模型的端到端速度。

通过上述模型层面的优化,我们的方案在保证精度的前提下减少了模型尺寸,减少了模型算子数量,并且避免了大量的冗余计算,更加适合在TPU平台高效运行。

4.模型转换

在模型优化完成后,我们使用TPU-MLIR工具对模型进行转换,以便能够在TPU平台上高效运行。模型转换主要包括以下两个方面:

1. 检测模型转换:将检测模型从onnx转换为mlir格式,最后转换为cvimodel格式。这一过程中,优化了检测模型的输入尺寸,将输入尺寸从640*640调整为320*320,以减少图像前处理的耗时和推理的计算量。我们尝试将检测模型以INT8精度转换,在Milkv-Duo上的精度保持很好,最终我们采用了INT8模型部署,并且将前处理融合到模型道中,以加速端到端的速度。

 2. 识别模型转换:将识别模型从onnx转换为mlir格式,最后转换为cvimodel格式。识别模型的转换过程中,由于原始输入尺寸为32x640,转换时遇到了一些问题,最终通过调整为32x320的输入尺寸,解决了转换失败的问题。我们尝试过INT8精度转换,但是在Milkv-Duo上的精度较差,最终我们选择使用BF16精度部署,并且将前处理融合到模型道中,以加速端到端的速度。

5.前后处理优化

在前后处理阶段,我采用了一些优化策略,以进一步提升模型的运行效率。具体优化手段包括:

1. 前处理优化:使用RVV(RISC-V Vector Extension)实现图像resize操作,将原本120ms的图像resize时间减少至90ms,提升了33.33%的速度。

2. 后处理优化:通过使用int8查表实现sigmoid过滤阈值,减少了后处理的计算量,将后处理的时间从20ms减少至18ms,提升了11.11%的速度。

3. anchor生成优化:通过将anchor生成和softmax计算通过int16进行优化,并结合反量化操作,使得后处理速度提升了66.66%(从10ms降至6ms)。

4. OpenCV优化:使用平头哥的OpenCV替代了opencv-mobile,提升了OpenCV算子的执行速度,进而加速了整体模型的运行。

6.实验记录

经过上述优化后,我们对模型进行了全面的实验验证。实验结果如下:

首先是检测模型的实验情况:

模型

端到端耗时(ms)

备注

Base

1080ms

640x640

Base

650ms

320x320

Pose

472ms

320x320

Pose

440ms

+后处理裁剪

Pose

310ms

+int8 融合前处理

Pose

294ms

+算子融合

Pose

260ms

+rvv reize + 库优化

Pose

242ms

+sigmod/softmax优化

Pose

220ms

+阈值 (conf0.3 iou0.7)

然后是识别模型的实验情况:

模型

端到端耗时(ms)

备注

ppocrv2

560ms

32x640

ppocrv2

380ms

32x320

ppocrv2

220ms

+int8 融合前处理

ppocrv2

209ms

+裁剪softmax

ppocrv2

188ms

+算子融合

ppocrv2

154ms

+裁剪词表

ppocrv2

140ms

+rvv reize  + 库优化

最终,我们优化后的检测模型相比基线版本提升了接近4.9倍,我们优化后的识别模型相比基线版本提升了接近3.5倍。

在单图推理的情况下(包括一次检测和三次识别),优化后的模型能够在700ms以内完成,远低于基线模型的运行时间。这一结果表明,通过上述优化手段,模型在TPU平台上的运行效率得到了显著提升。

致谢

感谢CCF协会、DF平台和SOPHGO公司提供的宝贵机会;感谢主办方免费提供的milkv duo开发板,以及主办方针对开发板板特性和模型部署问题的答疑;感谢平头哥和nihui老师开源OpenCV-THead和OpenCV-Mobile;感谢百度PaddlePaddle团队开源PPOCR工具;感谢Ultralytics对YOLO模型的开源;感谢一起参加此次比赛的友军的分享和讨论。

参考

[1] Ultralytic, YOLOv8,https://github.com/ultralytics/ultralytics

[2] nihui,OpenCV-Mobile,https://github.com/nihui/opencv-mobile

[3] 平头哥团队,OpenCV-Mobile,https://www.xrvm.cn/community/

download?id=4112956065753141248

相关文章:

2025 CCF BDCI|“基于TPU平台的OCR模型性能优化”一等奖作品

2024年12月,中国计算机学会在海南博鳌成功举办了第十二届CCF大数据与计算智能大赛(简称2024 CCF BDCI)。本届比赛的算能赛道吸引了1748名选手报名,经过激烈角逐,北京航空航天大学的“常务副SOTA”团队脱颖而出&#xf…...

结合深度学习、自然语言处理(NLP)与多准则决策的三阶段技术框架,旨在实现从消费者情感分析到个性化决策

针对电商个性化推荐场景的集成机器学习和稳健优化三阶段方案。 第一阶段:在线评论数据处理,利用深度学习和自然语言处理技术进行特征挖掘,进而进行消费者情感分析,得到消费者偏好 在第一阶段,我们主要关注如何通过深度学习和自然语…...

Linux系统安装Nginx详解(适用于CentOS 7)

目录 1. 更新系统包 2. 安装EPEL仓库 3. 安装Nginx 4. 启动Nginx服务 5. 设置Nginx开机自启 6. 检查Nginx状态 7. 配置防火墙 8. 访问Nginx默认页面 9. 配置Nginx(可选) 10. 重启Nginx 解决步骤 1. 检查系统版本 2. 移除错误的 Nginx 仓库 …...

Qt常用控件 输入类控件

文章目录 1.QLineEdit1.1 常用属性1.2 常用信号1.3 例子1,录入用户信息1.4 例子2,正则验证手机号1.5 例子3,验证输入的密码1.6 例子4,显示密码 2. QTextEdit2.1 常用属性2.2 常用信号2.3 例子1,获取输入框的内容2.4 例…...

[LeetCode]全排列I,II

全排列I 给定一个不含重复数字的整数数组 nums ,返回其 所有可能的全排列 。可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入&#xff1…...

力扣.270. 最接近的二叉搜索树值(中序遍历思想)

文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的中序遍历) 本题的难点在于可能存在多个答案,并且要返回最小的那一个,为了解决这个问题,我门则要利用上二叉搜索树中序遍历为有序序列的特性,具体到代码中&a…...

Spring 核心技术解析【纯干货版】- VIII:Spring 数据访问模块 Spring-Tx 模块精讲

在企业级开发中,事务管理是保障数据一致性和完整性的重要手段。Spring 作为 Java 生态中广泛使用的框架,其事务管理模块(Spring-Tx)不仅提供了强大的功能,还极大地简化了开发者在不同技术栈中的事务处理工作。无论是编…...

Vue混入(Mixins)与插件开发深度解析

Vue混入(Mixins)与插件开发深度解析 Vue混入(Mixins)与插件开发深度解析1. Vue混入(Mixins)核心概念1.1 什么是混入1.1.1 本质定义与技术定位1.1.2 混入与相关概念的对比1.1.3 适用场景分析1.1.4 设计哲学与…...

Linux里的容器被OOM killed的两种情况

生产上遇到过几次容器实例被OOM的现象,总结一下LInux OOM的两种触发条件。我的虚拟机是ubuntu 24.0.4版本,分配4G内存,在我的虚拟机上复现这两种case。 一 宿主机物理内存不够 当linux上所有应用程序的内存需求加起来超出了物理内存&#x…...

十一、CentOS Stream 9 安装 Docker

一、Docker 环境安装 1、软件源(仓库)信息 使用如下命令可列出当前系统配置的所有软件源(仓库)信息 # 列出所有软件源 dnf repolist 这表明系统有三个仓库 AppStream 、 BaseOS、Extras-Common 被启用 2、配置软件源镜像 使用如下命令可配置 Docker 软件包下载的镜像地址 …...

【数据结构】链表应用-链表重新排序

重新排序 反转链表预期实现思路解题过程code力扣代码核心代码完整代码 总结 删除链表中间节点代码解惑 链表重新排序题目描述解题思路解题过程复杂度代码力扣代码完整代码 反转链表 预期实现 思路 你选用何种方法解题? 我选用了迭代法来反转链表。这是一种经典且高…...

e2studio开发RA2E1(9)----定时器GPT配置输入捕获

e2studio开发RA2E1.9--定时器GPT配置输入捕获 概述视频教学样品申请硬件准备参考程序源码下载选择计时器时钟源UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()printf输出重定向到串口定时器输入捕获配…...

qt使用MQTT协议连接阿里云demo

qt使用Mqtt协议连接阿里云。 在配置好qt关于MQTT的环境之后,主要就是根据MQTT的连接参数进行连接即可。 环境配置推荐链接QT编译并部署QtMqtt相关环境跑测demo【超详细教程】_mqtt qt开发教程-CSDN博客 连接核心代码,主要就是根据阿里云的MQTT相关参数进行配置实现连…...

Python分享20个Excel自动化脚本

在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式。通过Python,我们可以实现对Excel文件的各种自动化操作,提高工作效率。 本文将分享20个实用的Excel自动化脚本,以帮助新手小白更轻松地掌握这些技能。 1. Excel单…...

DNN(深度神经网络)近似 Lyapunov 函数

import torch import torch.nn as nn import torch.optim as optim import matplotlib.pyplot as plt # from torchviz import make_dot import torchviz# 1. Lyapunov 函数近似器(MLP 结构) class LyapunovNet(nn.Module):def __init__(self, input_dim…...

什么是数据库代理

数据库代理(DB Proxy)是一种位于应用程序和数据库服务器之间的中间件,充当两者之间的“中间人”。它的核心目标是优化数据库访问、提升性能、增强安全性,并简化数据库架构的复杂度,尤其在高并发、分布式或云环境中应用…...

深入浅出 DeepSeek V2 高效的MoE语言模型

今天,我们来聊聊 DeepSeek V2 高效的 MoE 语言模型,带大家一起深入理解这篇论文的精髓,同时,告诉大家如何将这些概念应用到实际中。 🌟 什么是 MoE?——Mixture of Experts(专家混合模型&#x…...

【创建模式-单例模式(Singleton Pattern)】

赐萧瑀 实现方案饿汉模式懒汉式(非线程安全)懒汉模式(线程安全)双重检查锁定静态内部类 攻击方式序列化攻击反射攻击 枚举(最佳实践)枚举是一种类 唐 李世民 疾风知劲草,板荡识诚臣。 勇夫安识义,智者必怀仁…...

计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

6. 【Vue实战--孢子记账--Web 版开发】-- 主币种设置

从这篇文章开始我们将一起实现孢子记账的功能,这篇文章实现主币种设置。这个功能比较简单,因此我们从这个功能开始做。 一、功能 根据项目前期的需求调研,用户需要在设置主币种的时候查看汇率信息(别问为什么有这么个需求&#…...

RabbitMQ深度探索:前置知识

消息中间件: 消息中间件基于队列模式实现异步 / 同步传输数据作用:可以实现支撑高并发、异步解耦、流量削峰、降低耦合 传统的 HTTP 请求存在的缺点: HTTP 请求基于响应的模型,在高并发的情况下,客户端发送大量的请求…...

【文件上传、秒传、分片上传、断点续传、重传】

文章目录 获取文件对象文件上传&#xff08;秒传、分片上传、断点续传、重传&#xff09;优化 获取文件对象 input标签的onchange方法接收到的参数就是用户上传的所有文件 <html lang"en"><head><title>文件上传</title><style>#inp…...

设计模式Python版 组合模式

文章目录 前言一、组合模式二、组合模式实现方式三、组合模式示例四、组合模式在Django中的应用 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式…...

python开发:爬虫示例——GET和POST请求处理

一、Get请求 import json import requests#输入示例&#xff1a;urlhttps://www.baidu.com #RequestHeader:F12标头-请求标头-原始-复制到这&#xff08;忽略第一句&#xff09; def GetRequest(url,RequestHeader""):try:dic{}RequestHeaderList RequestHeader.s…...

【3分钟极速部署】在本地快速部署deepseek

第一步&#xff0c;找到网站&#xff0c;下载&#xff1a; 首先找到Ollama &#xff0c; 根据自己的电脑下载对应的版本 。 我个人用的是Windows 我就先尝试用Windows版本了 &#xff0c;文件不是很大&#xff0c;下载也比较的快 第二部就是安装了 &#xff1a; 安装完成后提示…...

【归属地】批量号码归属地查询按城市高速的分流,基于WPF的解决方案

在现代商业活动中&#xff0c;企业为了提高营销效果和资源利用效率&#xff0c;需要针对不同地区的市场特点开展精准营销。通过批量号码归属地查询并按城市分流&#xff0c;可以为企业的营销决策提供有力支持。 短信营销&#xff1a;一家连锁餐饮企业计划开展促销活动&#xf…...

大数据sql查询速度慢有哪些原因

1.索引问题 可能缺少索引&#xff0c;也有可能是索引不生效 2.连接数配置&#xff1a;连接数过少/连接池比较小 连接数过 3.sql本身有问题&#xff0c;响应比较慢&#xff0c;比如多表 4.数据量比较大 -这种最好采用分表设计 或分批查询 5.缓存池大小 可能是缓存问题&#xff…...

安卓路由与aop 以及 Router-api

安卓路由&#xff08;Android Router&#xff09;和AOP&#xff08;面向切面编程&#xff09;是两个在Android开发中常用的概念。下面我将详细讲解这两个概念及其在Android开发中的应用。 一、安卓路由 安卓路由主要用于在应用程序中管理不同组件之间的导航和通信。它可以简化…...

游戏引擎学习第89天

回顾 由于一直没有渲染器&#xff0c;终于决定开始动手做一个渲染器&#xff0c;虽然开始时并不确定该如何进行&#xff0c;但一旦开始做&#xff0c;发现这其实是正确的决定。因此&#xff0c;接下来可能会花一到两周的时间来编写渲染器&#xff0c;甚至可能更长时间&#xf…...

备战蓝桥杯-洛谷

今天打算写一些洛谷上面的题目 P10904 [蓝桥杯 2024 省 C] 挖矿 https://www.luogu.com.cn/problem/P10904 看了大佬写的题解才写出来这道题的&#xff1a;题解&#xff1a;P10904 [蓝桥杯 2024 省 C] 挖矿 - 洛谷专栏 思路&#xff1a; 这是一道贪心的题目&#xff0c;用…...

动手学图神经网络(9):利用图神经网络进行节点分类 WeightsBiases

利用图神经网络进行节点分类Weights&Biases 引言 在本篇博客中,将深入探讨如何使用图神经网络(GNNs)来完成节点分类任务。以 Cora 数据集为例,该数据集是一个引用网络,节点代表文档,推断每个文档的类别。同时,使用 Weights & Biases(W&B)来跟踪实验过程和…...

如何在 FastAPI 中使用本地资源自定义 Swagger UI

要自定义 FastAPI 中的 Swagger UI&#xff0c;且使用本地资源来代替 CDN。只是需要稍微修改一下。 修改后的代码&#xff1a; 步骤&#xff1a; 挂载本地静态文件目录&#xff1a;我们将本地的 Swagger UI 资源文件&#xff08;如 .js, .css, favicon.png 等&#xff09;放…...

Swift 进阶:Observation 框架中可观察(@Observable)对象的高级操作(上)

概述 在 WWDC 24 中苹果推出了全新的 Observation 框架,借助于它我们可以更加细粒度的监听可观察(@Observable)对象 。同时,SwiftUI 自身也与时偕行开始全面支持 @Observable 对象的“嵌入”。 然而在这里,我们却另辟蹊径来介绍 @Observable 对象另外一些“鲜为人知”的故…...

aws(学习笔记第二十七课) 使用aws API Gateway+lambda体验REST API

aws(学习笔记第二十七课) 使用aws API Gatewaylambda体验REST API 学习内容&#xff1a; 使用aws API Gatewaylambda 1. 使用aws API Gatewaylambda 作成概要 使用api gateway定义REST API&#xff0c;之后再接收到了http request之后&#xff0c;redirect到lambda进行执行。…...

UE学习日志#23 C++笔记#9 编码风格

注&#xff1a;此文章为学习笔记&#xff0c;只记录个人不熟悉或备忘的内容 1 为代码编写文档 1.1 使用注释的原因 1.说明用途的注释 应该注释的信息&#xff1a;输入&#xff0c;输出含义&#xff0c;参数的类型含义&#xff0c;错误条件和处理&#xff0c;预期用途&#x…...

vue2-vue自定义指令

文章目录 vue2-vue自定义指令1. 什么是指令2. 自定义指令2.1 全局注册2.2 局部注册 3. 自定义指令的钩子函数4. 钩子函数的参数4. 用例 vue2-vue自定义指令 1. 什么是指令 在vue中提供了一套为数据驱动视图更为方便的操作&#xff0c;这些操作被称为指令系统我们平时使用的v-…...

[250202] DocumentDB 开源发布:基于 PostgreSQL 的文档数据库新选择 | Jekyll 4.4.0 发布

目录 DocumentDB 开源发布&#xff1a;基于 PostgreSQL 的文档数据库新选择DocumentDB 的使命DocumentDB 的架构 Jekyll 4.4.0 版本发布&#x1f195; 新特性与改进 DocumentDB 开源发布&#xff1a;基于 PostgreSQL 的文档数据库新选择 微软近日宣布开源 DocumentDB&#xff…...

matplotlib绘制三维曲面图时遇到的问题及解决方法

在科学计算和数据可视化中&#xff0c;三维曲面图是非常有用的工具&#xff0c;可以直观地展示数据的三维分布和关系。Matplotlib是Python中广泛使用的数据可视化库之一&#xff0c;提供了强大的三维绘图功能。然而&#xff0c;在实际使用过程中&#xff0c;用户可能会遇到各种…...

【数据结构】(4) 线性表 List

一、什么是线性表 线性表就是 n 个相同类型元素的有限序列&#xff0c;每一个元素只有一个前驱和后继&#xff08;除了第一个和最后一个元素&#xff09;。 数据结构中&#xff0c;常见的线性表有&#xff1a;顺序表、链表、栈、队列。 二、什么是 List List 是 Java 中的线性…...

简单React项目从0到1

文章目录 项目搭建基于CRA创建项目调整项目目录结构 使用scss预处理器组件库antd使用配置基础路由配置别名路径路径编译配置VsCode提示配置 基本结构搭建表单校验实现获取登录表单数据封装request工具模块使用Redux管理token安装Redux相关工具包配置Redux 实现登录逻辑token持久…...

IM 即时通讯系统-46-OpenIM 提供了专为开发者设计的开源即时通讯解决方案

IM 开源系列 IM 即时通讯系统-41-开源 野火IM 专注于即时通讯实时音视频技术&#xff0c;提供优质可控的IMRTC能力 IM 即时通讯系统-42-基于netty实现的IM服务端,提供客户端jar包,可集成自己的登录系统 IM 即时通讯系统-43-简单的仿QQ聊天安卓APP IM 即时通讯系统-44-仿QQ即…...

MFC 学习笔记目录

序章 MFC学习笔记专栏开篇语-CSDN博客 下载与安装 VS2010 下载与安装 VS2019...

一文讲解Java中的ArrayList和LinkedList

ArrayList和LinkedList有什么区别&#xff1f; ArrayList 是基于数组实现的&#xff0c;LinkedList 是基于链表实现的。 二者用途有什么不同&#xff1f; 多数情况下&#xff0c;ArrayList更利于查找&#xff0c;LinkedList更利于增删 由于 ArrayList 是基于数组实现的&#…...

【Linux系统】线程:线程的优点 / 缺点 / 超线程技术 / 异常 / 用途

1、线程的优点 创建和删除线程代价较小 创建一个新线程的代价要比创建一个新进程小得多&#xff0c;删除代价也小。这种说法主要基于以下几个方面&#xff1a; &#xff08;1&#xff09;资源共享 内存空间&#xff1a;每个进程都有自己独立的内存空间&#xff0c;包括代码段…...

HTML 复习

文章目录 路径问题标题标签段落标签换行标签列表标签<ol> 有序列表<ul> 无序标签标签嵌套 超链接标签多媒体标签<img> 图片标签<audio> 音频标签<video> 视频标签 表格标签<colspan> 跨行<rowspan> 跨列组合使用 表单标签基本表单标…...

网络爬虫学习:借助DeepSeek完善爬虫软件,增加停止任务功能

一、引言 我从24年11月份开始学习网络爬虫应用开发&#xff0c;经过2个来月的努力&#xff0c;终于完成了开发一款网络爬虫软件的学习目标。这几天对本次学习及应用开发进行一下回顾总结。前面已经发布了两篇日志&#xff1a; 网络爬虫学习&#xff1a;应用selenium从搜*狐搜…...

【数据结构】单向链表(真正的零基础)

放弃眼高手低&#xff0c;你真正投入学习&#xff0c;会因为找到一个新方法产生成就感&#xff0c;学习不仅是片面的记单词、学高数......只要是提升自己的过程&#xff0c;探索到了未知&#xff0c;就是学习。 目录 一.链表的理解 二.链表的分类&#xff08;重点理解&#xf…...

8. k8s二进制集群之Kubectl部署

创建kubectl证书请求文件生成admin证书文件复制admin证书到指定目录生成kubeconfig配置文件接下来完成kubectl配置文件的角色绑定【扩展】kubectl命令补全操作继续上一篇文章《k8s二进制集群之Kube ApiServer部署》下面介绍一下k8s中的命令行管理工具kubectl。 通过kubectl可以…...

115,【7】 攻防世界 web fileinclude

进入靶场 试着访问了几个文件&#xff0c;都没得到信息&#xff0c;f12看看源码 还真有 <?php // 检查是否开启了错误显示功能 // ini_get 函数用于获取 PHP 配置选项的值&#xff0c;这里检查 display_errors 选项是否开启 if( !ini_get(display_errors) ) {// 如果错误…...

RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)

接上篇&#xff1a;《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;一&#xff09;》 链接 文章目录 4.安装RabbitMQ Messaging Topology Operator 裸金属环境部署RabbitMQ部署单实例部署集群 4.安装RabbitMQ Messaging Topology Operator 使用 cer…...