Оптимизация доступа и изменение значения суперпикселей SLIC

Я пытаюсь выполнить семантическую сегментацию, используя вариант SLIC, и хочу создать маску для исходного изображения, где каждый сегмент окрашен (в соответствии с его классом) на основе доступных аннотаций на основе точек. Если в этом сегменте нет точечных аннотаций, то оставить равным 0.

В настоящее время у меня есть точки x, y и связанные с ними метки для изображения и (медленный) метод, который находит и окрашивает нужные сегменты. Я знаком с векторизацией или с «питоновским» делом, но я не могу ускорить этот последний цикл for и хотел бы получить некоторые советы или ссылки по оптимизации. Спасибо.


# Point-based annotations
annotation = pd.read_csv("a_dataframe.csv") # [X, Y, Label]
color_label = {'class 1' : 25, 'class 2' : 50, 'class 3' : 75}

# Uses CPU to create single segmented image with current params
slic = SlicAvx2(num_components = n_segments, compactness = n_compactness)
segmented_image = slic.iterate(cv2.cvtColor(each_image, cv2.COLOR_RGB2LAB)) 

# Finds the segments of interest and records their ID
X = np.array(each_annotation.iloc[:, 0], dtype = 'uint8')
Y = np.array(each_annotation.iloc[:, 1], dtype = 'uint8')
L = np.array(each_annotation.iloc[:, 2], dtype = 'str')  # Labels
DS = segmented_image[X, Y]                               # Desired Segments

# Empty mask, marks the segments of interest with the classes of the point in them
mask = np.zeros(each_image.shape[:2], dtype = "uint8")

# Would ideally like to find a more quickly way of doing this
for (index, segVal) in enumerate(DS):
   mask[segmented_image == segVal] = color_label.get(L[index])

По сути, у меня есть то, что я хотел бы заменить этим циклом здесь:

[mask[segmented_image == s] for i, s in enumerate(DS)]

но я не могу назначить местам X, Y соответствующую метку в mask. Я думал, что это будет что-то похожее на это:

[mask[segmented_image == s] for i, s in enumerate(DS)] = color_label.get(L[i])

но похоже, что я пытаюсь присвоить значение цвета для списков, которые я генерирую...


person JordanMakesMaps    schedule 23.07.2019    source источник
comment
Вы не можете преобразовать этот цикл for в понимание списка, потому что он не создает список. Кроме того, обработка списков выполняется ненамного быстрее, чем циклы for, потому что основная часть времени в вашем цикле тратится не на повторение, а на выполнение операции. (Включение списков экономит очень мало времени при итерации для создания нового списка, но это не то, что вы делаете здесь.)   -  person iz_    schedule 25.07.2019
comment
Привет @ Tomothy32, я понимаю, что ты имеешь в виду здесь . Я был смущен тем, что такое понимание списка. Спасибо за ваш отзыв.   -  person JordanMakesMaps    schedule 25.07.2019


Ответы (1)


Вы ищете ind2rgb?
способ преобразовать индексированную карту (один индекс на сегмент среза, возможный один и тот же индекс для нескольких регионов) и преобразовать его в изображение RGB на основе карты из индекса в цвет.

person Shai    schedule 24.07.2019
comment
Спасибо за ответ Шай; не совсем, я думаю. Получение конечного продукта завершено, просто я хочу сделать последнюю часть (цикл for) более эффективным способом. В приведенном выше коде s — это список желаемых сегментов (идентифицируемых их уникальным идентификатором), и для каждого из них соответствующее место в маске окрашено соответствующим цветом. Но цикл for очень медленный при работе с тысячами сегментов. - person JordanMakesMaps; 24.07.2019