首页 > 其他分享 >【原创】解决ncnn yolov11 乱框,输出维度出错,无框问题

【原创】解决ncnn yolov11 乱框,输出维度出错,无框问题

时间:2024-12-25 12:30:27浏览次数:3  
标签:onnx param ncnn yolov11 乱框 import model size

Abstract

解决:ncnn yolov11 乱框,输出维度出错,无框问题

Solution: ncnn yolov11 has random boxes, incorrect output dimensions, and no boxes

0x00: model export

首先是模型转换问题

最开始,我是用python的ultralytics导出为onnx格式文件(.onnx),这个文件在python的pytorch和C++的onnxruntime库中推理良好,于是我就直接onnx转为ncnn格式(.bin和.param)

这会导致ncnn的输出维度出错。

Firstly, there is the issue of model transformation

At first, I exported the file in onnx format (. onnx) using Python's ultralytics. This file worked well in Python's pytorch and C++'s onnxruntime library, so I directly converted onnx to ncnn format (. bin and. param)

This will cause an error in the output dimension of ncnn.

from ultralytics import YOLO
model = YOLO("yolo11n.pt")
success = model.export(format="onnx")
onnx2ncnn.exe best.onnx yolov11.param yolov11.bin

另外,Tencent官方也建议,不要用onnx转换,而是用pnnx转换。不过我也没有用pnnx转换,因为ultralytics官方有自己的模型转换方式,直接会导出适合ncnn的bin和param文件

yolo export model=yolo11n.pt format=ncnn

In addition, Tencent officials also suggest not using onnx conversion, but using pnnx conversion. However, I did not use pnnx conversion because ultralytics has its own model conversion method, which directly exports bin and param files suitable for ncnn

执行完命令后,你就在yolo11n_ncnn_model文件夹下拿到了model.ncnn.bin和model.ncnn.param文件了

0x01: Picture resize

图片的大小必须符合要求,最好是640*640

在python中,人家都给你封装好了,你输入图片的大小无严格要求也不会出错。例如:

The size of the image must meet the requirements, preferably 640 * 640

In Python, they have already packaged it for you, so there is no strict requirement for the size of the input image and there will be no errors. For example:

import ncnn
import cv2
import numpy as np
from ncnn.model_zoo import get_model

image_handler  = cv2.imread('../bus.jpg')

net2 = get_model("mobilenet_ssd", use_gpu=False)
objects = net2(image_handler)

这不会导致任何问题,但是在C++中,无论是onnxruntime还是ncnn,都需要把图片的输入大小resize成符合要求的大小。

此外,即使是在python中,使用原始yolov11进行基于pytorch的模型推理,也是需要用户自行修改图片维度的。

例如(代码以torch_directml为例,cuda版torch同理):

This will not cause any problems, but in C++, both onnxruntime and ncnn require resizing the input size of the image to meet the requirements.

In addition, even in Python, using the original YOLOV11 for PyTorch based model inference requires users to modify the image dimensions themselves.

For example (taking torch-directml as an example, the CUDA version of torch is the same):

import cv2
import numpy as np
import torch
import torch_directml
import ultralytics
from torchvision import transforms

device = torch_directml.device(0)
model = ultralytics.YOLO("yolo11n.pt",task="detect").to(device).model
model.eval()
INFER_SIZE = (640, 640)
transform = transforms.Compose([
    transforms.ToTensor(),  # 转为张量
    transforms.Resize(INFER_SIZE),  # YOLO 通常要求输入大小为 640x640
    transforms.Normalize((0.5,), (0.5,))  # 归一化到 [-1, 1]
])

cap = cv2.VideoCapture(0)
ret, frame = cap.read()  #read a frame
resized_frame = cv2.resize(frame, INFER_SIZE)  #resize
input_tensor = transform(resized_frame).unsqueeze(0).to(device)
outputs = model(input_tensor)     #output is (1,1,84,8400)
predictions = outputs[0].cpu().numpy()
predictions = predictions[0]   #predictions   is (84,8400)
#随后的处理略
#do something

因此NCNN也必须要处理图片维度,在NCNN官方中有yolov8的代码处理案例,核心代码如下:

ncnn/examples/yolov8.cpp at master · Tencent/ncnn

const char* imagepath = "bus.jpg";
cv::Mat bgr= cv::imread(imagepath, 1);
ncnn::Net yolov8;
yolov8.load_param("yolo11n_ncnn_model\\model.ncnn.param");
yolov8.load_model("yolo11n_ncnn_model\\model.ncnn.bin");
const int target_size = 640;
const float prob_threshold = 0.15f;
const float nms_threshold = prob_threshold;
int img_w = bgr.cols;
int img_h = bgr.rows;

// letterbox pad to multiple of MAX_STRIDE
int w = img_w;
int h = img_h;
float scale = 1.f;
if (w > h)
{
    scale = (float)target_size / w;
    w = target_size;
    h = h * scale;
}
else
{
    scale = (float)target_size / h;
    h = target_size;
    w = w * scale;
}

ncnn::Mat in = ncnn::Mat::from_pixels_resize(bgr.data,ncnn::Mat::PIXEL_BGR2RGB, img_w, img_h, w, h);

int wpad = (target_size + MAX_STRIDE - 1) / MAX_STRIDE * MAX_STRIDE - w;
int hpad = (target_size + MAX_STRIDE - 1) / MAX_STRIDE * MAX_STRIDE - h;
ncnn::Mat in_pad;
ncnn::copy_make_border(in, in_pad, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, ncnn::BORDER_CONSTANT, 114.f);

