生成tensorrt引擎错误记录-yolov5

warning: ‘nvinfer1::Dims::type’ is deprecated [-Wdeprecated-declarations]
note:TRT_DEPRECATED DimensionType type[MAX_DIMS];  //!< The type of each dimensi
执行make时出错:/usr/bin/ld: cannot find -lnvinfer
解决方式:cmakelists添加
include_directories("/home/tensorrt_tar/TensorRT-6.0.1.5/include")    #具体路径根据实际安装路径来写
link_directories(/home/tensorrt_tar/TensorRT-6.0.1.5/lib)


背景介绍:生成engine ,模型yolov5,ubantu16.04


具体流程:
 

2. build tensorrtx/yolov5 and run
// put yolov5s.wts into tensorrtx/yolov5
// go to tensorrtx/yolov5
// update CLASS_NUM in yololayer.h if your model is trained on custom dataset
mkdir build
cd build
cmake ..
make
sudo ./yolov5 -s [.wts] [.engine] [s/m/l/x or c gd gw]  // serialize model to plan file
sudo ./yolov5 -d [.engine] [image folder]  // deserialize and run inference, the images in [image folder] will be processed.
// For example yolov5s
sudo ./yolov5 -s yolov5s.wts yolov5s.engine s
sudo ./yolov5 -d yolov5s.engine ../samples
// For example Custom model with depth_multiple=0.17, width_multiple=0.25 in yolov5.yaml
sudo ./yolov5 -s yolov5_custom.wts yolov5.engine c 0.17 0.25
sudo ./yolov5 -d yolov5.engine ../samples

cmake..时:

1.CMake Warning at CMakeLists.txt:27 (find_package):
  By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "OpenCV", but
  CMake did not find one.

 cmakelists中添加 :set(OpenCV_DIR /home/.conda/envs/pytorch/share/OpenCV/)

make时:

 1.fatal error: NvInfer.h:没有那个文件或者目录.compilation terminated.

解决方式:cmakelists添加

include_directories("/home/tensorrt_tar/TensorRT-6.0.1.5/include")    #具体路径根据实际安装路径来写
link_directories(/home/tensorrt_tar/TensorRT-6.0.1.5/lib)

2./usr/bin/ld: 找不到-lnvinfer
问题分析:其实还是库路径问题,对于新手而言,由于不明白cmakelists里的代码含义,在cmakelists里添加库路径时,不知道应该添加在什么位置。比如我,就照猫画虎的添加在了

find_package(OpenCV)

这句代码之前,结果make时就一直报:找不到-lnvinfer。明明之前出现这样的问题,添加路径就可以解决呀,现在怎么不行呢?
后来我发现,添加路径的代码要写在合适的位置,简单来说就是必须先设置库路径,再调用库路径里的东西(这是句废话,但新手有时候就是容易忽略掉这样简单的逻辑)。此外,还有一个关键问题是什么是调用库相关的代码?目前我见到的有
 

cuda_add_library(myplugins SHARED ${PROJECT_SOURCE_DIR}/yololayer.cu)
target_link_libraries(myplugins nvinfer cudart)

之前报错的原因就是因为我在它们之后才添加的路径。

sudo ./yolov5 -s [.wts] [.engine]时:

1./common.hpp:156: nvinfer1::IScaleLayer* addBatchNorm2d(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char>, nvinfer1::Weights>&, nvinfer1::ITensor&, std::__cxx11::string, float): Assertion `scale_1' failed.
问题分析:其实这个错误的关键还是在最后一句 Assertion `scale_1' failed.
定位到代码中


IScaleLayer* scale_1 = network->addScale(input, ScaleMode::kCHANNEL, shift, scale, power);
assert(scale_1);

Loading weights: yolov5s.wts
[05/07/2021-10:05:06] [E] [TRT] Parameter check failed at: ../builder/Network.cpp::addScale::286, condition: shift.count > 0 ? (shift.values != nullptr) : (shift.values == nullptr)

问题分析:提示断言scale_1有问题,说明scale_1这个层生成的不对,说明network->addScale的input, ScaleMode::kCHANNEL, shift, scale, power这些参数可能存在问题,具体哪个需要进一步调试,可能性相对较大的原因是没有正确取到网络的权重。
我的问题原因是没有按照readme规范操作,没有取到正确的权重。
问题解析:readme的流程少看了一段,如下

1. generate .wts from pytorch with .pt, or download .wts from model zoo

