def loss_without_regularization(self, y_true, y_pred): #handle for config mc = self.config #slice y_true input_mask = y_true[:, :, 0] input_mask = K.expand_dims(input_mask, axis=-1) box_input = y_true[:, :, 1:5] box_delta_input = y_true[:, :, 5:9] labels = y_true[:, :, 9:] #number of objects. Used to normalize bbox and classification loss num_objects = K.sum(input_mask) #before computing the losses we need to slice the network outputs pred_class_probs, pred_conf, pred_box_delta = ut.slice_predictions( y_pred, mc) #compute boxes det_boxes = ut.boxes_from_deltas(pred_box_delta, mc) #again unstack is not avaible in pure keras backend unstacked_boxes_pred = [] unstacked_boxes_input = [] for i in range(4): unstacked_boxes_pred.append(det_boxes[:, :, i]) unstacked_boxes_input.append(box_input[:, :, i]) #compute the ious ious = ut.tensor_iou(ut.bbox_transform(unstacked_boxes_pred), ut.bbox_transform(unstacked_boxes_input), input_mask, mc) #compute class loss class_loss = K.sum(labels * (-K.log(pred_class_probs + mc.EPSILON)) + (1 - labels) * (-K.log(1 - pred_class_probs + mc.EPSILON)) * input_mask * mc.LOSS_COEF_CLASS) / num_objects #bounding box loss bbox_loss = (K.sum( mc.LOSS_COEF_BBOX * K.square(input_mask * (pred_box_delta - box_delta_input))) / num_objects) #reshape input for correct broadcasting input_mask = K.reshape(input_mask, [mc.BATCH_SIZE, mc.ANCHORS_NO]) #confidence score loss conf_loss = K.mean( K.sum(K.square((ious - pred_conf)) * (input_mask * mc.LOSS_COEF_CONF_POS / num_objects + (1 - input_mask) * mc.LOSS_COEF_CONF_NEG / (mc.ANCHORS_NO - num_objects)), axis=[1]), ) # add above losses total_loss = class_loss + conf_loss + bbox_loss return total_loss
def conf_loss(self, y_true, y_pred): #handle for config mc = self.config #calculate non padded entries n_outputs = mc.CLASS_NO + 1 + 4 #slice and reshape network output y_pred = y_pred[:, :, 0:n_outputs] y_pred = K.reshape( y_pred, (mc.BATCH_SIZE, mc.ANCHOR_HEIGHT, mc.ANCHOR_WIDTH, -1)) #slice y_true input_mask = y_true[:, :, 0] input_mask = K.expand_dims(input_mask, axis=-1) box_input = y_true[:, :, 1:5] #number of objects. Used to normalize bbox and classification loss num_objects = K.sum(input_mask) #number of class probabilities, n classes for each anchor num_class_probs = mc.ANCHOR_PER_GRID * mc.CLASS_NO #number of confidence scores, one for each anchor + class probs num_confidence_scores = mc.ANCHOR_PER_GRID + num_class_probs #slice the confidence scores and put them trough a sigmoid for probabilities pred_conf = K.sigmoid( K.reshape(y_pred[:, :, :, num_class_probs:num_confidence_scores], [mc.BATCH_SIZE, mc.ANCHORS_NO])) #slice remaining bounding box_deltas pred_box_delta = K.reshape(y_pred[:, :, :, num_confidence_scores:], [mc.BATCH_SIZE, mc.ANCHORS_NO, 4]) #compute boxes det_boxes = ut.boxes_from_deltas(pred_box_delta, mc) #again unstack is not avaible in pure keras backend unstacked_boxes_pred = [] unstacked_boxes_input = [] for i in range(4): unstacked_boxes_pred.append(det_boxes[:, :, i]) unstacked_boxes_input.append(box_input[:, :, i]) #compute the ious ious = ut.tensor_iou(ut.bbox_transform(unstacked_boxes_pred), ut.bbox_transform(unstacked_boxes_input), input_mask, mc) #reshape input for correct broadcasting input_mask = K.reshape(input_mask, [mc.BATCH_SIZE, mc.ANCHORS_NO]) #confidence score loss conf_loss = K.mean( K.sum(K.square((ious - pred_conf)) * (input_mask * mc.LOSS_COEF_CONF_POS / num_objects + (1 - input_mask) * mc.LOSS_COEF_CONF_NEG / (mc.ANCHORS_NO - num_objects)), axis=[1]), ) return conf_loss