0x02: substract_mean_normalize

这一步非常重要,ncnn官方的案例如下,这个是错误的!!!

This step is very important. The official case of ncnn is as follows, which is incorrect!!!

This step is very important. The official case of ncnn is as follows, which is incorrect!!!

This step is very important. The official case of ncnn is as follows, which is incorrect!!!

const float norm_vals[3] = {1 / 255.f, 1 / 255.f, 1 / 255.f};
in_pad.substract_mean_normalize(0, norm_vals);

修正如下:

fixed as follow:

const float norm_vals[3] = { 1 / 0.348492 / 0xff, 1 / 0.3070657 / 0xff, 1 / 0.28770673 / 0xff };
in_pad.substract_mean_normalize(0, norm_vals);

真的很奇怪,这个substract_mean_normalize的设定对推理结果影响非常大。

设置错误的substract_mean_normalize会导致乱框和无框的发生。官方给出的案例也不适合yolov11

0x03: NCNN inference

现在,它应该工作正常了。

fgfxf 于 河南科技大学

fgfxf, Henan University of Science and Technology

2024.12.25

标签:onnx,param,ncnn,yolov11,乱框,import,model,size
From: https://www.cnblogs.com/coolfan/p/18630121

相关文章

  • 【原创】【踩坑日记】onnx转ncnn模型出bug
    python导出的onnx格式的yolo模型为yolov11.onnx文件。输出代码如下:fromultralyticsimportYOLOmodel=YOLO("yolo11n.pt")success=model.export(format="onnx")ncnn需要两个模型文件才能推理,.param和.bin文件。官方建议使用onnx2ncnn.exe导出,这个导出的onnx格式文件(yo......
  • YOLOv11模型改进-模块-引入多尺度大核注意力Multi-scale Large Kernel Attention
            MLKA的提出源于图像超分辨率任务的挑战性,该任务需重建低质量图像缺失的高频信息,但因LR与HR图像对应关系复杂,寻找像素相关性困难。此前模型扩展容量的方法增加了训练负担和数据收集成本,而采用的注意力机制无法同时获取局部与长距离信息且感受野固定。受视......
  • YOLOv11训练参数详解
    一、训练参数详解modelstrNone指定用于训练的模型文件。接受指向 .pt 预训练模型或 .yaml 配置文件。对于定义模型结构或初始化权重至关重要。datastrNone数据集配置文件的路径(例如 coco8.yaml).该文件包含特定于数据集的参数,包括训练和 验证数据类名和类数。epochsint......
  • YOLOv11/10/8算法改进【NO.158】使用一种名为 PRepBN 的新方法,在训练过程中逐步用重新
      前  言    YOLO算法改进系列出到这,很多朋友问改进如何选择是最佳的,下面我就根据个人多年的写作发文章以及指导发文章的经验来看,按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通:首推,是将两种最新推出算法的模块进行融合形......
  • yolov11速度估计+距离测量+轨迹跟踪+计数+代码+教程
    YOLOv11速度估计、距离测量、轨迹跟踪与计数:综合解决方案引言随着计算机视觉技术的快速发展,YOLO(YouOnlyLookOnce)系列目标检测算法因其高效性和准确性而广受欢迎。特别是最新的YOLOv8版本,在保持高性能的同时引入了更多功能,如速度估计、距离测量、轨迹跟踪和对象计数。......
  • YOLOv11改进,YOLOv11添加DLKA-Attention可变形大核注意力,WACV2024 ,,二次创新C3k2结构
    摘要作者引入了一种称为可变形大核注意力(D-LKAAttention)的新方法来增强医学图像分割。这种方法使用大型卷积内核有效地捕获体积上下文,避免了过多的计算需求。D-LKAAttention还受益于可变形卷积,以适应不同的数据模式。理论介绍大核卷积(LargeKernelConvolutio......
  • 用Beetle ESP32 C6复现ncnn_on_esp32
    前言偶然发现nihui大佬的知乎文章在esp32c3用ncnn跑神经网络mnist-知乎该项目的项目地址:GitHub-nihui/ncnn_on_esp32于是我买了一块BeetleESP32C6,尝试复现该项目。该开发板小巧可爱,性能也是比较好的。本博客希望能够通过列举自己在复现过程中遇到的问题,帮助同......
  • YOLOv11融合[CVPR2024]EMCAD中的特征提取模块及相关改进思路
    YOLOv11v10v8使用教程:  YOLOv11入门到入土使用教程YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《EMCAD:EfficientMulti-scaleConvolutionalAttentionDecodingforMedicalImageSegmentation》一、模块介绍    论文链接:https://arxiv.org/pdf/2......
  • 【NVIDIA orin nx 安装ultralytics yolov11】
    注意:不同用户安装的python可能会在不同的路径,因此不同的pip管理会导致安装的torch和torchvision会在不同的路径下记得区分用户来运行yolo一、确认系统JetPack版本此处使用5.1.11、查看JetPack版本jtop二、安装ultralytics、pytorch、torchvision、onnxruntime-......
  • YOLOv11改进策略【YOLO和Mamba】| 2024 VM-UNet,高效的特征提取模块VSS block 二次创新
    一、本文介绍本文记录的是利用VM-UNet中的VSSblock优化YOLOv11的目标检测网络模型。VSSBlock与传统模块不同,它汲取了VMamba模型的优势,通过特定结构设计,在保证计算效率的同时,精准建模局部特征并学习长距离依赖,实现局部特征的高效处理与长距离依赖关系的有效学习。本文将其......