Как настроить слой, который принимает изображение в оттенках серого и выводит ARGB, делая один из оттенков серого прозрачным?

#python #machine-learning #image-segmentation #coreml #mlmodel

#python #машинное обучение #изображение-сегментация #coreml #mlmodel

Вопрос:

Я начал с DeepLabV3 mlmodel, который выводит 2D Multiarray (сегментированный). Успешно добавлен слой, который принимает это в качестве входных данных и выводит изображение в оттенках СЕРОГО.

Теперь я хотел бы использовать это изображение в оттенках серого в качестве входного и выходного ARGB, в котором я хотел бы сделать любой из цветов прозрачным.

Как настроить такой слой?

Мой код на Python для этого:

 import coremltools
import coremltools.proto.FeatureTypes_pb2 as ft

coreml_model = coremltools.models.MLModel('DeepLabKP.mlmodel')
spec = coreml_model.get_spec()
spec_layers = getattr(spec,spec.WhichOneof("Type")).layers


# find the current output layer and save it for later reference
last_layer = spec_layers[-1]
 
# add the post-processing layer
new_layer = spec_layers.add()
new_layer.name = 'image_gray_to_RGB'
 
# Configure it as an activation layer
new_layer.activation.linear.alpha = 255
new_layer.activation.linear.beta = 0
 
# Use the original model's output as input to this layer
new_layer.input.append(last_layer.output[0])
 
# Name the output for later reference when saving the model
new_layer.output.append('image_gray_to_RGB')
 
# Find the original model's output description
output_description = next(x for x in spec.description.output if x.name==last_layer.output[0])
 
# Update it to use the new layer as output
output_description.name = new_layer.name


# Function to mark the layer as output
# https://forums.developer.apple.com/thread/81571#241998
def convert_grayscale_image_to_RGB(spec, feature_name, is_bgr=False): 
    """ 
    Convert an output multiarray to be represented as an image 
    This will modify the Model_pb spec passed in. 
    Example: 
        model = coremltools.models.MLModel('MyNeuralNetwork.mlmodel') 
        spec = model.get_spec() 
        convert_multiarray_output_to_image(spec,'imageOutput',is_bgr=False) 
        newModel = coremltools.models.MLModel(spec) 
        newModel.save('MyNeuralNetworkWithImageOutput.mlmodel') 
    Parameters 
    ---------- 
    spec: Model_pb 
        The specification containing the output feature to convert 
    feature_name: str 
        The name of the multiarray output feature you want to convert 
    is_bgr: boolean 
        If multiarray has 3 channels, set to True for RGB pixel order or false for BGR 
    """
    for output in spec.description.output: 
        if output.name != feature_name: 
            continue
        if output.type.WhichOneof('Type') != 'imageType': 
            raise ValueError("%s is not a image type" % output.name)
        output.type.imageType.colorSpace = ft.ImageFeatureType.ColorSpace.Value('RGB')
 
# Mark the new layer as image
convert_grayscale_image_to_RGB(spec, output_description.name, is_bgr=False)

updated_model = coremltools.models.MLModel(spec)
 
updated_model.author = 'Saran'
updated_model.license = 'MIT'
updated_model.short_description = 'Inherits DeepLab V3  and adds a layer to turn scores into an image'
updated_model.input_description['image'] = 'Input Image'
updated_model.output_description[output_description.name] = 'RGB Image'
 
model_file_name = 'DeepLabKP-G2R.mlmodel'
updated_model.save(model_file_name)
  

В то время как модель успешно сохраняется без каких-либо ошибок, ошибки прогнозирования, как показано ниже

 result = model.predict({'image': img})
  File "/Users/saran/Library/Python/2.7/lib/python/site-packages/coremltools/models/model.py", line 336, in predict
    return self.__proxy__.predict(data, useCPUOnly)
RuntimeError: {
    NSLocalizedDescription = "Failed to convert output image_gray_to_RGB to image";
    NSUnderlyingError = "Error Domain=com.apple.CoreML Code=0 "Invalid array shape (n    1,n    513,n    513n) for converting to gray image" UserInfo={NSLocalizedDescription=Invalid array shape (n    1,n    513,n    513n) for converting to gray image}";
}
  

Я чувствую, что это связано с тем, как активация установлена в этом слое. Но не смог найти ничего, чтобы попробовать это по-другому.

Любая помощь очень ценится.

Они отображают изображение в оттенках серого, которое создает слой, который я добавил

введите описание изображения здесь

Ответ №1:

Похоже, что ваш вывод имеет форму (1, 513, 513). Первое число, 1, — это количество каналов. Поскольку это значение равно 1, Core ML может преобразовывать вывод только в изображение в оттенках серого. Для цветного изображения требуется 3 канала или форма (3, 513, 513).

Поскольку это DeepLab, я предполагаю, что в вашем изображении в оттенках серого на самом деле нет «цветов», кроме индекса класса (другими словами, вы взяли ARGMAX вместо прогнозов). На мой взгляд, самый простой способ превратить это «изображение» в оттенках серого (на самом деле, маску сегментации) в цветное изображение — это сделать это в Swift или в Metal.

Вот пример исходного кода:https://github.com/hollance/SemanticSegmentationMetalDemo

Комментарии:

1. Прикрепленный вывод изображения в оттенках серого, который я получаю с предыдущего слоя, который я добавил к приведенному выше вопросу. Я в порядке, если я не верну исходные цвета. Пока я могу сделать сегментированную часть прозрачной, превратив ее в 3 канала, даже с некоторыми значениями по умолчанию, я буду счастлив. Я возьму это и буду использовать в качестве маски для компоновки с исходным изображением. Спасибо за ссылку, я тоже посмотрю на это.