示例#1
0
 def call(self, inputs):
     rpn_bbox_deltas = inputs[0]
     rpn_labels = inputs[1]
     anchors = self.anchors
     #
     pre_nms_topn = self.hyper_params["pre_nms_topn"]
     post_nms_topn = self.hyper_params["train_nms_topn"] if self.mode == "training" else self.hyper_params[
         "test_nms_topn"]
     nms_iou_threshold = self.hyper_params["nms_iou_threshold"]
     variances = self.hyper_params["variances"]
     total_anchors = anchors.shape[0]
     batch_size = tf.shape(rpn_bbox_deltas)[0]
     rpn_bbox_deltas = tf.reshape(rpn_bbox_deltas, (batch_size, total_anchors, 4))
     rpn_labels = tf.reshape(rpn_labels, (batch_size, total_anchors))
     #
     rpn_bbox_deltas *= variances
     rpn_bboxes = bbox_utils.get_bboxes_from_deltas(anchors, rpn_bbox_deltas)
     #
     _, pre_indices = tf.nn.top_k(rpn_labels, pre_nms_topn)
     #
     pre_roi_bboxes = tf.gather(rpn_bboxes, pre_indices, batch_dims=1)
     pre_roi_labels = tf.gather(rpn_labels, pre_indices, batch_dims=1)
     #
     pre_roi_bboxes = tf.reshape(pre_roi_bboxes, (batch_size, pre_nms_topn, 1, 4))
     pre_roi_labels = tf.reshape(pre_roi_labels, (batch_size, pre_nms_topn, 1))
     #
     roi_bboxes, _, _, _ = bbox_utils.non_max_suppression(pre_roi_bboxes, pre_roi_labels,
                                                          max_output_size_per_class=post_nms_topn,
                                                          max_total_size=post_nms_topn,
                                                          iou_threshold=nms_iou_threshold)
     #
     return tf.stop_gradient(roi_bboxes)
示例#2
0
 def call(self, inputs):
     roi_bboxes = inputs[0]
     pred_deltas = inputs[1]
     pred_label_probs = inputs[2]
     batch_size = tf.shape(pred_deltas)[0]
     #
     pred_deltas = tf.reshape(pred_deltas, (batch_size, -1, self.total_labels, 4))
     pred_deltas *= self.variances
     #
     expanded_roi_bboxes = tf.tile(tf.expand_dims(roi_bboxes, -2), (1, 1, self.total_labels, 1))
     pred_bboxes = bbox_utils.get_bboxes_from_deltas(expanded_roi_bboxes, pred_deltas)
     #
     pred_labels_map = tf.expand_dims(tf.argmax(pred_label_probs, -1), -1)
     pred_labels = tf.where(tf.not_equal(pred_labels_map, 0), pred_label_probs, tf.zeros_like(pred_label_probs))
     #
     final_bboxes, final_scores, final_labels, _ = bbox_utils.non_max_suppression(
         pred_bboxes, pred_labels,
         max_output_size_per_class=self.max_total_size,
         max_total_size=self.max_total_size,
         score_threshold=self.score_threshold)
     #
     return final_bboxes, final_labels, final_scores
        lambda x: data_utils.preprocessing(x, img_size, img_size))

test_data = test_data.padded_batch(batch_size,
                                   padded_shapes=data_shapes,
                                   padding_values=padding_values)

rpn_model, _ = get_model(hyper_params)

frcnn_model_path = io_utils.get_model_path("faster_rcnn", backbone)
rpn_model_path = io_utils.get_model_path("rpn", backbone)
model_path = frcnn_model_path if load_weights_from_frcnn else rpn_model_path
rpn_model.load_weights(model_path, by_name=True)

anchors = bbox_utils.generate_anchors(hyper_params)

for image_data in test_data:
    imgs, _, _ = image_data
    rpn_bbox_deltas, rpn_labels = rpn_model.predict_on_batch(imgs)
    #
    rpn_bbox_deltas = tf.reshape(rpn_bbox_deltas, (batch_size, -1, 4))
    rpn_labels = tf.reshape(rpn_labels, (batch_size, -1))
    #
    rpn_bbox_deltas *= hyper_params["variances"]
    rpn_bboxes = bbox_utils.get_bboxes_from_deltas(anchors, rpn_bbox_deltas)
    #
    _, top_indices = tf.nn.top_k(rpn_labels, 10)
    #
    selected_rpn_bboxes = tf.gather(rpn_bboxes, top_indices, batch_dims=1)
    #
    drawing_utils.draw_bboxes(imgs, selected_rpn_bboxes)
示例#4
0
ssd_model_path = io_utils.get_model_path(backbone)
ssd_model.load_weights(ssd_model_path)

prior_boxes = bbox_utils.generate_prior_boxes(
    hyper_params["feature_map_shapes"], hyper_params["aspect_ratios"])

background_label = "bg"
labels = [background_label] + labels
bg_id = labels.index(background_label)

for image_data in test_data:
    img, _, _ = image_data
    pred_bbox_deltas, pred_labels = ssd_model.predict_on_batch(img)
    #
    pred_bbox_deltas *= hyper_params["variances"]
    pred_bboxes = bbox_utils.get_bboxes_from_deltas(prior_boxes,
                                                    pred_bbox_deltas)
    pred_bboxes = tf.clip_by_value(pred_bboxes, 0, 1)
    #
    pred_labels = tf.cast(pred_labels, tf.float32)
    reshaped_pred_bboxes = tf.reshape(
        pred_bboxes, (batch_size, pred_bbox_deltas.shape[1], 1, 4))
    # Remove background predictions
    pred_labels_map = tf.argmax(pred_labels, 2, output_type=tf.int32)
    valid_cond = tf.not_equal(pred_labels_map, bg_id)
    #
    valid_bboxes = tf.expand_dims(reshaped_pred_bboxes[valid_cond], 0)
    valid_labels = tf.expand_dims(pred_labels[valid_cond], 0)
    #
    nms_bboxes, nmsed_scores, nmsed_classes, valid_detections = bbox_utils.non_max_suppression(
        valid_bboxes,
        valid_labels,