- 博客(87)
- 收藏
- 关注
原创 线程创建方法
joinable()返回false不是因为“已经被 join”,而是因为“根本就没有线程可 join”。默认构造的就是一个“空容器”,不代表任何实际线程。所以你的t1返回false是完全正确且符合设计的!在 C++ 中,创建线程的核心方式是使用标准库中的 std::thread(自 C++11 起)。下面系统、清晰地介绍所有主流的线程创建方法,并附上示例和注意事项。就是 C++ 版的 “map” 操作 —— 把输入序列“映射”成输出序列。问题答案干什么?对序列做函数变换,生成新序列。
2026-03-23 15:12:24
357
原创 onnx结构认识
最后,使用 helper.make_graph 函数创建了图结构,并通过 helper.make_model 函数创建了完整的模型。接下来,定义了模型的初始化参数,使用 helper.make_tensor 函数创建了权重和偏置项的张量。整个过程是通过使用 onnx 库提供的 helper 函数和数据结构来构建模型的图结构、参数和元数据,从而创建一个完整的 ONNX 模型。然后,定义了输入和输出的信息,使用 helper.make_value_info 函数创建了输入和输出的张量类型信息。
2026-03-20 15:36:02
192
原创 智能指针 unique_ptr
unique_ptr销毁、重置、赋值时 → 自动调用删除器删除器是函数对象 → 里面必须写operator()unique_ptr内部就是执行→ 触发你的operator()
2026-03-20 14:57:48
352
原创 paddle 文本检测识别模型转为onnx
Paddle2ONNX 支持将模型格式转化到ONNX模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括 TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。
2026-03-19 16:40:17
340
原创 基于paddle模型 文本识别
阶段输入处理输出模型推理图像[3, H, W]Logits[80, 6625]ArgMaxLogits找每列最大值索引序列[80](0~6624)CTC 解码索引序列去 blank + 去重字符串(如"粤B88888"这套流程高效、鲁棒,是工业 OCR 系统的标准实践。
2026-03-18 15:53:35
357
原创 lpr车牌识别
LPRNet车牌识别后处理流程解析 摘要:本文详细分析了LPRNet车牌识别模型的后处理流程。模型输出为[68×18]的张量,包含68个字符类别(67个有效字符+1个空白符)在18个时间步上的预测结果。后处理分为两个关键步骤:首先通过ArgMax解码获取每个时间步最可能的字符索引,形成长度为18的序列;然后进行CTC贪婪解码,去除连续重复字符和空白符。示例显示原始输出序列[27,27,67...64,32,51,39]经处理后得到有效字符索引[27,64,32,51,39],最终映射为"粤B869
2026-03-18 10:25:59
311
原创 tensorrt基本流程
ONNX 文件]↓Builder → Network → Parser → 解析 ONNX↓BuilderConfig → 设置 FP16 / workspace↓buildSerializedNetwork() → 生成序列化 Engine↓保存为 .engine 文件(离线完成)[推理时]↓↓↓分配 GPU 输入/输出缓冲区↓↓executeV2() → 执行推理↓↓得到结果阶段核心对象作用构建IBuilderIParser。
2026-03-13 17:22:28
321
原创 使用cuda核函数加速 yolov5后处理
本文展示了一个基于CUDA和OpenCV的目标检测后处理代码实现。主要包含三个功能模块:1) CUDA运行时错误检查宏checkRuntime;2) 文件加载工具函数load_file,支持二进制文件读取;3) 目标检测结果后处理函数cpu_decode,实现了置信度阈值过滤、非极大值抑制(NMS)等关键步骤。其中NMS部分采用经典的IoU计算和排序策略,对检测框进行筛选。代码结构清晰,包含详细的注释说明,适用于YOLO等目标检测算法的输出解析。
2026-03-13 16:05:17
117
原创 函数指针和回调函数
写法含义a是student的别名CalcFunc是的别名(即函数指针类型)→a就是student→CalcFunc就是“能指向函数”的指针类型你以后看到复杂的typedef,就用“先想变量怎么写,再把变量名换成类型名”的方法,就能轻松破解!当然可以!你上传的这份 PDF 是一个非常经典的C++ 回调函数(Callback)与函数指针的入门示例,用“计算器”来模拟大厂 SDK 封装逻辑。下面我将它完整翻译、整理并结构化,便于理解核心思想。特性说明解耦大厂逻辑 与 用户逻辑分离扩展性。
2026-03-13 11:48:54
322
原创 python语法学习
比如说类Animal,动物类这是一个抽象的概念,自然界有那么多动物,具体是那种动物呢?类中的实例方法需要访问该实例,因此在定义实例方法时必须将self作为第一个参数,以便在内部使用它。在Python中,要实例化一个类,需要使用类名加上一对括号,如Animal(),这将创建类的一个实例。实例化类时,会调用类的 初始化 函数__init__(),并返回一个新的实例。在上述示例中,我们定义了一个Animal类,并在其初始化函数中传入一个参数name,在实例方法eat中使用了传入的参数name。
2026-03-12 13:51:39
193
原创 tensorrt学习-cuda运行时api
这样简化了代码,使得使用 CUDA Runtime API 更加方便和易于操作。接着同样又利用异步复制将 GPU 上的数据复制到 CPU 上来,最后使用 cudaStreamSynchronize 同步流,确保前面的异步复制操作全部完成(也就是男朋友将东西全买回来了),然后打印获取的结果,那你可以发现真正的耗时其实是发生在这一步的。在异步复制的时候,发出指令立即返回,并不等待复制完成,因此你可以看到如果你在后面添加打印语句,可以发现数据并没有复制,主线程并不需要等待复制完成,可以继续执行后续操作。
2026-03-04 18:30:37
388
原创 视觉transformer 部分知识梳理
问题回答ViT 有没有 Q、K、V?有!完全保留Q、K、V 在图像中是什么意思?Q=“我想看啥”,K=“我能被谁看”,V=“我有啥内容”为什么需要 Q 和 K 算相关性?为了知道图像中哪个区域该关注哪个区域(比如眼睛关注鼻子,车轮关注车身)是不是只关注自己?不是!恰恰是要跨区域关注,这才是注意力的价值所以,不管是文字还是图像,Transformer 的核心思想不变通过 Q-K 匹配,动态决定从哪些地方(V)提取信息。让图像的不同部分学会“互相理解”。
2026-02-28 11:10:29
841
原创 tensorrt学习 - cuda驱动api
值得注意的是,cuda.h 是 NVIDIA CUDA Toolkit 中的一部分。cuInit 函数的参数 flags 目前必须为 0,在使用 CUDA 的其它函数之前,必须先调用 cuInit 函数进行初始化,否则其它 CUDA API 函数会返回 CUDA_ERROR_NOT_INITIALIZED 错误。cuda.h 提供了 CUDA 编程的接口和声明,而 libcuda.so 则是运行库,提供了 CUDA 运行时所需的底层功能和支持。主要是cuda初始化以及获取驱动版本以及设备名称。
2026-02-26 16:04:01
382
原创 paddleocr安装
安装完成后您可以使用 python3 进入 python 解释器,输入import paddle ,再输入 paddle.utils.run_check()如果出现PaddlePaddle is installed successfully!,说明您已成功安装。如何卸载Step 3:安装 PaddleOCR。
2026-02-12 15:28:18
248
原创 opencv入门
Point 类用来表示二维坐标系中的一个点。OpenCV 提供了两个版本:Point2i(或简称 Point)用于整数坐标,Point2f 用于浮点数坐标。示例// 创建一个整数类型的点 (x=10, y=20)// 创建一个浮点类型的点// 在图像上绘制这个点// 创建一个100x100的黑色图像// 在点pt处绘制一个绿色圆圈。
2025-11-18 15:50:34
35
原创 RKNN-Toolkit2入门
RKNN-Toolkit2 的主要作用是在 x86 主机(Host)上将 ONNX、TensorFlow、Caffe 等模型转换为 .rknn 格式,然后部署到 瑞芯微(Rockchip)NPU 芯片(如 RK3566、RK3568、RK3588、RV1106 等)上进行推理。📌 详细解释:RKNN-Toolkit2 到底是什么?
2025-10-31 15:04:32
837
原创 tensorRT高级-使用onnxruntime进行onnx模型推理过程
8. 图像预处理(Letterbox + 归一化)和tensorrt是一样的。9. HWC → CHW + BGR → RGB + 归一化。12. 解码输出(YOLO 后处理)13. NMS 非极大值抑制。
2025-10-30 11:27:23
150
原创 tensorRT-UNet分割模型编译到推理
计算缩放因子 scale = min(target_w / img_w, target_h / img_h)使用 cv::warpAffine 进行仿射变换,将图像缩放到目标尺寸(如 512x512)类别图(uint8)使用 cv::INTER_NEAREST 防止类别混合。空白区域用灰色(114)填充(常见于 YOLO/UNet 系列)概率图(float)使用 cv::INTER_LINEAR 插值。模型输出形状:[B, H, W, C](C 为类别数)前处理的目标是将原始图像转换为模型输入所需的格式。
2025-10-27 13:23:02
363
原创 c++中tuple的基本用法
访问 tuple 元素:std::get<索引>(tuple)获取 tuple 大小:std::tuple_size。解包 tuple:std::tie(经典方式)使用 std::tuple 类型声明。
2025-10-27 11:09:13
133
原创 OpenCV C++ 中,访问图像像素三种常用方法
🔹 方法 2:指针访问 cv::Mat::ptr<>()(推荐用于遍历整行或全图)🔹 方法 1:cv::Mat::at<>() 方法(推荐用于调试和小规模访问)🔹 方法 3:迭代器访问(安全且适合 STL 风格编程)✅ OpenCV C++ 访问像素的三种方法。
2025-10-27 10:49:39
275
原创 retinaface tensorrt 无封装版本
这叫做 Bounding Box Regression(边界框回归),目的是: 把一个“先验框”(anchor/prior)通过学习到的偏移量,调整成更接近真实框(ground truth)的预测框。init_prior_box 函数是 人脸检测模型(如 RetinaFace、SSD、YOLO 的 Anchor 版本等)中生成“先验框”(Prior Boxes / Anchors)的核心函数。真实偏移量 (dx_real) = (gt_cx - anchor_cx) / anchor_sx。
2025-10-24 15:59:06
902
原创 shared_ptr 与 Lambda 删除器
🔍 核心问题:为什么 engine->infer() 没有执行 lambda?这行代码等价于:MyEngine* raw = engine.get();👉 它只是通过 shared_ptr 获取原始指针,然后调用方法。✅ 2. engine->infer():只是正常使用对象。管家(shared_ptr)收下了遗嘱,但不会立刻执行。✅ 1. shared_ptr 的构造:只保存,不执行。这才是 lambda 第一次也是唯一一次被执行。👉 但 不会立即执行 lambda!✅ 3. 析构时:删除器终于执行
2025-10-23 10:08:03
132
原创 最简单的tensorrt程序,实现模型编译和推理
假设输入是 [1.0, 1.0, 1.0](即 x0=x1=x2=1),偏置 b = [0, 0]🔍 第二步:addFullyConnected 需要什么样的权重?🔢 第三步:你的权重数组如何排列?所以输出是 [3.5, 0.8]🧮 第五步:矩阵乘法示例。
2025-10-22 11:18:23
40
原创 cuda运行时API-内存的学习,pinnedmemory
Device To Host 的过程,等价于。Host To Device 的过程,等价于。
2025-10-17 09:33:13
35
原创 YOLO 模型前向推理全流程(以 YOLOv8 为例)
形状:(1, 4 * reg_max, 80, 80)、(1, 4 * reg_max, 40, 40)、(1, 4 * reg_max, 20, 20)形状:(1, 80, 80, 80)、(1, 80, 40, 40)、(1, 80, 20, 20)(COCO 80 类)实际使用时通过卷积解码为 (l, t, r, b) 四个距离(归一化到特征图尺度)将缩放后的图像(640×480)居中放置在 640×640 的画布上。前 4 行:[l, t, r, b](归一化的距离)填充短边(letterbox)
2025-09-16 18:05:33
138
原创 非极大值抑制(Non-Maximum Suppression, NMS)
即:IM 把变换后的点 (x’, y’) 映射回原始点 (x, y)。如果 IoU > 阈值,说明是重复检测,将那个低分框标记为“删除”。否则,保留这个框(因为它目前是置信度最高的未被删的框)。假设输入的检测框已经按置信度从高到低排序。如果当前框已被标记删除,跳过。计算它们与当前框的 IoU。最终返回所有未被删除的框。
2025-09-16 17:14:54
60
原创 std::initializer_list<int> 和 std::vector<int>
使用 std::initializer_list 和 std::vector 两种方式来构造 InputDims 类,并说明它们的区别。两者最终都会把数据存到 dims_ 这个 vector 成员变量中,区别只在于如何把数据传进来。为什么 InputDims 要同时支持两种构造方式?
2025-09-16 10:50:29
123
原创 使用海康威视 SDK 实现软触发拍照(C语言完整示例 + 中文注释)
本文介绍了基于海康威视MVS SDK的软触发拍照C语言实现方案。文章摘要如下: 功能概述: 实现软触发控制工业相机精准拍摄 支持设备枚举、选择、取流控制 采用"拍一张→处理→再拍一张"的工作模式 关键技术: 使用MV_CC_SetCommandValue发送软触发指令 通过回调函数处理图像数据 多线程设计分离触发和图像处理逻辑 代码特点: 完整可运行的示例代码 详细中文注释 中文化打印信息 Linux环境测试通过 适用场景: 流水线检测 运动同步拍摄 需要精确控制拍摄时机的应用 注意事项
2025-09-05 19:41:34
740
原创 海康威视工业相机SDK开发实战:使用C/C++实现软件触发图像采集(含详细中文注释代码)
本文将带你从零开始,使用 海康MVS SDK(Machine Vision Software Development Kit),通过 C/C++语言 实现对海康工业相机的控制,重点演示如何配置 软件触发模式 并完成图像采集。而“软件触发”是触发模式中的一种,指通过 调用SDK函数发送命令 来触发相机采集一帧图像,无需外部硬件信号,非常适合调试和控制场景。本文通过一个完整示例,展示了如何使用海康MVS SDK 实现 软件触发图像采集,代码结构清晰,注释详尽,适合初学者快速上手。五、完整代码实现(含中文注释)
2025-09-05 17:59:56
1326
【老年人异常行为监测】基于YOLOv5的目标检测模型数据采集与动作模拟指南:养老院老人摔倒争吵等危险动作实时监测系统设计
2025-08-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