```
// git clone src code according to `Different versions of yolov5` above
// download https://github.com/ultralytics/yolov5/releases/download/v4.0/yolov5s.pt
// copy tensorrtx/yolov5/gen_wts.py into ultralytics/yolov5
// ensure the file name is yolov5s.pt and yolov5s.wts in gen_wts.py
// go to ultralytics/yolov5
python gen_wts.py
// a file 'yolov5s.wts' will be generated.
```

其中,生成wts文件时,我直接在pycharm运行gen_wts.py这个文件,结果报错
result = unpickler.load()
ModuleNotFoundError: No module named 'models'
我以为是环境错误,然后做了个骚操作,利用yolov5 detect.py构建的网络来生成wts文件,ok,成功生成,但是接下来生成引擎时就是无尽的 shift.count > 0 ? (shift.values != nullptr) : (shift.values == nullptr)了。

解决方式:按照官方操作来!!!

  • 由gen_wts.py文件生成wts文件
  • gen_wts.py里需要指定yolov5权重.pt文件的路径,可以是绝对路径,可以是相对路径
  • 如果是相对路径,需要把gen_wts.py拷贝到yolov5权重所在文件
  • 注意tensorrtx-yolov5和yolov5权重版本的对应
  • 官方操作就是指README.md文件里 给出的操作
     

我的代码示例如下:
 

import torch
import struct
from utils.torch_utils import select_device

# Initialize
device = select_device('cpu')
/*
只需要修改pt和wts路径即可
*/
# Load model yolov5权重所在路径,这里是相对路径
model = torch.load('weights/yolov5s.pt', map_location=device)['model'].float()  # load to FP32
model.to(device).eval()

with open('yolov5s.wts', 'w') as f:#生成的wts路径
    f.write('{}\n'.format(len(model.state_dict().keys())))
    for k, v in model.state_dict().items():
        vr = v.reshape(-1).cpu().numpy()
        f.write('{} {} '.format(k, len(vr)))
        for vv in vr:
            f.write(' ')
            f.write(struct.pack('>f',float(vv)).hex())
        f.write('\n')

tensorrtx-yolov5代码地址:https://github.com/ultralytics/yolov5.git,里面有不同yolov5版本的tensorrtx代码,我采用的是tensorrtx-yolov5-v4。

Currently, we support yolov5 v1.0(yolov5s only), v2.0, v3.0, v3.1 and v4.0.

