背景&问题:
使用ultralytics官方项目导出engine格式的yolov8模型,用tensorrt框架去推理。这里用的是椒盐大佬开源的TensorRT-CSharp-API
项目。
加载模型的时候,会出现如下报错:
Error Code 1: Serialization (Serialization assertion plan->header.magicTag == rt::kPLAN_MAGIC_TAG failed.)
解决方案:
搜索之后,看到ultralytics里某个issues #4597
里提到了这个问题。
file: ultralytics/engine/exporter.py, line: 598-600
原因是在文件:ultralytics/engine/exporter.py
,
大概在def export_engine(self, prefix=colorstr("TensorRT:")):
这个函数的最后关于# Write file
部分
# Write file
build = builder.build_serialized_network if is_trt10 else builder.build_engine
with build(network, config) as engine, open(f, "wb") as t:
# Metadata
meta = json.dumps(self.metadata)
t.write(len(meta).to_bytes(4, byteorder="little", signed=True))
t.write(meta.encode())
# Model
t.write(engine if is_trt10 else engine.serialize())
ultralytics的项目会写入一些metadata,导致直接用tensorrt的接口加载engine模型会出现上述的Serialization
相关报错。
把# Metadata
部分的代码注释掉即可。
tips:metadata注释掉后,导出的engine格式的模型,无法使用ultralytics项目里原来的代码加载模
TensorRT-CSharp-API:https://github.com/guojin-yan/TensorRT-CSharp-API
issues #4597:https://github.com/ultralytics/ultralytics/issues/4597