Преобразование глубины чего угодно в CoreML

Я пытаюсь преобразовать существующую модель глубины 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. Спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
195
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что ж, на самом деле, используя 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')

Я не уверен, что это хорошее решение, но в качестве обходного пути я добился того, что оно покрыло все мои потребности.

Другие вопросы по теме