# trt-sahi-yolo **Repository Path**: jia0510/trt-sahi-yolo ## Basic Information - **Project Name**: trt-sahi-yolo - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-14 - **Last Updated**: 2025-06-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TRT-SAHI-YOLO ## 项目简介 **TRT-SAHI-YOLO** 是一个基于 **SAHI** 图像切割和 **TensorRT** 推理引擎的目标检测系统。该项目结合了高效的图像预处理与加速推理技术,旨在提供快速、精准的目标检测能力。通过切割大图像成多个小块进行推理,并应用非极大值抑制(NMS)来优化检测结果,最终实现对物体的精确识别。 ## 功能特性 1. **SAHI 图像切割** 利用 CUDA 实现 **SAHI** 的功能将输入图像切割成多个小块,支持重叠切割,以提高目标检测的准确性,特别是在边缘和密集物体区域。 2. **TensorRT 推理** 使用 **TensorRT** 进行深度学习模型推理加速。 目前支持 **TensorRT8** 和 **TensorRT10** API ## Engine 导出 1. 导出动态onnx 2. 对于yolov8、yolov11模型需要执行v8trans.py脚本对输出做一个转置 3. 使用trtexec 导出engine模型,指定为动态batch,需要将最大batch设置的大一些,避免切割图的数量大于最大batch ## 注意事项 1. 模型需要是动态batch的 2. 如果模型切割后的数量大于batch的最大数量会导致无法推理 3. **TensorRT 10**在执行推理的时候需要指定输入和输出的名称,名称可以在netron中查看 4. yolov8和yolov11模型导出的onnx输出shape是 1x84x8400 ,需要使用v8trans.py将输出转换为1x8400x84 ## 结果对比 ### YOLOv5 检测
### YOLO11 检测
### YOLO11 姿态
### YOLO11 分割
### YOLO11 旋转目标检测
### D-FINE 检测
#### D-FINE 导出engin ```shell trtexec --onnx=models/onnx/dfine_l_obj2coco.onnx \ --minShapes=images:1x3x640x640,orig_target_sizes:1x2 \ --maxShapes=images:16x3x640x640,orig_target_sizes:16x2 \ --optShapes=images:1x3x640x640,orig_target_sizes:1x2 \ --saveEngine=models/engine/dfine_l_obj2coco.engine --fp16 ``` ### YOLOE #### 根据文本提示导出onnx 这里导出的是识别人的onnx模型,导出后可以按照YOLOV8或者YOLO11的segmentation模型使用 ```python import os from ultralytics import YOLOE from pathlib import Path from ultralytics.utils import yaml_load model_name = "pretrain/yoloe-v8l-seg.pt" file_name = "ultralytics/cfg/datasets/custom.yaml" model = YOLOE(model_name).cuda() model.eval() # Please replace names with yours data = yaml_load(file_name) names = [n.split('/')[0] for n in data["names"].values()] model.set_classes(names, model.get_text_pe(names)) onnx_path = model.export(format='onnx', opset=17, simplify=True, device="0", dynamic=True, nms=False) # coreml_path = model.export(format='coreml', half=True, nms=False, device="0") save_name = f"{Path(model_name).stem}" os.rename(onnx_path, os.path.join(f'{save_name}.onnx')) ``` #### 根据bboxes提示导出onnx模型 ```python from ultralytics import YOLOE import numpy as np import torch from pathlib import Path import os from ultralytics.models.yolo.yoloe.predict_vp import YOLOEVPSegPredictor model_name = "pretrain/yoloe-v8l-seg.pt" model = YOLOE(model_name) # Handcrafted shape can also be passed, please refer to app.py # Multiple boxes or handcrafted shapes can also be passed as visual prompt in an image visuals = dict( bboxes=[ np.array( [ [221.52, 405.8, 344.98, 857.54], [120, 425, 160, 445], ], ), np.array([ [150, 200, 1150, 700] ]) ] , cls=[ np.array( [0, 1] ), np.array([0]) ] ) source_image1 = 'ultralytics/assets/bus.jpg' source_image2 = 'ultralytics/assets/zidane.jpg' target_image1 = 'ultralytics/assets/persons.jpg' model.predict([source_image1, source_image2] , prompts=visuals, predictor=YOLOEVPSegPredictor, return_vpe=True) model.set_classes(["person", "glasses"], torch.nn.functional.normalize(model.predictor.vpe.mean(dim=0, keepdim=True), dim=-1, p=2)) model.predictor = None # remove VPPredictor model.predict(target_image1, save=True) onnx_path = model.export(format='onnx', opset=17, simplify=True, device="cpu", dynamic=True, nms=False) # # coreml_path = model.export(format='coreml', half=True, nms=False, device="0") save_name = f"{Path(model_name).stem}" os.rename(onnx_path, os.path.join(f'{save_name}.onnx')) ``` #### YOLOE 效果展示 - 文本提示检测人的模型 如果将分辨率改为1280 x 1280效果会好很多
## TensorRT8 API支持 在Makefile中通过 **TRT_VERSION** 来控制编译哪个版本的 **TensorRT** 封装文件 ## 优化文字显示 目标检测模型识别到多个目标时,在图上显示文字可能会有重叠,导致类别置信度显示被遮挡。 优化了目标文字显示,尽可能改善遮挡情况 详细说明见 [目标检测可视化文字重叠](https://www.jianshu.com/p/a6e289df4b90)
## python 支持 ```python def yolov5(): # Load the model names = ["person", "helmet"] model = trtsahi.TrtSahi( model_path="models/helmet.engine", model_type=trtsahi.ModelType.YOLOV5SAHI, names=names, gpu_id=0, confidence_threshold=0.5, nms_threshold=0.4, max_batch_size=32, auto_slice=True, slice_width=640, slice_height=640, slice_horizontal_ratio=0.5, slice_vertical_ratio=0.5 ) images = [cv2.imread("inference/persons.jpg")] # Run inference results = model.forwards(images) # Print results for result in results[0]: print(result.box) ``` ## 环境依赖 - cuda - opencv - tensorrt - python(如果需要python使用) ## 支持的模型 | 模型名称 | 是否支持sahi | |-----------------------|--------------| | YOLO11 | 是 | | YOLO11-Pose | 是 | | YOLO11-SEG | 是 | | YOLO11-Obb | 是 | | YOLOv8 | 是 | | YOLOv5 | 是 | | D-FINE | 是 | ## TODO - [x] **NMS 实现**:完成所有子图的 NMS 处理逻辑,去除冗余框。已完成 - [x] **TensorRT8支持**:完成使用 **TensorRT8** 和 **TensorRT10** API - [x] **Python支持**:使用 **Pybind11** 封装,使用 **Pyton** 调用 - [ ] **更多模型支持**:添加对其他模型的支持。