3、PyTorch训练YOLOv11—部署篇(detect)—Windows系统
1、pt转onnx或engine
from ultralytics import YOLO model = YOLO("best.pt") model.export(format="onnx") # model.export(format="engine") # 预测看下效果 onnx_model = YOLO("best.onnx", task="detect") results = onnx_model("https://ultralytics.com/images/bus.jpg") results[0].show() ''' tensorrt_model = YOLO("best.engine", task="detect") results = tensorrt_model("https://ultralytics.com/images/bus.jpg") results[0].show() '''
更丰富的export参数,查阅 YOLO11在训练和导出时的一些参数设置 - 夕西行 - 博客园 (cnblogs.com)
yolov11 常用参数(无废话)_yolo11参数-CSDN博客
2、YOLO10和11版本用了新的技术
有人说干掉了耗时的NMS操作,参考YOLOv10:无需NMS的目标检测新范式(强的离谱)_yolov10 topk-CSDN博客
其中有这样一句话:模型可以在训练期间利用一对多分配的丰富监督信号,而在推理期间则使用一对一分配的预测结果,从而实现无NMS的高效推理。
我在YOLO11的 loss.py 代码里看到了
那么,模型检测后应该会得到很少的框,即同一个位置只输出满足阈值的每一类的最大框,如图片里有人、狗(人和狗在一块),那么只输出两个框(如果满足设定的阈值)
训练时候只使用one2one,不使用one2many,行不行?
不行,论文里指出:
Dual label assignments. Unlike one-to-many assignment, one-to-one matching assigns only one prediction to each ground truth,
avoiding the NMS post-processing. However, it leads to weak supervision, which causes suboptimal accuracy and convergence speed [75].
Fortunately, this deficiency can be compensated for by the one-to-many assignment [5].
参考 目标检测领域NMS(非极大值抑制)的改进算法有哪些? - 知乎 (zhihu.com)
3、部署框架的选择
为了效率,用C++部署。
git上有很多C++部署yolo的项目,关于获取框,主要参考YOLO11的 tal.py 这个文件,直接看大神博客 yolov10/v8 loss详解_yolov10损失函数-CSDN博客
~~~~~下一步计划,搜索能用于yolo11的c++项目,尤其是检测框的结果怎么拿,是不是还是很多(如8400个)需要自己筛选???
网上大神手速就是快,C++ Tensort YOLO11已经出来了,给这个人star支持吧,感谢作者的无私奉献。
yolo11和yolo10的输出如下:
yolo10的300行结果已经被排好序了,第一行就是最优结果(每一行前4位为候选框坐标xyxy,第五位为conf,第六位为类别,结果已经按照conf由大到小排列)。
yolo11的结果还是8400结果,需要nms,不过大神已经用cuda搞出来了,再此手动star⭐,感谢!!!
github项目运行可能出现的错误:
mian.cpp里如果指定了engine,那么直接载入使用
std::string trtFile = "C:/Users/admin/source/repos/ConsoleApplication1/x64/Release/best.engine";
如果未指定,则载入config.h里的onnx
const std::string onnxFile = "../onnx_model/best.onnx";
对于指定了engine
运行后报错,由于trt版本和当前电脑版本不一致导致,用当前电脑版本将pt转engine