# Generate X (x_img) and label Y ([y_rpn_cls, y_rpn_regr]) X, Y, img_data, debug_img, debug_num_pos = next(data_gen_train) # Train rpn model and get loss value [_, loss_rpn_cls, loss_rpn_regr] loss_rpn = model_rpn.train_on_batch(X, Y) # Get predicted rpn from rpn model [rpn_cls, rpn_regr] P_rpn = model_rpn.predict_on_batch(X) # print(P_rpn[0]) # R: bboxes (shape=(300,4)) # Convert rpn layer to roi bboxes R = rpn_to_roi(P_rpn[0], P_rpn[1], C, 'tf', use_regr=True, overlap_thresh=0.7, max_boxes=300) # note: calc_iou converts from (x1,y1,x2,y2) to (x,y,w,h) format # X2: bboxes that iou > C.classifier_min_overlap for all gt bboxes in 300 non_max_suppression bboxes # Y1: one hot code for bboxes from above => x_roi (X) # Y2: corresponding labels and corresponding gt bboxes X2, Y1, Y2, IouS = calc_iou(R, img_data, C, class_mapping) # If X2 is None means there are no matching bboxes if X2 is None: rpn_accuracy_rpn_monitor.append(0) rpn_accuracy_for_epoch.append(0) continue
img = cv2.imread(filepath) X, ratio_h, ratio_w = format_img(img, C) X = np.transpose(X, (0, 2, 3, 1)) # get output layer Y1, Y2 from the RPN and the feature maps F # Y1: y_rpn_cls # Y2: y_rpn_regr # for layer in model_rpn.layers: # print(layer.get_config(), layer.get_weights()) [Y1, Y2, F] = model_rpn.predict(X) # print(Y1.shape) # Get bboxes by applying NMS # R.shape = (300, 4) R = rpn_to_roi(Y1, Y2, C, 'tf', overlap_thresh=0.7) print(len(R)) # convert from (x1,y1,x2,y2) to (x,y,w,h) R[:, 2] -= R[:, 0] R[:, 3] -= R[:, 1] # apply the spatial pyramid pooling to the proposed regions bboxes = {} probs = {} for jk in range(R.shape[0] // C.num_rois + 1): ROIs = np.expand_dims(R[C.num_rois * jk:C.num_rois * (jk + 1), :], axis=0) if ROIs.shape[1] == 0: break