Пытался руками дописать YOLOv3 в качестве тренировки, но на препроцессинге изображения ловлю invalid syntax
#Функция предобработки и фильтрации предограничивающих рамок и объектов
#pred_bbox - массив необработанных ограничивающих рамок после предсказания
#original_image - оригинальное изображение
#input_size - размер входной сети
#score_treshold - порог фильрации объектов с низкой вероятностью
def postprocessing_boxex(pred_bbox, original_image, input_size, score_treshold):
#преобразование тензора в массив numpy
pred_bbox = np.array(pred_bbox)
#разделяем массив по значениям
#координаты центра, длина и ширина ограничивающей рамки
pred_xywh = pred_bbox[:, 0:4]
#показатель уверенности того, что в ограничивающей рамки есть объект
pred_conf = pred_bbox[:, 4]
#вероятности присутствия в рамке каждого конкретного класса
pred_prob = pred_bbox[:, 5:]
#изменяем формат ограничивающих рамок
#(x,y,w,h) -> (xmin, ymin, xmax, ymax)
#xmin = x - w/2, ymin = y-h/2, xmax = x + w/2, ymax = y + h/2
pred_coor = np.concatenate(pred_xywh[:, :2] - pred_xywh[:, 2:]*0.5, pred_xywh[:, :2] + pred_xywh[:, 2:] * 0.5)
#сеть масштабирует размеры ограничивающих рамок относительно своего входа 416х416
#нам нужно масштабировать размеры ограничивающих рамок относительно изначального размера оригинального изображения
#(xmin,ymin,xmax,ymax) -> (xmin_org, ymin_org, xmax_org, ymax_org)
#то есть производим изменения обратные функции image_preprocessing
#исхожные размеры оригинального изображения
org_h, org_w = original_image.shape[:2]
#масштабы изменения размера
resize_ratio = min(input_size / org_w, input_size / org_h)
#вычисляем, насколько было сдвинуто изображение по осям х и у
dw = (input_size - resize_ratio * org_w) / 2
dh = (input_size - resize_ratio * org_h) / 2
#масштабируем значения по ох и оу и убираем сдвиг
pred_coor[:, 0::2] = (pred_coor[:, 0::2] - dw) / resize_ratio
pred_coor[:, 1::2] = (pred_coor[:, 1::2] - dh) / resize_ratio
#ограничиваем значения рамок, которые вышли за пределы картинки
pred_coor = np.concatenate(np.maximum(pred_coor[:, :2], [0, 0]), np.maximum(pred_coor[:, 2:], [org_2 - 1, org_h - 1]))
#задаем маску неправильных ограничивающих рамок
#условие xmin>xmax or ymin>ymax
invalid_mask = np.logical_or((pred_coor[:, 0] > pred_coor[:, 2]), (pred_coor[:, 1] > pred_coor[:, 3]))
#присваиваем 0 всему что попадает под условия маски
pred_coor[invalid_mask] = 0
#диапазон масштаба рамок
valid_scale = [0, np.inf]
#вычисление масштаба каждой ограничивающей рамки
bboxes_scale = np.sqrt(np.multiply.reduce(pred_coor[:, 2:4] - pred_coor[:, 0:2], axis = -1)
#создание маски с условием для того, чтобы масштаб рамки был в допустимом диапазоне
scale_mask = np.logical_and((valid_scale[0] < bboxes_scale), (bboxes_scale < valid_scale[1]))
# Находим класс объекта в каждой ограничивающей рамке.
# 80 one hot encoding - > 1 index.
classes = np.argmax(pred_prob, axis=-1)
#вычисляем итоговую вероятность, умножая итоговую уверенность на вероятность класса, который имеет максимальную вероятность в данной рамке
scores = pred_conf * pred_prob[np.arange(len(pred_coor)), classes]
#маска по вероятности с условием, чтобы значение было выше допустимого порога
score_mask = scores > score_treshold
#общая маска по вероятности и масштабу
mask = np.logical_and(scale_mask, score_mask)
#выкидываем недопустимые рамки по условию маски
coors, scores, classes = pred_coors[mask], scores[masc], classes[mask]
#объединяем в один массив и возвращаем
return np.concatenate([coors, scores[:, np.newaxis], classes[:, np.newaxis]], axis=-1)
На строке со scale_mask, где пытаюсь сделать так, чтобы маска была в допустимом диапазоне, ловлю invalid syntax. Ошибку не понимаю от слова совсем.
File "<ipython-input-19-d23cd7bb7dcf>", line 46
scale_mask = np.logical_and((valid_scale[0] < bboxes_scale), (bboxes_scale < valid_scale[1]))
^
SyntaxError: invalid syntax
Ошибка выглядит так. Извините за некорректность, в первый раз пишу на SO
Ответы (1 шт):
Автор решения: CrazyElf
→ Ссылка
File "<ipython-input-19-d23cd7bb7dcf>", line 46
scale_mask = np.logical_and((valid_scale[0] < bboxes_scale), (bboxes_scale < valid_scale[1]))
^
SyntaxError: invalid syntax
Как обычно в таких случаях, когда вдруг ругается на самое начало явно корректной в этом месте строки ошибку нужно искать в незакрытых кавычках или скобках в предыдущей строке или строках. И правда в предыдущей строке кода не закрыта последняя круглая скобка, если внимательно посмотреть:
bboxes_scale = np.sqrt(
np.multiply.reduce(pred_coor[:, 2:4] -
pred_coor[:, 0:2], axis = -1)
^^^