OpenVINO教程(五):实现YOLOv11+OpenVINO实时视频目标检测
目录
- 实现讲解
- 效果展示
- 完整代码
本文作为上篇博客的延续,在之前实现了图片推理的基础上,进一步介绍如何进行视频推理。
实现讲解
首先,我们需要对之前的 predict_and_show_image 函数进行拆分,将图像显示与推理器(predictor)的初始化解耦。这样做的目的是在进行视频推理前,能够先完成推理器的初始化、模型配置的设置,以及模型与 OpenVINO 优化模型的绑定,从而确保推理过程能够充分利用 OpenVINO 提供的高性能推理引擎。
以下是修改后的代码示例:
def initialize_predictor(det_model: YOLO, compiled_model: ov.CompiledModel, conf=0.25, batch=1, save=False, mode="predict"):"""初始化 det_model 的 predictor,如果尚未初始化,并设置 OpenVINO 编译好的模型。参数:det_model: 模型对象,包含 predictor, model, overrides 等属性。compiled_model: OpenVINO 编译好的模型对象。conf: 置信度阈值,默认 0.25。batch: 批处理大小,默认 1。save: 是否保存结果,默认 False。mode: 推理模式,默认 "predict"。"""if det_model.predictor is None:config = {"conf": conf, "batch": batch, "save": save, "mode": mode}args = {**det_model.overrides, **config}det_model.predictor = det_model._smart_load("predictor")(overrides=args,_callbacks=det_model.callbacks)det_model.predictor.setup_model(model=det_model.model)det_model.predictor.model.ov_compiled_model = compiled_modeldef predict_and_show_image(det_model: YOLO, compiled_model: ov.CompiledModel):"""使用模型对图像进行目标检测,并通过 Tkinter GUI 显示检测结果"""results = det_model(IMAGE_PATH)result_img = Image.fromarray(results[0].plot()[:, :, ::-1])root = tk.Tk()root.title("YOLOv11 (OpenVINO INT8) Detection Result")tk_img = ImageTk.PhotoImage(result_img)label = tk.Label(root, image=tk_img)label.pack()root.mainloop()
接下来,我们需要实现一个函数,用于结合 YOLO 和 OpenVINO 实现对视频的实时目标检测。该函数支持从视频文件或摄像头读取图像帧,并在完成推理处理后,实时显示检测结果、推理耗时和帧率(FPS)。此外,检测结果还可以保存为带有边框标注和帧率信息的视频文件,同时支持将检测信息(如类别、时间戳等)记录为日志文件,便于后续分析。
以下是具体的实现代码:
def run_video_inference(det_model, source=0, flip=True, width=None,save_video=True, save_log=True,output_dir="results"):"""使用 OpenVINO 和 YOLO 模型对视频进行目标检测推理并可视化。参数:det_model:YOLO 推理模型,支持 __call__(image) 方式调用source:视频源,可以是文件路径或摄像头索引, 0 表示默认摄像头flip:是否镜像翻转视频(镜像)width:设置画面宽度(自动等比例缩放), None 表示保持原尺寸save_video: 是否保存检测后的视频(MP4)save_log: 是否记录检测日志output_dir: 输出文件目录"""cap = cv2.VideoCapture(source)if not cap.isOpened():print(f"无法打开视频源: {source}")returnPath(output_dir).mkdir(parents=True, exist_ok=True)# 视频保存设置(保存为 MP4)out_writer = Noneoutput_path = str(Path(output_dir) / "output_yolo.mp4")fourcc = cv2.VideoWriter_fourcc(*"mp4v")# 日志文件准备log_file = open(Path(output_dir) / "detection_log.txt", "w") if save_log else Nonecv2.namedWindow("YOLO OpenVINO Detection", cv2.WINDOW_GUI_NORMAL | cv2.WINDOW_AUTOSIZE)processing_times = collections.deque()try:while True:ret, frame = cap.read()if not ret:print("视频读取失败或结束。")break# 检测窗口是否关闭if cv2.getWindowProperty("YOLO OpenVINO Detection", cv2.WND_PROP_VISIBLE) < 1:print("窗口已关闭,退出推理。")break# 镜像翻转(常用于摄像头)if flip:frame = cv2.flip(frame, 1)# 等比例缩放画面到指定宽度if width:scale = width / max(frame.shape)frame = cv2.resize(frame, None, fx=scale, fy=scale, interpolation=cv2.INTER_AREA)input_image = np.array(frame)# 计时推理开始start_time = time.time()results = det_model(input_image, verbose=False)stop_time = time.time()# 保存日志if log_file:for result in results:for box in result.boxes:cls_id = int(box.cls)conf = float(box.conf)log_file.write(f"time: {stop_time:.3f}, class_id: {cls_id}, confidence: {conf:.2f}\n")# 绘制检测结果frame = results[0].plot()# 推理时间统计,用于计算平均推理时间和 FPSprocessing_times.append(stop_time - start_time)if len(processing_times) > 200:processing_times.popleft()avg_time = np.mean(processing_times) * 1000fps = 1000 / avg_time# 显示推理时间和 FPS_, f_width = frame.shape[:2]cv2.putText(frame,f"Inference: {avg_time:.1f}ms ({fps:.1f} FPS)",(20, 40),cv2.FONT_HERSHEY_COMPLEX,f_width / 1000,(0, 0, 255),1,cv2.LINE_AA)# 初始化 MP4 写入器if save_video and out_writer is None:height, width_out = frame.shape[:2]out_writer = cv2.VideoWriter(output_path, fourcc, 25.0, (width_out, height))if save_video and out_writer:out_writer.write(frame)cv2.imshow("YOLO OpenVINO Detection", frame)# ESC 键退出if cv2.waitKey(1) == 27:print("按下 ESC 键,退出。")breakexcept KeyboardInterrupt:print("用户中断。")except RuntimeError as e:print("运行错误:", e)finally:cap.release()cv2.destroyAllWindows()if out_writer:out_writer.release()if log_file:log_file.close()print(f"检测视频保存至: {output_path}")if save_log:print(f"检测日志保存至: {Path(output_dir) / 'detection_log.txt'}")
最后就是调用这个函数的部分了,下面是具体的示例代码:
# 5. 初始化 predictorinitialize_predictor(det_model, compiled_int8_model)# 6. 执行视频推理run_video_inference(det_model=det_model, # 模型对象source="./1.mp4", # 视频路径或摄像头编号flip=False, # 是否镜像width=1280, # 画面宽度save_video=True, # 是否保存 MP4 视频save_log=True, # 是否保存检测日志output_dir="./results" # 输出目录)
效果展示
完整代码
from pathlib import Path
from zipfile import ZipFile
from typing import Dictimport urllib.request
import tkinter as tk
from PIL import Image, ImageTkfrom ultralytics import YOLO
from ultralytics.utils import DEFAULT_CFG
from ultralytics.cfg import get_cfg
from ultralytics.data.converter import coco80_to_coco91_class
from ultralytics.data.utils import check_det_datasetimport openvino as ov
import nncf
import cv2
import numpy as np
import collections
import time# ----------------------------- #
# 全局配置和路径定义
# ----------------------------- #MODEL_VARIANTS = ["yolo11n", "yolo11s", "yolo11m", "yolo11l", "yolo11x"]
MODEL_NAME = MODEL_VARIANTS[0] # 默认使用最轻量的 yolo11n 模型
PT_MODEL_PATH = f"{MODEL_NAME}.pt"
IR_MODEL_DIR = Path(f"{MODEL_NAME}_openvino_model")
IR_MODEL_PATH = IR_MODEL_DIR / f"{MODEL_NAME}.xml"
INT8_MODEL_PATH = Path(f"{MODEL_NAME}_openvino_int8_model/{MODEL_NAME}.xml")IMAGE_PATH = Path("./coco_bike.jpg")
OUT_DIR = Path("./")# COCO 数据集资源路径
DATA_URL = "http://images.cocodataset.org/zips/val2017.zip"
LABELS_URL = "https://github.com/ultralytics/yolov5/releases/download/v1.0/coco2017labels-segments.zip"
CFG_URL = "https://raw.githubusercontent.com/ultralytics/ultralytics/v8.1.0/ultralytics/cfg/datasets/coco.yaml"
DATA_PATH = OUT_DIR / "val2017.zip"
LABELS_PATH = OUT_DIR / "coco2017labels-segments.zip"
CFG_PATH = OUT_DIR / "coco.yaml"# ----------------------------- #
# 工具函数模块
# ----------------------------- #def download_file_if_needed(url: str, filename: str, dest_dir: Path) -> Path:"""下载文件(若文件已存在则跳过)"""dest_dir.mkdir(parents=True, exist_ok=True)file_path = dest_dir / filenameif not file_path.exists():print(f"Downloading: {filename}")urllib.request.urlretrieve(url, file_path)else:print(f"File already exists: {file_path}")return file_pathdef prepare_test_image():"""确保测试图片存在,如无则从官方地址下载"""if not IMAGE_PATH.exists():download_file_if_needed("https://storage.openvinotoolkit.org/repositories/openvino_notebooks/data/data/image/coco_bike.jpg",IMAGE_PATH.name, IMAGE_PATH.parent)def load_or_export_openvino_model() -> ov.CompiledModel:"""加载或导出 YOLOv11 OpenVINO IR 模型,并编译为 CPU 运行时模型"""model = YOLO(PT_MODEL_PATH).to("cpu")if not IR_MODEL_PATH.exists():model.export(format="openvino", dynamic=True, half=True)core = ov.Core()ir_model = core.read_model(IR_MODEL_PATH)return core.compile_model(ir_model, "CPU")def build_ultralytics_model() -> YOLO:"""创建 Ultralytics 的 YOLO 模型接口,用于调用预测器"""return YOLO(IR_MODEL_DIR, task="detect")def prepare_dataset() -> 'tuple[nncf.Dataset, object]':"""下载并解压 COCO 数据集,构造验证器和 NNCF 所需数据集格式"""if not (OUT_DIR / "coco/labels").exists():download_file_if_needed(DATA_URL, DATA_PATH.name, DATA_PATH.parent)download_file_if_needed(LABELS_URL, LABELS_PATH.name, LABELS_PATH.parent)download_file_if_needed(CFG_URL, CFG_PATH.name, CFG_PATH.parent)with ZipFile(LABELS_PATH, "r") as z:z.extractall(OUT_DIR)with ZipFile(DATA_PATH, "r") as z:z.extractall(OUT_DIR / "coco/images")args = get_cfg(cfg=DEFAULT_CFG)args.data = str(CFG_PATH)# 用 ultralytics 的 validator 构建 datasetdet_model = build_ultralytics_model();validator_cls = det_model.task_map[det_model.task]["validator"]validator = validator_cls(args=args)validator.data = check_det_dataset(args.data)validator.stride = 32dataloader = validator.get_dataloader(OUT_DIR / "coco", 1)validator.class_map = coco80_to_coco91_class()validator.names = YOLO(PT_MODEL_PATH).to("cpu").model.namesvalidator.nc = 80def transform_fn(data: Dict):return validator.preprocess(data)['img'].numpy()return nncf.Dataset(dataloader, transform_fn), validatordef quantize_model(original_model: ov.Model, quant_dataset: nncf.Dataset) -> ov.Model:"""使用 NNCF 对 OpenVINO 模型进行混合精度量化(混合 INT8/F32)"""ignored_scope = nncf.IgnoredScope(subgraphs=[nncf.Subgraph(inputs=[f"__module.model.{22 if 'v8' in MODEL_NAME else 23}/aten::cat/Concat",f"__module.model.{22 if 'v8' in MODEL_NAME else 23}/aten::cat/Concat_1",f"__module.model.{22 if 'v8' in MODEL_NAME else 23}/aten::cat/Concat_2"],outputs=[f"__module.model.{22 if 'v8' in MODEL_NAME else 23}/aten::cat/Concat_7"])])quant_model = nncf.quantize(original_model,quant_dataset,preset=nncf.QuantizationPreset.MIXED,ignored_scope=ignored_scope)ov.save_model(quant_model, str(INT8_MODEL_PATH))print(f"Quantized model saved to: {INT8_MODEL_PATH}")return quant_modeldef initialize_predictor(det_model: YOLO, compiled_model: ov.CompiledModel, conf=0.25, batch=1, save=False, mode="predict"):"""初始化 det_model 的 predictor,如果尚未初始化,并设置 OpenVINO 编译好的模型。参数:det_model: 模型对象,包含 predictor, model, overrides 等属性。compiled_model: OpenVINO 编译好的模型对象。conf: 置信度阈值,默认 0.25。batch: 批处理大小,默认 1。save: 是否保存结果,默认 False。mode: 推理模式,默认 "predict"。"""if det_model.predictor is None:config = {"conf": conf, "batch": batch, "save": save, "mode": mode}args = {**det_model.overrides, **config}det_model.predictor = det_model._smart_load("predictor")(overrides=args,_callbacks=det_model.callbacks)det_model.predictor.setup_model(model=det_model.model)det_model.predictor.model.ov_compiled_model = compiled_modeldef predict_and_show_image(det_model: YOLO, compiled_model: ov.CompiledModel):"""使用模型对图像进行目标检测,并通过 Tkinter GUI 显示检测结果"""results = det_model(IMAGE_PATH)result_img = Image.fromarray(results[0].plot()[:, :, ::-1])root = tk.Tk()root.title("YOLOv11 (OpenVINO INT8) Detection Result")tk_img = ImageTk.PhotoImage(result_img)label = tk.Label(root, image=tk_img)label.pack()root.mainloop()def run_video_inference(det_model, source=0, flip=True, width=None,save_video=True, save_log=True,output_dir="results"):"""使用 OpenVINO 和 YOLO 模型对视频进行目标检测推理并可视化。参数:det_model:YOLO 推理模型,支持 __call__(image) 方式调用source:视频源,可以是文件路径或摄像头索引, 0 表示默认摄像头flip:是否镜像翻转视频(镜像)width:设置画面宽度(自动等比例缩放), None 表示保持原尺寸save_video: 是否保存检测后的视频(MP4)save_log: 是否记录检测日志output_dir: 输出文件目录"""cap = cv2.VideoCapture(source)if not cap.isOpened():print(f"无法打开视频源: {source}")returnPath(output_dir).mkdir(parents=True, exist_ok=True)# 视频保存设置(保存为 MP4)out_writer = Noneoutput_path = str(Path(output_dir) / "output_yolo.mp4")fourcc = cv2.VideoWriter_fourcc(*"mp4v")# 日志文件准备log_file = open(Path(output_dir) / "detection_log.txt", "w") if save_log else Nonecv2.namedWindow("YOLO OpenVINO Detection", cv2.WINDOW_GUI_NORMAL | cv2.WINDOW_AUTOSIZE)processing_times = collections.deque()try:while True:ret, frame = cap.read()if not ret:print("视频读取失败或结束。")break# 检测窗口是否关闭if cv2.getWindowProperty("YOLO OpenVINO Detection", cv2.WND_PROP_VISIBLE) < 1:print("窗口已关闭,退出推理。")break# 镜像翻转(常用于摄像头)if flip:frame = cv2.flip(frame, 1)# 等比例缩放画面到指定宽度if width:scale = width / max(frame.shape)frame = cv2.resize(frame, None, fx=scale, fy=scale, interpolation=cv2.INTER_AREA)input_image = np.array(frame)# 计时推理开始start_time = time.time()results = det_model(input_image, verbose=False)stop_time = time.time()# 保存日志if log_file:for result in results:for box in result.boxes:cls_id = int(box.cls)conf = float(box.conf)log_file.write(f"time: {stop_time:.3f}, class_id: {cls_id}, confidence: {conf:.2f}\n")# 绘制检测结果frame = results[0].plot()# 推理时间统计,用于计算平均推理时间和 FPSprocessing_times.append(stop_time - start_time)if len(processing_times) > 200:processing_times.popleft()avg_time = np.mean(processing_times) * 1000fps = 1000 / avg_time# 显示推理时间和 FPS_, f_width = frame.shape[:2]cv2.putText(frame,f"Inference: {avg_time:.1f}ms ({fps:.1f} FPS)",(20, 40),cv2.FONT_HERSHEY_COMPLEX,f_width / 1000,(0, 0, 255),1,cv2.LINE_AA)# 初始化 MP4 写入器if save_video and out_writer is None:height, width_out = frame.shape[:2]out_writer = cv2.VideoWriter(output_path, fourcc, 25.0, (width_out, height))if save_video and out_writer:out_writer.write(frame)cv2.imshow("YOLO OpenVINO Detection", frame)# ESC 键退出if cv2.waitKey(1) == 27:print("按下 ESC 键,退出。")breakexcept KeyboardInterrupt:print("用户中断。")except RuntimeError as e:print("运行错误:", e)finally:cap.release()cv2.destroyAllWindows()if out_writer:out_writer.release()if log_file:log_file.close()print(f"检测视频保存至: {output_path}")if save_log:print(f"检测日志保存至: {Path(output_dir) / 'detection_log.txt'}")# ----------------------------- #
# 主执行流程
# ----------------------------- #
def main():# 1. 准备测试图像(如无则下载)prepare_test_image()# 2. 加载或导出 OpenVINO IR 模型,并编译运行(用于量化或预测)compiled_fp_model = load_or_export_openvino_model()# 3. 构造 Ultralytics YOLO 接口,用于推理/验证det_model = build_ultralytics_model()# 4. 若 INT8 模型已存在,则直接加载;否则进行量化生成core = ov.Core()if INT8_MODEL_PATH.exists():quantized_model = core.read_model(INT8_MODEL_PATH)compiled_int8_model = core.compile_model(quantized_model, "CPU")else:quant_dataset, _ = prepare_dataset()quantized_model = quantize_model(core.read_model(IR_MODEL_PATH), quant_dataset)compiled_int8_model = core.compile_model(quantized_model, "CPU")# 5. 初始化 predictorinitialize_predictor(det_model, compiled_int8_model)# 6. 执行视频推理run_video_inference(det_model=det_model, # 模型对象source="./1.mp4", # 视频路径或摄像头编号flip=False, # 是否镜像width=1280, # 画面宽度save_video=True, # 是否保存 MP4 视频save_log=True, # 是否保存检测日志output_dir="./results" # 输出目录)if __name__ == "__main__":main()
相关文章:
OpenVINO教程(五):实现YOLOv11+OpenVINO实时视频目标检测
目录 实现讲解效果展示完整代码 本文作为上篇博客的延续,在之前实现了图片推理的基础上,进一步介绍如何进行视频推理。 实现讲解 首先,我们需要对之前的 predict_and_show_image 函数进行拆分,将图像显示与推理器(pre…...
【新能源科学与技术】MATALB/Simulink小白教程(一)实验文档【新能源电力转换与控制仿真】
DP读书:新能源科学与工程——专业课「新能源发电系统」 2025a 版本 MATLAB下面进入正题 仿真一:Buck 电路一、仿真目的二、仿真内容(一)Buck电路基本构成及工作原理(二)Buck电路仿真模型及元件连接…...
软件项目实施全流程及交付物清单
需求分析 -> 概要设计 -> 详细设计 -> 开发 -> 测试 -> 部署 -> 上线运行 一、确认项目目标、范围和团队成员 二、收集和分析客户需求,确定需求规格 三、制定详细的项目计划,包括时间表、资源计划、预算 四、系统架构设计…...
Docker安装ES :确保 Kibana 正确连接 Elasticsearch
在使用 Docker 部署 ELK(Elasticsearch、Logstash、Kibana)堆栈时,正确的服务配置和依赖管理至关重要。本文将分享如何优化 Docker Compose 配置,确保 Kibana 能稳定连接到 Elasticsearch,并提供故障排查建议 cd /opt/…...
云贝餐饮 最新 V3 独立连锁版 全开源 多端源码 VUE 可二开
云贝餐饮源码 最新 V3 独立连锁版 全开源 多端源码 VUE 可二开 vue uniapp 独家优化版本 后台管理 Vue 源文件 后台管理文件 yii2 升级包 (全开源) 收银台 Vue 源文件 装修 Vue 源文件 商家端 uni-app 源文件 用户端 uni-app 源文件 数据库文件 云贝餐饮…...
python异步协程async调用过程图解
1.背景: 项目中有用到协程,但是对于协程,线程,进程的区别还不是特别了解,所以用图示的方式画了出来,用于理清三者的概念。 2.概念理解: 2.1协程,线程,进程包含关系 一…...
【Java学习笔记】选择结构
选择结构 内容结构 一、顺序结构 二、分支控制 (1)单分支 (2)双分支 (3)多分支 (4)嵌套分支 (5)switch 分支结构 三、switch和if的比较 一、顺序结构…...
java Nacos
windows下载nacos,版本2.x的,1.0的话会出现“Server check fail, please check server 127.0.0.1 ,port 9848 is available , error {}” 这个鬼问题 下载链接 这里用的是2.0.4版本,启动的话用 startup.cmd -m standalone,单体启…...
c语言之杂识
前言 主要说一下c语言的杂知识 一、预处理指令 1. #include #include指令用于包含其他头文件的内容到当前文件中。这允许您在程序中使用其他模块定义的函数和变量。 示例: #include <stdio.h> // 包含标准输入输出头文件int main() {printf("Hello…...
CSS内边距、外边距、边框
CSS内边距 内边距 :内容区(Content)与边框(Border)之间的透明间距,用于增加元素内部的留白。不影响元素内容本身的尺寸(如文字大小),但会增大元素的总占用空间。 以下是…...
融山科技前端面经
前端面试问题解答 这次是波珠的第三次面试,持续打怪升级,积累面试中面试官问到的不会的点子。 1.自我介绍 面试官您好,我是来自XX学校XX专业本科的XX名字,然后介绍在学校情况,我就介绍了大一自学前端,然…...
元素滚动和内容垂直居中同时存在,完美的 html 元素垂直居中的方法flex + margin: auto
假设有一个元素 div 作为父容器且宽高固定,里面的内容 content 在父容器中垂直/水平都居中,且当内容很多时,父元素滚动overflow: auto,content的内容要能够完全展示。 我之前在这篇文档提到了两个方法: 使用 flex s…...
STM32F103 单片机(基于 ARM Cortex-M3 内核)的启动过程涉及硬件初始化、固件配置和程序执行流程。
1. 启动模式与地址映射 STM32F103 的启动模式由 BOOT0 和 BOOT1 引脚配置决定,不同的启动模式对应不同的存储器映射: 启动模式 映射地址范围 说明 主 Flash 0x08000000~0x0807FFFF 用户程序存储在 Flash 中,复位后从 Flash 启动(…...
c++中iota容器和fill的区别
在C 中,std::iota 和 std::fill 都是标准库中的函数,用于对序列进行操作,它们的功能和用法如下: std::iota 功能:std::iota 函数用于将一个连续的递增序列赋值给指定范围的元素。它接受三个参数,第一个参…...
Kafka集群
kafka集群: kafka-server-start.sh;kafka-server-stop.sh cd/opt/software/kafka/ kafka.sh上传:cd /usr/local/bin/ 执行文件变成绿色:chmod 777 kafka.sh Kafka.sh start Xcall.sh jps...
多源数据集成技术分析与应用实践探索
摘要:本文聚焦多源数据集成技术,深入剖析联邦式、基于中间件模型及数据仓库三类主流技术的侧重点与应用场景。通过实际案例阐述多源数据集成应用构建过程,旨在为企业数据整合与共享提供理论指导与实践参考,助力企业提升数据利用效…...
UniOcc:自动驾驶占用预测和预报的统一基准
25年3月来自 UC Riverside、U Wisconsin 和 TAMU 的论文"UniOcc: A Unified Benchmark for Occupancy Forecasting and Prediction in Autonomous Driving"。 UniOcc 是一个全面统一的占用预测基准(即基于历史信息预测未来占用)和基于摄像头图…...
反向代理和DDNS的区别是什么?
反向代理(Reverse Proxy)和动态域名解析(DDNS,Dynamic Domain Name System)是两种不同的网络技术,虽然它们都与外部访问内部服务相关,但解决的问题和应用场景完全不同。具体区别如下:…...
markdown展示数学公式
要让Markdown正确展示数学公式,你需要使用支持数学公式渲染的工具,比如在支持LaTeX语法的Markdown编辑器中进行编写。 Markdown本身并不原生支持数学公式的渲染,但许多Markdown解析器(例如在GitHub、Jupyter Notebooks、或一些博…...
服务器编译环境配置及数据接收脚本编写(11)
文章目录 一、本章说明二、云端服务器Python编译环境配置三、传感数据解析脚本编写一、本章说明 注:本节为【基于STM的环境监测系统(节点+云服务器存储+QT界面设计)】项目第11篇文章,上面两篇介绍了云服务器数据库的安装与相关设置,本章主要介绍在服务器中安装Python编译…...
硬件基本概念
目录 基本概念 电压 电流 串联、并联 欧姆定律 电路仿真网址: 功率 焦耳定律 AC220V 转 DC5V 基本电子元器件了解 电阻:(电阻器) 电容 电感 继电器 二极管 三极管 晶振(晶体振荡器) 光耦…...
Spark与Hadoop之间的联系与区别
联系 生态系统互补: Hadoop 是一个分布式存储和计算平台,主要包括 HDFS(分布式文件系统)和 MapReduce(分布式计算框架)。Hadoop 提供了可靠的数据存储和分布式计算的基础。 Spark 是一个高性能的分布式计算…...
spark和Hadoop之间的对比与联系
对比 计算模型: Hadoop:采用MapReduce计算模型,分map与reduce两个阶段,数据处理按阶段顺序执行,数据处理按阶段顺序执行,中间结果会写入磁盘,I/O开销大。 Spark:基于弹性分布式数…...
0802api设计和实战-网络ajax请求1-react-仿低代码平台项目
文章目录 1 API设计1.1 用户功能1.1.1 获取用户信息1.1.2 注册1.1.3 登录 1.2 问卷功能1.2.1 获取单个问卷1.2.2 获取问卷列表1.2.3 创建问卷1.2.4 更新问卷1.2.5 批量彻底删除问卷1.2.6 复制问卷 1.3 小结 2 实战2.1配置axios2.2 封装API和测试2.3 新建问卷2.4 自定义hooks封装…...
什么是CAN的非破坏仲裁?
CAN总线的非破坏性仲裁是一种在多个设备同时发送数据时,通过标识符(ID)优先级来决定哪个设备可以优先发送数据的机制。其核心思想是:当多个设备同时发送数据时,ID值较小的数据具有更高的优先级,能够优先…...
无线监控系统分类全解析:搭配视频融合平台EasyCVR开启高效监控
随着技术的发展,无线监控系统在家庭、小型企业、特定行业以及室外恶劣环境中的应用越来越广泛。本文将介绍几种常见的无线监控系统,分析其优缺点,并结合EasyCVR视频融合平台的功能,探讨如何优化无线监控系统的性能和应用。 一、主…...
并行RANSAC平面拟合(C++)
依赖库 1)Eigen 2)GLM 算法大致思路 Step 1:源点云随机采样3个点; Step 2:3个点拟合平面,统计符合该平面模型的点,为inlier点; Step 3:判断inlier点比例是否达到阈…...
Docker核心技术精讲:从入门到企业级实战
第一章>Docker概述 第二章>Docker安装与镜像下载加速 第三章>镜像 第四章>容器 第五章>发布镜像到阿里云或私有化仓库 第六章>容器卷 第七章>Docker安装常用软件 第八章>Docker高级版-Mysql主从复制、Redis主从、分布式存储 第九章>Doc…...
【KWDB 创作者计划】_深度学习篇---向量指令集
文章目录 前言一、加速原理数据级并行(DLP)计算密度提升减少指令开销内存带宽优化隐藏内存延迟 二、关键实现技术1. 手动向量化(Intrinsics)优势挑战 2. 编译器自动向量化限制 3. BLAS/LAPACK库优化4. 框架级优化 三、典型应用场景…...
音视频小白系统入门课-4
本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅 往期课程笔记传送门: 音视频小白系统入门笔记-0音视频小白系统入门笔记-1音视频小白系统入门笔记-2音视频小白系统入门笔记-3 将mp4文件转换为yuv文件 ffmpeg -i demo.mp4 # 输入文件-an …...
CS144 Lab3 实战记录:TCP 发送器实现
文章目录 1 实验背景与目标2 TCP发送器的实现2.1 整体流程2.2 核心组件2.3 窗口管理2.4 关键函数实现2.4.1 push函数2.4.2 receive函数2.4.3 tick函数 3 仓库地址 1 实验背景与目标 在 TCP 协议中,发送器(TCP Sender)是实现可靠传输的核心组…...
Transformer:引领深度学习新时代的架构
引言 在深度学习的快速发展历程中,Transformer 架构如同璀璨的新星,照亮了自然语言处理(NLP)以及计算机视觉(CV)等众多领域的前行道路。自 2017 年在论文《Attention Is All You Need》中被提出以来&#…...
基于RabbitMQ实现订单超时自动处理
基于RabbitMQ实现订单超时自动处理 引言 在现代电商系统中,订单超时自动取消是一个常见的业务需求。传统的定时任务扫描数据库的方式存在性能瓶颈和实时性差的问题。本文将介绍如何使用RabbitMQ的消息队列和死信队列特性,构建一个高效可靠的订单超时自…...
nginx实现同一个端口监听多个服务
nginx实现同一个端口监听多个服务 前言原理配置不同域名基于路径(URL 路由)补充 总之完结撒花,如有需要收藏的看官,顺便也用发财的小手点点赞哈,如有错漏,也欢迎各位在评论区评论! 前言 受同…...
用 Firebase 和 WebRTC 快速搭建一款浏览器视频聊天应用
在现代 Web 应用中,实时音视频通信变得越来越普遍。本文将通过一个简洁实用的示例,带你一步步搭建一个基于 Firebase WebRTC 的浏览器视频聊天应用,帮助你理解 WebRTC 的核心通信机制以及如何借助 Firebase 进行信令传输。 🔧 技…...
记录一次OGG进程abended,报错OGG-01431、OGG-01003、OGG-01151、OGG-01296问题的处理
1. ogg进程abended的几种常见原因: 1. undo表空间不足导致abended。 2. 数据不一致,违反唯一约束导致abended。 3. 源端和目标端表结构不一致导致abended。 4. 源端表名过长,同步到目标端报错导致abended。 5. OGG-03517字符集转换问题导…...
机器学习分类算法详解:原理、应用场景与测试用例
机器学习分类算法详解:原理、应用场景与测试用例 一、基础分类算法 1. 决策树 原理: 通过递归划分数据集,选择信息增益(ID3)或基尼系数(CART)最大的特征作为分裂节点,构建树结构。叶节点代表分类结果。应用场景: 医疗诊断(需解释性,如判断疾病风险)。客户分群(如根…...
机器人仿真:相机信息仿真及显示
1)概要 除了激光雷达以外,机器人常用的视觉传感器还包括相机,相机图像能够获取真实世界的真实颜色和纹理信息,能够被用于进行目标检测、分割和追踪。 2)结果展示...
车载功能测试-车载域控/BCM控制器测试用例开发流程【用例导出方法+优先级划分原则】
目录 1 摘要2 位置灯手动控制简述2.1 位置灯手动控制需求简述2.2 位置灯手动控制逻辑交互图 3 用例导出方法以及优先级原则3.1 用例导出方法3.1.1 用例导出方法介绍3.1.2 用例导出方法关键差异分析 3.2 优先级规则3.2.1 优先级划分的核心原则3.2.2 具体等级定义与判定标准 3.3 …...
gem5-gpu教程05 内存建模
memory-modeling|Details on how memory is modeled in gem5-gpu ====== gem5-gpu’s Memory Simulation ====== gem5-gpu, for the most part, eschews GPGPU-Sim’s separate functional simulation and instead uses gem5’s execute-in-execute model. Therefore, memory …...
如何提升个人解决问题的能力?
提升个人解决问题的能力是一个系统性工程,涉及思维、知识、经验和心态的多方面提升。以下是一些具体且可操作的方法,帮助你逐步增强解决问题的能力: 1. 培养「结构化思维」 明确问题本质: 遇到问题时,先问自己&…...
CSS清楚默认样式
* {margin: 0;padding: 0;box-sizing: border-box;} 这段 CSS 代码是一个常见的全局样式重置代码块,它会对网页中的所有元素(通过通配符 * 选择器)应用相同的样式规则,下面分别解释每一条规则的作用。 margin: 0; 在 HTML 中&a…...
问题:raw.githubusercontent无法访问
问题:raw.githubusercontent无法访问 文章目录 一、问题二、hosts文件2.1、hosts文件简介2.2、hosts文件位置2.3、hosts文件修改 3、解决方法3.1、查询出raw.githubusercontent.com的ip地址3.2、在/etc/hosts里填写IP地址3.3、再次执行命令 4、一些常用IP地址 一、问…...
【C语言】文本操作函数fgetc、fputc、fgets、fputs、fprintf、fscanf、fread、fwrite
一、介绍 二、简要概括 三、函数的使用 1、fgetc和fputc int fgetc ( FILE * stream ); 从文件中读取信息,每次读取一个字符 从流中获取字符返回指定流的内部文件位置指示符当前指向的字符。然后将内部文件位置指示符推进到下一个字符 int main() {//打开文件FI…...
(19)VTK C++开发示例 --- 分隔文本读取器
文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容👉内容导航 👈👉VTK开发 👈 1. 概述 本例采用坐标和法线(x y z nx ny nz)的纯文本文件,并将它们读入vtkPolyData并显示…...
C++ 中 std::thread 的高级应用
C 中 std::thread 的高级应用、常见坑,以及如何封装为类,适合做线程池、异步任务、后台 worker、并发调度等场景。内容结构如下: 一、std::thread 高级用法清单 1. 线程成员函数调用(this 捕获) class Worker { publ…...
Linux之彻底掌握防火墙-----安全管理详解
—— 小 峰 编 程 目录: 一、防火墙作用 二、防火墙分类 1、逻辑上划分:大体分为 主机防火墙 和 网络防火墙 2、物理上划分: 硬件防火墙 和 软件防火墙 三、硬件防火墙 四、软件防火墙 五、iptables 1、iptables的介绍 2、netfilter/…...
Linux安装ffmpeg7.1操作说明
安装yasm Index of /projects/yasm/releases/ 下载最新版 wget https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz 解压 tar -zxvf yasm-1.3.0.tar.gz 编译及安装 ./configure make && make install 安装ffmpeg https://download.csdn.net/down…...
Java 加密与解密:从算法到应用的全面解析
Java 加密与解密:从算法到应用的全面解析 一、加密与解密技术概述 在当今数字化时代,数据安全至关重要。Java 加密与解密技术作为保障数据安全的关键手段,被广泛应用于各个领域。 加密是将明文数据通过特定算法转换为密文,使得…...
海思SDK的sensor驱动框架
对于海思的SDK之前一直对驱动的框架不清楚,只知道mpp的目录下的一些简单的业务demo,归根结底对这个SDK的框架还是不够了解,研究了一段时间才对该框架有一点认识。SDK是通过Makefile来管理和编译的所以对于Makefile文件需要有一定的理解&#…...