Loniks
Loniks

Reputation: 489

How to convert PyTorch Mask R-CNN model to Core ML

I'm looking for a way to convert my custom Mask R-CNN model to Core ML.

I'm facing a problem when trying to trace the model.

Here is an example of a basic model that works fine if I try to convert just backbone models.resnet50(pretrained=True) instead of full model models.detection.maskrcnn_resnet50_fpn_v2(pretrained=True)

import torch
import torchvision.models as models
import coremltools as ct

# Load the Mask R-CNN model
model = models.detection.maskrcnn_resnet50_fpn_v2(pretrained=True)
model.eval()

# Trace the model with a dummy input
dummy_input = torch.randn(1, 3, 800, 800)
traced_model = torch.jit.trace(model, dummy_input)

# Convert the traced model to Core ML and assign custom names
mlmodel = ct.convert(
    traced_model,
    inputs=[ct.TensorType(name="input", shape=dummy_input.shape)],
    outputs=[ct.TensorType(name="output")]
)

# Add descriptions
mlmodel.input_description['input'] = "Input image"
mlmodel.output_description['output'] = "Detected features"

# Save the model
mlmodel.save("MaskRCNN.mlpackage")

For this script I got an error RuntimeError: Only tensors, lists, tuples of tensors, or dictionary of tensors can be output from traced functions

Also I have tried to script the model instead of tracing it, but in that case, I have problems with the Core ML converter itself as it experimentally supports script models.

import torch
import torchvision.models as models
import coremltools as ct

# Load the Mask R-CNN model
model = models.detection.maskrcnn_resnet50_fpn_v2(pretrained=True)
model.eval()

scripted_model = torch.jit.script(model)
scripted_model.eval()

# Trace the model with a dummy input
dummy_input = torch.randn(1, 3, 800, 800)

# Convert the scripted model to Core ML and assign custom names
mlmodel = ct.convert(
    scripted_model,
    inputs=[ct.TensorType(name="input", shape=dummy_input.shape)],
    outputs=[ct.TensorType(name="output")]
)

# Add descriptions
mlmodel.input_description['input'] = "Input image"
mlmodel.output_description['output'] = "Detected features"

# Save the model
mlmodel.save("MaskRCNN.mlpackage")

This leads to the error KeyError: images.7 defined in (%images.7 : __torch__.torchvision.models.detection.image_list.ImageList, %targets.31 : Dict(str, Tensor)[]? = prim::TupleUnpack(%413) )

Is there any way to convert the Mask R-CNN model to Core ML?

Upvotes: 0

Views: 55

Answers (0)

Related Questions