- For yolov5 v4.0, download .pt from [yolov5 release v4.0](https://github.com/ultralytics/yolov5/releases/tag/v4.0), `git clone -b v4.0 https://github.com/ultralytics/yolov5.git` and `git clone https://github.com/wang-xinyu/tensorrtx.git`, then follow how-to-run in current page.
- For yolov5 v3.1, download .pt from [yolov5 release v3.1](https://github.com/ultralytics/yolov5/releases/tag/v3.1), `git clone -b v3.1 https://github.com/ultralytics/yolov5.git` and `git clone -b yolov5-v3.1 https://github.com/wang-xinyu/tensorrtx.git`, then follow how-to-run in [tensorrtx/yolov5-v3.1](https://github.com/wang-xinyu/tensorrtx/tree/yolov5-v3.1/yolov5).
- For yolov5 v3.0, download .pt from [yolov5 release v3.0](https://github.com/ultralytics/yolov5/releases/tag/v3.0), `git clone -b v3.0 https://github.com/ultralytics/yolov5.git` and `git clone -b yolov5-v3.0 https://github.com/wang-xinyu/tensorrtx.git`, then follow how-to-run in [tensorrtx/yolov5-v3.0](https://github.com/wang-xinyu/tensorrtx/tree/yolov5-v3.0/yolov5).
- For yolov5 v2.0, download .pt from [yolov5 release v2.0](https://github.com/ultralytics/yolov5/releases/tag/v2.0), `git clone -b v2.0 https://github.com/ultralytics/yolov5.git` and `git clone -b yolov5-v2.0 https://github.com/wang-xinyu/tensorrtx.git`, then follow how-to-run in [tensorrtx/yolov5-v2.0](https://github.com/wang-xinyu/tensorrtx/tree/yolov5-v2.0/yolov5).
- For yolov5 v1.0, download .pt from [yolov5 release v1.0](https://github.com/ultralytics/yolov5/releases/tag/v1.0), `git clone -b v1.0 https://github.com/ultralytics/yolov5.git` and `git clone -b yolov5-v1.0 https://github.com/wang-xinyu/tensorrtx.git`, then follow how-to-run in [tensorrtx/yolov5-v1.0](https://github.com/wang-xinyu/tensorrtx/tree/yolov5-v1.0/yolov5).
 


 


 


 

  • 12
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 58
    评论
### 回答1: rotation-yolov5 是一个基于YOLOv5的目标检测算法,它是围绕物体旋转检测而设计的算法。 在传统的目标检测算法中,通常只能检测物体的位置和类别信息,而对于物体的旋转角度等信息缺乏准确的检测。而 rotation-yolov5 算法通过引入旋转矩形框的概念,实现了对物体旋转角度的检测。 rotation-yolov5 的网络结构和YOLOv5类似,通过使用卷积神经网络提取图像特征,并通过多个不同分辨率的特征层来检测不同尺寸的物体。但是在检测过程中,rotation-yolov5 不仅仅预测物体的位置和类别,还预测物体的旋转角度。 rotation-yolov5 在训练阶段首先通过标注的旋转角度信息来生成旋转矩形框的真实标签,然后使用这些标签进行训练。在预测阶段,通过计算物体边界框的角度,可以得到旋转物体的旋转角度信息。 rotation-yolov5 的性能优于传统的目标检测算法,特别是对于需要准确检测物体旋转角度的应用场景,如自动驾驶中的行人检测、机器人的物体抓取等。通过引入旋转矩形框来描述旋转物体,rotation-yolov5 提供了一种可行的解决方案,使得目标检测算法在物体旋转角度的检测上取得了突破。 ### 回答2: rotation-yolov5是一种基于YOLOv5模型的目标检测算法。目标检测是计算机视觉中的重要任务之一,旨在识别图像中的目标并确定其位置。 rotation-yolov5通过在YOLOv5的基础上增加旋转物体的检测能力来改进目标检测。传统的目标检测算法主要侧重于检测横向或纵向的目标,对于旋转目标的检测效果较差。而rotation-yolov5通过引入旋转目标的数据增强以及更改模型结构,提高了对旋转目标的检测准确性和鲁棒性。 具体来说,rotation-yolov5通过对训练数据进行旋转增强,使模型在训练过程中接触到更多不同角度的旋转目标样本,从而增强了模型对旋转目标的理解和识别能力。此外,rotation-yolov5还通过修改模型的网络结构,增加了对旋转目标的感知能力,使模型能够更好地捕捉旋转目标的特征和形状。 rotation-yolov5在旋转目标检测方面取得了一定的突破,但仍然存在一些挑战。例如,对于极端角度的旋转目标,模型可能仍然存在一定的检测误差;对于密集目标的检测,模型可能会出现漏检或误检的情况。因此,仍然需要进一步研究和改进算法,提高rotation-yolov5在旋转目标检测上的性能和鲁棒性。 总之,rotation-yolov5是一种基于YOLOv5的目标检测算法,通过增强模型对旋转目标的理解和感知能力,从而提高了对旋转目标的检测准确性和鲁棒性。 ### 回答3: YOLOv5是一种基于旋转框的目标检测模型。旋转目标检测是相对于传统的水平矩形框而言的。旋转框可以更准确地描述旋转目标的形状,例如倾斜文字或倾斜交通标志等。在YOLOv5中,旋转目标检测的实现主要依赖于三个关键步骤。 首先,YOLOv5通过使用anchor-based方法,针对旋转目标生成预测框。与传统的水平矩形anchor不同,旋转anchor由中心点、宽度、高度和旋转角度来定义。通过在训练集上学习旋转anchor的形状和尺寸,模型能够更好地适应旋转目标的检测。 其次,为了准确地检测旋转目标,YOLOv5在主干网络中引入了旋转卷积层。旋转卷积层可以对特征图进行旋转操作,从而更好地适应旋转目标的形状。通过在卷积层中添加旋转角度作为参数,可以学习到旋转目标在特征图中的表示。 最后,在损失函数中,YOLOv5采用了旋转iou损失来衡量预测框和真实框之间的重叠度。由于旋转目标的形状特殊,传统的iou计算方式无法准确地度量旋转框之间的重叠程度。因此,YOLOv5引入了旋转iou来解决这个问题,从而更好地优化模型的训练。 总结来说,YOLOv5通过引入旋转anchor、旋转卷积层和旋转iou损失,实现了旋转目标的检测。这一技术在许多领域中都能够得到应用,例如自动驾驶、图像识别等。旋转目标检测的优势使得YOLOv5在旋转目标场景中具有更好的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 58
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值