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

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

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.
    

相关文章:

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

BiRefNet C TensorRT (二分类图像分割) 利用TensorRT和CUDA的双边参考网络(BiRefNet)的高性能c实现,针对实时高分辨率二分类图像分割进行了优化。 BiRefNet c TENSORRT旨在有效地在GPU上运行双边参考分割任务。通过利…...

蓝桥杯篇---IAP15F2K61S2矩阵键盘

文章目录 前言简介矩阵键盘的工作原理1.行扫描2.检测列状态3.按键识别 硬件连接1.行线2.列线 矩阵键盘使用步骤1.初始化IO口2.扫描键盘3.消抖处理4.按键识别 示例代码:4x4矩阵键盘扫描示例代码:优化后的矩阵键盘扫描注意事项1.消抖处理2.扫描频率3.IO口配…...

【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…...

LeetCode 2595.奇偶位数:位运算

【LetMeFly】2595.奇偶位数:位运算 力扣题目链接:https://leetcode.cn/problems/number-of-even-and-odd-bits/ 给你一个 正 整数 n 。 用 even 表示在 n 的二进制形式(下标从 0 开始)中值为 1 的偶数下标的个数。 用 odd 表示…...

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

一. 若依: 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频繁地上下文切换看样子,还得转为人话 大白话 作为一般的应用的开发大部分人没有很强的底层技术基础如果深究,涉及复杂技术点,很容易迷惘为什…...

马拉车算法

Manacher算法 ,用于处理最长回文字符串的问题,可以在O(n)的情况下,求出一个字符串的最长回文字符串 回文串的基础解法: 以每个点为中心对称点,看左右两边的点是否相同。这种算法的时间复杂度为O&#xff0…...

【PLL】应用:同步

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

golang常用库之-swaggo/swag根据注释生成接口文档

文章目录 golang常用库之-swaggo/swag库根据注释生成接口文档什么是swaggo/swag golang常用库之-swaggo/swag库根据注释生成接口文档 什么是swaggo/swag github:https://github.com/swaggo/swag 参考文档:https://golang.halfiisland.com/community/pk…...

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的医院门诊挂号系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 医院门诊挂号系统的主要使用者…...

今日行情明日机会——20250220

明日投资机会分析 根据提供的数据,市场热点集中在机器人、人工智能、军工、化工、AI医疗等板块,结合涨停梯队和资金动向,建议关注以下方向: 1. 机器人概念(20家涨停) 核心标的:七板龙头杭齿前…...

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

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

对CSS了解哪些?

CSS(Cascading Style Sheets,层叠样式表)是用来描述HTML文档外观和布局的语言。以下是对CSS的常见了解范围: 1. CSS 基础 选择器:如通用选择器 (*)、类型选择器、类选择器 (.class)、ID选择器 (#id)、后代选择器、伪类…...

虚拟机新建Ubuntu系统联网快速配置实现能正常ssh连接

1.写一个shell脚本 #!/bin/bash# 更新系统 sudo apt update -y# 安装openssh-server sudo apt install openssh-server -y# 启动SSH服务 sudo systemctl start ssh# 设置SSH服务开机自启 sudo systemctl enable ssh# 检查SSH服务状态 sudo systemctl status ssh# 允许SSH连接 …...

青少年编程都有哪些比赛可以参加

Python小学生可参加的赛事: 电子学会青少年编程考级、中国计算机学会编程能力等级认证、蓝桥杯、 信奥赛CSP-J/S初赛/NOIP(推荐C)、编程设计、信息素养、科技创新赛; 升学助力(科技特长生、大学)、企业、出国留学; python比赛&am…...

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的默认类型,只能在集群…...

【结束】JS如何不通过input的onInputFileChange使用本地mp4文件并播放,nextjs下放入public文件的视频用video标签无法打开

本地不用input标签获取video视频并播放 浏览器没有像JAVA这些语言之类的IO 代码&#xff1a; <div><video id"video_id" width"750" height"500" controls>Your browser does not support the video tag.</video> </div…...

【STM32】舵机SG90

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

科普:“git“与“github“

Git与GitHub的关系可以理解为&#xff1a;Git是一种软件工具&#xff0c;而GitHub则是一个在线平台&#xff0c;它们是“一家子”。二者的关联最直接体现在你通过Git在GitHub仓库中clone软件包到你的机器中来。 具体来说&#xff1a; 一、Git 定义&#xff1a;Git是一个开源的…...

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

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