计算机视觉——基于树莓派的YOLO11模型优化与实时目标检测、跟踪及计数的实践
概述
设想一下,你在多地拥有多个仓库,要同时监控每个仓库的实时状况,这对于时间和精力而言,都构成了一项艰巨挑战。从成本和可靠性的层面考量,大规模部署计算设备也并非可行之策。一方面,大量计算设备的购置、维护成本会让你的预算不堪重负;另一方面,设备数量增多,出现故障的概率也会相应提升,这无疑会给仓库的稳定监控带来极大的不确定性。
基于云的系统看似是一个解决之道,但实际上也存在诸多弊端。云计算系统在运行过程中,常常会受到网络状况、服务器负载等因素的影响,导致数据处理速度缓慢,甚至出现服务中断的情况。并且,随着数据量的不断增长以及使用时长的累积,基于云的系统所产生的费用也会持续攀升,这无疑会进一步加重你的经济负担。
在此种情形下,边缘计算技术的优势便凸显出来。与传统模式中将数据在本地与遥远服务器之间来回传输不同,边缘计算支持在数据产生的源头直接进行本地处理。这种方式不仅能够显著减少数据传输过程中的延迟,还能降低对网络带宽的依赖,从而大大提高了数据处理的效率和稳定性。
在众多实现边缘计算的方案中,在 树莓派 上运用 YOLO11 是一种极具性价比的选择。树莓派以其低成本、低功耗且具备一定计算能力的特性,为边缘计算提供了一个理想的硬件载体。而 YOLO11 作为先进的目标检测算法,能够高效精准地识别和分析图像或视频中的目标物体。将二者结合,能够在仓库现场实现实时的数据处理与分析,为仓库的安全管理和高效运营提供有力保障。
一、树莓派
树莓派最初是一款信用卡大小的计算机,其设计初衷是激发人们对基础计算机科学的兴趣。随着时间的推移,它已发展成为各类应用的首选平台,尤其是在边缘人工智能领域表现出色。2012 年,树莓派基金会发布了第一代树莓派,当时售价仅约合人民币 230 元,这一举措立刻在爱好者、教育工作者和专业人士群体中引发了极大的轰动。截至目前,树莓派系列的销量已突破6000 万台,且每一代产品都在前一代的基础上实现了性能的显著提升。
1.1 树莓派各代产品快速概览
- 树莓派 1:作为低成本单板计算领域的先驱,其处理能力相对有限,更适合执行轻量级任务以及开展教育项目。
- 树莓派 2 和 3:这两代产品在 CPU 性能上有了显著升级,内存容量也有所增加,同时还内置了 Wi - Fi 和蓝牙连接功能。这些改进为开展轻量级服务器任务、机器人技术研究以及早期人工智能实验奠定了坚实基础。
- 树莓派 4:引入了 USB 3.0 端口,最高支持 8GB 内存,并配备了更强大的 GPU。这些特性拓宽了其在计算机视觉、媒体中心以及更复杂应用场景中的应用范围。
- 树莓派 5:作为最新款型号,配备了2.4 GHz 四核 ARM Cortex - A76 处理器、经过优化的VideoCore VII GPU,支持PCIe连接,以及4GB 或 8GB 配置的 LPDDR4X - 4267 SDRAM,性能得到了进一步飞跃。
1.2 为什么树莓派非常适合边缘人工智能
- 成本效益高:树莓派价格低于人民币 700 元(树莓派 5 基础版通常约为 350 元),这使得用户能够在不同位置部署多个设备。想象一下,用这些小巧的板子装备整个工厂车间,实现分布式实时分析,而无需担心超出预算。
- 强大的社区支持:丰富的开源文档、众多的技术论坛以及社区驱动的库,让故障排除变得更加轻松。例如,picamera2 或 libcamera 等工具可以直接集成摄像头模块,用户几乎可以立即捕获图像数据,用于基于 YOLO 的推理。
- 改进的硬件加速:随着树莓派各代新产品的不断推出,其硬件加速能力也在持续提升。树莓派 5 增强的 GPU,再加上可能添加的谷歌珊瑚 USB 加速器,能够为更复杂的 YOLO11 变体提供额外的性能提升。
注意:本文使用的是树莓派 5(8GB)。
如果有关注过YOLO系列模型,就会了解到它们以高精度和实时目标检测能力而闻名。从 YOLOv3、YOLOv5 到 YOLOv8 等每一个新版本,都引入了更优的架构,以更快速、高效地处理计算机视觉任务。如今,YOLO11进一步推动了这些优化,以下是它在像树莓派这样的边缘设备上脱颖而出的原因:
- 低延迟:由于采用了诸如C3k2和C2PSA模块等架构改进,YOLO11 不仅能够准确地检测目标,还能以毫秒级延迟完成检测。这在需要快速决策以节省时间、资源甚至挽救生命的场景中至关重要,例如无人机应用、机器人技术或安全系统。
- NCNN 集成:通过将 PyTorch 权重转换为专为边缘设备设计的NCNN格式,推理时间最多可缩短62%,使实时检测不再仅仅停留在理论层面。
- 保持高 mAP:尽管 YOLO11 的模型更为轻量,但在常见的目标检测基准测试中仍能保持约**55%**的平均精度均值(mAP)。这种速度和精度的平衡确保了在提高效率的同时,不会牺牲检测质量。
我们之所以选择在树莓派上使用YOLO11,是因为它在速度、精度和资源效率方面实现了最佳平衡。传统的解决方案可能需要强大的 GPU 或大型计算集群才能实现实时结果,而 YOLO11 可以直接在边缘设备上运行——无需额外的硬件加速器(当然,如果您有需求,也可以添加)。
二、实现流程
为了在树莓派上实现高效的实时目标检测与跟踪,我们首先需要构建一个适合的开发环境,并对YOLO11模型进行优化导出。以下是详细的实现流程:
2.1 环境搭建
首先,创建一个独立的Python开发环境,以确保依赖库的兼容性与稳定性:
conda create -n yolo11xrpi python=3.11
conda activate yolo11xrpi
pip install ultralytics
此环境配置为后续模型导出与推理任务提供了必要的基础支持。
2.2 模型导出策略
鉴于树莓派的硬件特性,我们重点关注三种模型导出格式:OpenVINO、NCNN 和 MNN。这三种格式均针对边缘设备进行了优化,能够在保持模型精度的同时,显著提升推理速度。
- OpenVINO:作为英特尔推出的工具包,OpenVINO通过深度优化,能够在英特尔硬件及兼容设备(如树莓派)上实现高效的神经网络推理。它提供了丰富的预优化模型与推理引擎,能够显著降低推理延迟。
- NCNN:由腾讯开发的高性能神经网络推理框架,专为ARM架构的移动与边缘设备设计。NCNN以其轻量级特性与高效的计算性能,成为在树莓派上部署深度学习模型的理想选择。
- MNN:阿里巴巴开发的移动神经网络框架,针对移动与嵌入式平台进行了全面优化。MNN支持多种硬件加速技术,包括GPU加速,能够在树莓派上实现快速且稳定的推理。
我们使用Ultralytics提供的导出命令将YOLO11模型转换为上述格式:
yolo export model=yolo11n.pt format=ncnn
详细的导出参数与配置可参考Ultralytics文档。
在本实验中,我们选用YOLO11n模型作为主要研究对象,因其在存储空间占用与检测精度之间取得了良好的平衡,能够满足树莓派的硬件约束,同时提供较高的帧率与检测精度。
2.3 代码实现
2.3.1 导入库与设置
导入必要的Python库,为后续的图像处理、模型推理与结果展示提供支持:
import cv2
import numpy as np
import time
from ultralytics import YOLO
from collections import defaultdict
- OpenCV(
cv2
):用于视频帧的读取、边界框的绘制以及图像的显示与保存。 - NumPy(
np
):用于高效的数值计算与数组操作,便于处理模型输出的检测结果。 - time:用于测量每帧的处理时间,进而计算实时帧率(FPS)。
YOLO
:Ultralytics提供的YOLO模型接口,用于加载预训练模型并执行检测与跟踪任务。defaultdict
:用于存储跟踪目标的历史信息,无需手动检查键是否存在,简化了代码逻辑。
2.3.2 定义推理函数
定义inference
函数,封装模型推理的完整流程:
def inference(model,mode,task,video_path=None,save_output=False,output_path="output.mp4",show_output=True,count=False,show_tracks=False,
):pass
该函数接受以下参数:
model
:加载的YOLO模型实例。mode
:输入模式,可选值为"cam"
(使用网络摄像头)或"video"
(从视频文件读取)。task
:任务类型,可选值为"detect"
(目标检测)或"track"
(目标跟踪)。video_path
:当mode
为"video"
时,指定视频文件的路径。save_output
:是否保存处理后的视频输出。output_path
:保存输出视频的路径。show_output
:是否实时显示处理结果。count
:是否对检测到的目标进行计数。show_tracks
:是否绘制目标的运动轨迹。
2.3.3 预处理
根据输入模式初始化视频捕获对象,并设置相关参数:
if mode == "cam":cap = cv2.VideoCapture(0)
elif mode == "video":if video_path is None:raise ValueError("Please provide a valid video path for video mode.")cap = cv2.VideoCapture(video_path)
else:raise ValueError("Invalid mode. Use 'cam' or 'video'.")track_history = defaultdict(lambda: [])
seen_ids_per_class = defaultdict(set)fourcc = cv2.VideoWriter_fourcc(*"mp4v")
input_fps = cap.get(cv2.CAP_PROP_FPS)
out = None
- 创建
VideoCapture
对象,用于从网络摄像头或视频文件中读取视频帧。 - 初始化
track_history
字典,用于存储每个跟踪目标的历史轨迹信息,便于后续绘制运动轨迹。 - 初始化
seen_ids_per_class
字典,用于记录每个类别中已检测到的唯一目标ID,以便进行目标计数。 - 设置视频编码格式与输入视频的帧率,为保存输出视频做准备。
2.3.4 主处理循环
进入主循环,逐帧处理视频数据:
while cap.isOpened():success, frame = cap.read()if not success:print("Failed to read frame or end of video")breakstart_time = time.time()class_counts = defaultdict(int)if task == "track":results = model.track(frame, conf=0.3, persist=True, tracker="bytetrack.yaml")elif task == "detect":results = model.predict(frame, conf=0.5)else:raise ValueError("Invalid task. Use 'detect' or 'track'.")end_time = time.time()annotated_frame = results[0].plot()
- 从视频捕获对象中读取一帧,若读取失败则退出循环。
- 记录当前帧的处理开始时间,用于后续计算帧率。
- 根据任务类型(检测或跟踪),调用YOLO模型的相应方法进行推理。
- 在跟踪模式下,设置较低的置信度阈值(
conf=0.3
),并启用目标持久化跟踪(persist=True
),同时指定跟踪算法配置文件("bytetrack.yaml"
)。 - 在检测模式下,使用较高的置信度阈值(
conf=0.5
)进行目标检测。
- 在跟踪模式下,设置较低的置信度阈值(
- 记录当前帧的处理结束时间,并调用
results[0].plot()
方法生成带有检测或跟踪结果的注释帧。
2.3.5 YOLO的输出张量解析
YOLO模型的输出结果存储在results
列表中,其中results[0]
包含了当前帧的检测或跟踪信息。关键属性如下:
results[0].boxes
:包含检测到的目标边界框信息。boxes.xywh
:以(x_center, y_center, width, height
)格式表示边界框的中心点坐标、宽度与高度。boxes.cls
:每个边界框对应的类别索引,可通过results[0].names
将其映射为类别名称。boxes.id
(仅在跟踪模式下可用):每个边界框的唯一跟踪ID,用于在连续帧中标识同一目标。
2.3.6 检测与跟踪逻辑
检测模式
在检测模式下,对每个检测到的目标进行类别统计:
if task == "detect":results = model.predict(frame, conf=0.5)if results[0].boxes and results[0].boxes.cls is not None:boxes = results[0].boxes.xywh.cpu()class_ids = results[0].boxes.cls.int().cpu().tolist()names = results[0].namesif count:class_counts = defaultdict(int)for cls_id in class_ids:class_counts[names[cls_id]] += 1
- 获取检测结果中的边界框坐标、类别索引以及类别名称映射表。
- 若启用了目标计数功能(
count=True
),则遍历类别索引列表,统计每个类别的目标数量。
跟踪模式
在跟踪模式下,利用目标的唯一ID进行更复杂的处理:
if task == "track":results = model.track(frame, conf=0.3, persist=True, tracker="bytetrack.yaml")if task == "track" and results[0].boxes.id is not None:track_ids = results[0].boxes.id.int().cpu().tolist()for box, cls_id, track_id in zip(boxes, class_ids, track_ids):x, y, w, h = boxclass_name = names[cls_id]if count:seen_ids_per_class[class_name].add(track_id)track_history[track_id].append((x, y))
- 获取跟踪结果中的目标ID列表。
- 遍历每个目标的边界框、类别索引与跟踪ID,执行以下操作:
- 若启用了目标计数功能,则将当前目标的跟踪ID添加到对应类别的集合中,确保每个目标仅被计数一次。
- 将当前目标的坐标信息添加到其跟踪历史记录中,便于后续绘制运动轨迹。
2.3.7 目标计数与轨迹绘制
在跟踪模式下,通过维护目标的唯一ID,实现对每个类别的唯一目标数量统计:
if count:seen_ids_per_class[class_name].add(track_id)
在检测模式下,仅对当前帧中的目标进行简单计数:
if task == "detect" and count:for cls_id in class_ids:class_counts[names[cls_id]] += 1
通过这两种方式,我们能够在不同任务模式下灵活地统计目标数量,满足多样化的应用场景需求。
三、推理结果与性能分析
为了评估YOLO11模型在树莓派上的推理性能,我们对其进行了全面的基准测试。测试环境为树莓派5,使用YOLO11n模型在COCO数据集上进行评估,图像尺寸设置为640×640像素。测试结果如下表所示:
格式 | 状态 | 大小 (MB) | mAP (50-95) | 推理时间 (ms/帧) | FPS |
---|---|---|---|---|---|
PyTorch | ✅ | 5.4 | 0.610 | 360.09 | 2.78 |
TorchScript | ✅ | 10.5 | 0.608 | 472.03 | 2.12 |
ONNX | ✅ | 10.2 | 0.608 | 156.84 | 6.38 |
OpenVINO | ✅ | 10.4 | 0.609 | 80.93 | 12.36 |
TensorFlow SM | ✅ | 26.5 | 0.608 | 510.25 | 1.96 |
TensorFlow GD | ✅ | 10.3 | 0.608 | 515.56 | 1.94 |
TensorFlow Lite | ✅ | 10.3 | 0.608 | 354.82 | 2.82 |
PaddlePaddle | ✅ | 20.4 | 0.608 | 665.49 | 1.5 |
MNN | ✅ | 10.1 | 0.610 | 115.83 | 8.63 |
NCNN | ✅ | 10.2 | 0.611 | 292.10 | 3.42 |
从测试结果可以看出,OpenVINO和MNN格式在树莓派上表现出了较高的推理速度,分别达到了12.36 FPS和8.63 FPS。其中,OpenVINO格式在保持较高平均精度均值(mAP)的同时,具有最快的推理速度,适合对实时性要求较高的应用场景;而NCNN格式虽然在推理速度上略逊于OpenVINO,但其mAP值最高,达到了0.611,表明在检测精度方面具有一定优势。
为了进一步验证模型在实际应用中的效果,我们分别使用MNN、OpenVINO和NCNN格式进行了目标检测与跟踪任务的推理实验,并通过视频展示了推理结果。以下是部分实验结果的描述:
3.1 MNN格式推理结果
使用MNN格式进行目标检测与跟踪任务的推理实验,结果表明,该格式在树莓派上能够实现较为流畅的实时推理,平均帧率约为8-10 FPS。实验中,模型能够准确地检测出视频中的目标,并为其绘制边界框与类别标签。在跟踪任务中,目标的运动轨迹能够被清晰地绘制出来,且跟踪效果稳定,即使在目标发生遮挡或快速运动的情况下,仍能保持较好的跟踪精度。这表明MNN格式在树莓派上具有良好的适用性,能够在资源受限的嵌入式设备上实现高效的目标检测与跟踪。
在树莓派上部署yolo11目标检测与行人追踪效果
3.2 OpenVINO格式推理结果
在OpenVINO格式下进行目标检测与分割任务的推理实验,结果显示,该格式在树莓派上能够实现较高的推理速度,平均帧率可达10-12 FPS。在目标检测任务中,模型能够快速准确地检测出视频中的目标,并为其绘制边界框与类别标签。在目标分割任务中,模型能够对目标进行较为精细的分割,分割结果的边界较为清晰,且与目标的实际轮廓较为贴合。这表明OpenVINO格式在树莓派上具有较高的推理效率和较好的分割精度,适合对实时性和分割精度要求较高的应用场景。
基于OpenVINO对yolo11分割推理结果
3.3 NCNN格式推理结果
使用NCNN格式进行目标检测与姿态估计任务的推理实验,实验结果表明,该格式在树莓派上能够实现较为准确的目标检测与姿态估计。在目标检测任务中,模型能够准确地检测出视频中的目标,并为其绘制边界框与类别标签。在姿态估计任务中,模型能够对目标的姿态进行较为准确的估计,并绘制出目标的关键点与姿态骨架。虽然NCNN格式的推理速度略低于OpenVINO格式,但其检测精度和姿态估计精度较高,能够满足对检测精度和姿态估计精度要求较高的应用场景。
在树莓派上输出基于 yolo11 的姿态 ncnn 推理结果
3.4 实时检测、跟踪与计数实验结果
了模拟实时工业应用场景,我们进行了实时目标检测、跟踪与计数的实验。实验中,模型能够实时地检测出视频中的目标,并对其进行跟踪与计数。在检测任务中,模型能够准确地检测出视频中的目标,并为其绘制边界框与类别标签;在跟踪任务中,目标的运动轨迹能够被清晰地绘制出来,且跟踪效果稳定;在计数任务中,模型能够准确地统计出每个类别的目标数量,并实时显示在屏幕上。实验结果表明,该系统能够在实时场景中实现高效的目标检测、跟踪与计数,满足工业生产中的实时监控与统计需求。
yolo11在树莓派基于mnn与ncnn效果
四、 回顾与总结
4.1 树莓派在边缘人工智能中的重要性
树莓派作为一种经济实惠且功能强大的嵌入式计算平台,在边缘人工智能领域具有重要的应用价值。随着边缘人工智能市场的快速发展,越来越多的应用场景需要在本地进行数据处理,以减少对云端计算的依赖,降低延迟,提高数据隐私性。树莓派凭借其低功耗、高性能的特点,以及强大的社区支持,成为在边缘部署人工智能的理想选择之一。特别是树莓派5的推出,其在处理能力和硬件接口方面都有了显著提升,进一步拓展了其在边缘人工智能领域的应用范围。
4.2 YOLO11模型的优化特性
YOLO11模型是专门为边缘设备优化的目标检测模型,与YOLOv8相比,它在显著降低模型复杂度(最多降低37%)的同时,仍保持了较高的检测精度(约85%的平均精度均值)。这种优化使得YOLO11能够在资源受限的树莓派上实现高效的实时目标检测,为边缘设备上的复杂计算机视觉任务提供了可能。其轻量级的模型结构和高效的推理性能,使其成为在树莓派上部署目标检测应用的首选模型之一。
相关文章:

计算机视觉——基于树莓派的YOLO11模型优化与实时目标检测、跟踪及计数的实践
概述 设想一下,你在多地拥有多个仓库,要同时监控每个仓库的实时状况,这对于时间和精力而言,都构成了一项艰巨挑战。从成本和可靠性的层面考量,大规模部署计算设备也并非可行之策。一方面,大量计算设备的购…...

【计算机视觉】OpenCV项目实战:OpenCV_Position 项目深度解析:相机定位技术
OpenCV_Position 项目深度解析:基于 OpenCV 的相机定位技术 一、项目概述二、技术原理(一)单应性矩阵(Homography)(二)算法步骤(三)相机内参矩阵 三、项目实战运行&#…...

LAMMPS分子动力学基于周期扰动法的黏度计算
关键词:黏度,周期扰动法,SPC/E水分子,分子动力学,lammps 目前分子动力学计算黏度主要有以下方法:(1)基于 Green - Kubo 关系的方法。从微观角度出发,利用压力张量自相关函数积分计算…...

unity通过transform找子物体只能找子级
unity通过transform找子物体只能找子级,孙级以及更低级别都找不到,只能找到自己的下一级 如果要获取孙级以下的物体,最快的方法还是直接public挂载...

ThinkPad T440P如何从U盘安装Ubuntu24.04系统
首先制作一个安装 U 盘。我使用的工具是 Rufus ,它的官网是 rufus.ie ,去下载最新版就可以了。直接打开这个工具,选择自己从ubuntu官网下载Get Ubuntu | Download | Ubuntu的iso镜像制作U盘安装包即可。 其次安装之前,还要对 Thi…...
PostgreSQL给新用户授权select角色
✅ 切换到你的数据库并以超级用户登录(例如 postgres): admin#localhost: ~$ psql -U postgres -d lily✅ 创建登录的账号机密吗 lily> CREATE USER readonly_user WITH PASSWORD xxxxxxxxxxx; ✅ 确认你授予了这个表的读取权限…...

嵌入式开发学习(阶段二 C语言基础)
C语言:第05天笔记 内容提要 分支结构 条件判断用if语句实现分支结构用switch语句实现分支结构 分支结构 条件判断 条件判断:根据某个条件成立与否,决定是否执行指定的操作。 条件判断的结果是逻辑值,也就是布尔类型值&#…...
【RAG技术全景解读】从原理到工业级应用实践
目录 🌟 前言🏗️ 技术背景与价值🚨 当前技术痛点🛠️ 解决方案概述👥 目标读者说明 🔍 一、技术原理剖析📊 核心概念图解💡 核心作用讲解⚙️ 关键技术模块说明🔄 技术选…...

从人体姿态到机械臂轨迹:基于深度学习的Kinova远程操控系统架构解析
在工业自动化、医疗辅助、灾难救援与太空探索等前沿领域,Kinova轻型机械臂凭借7自由度关节设计和出色负载能力脱颖而出。它能精准完成物体抓取、复杂装配和精细操作等任务。然而,实现人类操作者对Kinova机械臂的直观高效远程控制一直是技术难题。传统远程…...

NX949NX952美光科技闪存NX961NX964
NX949NX952美光科技闪存NX961NX964 在半导体存储领域,美光科技始终扮演着技术引领者的角色。其NX系列闪存产品线凭借卓越的性能与创新设计,成为数据中心、人工智能、高端消费电子等场景的核心组件。本文将围绕NX949、NX952、NX961及NX964四款代表性产品…...

【Bootstrap V4系列】学习入门教程之 组件-输入组(Input group)
Bootstrap V4系列 学习入门教程之 组件-输入组(Input group) 输入组(Input group)Basic example一、Wrapping 包装二、Sizing 尺寸三、Multiple addons 多个插件四、Button addons 按钮插件五、Buttons with dropdowns 带下拉按钮…...

VS “筛选器/文件夹”
每天学习一个VS小技巧: 我在VS创建筛选器的时候,想要想要同步计算机上的文件目录,但是发现并未 同步。 例如我在这儿创建了一个筛选器IoManager 但是在UI这个文件夹里并未创建对应的IoManager文件夹 我右击也没有打开文件所在位置 然后我…...
RAG与语义搜索:让大模型成为测试工程师的智能助手
引言 AI大模型风头正劲,自动生成和理解文本的能力让无数行业焕发新生。测试工程师也不例外——谁不想让AI自动“看懂需求、理解接口、生成用例”?然而,很多人发现:直接丢问题给大模型,答案貌似“懂行”,细…...
从 JMS 到 ActiveMQ:API 设计与扩展机制分析(三)
三、ActiveMQ API 设计解析 (一)对 JMS API 的实现与扩展 ActiveMQ 作为 JMS 规范的一种实现,全面且深入地实现了 JMS API,确保了其在 Java 消息服务领域的兼容性和通用性。在核心接口实现方面,ActiveMQ 对 JMS 的 C…...

powerbuilder9.0中文版
经常 用这个版本号写小软件,非常喜欢这个开发软件 . powerbuilder9.0 非常的小巧,快捷,功能强大,使用方便. 我今天用软件 自己汉化了一遍,一些常用的界面都已经翻译成中文。 我自己用的,以后有什么界面需要翻译,再更新一下。 放在这里留个…...
小程序消息订阅的整个实现流程
以下是微信小程序消息订阅的完整实现流程,分为 5个核心步骤 和 3个关键注意事项: 一、消息订阅完整流程 步骤1:配置订阅消息模板 登录微信公众平台进入「功能」→「订阅消息」选择公共模板或申请自定义模板,获取模板IDÿ…...
互联网大厂Java求职面试实战:Spring Boot微服务与数据库优化详解
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通 😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…...

基于C语言的TCP通信测试程序开发指南
一、TCP通信基础原理 1.1 通信流程概述 TCP通信采用客户端-服务器模型,核心流程如下: 服务器端: 创建套接字(Socket) 绑定地址和端口(Bind) 开始监听(Listen) 接受…...
Git 分支指南
什么是 Git 分支? Git 分支是仓库内的独立开发线,你可以把它想象成一个单独的工作空间,在这里你可以进行修改,而不会影响主分支(或 默认分支)。分支允许开发者在不影响项目实际版本的情况下,开…...

教育系统源码如何支持白板直播与刷题功能?功能开发与优化探索
很多行业内同学疑问,如何在教育系统源码中支持白板直播和刷题功能?本篇文章,小编将从功能设计、技术实现到性能优化,带你全面了解这个过程。 一、白板直播功能的核心需求与技术挑战 实时交互与同步性 白板直播的核心是“实时性”。…...
SSM框架整合MyBatis-Plus的步骤和简单用法示例
以下是 SSM框架整合MyBatis-Plus的步骤 和 简单用法示例: 一、SSM整合MyBatis-Plus步骤 1. 添加依赖(Maven) <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.…...
【LeetCode 热题 100】206. 反转链表
📌 难度:简单 📚 标签:链表、双指针、迭代、递归 🔗 题目链接(LeetCode CN) 🧩 一、题目描述 给你单链表的头节点 head,请你反转链表,并返回反转后的链表。 ✅…...
centos8.5.2111 更换阿里云源
使用前提是服务器可以连接互联网 1、备份现有软件配置文件 cd /etc/yum.repos.d/ mkdir backup mv CentOS-* backup/ 2、下载阿里云的软件配置文件 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo 3、清理并重建…...

再度深入理解PLC的输入输出接线
本文再次重新梳理: 两线式/三线式传感器的原理及接线、PLC的输入和输出接线,深入其内部原理,按照自己熟悉的方式去理解该知识 在此之前,需要先统一几个基础知识点: 在看任何电路的时候,需要有高低电压差&…...

k8s(11) — 探针和钩子
钩子和探针的区别: 在 Kubernetes(k8s)中,钩子(Hooks)和探针(Probes)是保障应用稳定运行的重要机制,不过它们的用途和工作方式存在差异,以下为你详细介绍&…...

使用jmeter对数据库进行压力测试
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 前言 很多人提到 jmeter时,只会说到jmeter进行接口自动化或接口性能测试,其实jmeter还能对数据库进行自动化操作。个人常用的场景有以下&…...
Scala与Go的异同教程
当瑞士军刀遇到电锯:Scala vs Go的相爱相杀之旅 各位准备秃头的程序猿们(放心,用Go和Scala不会加重你的发际线问题),今天我们来聊聊编程界的"冰与火之歌"——Scala和Go的异同。准备好瓜子饮料,我…...
LeetCode 热题 100 138. 随机链表的复制
LeetCode 热题 100 | 138. 随机链表的复制 大家好,今天我们来解决一道经典的链表问题——随机链表的复制。这道题在 LeetCode 上被标记为中等难度,要求深拷贝一个带有随机指针的链表。 问题描述 给你一个长度为 n 的链表,每个节点包含一个额…...

Kubernetes生产实战(十四):Secret高级使用模式与安全实践指南
一、Secret核心类型解析 类型使用场景自动管理机制典型字段Opaque (默认)自定义敏感数据需手动创建data字段存储键值对kubernetes.io/dockerconfigjson私有镜像仓库认证kubelet自动更新.dockerconfigjsonkubernetes.io/tlsTLS证书管理Cert-Manager可自动化tls.crt/tls.keykube…...

05 mysql之DDL
一、SQL的四个分类 我们通常可以将 SQL 分为四类,分别是: DDL(数据定义语言)、DML(数据操作语言)、 DCL(数据控制语言)和 TCL(事务控制语言)。 DDL 用于创建…...