BiRefNet C++ TensorRT (二分类图像分割)

news2025/2/22 8:16:57

BiRefNet C++ TensorRT (二分类图像分割)

利用TensorRTCUDA的双边参考网络(BiRefNet)的高性能c++实现,针对实时高分辨率二分类图像分割进行了优化。
在这里插入图片描述


BiRefNet c++ TENSORRT旨在有效地在GPU上运行双边参考分割任务。通过利用TensorRT的优化和CUDA内核,它旨在以最小的延迟提供最先进的性能。

主要特性

  • TensorRT 加速:使用序列化的 TRT 引擎加速分割任务的推理过程。
  • CUDA 集成:全面基于 GPU 的预处理、后处理及内存管理。
  • 高分辨率支持:开箱即用,能够处理高分辨率图像(例如 1024x1024)。
  • 易于集成:采用 C++17 编码,便于集成到现有的流程中。

📢 最新动态

  • 增强的双边参考:通过利用双重参考指导,提升二分法分割输出的质量。
  • 改进的内存占用:针对大批次或高分辨率工作负载优化了 GPU 分配。
  • 可配置精度:支持 FP16FP32 模式(需要支持半精度的 GPU)。

📂 项目结构

BiRefNet/ 
├── include 
│ └── birefnet.h # Main BiRefNet class definition
├── src 
│ └── birefnet.cpp # Implementation of the BiRefNet class
├── CMakeLists.txt # CMake configuration 
└── main.cpp #
  • include/birefnet.h
    头文件,定义了 BiRefNet 类,该类负责 TensorRT 引擎的创建、执行和内存缓冲区管理。

  • src/birefnet.cpp
    源代码实现,包括加载序列化引擎、运行推理及处理输出后处理。

  • CMakeLists.txt
    使用 CMake 构建项目的配置文件。根据需要调整 TensorRT、CUDA 和 OpenCV 的路径。

  • main.cpp
    一个最小示例,演示了如何加载模型、对图像或视频进行推理并将结果保存。

🚀 安装步骤

  1. 克隆仓库

    git clone https://github.com/hamdiboukamcha/BiRefNet-Cpp-TensorRT.git
    cd BiRefNet-Cpp-TensorRT
    mkdir build && cd build
    cmake ..
    make -j$(nproc)
    

📦 依赖项

  • CUDA
    用于 GPU 加速和内核启动(例如,CUDA 11.x 或更新版本)。

  • TensorRT
    高性能深度学习推理库(推荐使用 v8.x 或更新版本)。

  • OpenCV
    用于图像加载、预处理和基本可视化。

  • C++17
    本项目使用现代 C++ 特性。请确保您的编译器支持 C++17 或更高版本。

🔍 代码概览

主要组件

  • BiRefNet 类

    • 从给定的引擎/模型路径初始化 TensorRT 引擎。
    • 处理预处理(图像大小调整、均值/标准差归一化等)。
    • 运行推理并将输出后处理为分割图。
    • 管理 CUDA 资源和流。
  • Logger 类(在 main.cpp 中)

    • 实现 TensorRT 的 ILogger 接口以进行自定义日志记录。

主要函数

  • BiRefNet::BiRefNet(…)
    构造函数,将 .trt(序列化的 TensorRT)引擎加载到内存中。

  • BiRefNet::predict(cv::Mat& image)
    主要推理函数:接受一个 OpenCV cv::Mat 作为输入,返回分割结果作为 cv::Mat。

  • BiRefNet::preprocess(…)
    将图像转换为归一化的浮点数(均值减法、除以标准差等)。

  • BiRefNet::postprocess(…)
    将原始输出重塑为有意义的图像数据,通常是一个 8 位或 32 位矩阵用于分割。

🎬 使用方法

准备TensorRT推理引擎:

  1. 将模型转换为 ONNX 格式,然后构建一个 TensorRT 引擎(例如,使用 trtexec 或自定义构建工具)。选择使用BiRefNet的预训练模型。

    trtexec --onnx=BiRefNet-general-resolution_512x512-fp16-epoch_216.onnx --saveEngine=BiRefNet-tiny.engine --fp16
    

    在这里插入图片描述

  2. 推理结果

    ./BiRefNetTRT
    Loading model from BiRefNet-tiny.engine...
    The model has been successfully loaded!
    Folder already exists!
    [Info] Processing time: 2452 ms for 1693479941020.jpg
    [Info] Saving result to: results/1693479941020.jpg
    [Info] Processing finished.
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2301787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ARM】MDK在编译 i.MXRT1芯片的时候出现报错Error: L6079E

1、 文档目标 解决MDK在编译 i.MXRT1芯片的时候出现报错Error: L6079E 2、 问题场景 客户在使用NXP 的NXP i.MXRT1050的芯片进行工程构建的时候出现下面的报错信息: Error: L6079E: Subtool invocation error: Error executing armcc. The system could not find…

论文笔记(七十二)Reward Centering(二)

Reward Centering(二) 文章概括摘要2 简单的奖励中心 文章概括 引用: article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arXiv preprint arXiv:2405.0…

推荐几款较好的开源成熟框架

一. 若依: 1. 官方网站:https://doc.ruoyi.vip/ruoyi/ 2. 若依SpringBootVueElement 的后台管理系统:https://gitee.com/y_project/RuoYi-Vue 3. 若依SpringBootVueElement 的后台管理系统:https://gitee.com/y_project/RuoYi-Cl…

基于知识图谱的问答系统:后端Python+Flask,数据库Neo4j,前端Vue3(提供源码)

