Я пытаюсь преобразовать существующую модель глубины PyTorch в формат CoreML. Я решил использовать Google Colab и взял следующуюзаметку для определения глубины любой модели. Однако я встретил некоторое исключение при попытке импортировать его на стороне iOS. Вот мой фрагмент кода для преобразования:
# Installing all needed extensions
!pip install coremltools
# ...
import coremltools as ct
import torch
# Convert the PyTorch model to TorchScript
traced_model = torch.jit.trace(depth_anything, torch.rand(1, 3, 518, 518))
# Convert the TorchScript model to CoreML
model_coreml = ct.convert(
traced_model,
inputs=[ct.ImageType(name = "input_1", shape=(1, 3, 518, 518), scale=1/255.0)]
)
output = model_coreml._spec.description.output[0]
output.type.imageType.colorSpace = ct.proto.FeatureTypes_pb2.ImageFeatureType.ColorSpace.Value('RGB')
output.type.imageType.width = 518
output.type.imageType.height = 518
# Save the modified CoreML model
print(model_coreml)
model_coreml.save('/content/drive/MyDrive/trained_models/depth9.mlpackage')
Я попытался указать входные параметры так же, как и для выходных, например:
# Create a dictionary for the input schema
input_schema = {'input_name': 'input', 'input_type': ct.TensorType(shape=(1, 3, 518, 518))}
# Add the input schema to the model's metadata
model_coreml.user_defined_metadata['inputSchema'] = str(input_schema)
Или использовать опцию convert_to с настройкой neuralnetwork следующим образом:
model_coreml = ct.convert(
traced_model,
inputs=[ct.ImageType(name = "input_1", shape=(1, 3, 518, 518), scale=1/255.0)],
convert_to='neuralnetwork'
)
Или установить ct.proto.FeatureTypes_pb2.ImageFeatureType.ColorSpace.Value('RGB') с помощью BGR/GRAYSCALE
Ничего не помогает.
Если я попытаюсь импортировать модель с помощью бэкэнда neuralnetwork, я просто получу бесконечную загрузку. Если я попытаюсь импортировать модель с помощью mlprogram бэкэнда (по умолчанию, если не указано), я получаю следующее:
Я с нетерпением жду любых советов и помощи, поскольку все, что мне нужно, это просто преобразовать существующую depth-anything модель без каких-либо корректировок или изменений в формат CoreML. Спасибо!






Что ж, на самом деле, используя neuralnetwork бэкэнд и зная тот факт, что форма глубины 1xHxW, следующие модификации, сделанные для значений shape и scale, сделали свое дело:
import coremltools as ct
import torch
x = torch.rand(1, 3, 518, 518)
traced_model = torch.jit.trace(depth_anything, x, strict=False)
mlmodel = ct.convert(traced_model,inputs=[ct.ImageType(shape=x.shape,bias=[-0.485/0.229,-0.456/0.224,-0.406/0.225],scale=1.0/255.0/0.226)], convert_to='neuralnetwork')
mlmodel.save('/content/drive/MyDrive/trained_models/depth_anything.mlmodel')
Я не уверен, что это хорошее решение, но в качестве обходного пути я добился того, что оно покрыло все мои потребности.