帮忙解决yolov5的pt转engine的问题。
问题是:我标注图片设为1个分类时用yolov5训练,然后将pt转成onnx,再转engine运行都没问题。
转onnx我用的是yolov5原版的export.py,只改了图像尺寸(imgsz)为2400,其它基本没改。
转engine是别人给的一段代码。
当我标注分类为4个类别时,将pt转成onnx没问题,但转engine时报如下错误:
[1,3,300,300,3] and [1,3,300,300,2]).
LOG[1]: /model.24/Add: elementwise inputs must have same dimensions or follow broadcast rules (input dimensions were [1,3,300,300,3] and [1,3,300,300,2]).
LOG[1]: /model.24/Add: elementwise inputs must have same dimensions or follow broadcast rules (input dimensions were [1,3,300,300,3] and [1,3,300,300,2]).
ERROR: onnx2trt_utils.cpp:680 In function elementwiseHelper:
[8] Assertion failed: tensor_ptr->getDimensions().nbDims == maxNbDims && "Failed to broadcast tensors elementwise!"
Parse failed.
当我标注分类为2个类别时,将pt转成onnx没问题,但转engine时报如下错误:
LOG[1]: /model.24/Reshape_1: volume mismatch. Input dimensions [1,3,300,300,6] have volume 1620000 and output dimensions [1,270000,7] have volume 1890000.
ERROR: onnx2trt_utils.cpp:188 In function convertAxis:
[8] Assertion failed: axis >= 0 && axis < nbDims
Parse failed.
export.py中代码如下:
def export_onnx(model, im, file, opset, dynamic, simplify, prefix=colorstr('ONNX:')):
# YOLOv5 ONNX export
check_requirements('onnx>=1.12.0')
import onnx
LOGGER.info(f'\n{prefix} starting export with onnx {onnx.__version__}...')
f = file.with_suffix('.onnx')
output_names = ['output0', 'output1'] if isinstance(model, SegmentationModel) else ['output0']
if dynamic:
dynamic = {'images': {0: 'batch', 2: 'height', 3: 'width'}} # shape(1,3,640,640)
if isinstance(model, SegmentationModel):
dynamic['output0'] = {0: 'batch', 1: 'anchors'} # shape(1,25200,85)
dynamic['output1'] = {0: 'batch', 2: 'mask_height', 3: 'mask_width'} # shape(1,32,160,160)
elif isinstance(model, DetectionModel):
dynamic['output0'] = {0: 'batch', 1: 'anchors'} # shape(1,25200,85)
torch.onnx.export(
model.cpu() if dynamic else model, # --dynamic only compatible with cpu
im.cpu() if dynamic else im,
f,
verbose=False,
opset_version=opset,
do_constant_folding=True, # WARNING: DNN inference with torch>=1.12 may require do_constant_folding=False
input_names=['images'],
output_names=output_names,
dynamic_axes=dynamic or None)
# Checks
model_onnx = onnx.load(f) # load onnx model
onnx.checker.check_model(model_onnx) # check onnx model
# Metadata
d = {'stride': int(max(model.stride)), 'names': model.names}
for k, v in d.items():
meta = model_onnx.metadata_props.add()
meta.key, meta.value = k, str(v)
onnx.save(model_onnx, f)
# Simplify
if simplify:
try:
cuda = torch.cuda.is_available()
check_requirements(('onnxruntime-gpu' if cuda else 'onnxruntime', 'onnx-simplifier>=0.4.1'))
import onnxsim
LOGGER.info(f'{prefix} simplifying with onnx-simplifier {onnxsim.__version__}...')
model_onnx, check = onnxsim.simplify(model_onnx)
assert check, 'assert check failed'
onnx.save(model_onnx, f)
except Exception as e:
LOGGER.info(f'{prefix} simplifier failure: {e}')
return f, model_onnx
网上查找说是需要变换写法,但我找不到对应修改位置。
哪位帮看看怎么解决,最好有具体修改方法,我是初学者,只会简单的操作。