Tried to finish YOLOv3 as a training exercise, but on the pre-processing of the images of the 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)
On the line from scale_mask, where I'm trying to make the mask within the allowed range, catch the invalid syntax. I don't understand the word.
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
That's the mistake. I'm sorry for the incorrectness I'm writing for SO for the first time.
-
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
As usual in cases where there's an argument at the very beginning of a clearly correct line in this place, a mistake needs to be found in open carcasses or brackets in the previous line or line. And it's true in the previous line that the code is not closed by the last round bracket if you look carefully:
bboxes_scale = np.sqrt(
np.multiply.reduce(pred_coor[:, 2:4] - pred_coor[:, 0:2], axis = -1) ^^^