You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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模型,使用如下参数适配类型支持:
    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 opset 16及以上版本对bool类型支持更完善,ATEN fallback可以把PyTorch特有算子做兼容处理。
  • 第三步:从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:57:03