基于知识图谱的问答系统:后端PythonFlask,数据库Neo4j,前端Vue3 引言 随着人工智能技术的不断发展,知识图谱作为一种结构化的知识表示方式,逐渐成为问答系统的重要组成部分。本文将介绍如何构建一个基于知识图谱的问答…

【华为机试】HJ80 整型数组合并

解法一: HashSet>List列表 Collections.sort(list)对列表进行排序 import java.util.*; import java.util.HashSet;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner sc new Scanner(…

day17-后端Web原理——SpringBoot原理

目录 SpingBoot原理1. 配置优先级2. Bean管理2.1 获取Bean2.2 Bean作用域2.3 第三方Bean 3. SpringBoot原理3.1 起步依赖3.2 自动配置3.2.1 概述3.2.2 常见方案3.2.2.1 概述3.2.2.2 方案一3.2.2.3 方案二 3.2.3 原理分析3.2.3.1 源码跟踪3.2.3.2 Conditional 4. Web后端开发总结…

我们来学nginx -- work process

题记 工作进程能处理大量的并发请求几乎不会阻塞Worker进程可绑定到固定的核,避免CPU频繁地上下文切换看样子,还得转为人话 大白话 作为一般的应用的开发大部分人没有很强的底层技术基础如果深究,涉及复杂技术点,很容易迷惘为什…

【PLL】应用:同步

1. 用于时钟去偏移的PLL 时钟频率增加内部时钟与外部时钟的偏移,在芯片之间通信时很重要时钟偏移可能是由时钟树引起的,该时钟树缓冲外部时钟以驱动大量内部节点 芯片间通信中的时钟偏移问题 芯片1和芯片2共享外部时钟CKext芯片内部逻辑电路操作的实际时…

Go入门之数组与切片

var arr1 [...]int{1, 2, 3}fmt.Println(len(arr1)) 数组长度不能扩展 var arr2 [...]int{0: 100, 5: 101}fmt.Println(len(arr2)) } 指定索引初始化 可以通过for和range遍历 值类型:基本数据类型和数组都是值类型,改变副本的值不会改变本身的值 切片为引用数…

30天开发操作系统 第22天 -- 用C语言编写应用程序

前言 在昨天的最后我们成功干掉了crack2.hrb, 今天我们要尝试一下更厉害的攻击手段。 所以说, 从现在开始又要打开坏人模式了哟,嘿嘿嘿 虽然把操作系统的段地址存入DS这一招现在已经不能用了,不过我可不会善罢甘休的。我要想个更厉害的招数&#xff0c…

后端开发:开启技术世界的新大门

在互联网的广阔天地中,后端开发宛如一座大厦的基石,虽不直接与用户 “面对面” 交流,却默默地支撑着整个互联网产品的稳定运行。它是服务器端编程的核心领域,负责处理数据、执行业务逻辑以及与数据库和其他后端服务进行交互。在当…

20250220解决使用top指令查看荣品PRO-RK3566开发板的CPU占用率为400%的问题

20250220解决使用top指令查看荣品PRO-RK3566开发板的CPU占用率为400%的问题 2025/2/20 19:14 缘起,使用荣品PRO-RK3566开发板配套的百度网盘中的SDK:Android13编译之后,查看RK3566的CPU占用率为400%。 开机就是400%,什么时候都是4…

win32汇编环境,窗口程序中使用月历控件示例二

;运行效果 ;win32汇编环境,窗口程序中使用月历控件示例二 ;以下示例有2个操作,即将每周的开始日进行改变,将默认的周日开始改为周一开始,同时实现点击哪个日期,则设定为哪个日期 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>…

java毕业设计之医院门诊挂号系统(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的医院门诊挂号系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 医院门诊挂号系统的主要使用者…

Linux 实操篇 组管理和权限管理、定时任务调度、Linux磁盘分区和挂载

一、组管理和权限管理 (1)Linux组基本介绍 在linux中的每个用户必须属于一个组,不能独立于组外 在linux中每个文件有所有者、所在组、其他组的概念 (2)文件/目录 所有者 一般为文件的创建者,谁创建了该…

MySql中的事务、MySql事务详解、MySql隔离级别

文章目录 一、什么是事务?二、事务四大特性ACID 2.1、原子性(Atomicity)2.2、一致性(Consistency)2.3、隔离性(Isolation)2.4、持久性(Durability) 三、事务操作/事务的…

10、k8s对外服务之ingress

service和ingress的作用 service的作用 NodePort:会在每个节点开放一个端口,端口号30000-32767。 也是只能用于内网访问,四层转发。实现负载均衡。不能基于域名进行访问。 clusterip:service的默认类型,只能在集群…

【STM32】舵机SG90

1.舵机原理 舵机内部有一个电位器,当转轴随电机旋转,电位器的电压会发生改变,电压会带动转一定的角度,舵机中的控制板就会电位器输出的电压所代表的角度,与输入的PWM所代表的角度进行比较,从而得出一个旋转…

个人简历html网页模板,科技感炫酷html简历模板

炫酷动效登录页 引言 在网页设计中,按钮是用户交互的重要元素之一。这样一款黑色个人简历html网页模板,科技感炫酷html简历模板,设计效果类似科技看板图,可帮您展示技能、任职经历、作品等,喜欢这种风格的小伙伴不要犹豫哦。该素材呈现了数据符号排版显示出人形的动画效…

<2.20>Leetcode哈希、双指针

还可以用双指针的做法 我们要找等于9 排序后从两边开始左右指针 2 3 7 9 如果29>9那么9肯定不能要 去掉 左边也一样 2 3 5 6 26小于9 那么2肯定不能要 去掉 package Leetcode; import java.util.*;public class 两数之和 {public int[] twoSum(int[] nums,int target…