Detectron2 TorchScript模型转Core ML遇ONNX bool类型错误,求可行转换方案
Detectron2模型转Core ML的可行解决方案
你遇到的Unknown type bool encountered in graph lowering报错,根源是Detectron2内置的Boxes等自定义结构体、推理逻辑中的动态bool分支,默认不被Core ML转换器的ONNX lowering通路支持,直接转换带自定义类型的TorchScript模型就会触发该错误。以下是三种可落地的转换方案:
方案1:裁剪模型后走ONNX中转通路
该方案兼容性最高,适合大多数自定义Detectron2模型:
- 第一步:修改Detectron2推理逻辑,将所有
Boxes类型操作全部替换为原生PyTorch Tensor操作,不要使用scripting_with_instances保留Instances结构体,确保整个模型的输入输出、中间计算节点均为标准Tensor类型,无自定义类。 - 第二步:导出ONNX模型,使用如下参数适配类型支持:
ONNX opset 16及以上版本对bool类型支持更完善,ATEN fallback可以把PyTorch特有算子做兼容处理。torch.onnx.export( model, torch.randn(1,3,64,64), "detectron2.onnx", opset_version=17, operator_export_type=torch.onnx.OperatorExportTypes.ONNX_ATEN_FALLBACK, do_constant_folding=True ) - 第三步:从ONNX转Core ML,使用新版ML Program格式:
mlmodel = ct.converters.convert( "detectron2.onnx", inputs=[ct.TensorType(shape=(1, 3, 64, 64))], convert_to="mlprogram", minimum_deployment_target=ct.target.iOS16 )
方案2:直接优化现有TorchScript模型后转换
如果不想改模型导出逻辑,可以直接处理已生成的TorchScript模型:
- 遍历TorchScript计算图,将所有输出为bool类型的节点强制转换为int32类型,避免类型识别错误。
- 转换时开启内置优化,跳过ONNX lowering的部分校验:
mlmodel = ct.converters.convert( torchscipt_model, inputs=[ct.TensorType(shape=(1, 3, 64, 64))], convert_to="mlprogram", pass_pipeline=ct.PassPipeline.DEFAULT, minimum_deployment_target=ct.target.iOS16 )
方案3:使用Detectron2官方ONNX导出适配
如果你使用的是Detectron2官方提供的标准检测/分割模型,可以直接调用官方自带的ONNX导出接口,已经内置了自定义类型、动态分支的兼容处理,导出合法ONNX后再转Core ML即可。
内容的提问来源于stack exchange,提问作者Gle6557
相关产品推荐
相关产品推荐

