def forward(self, bottom, top): """Compute loss, select RoIs using OHEM. Use RoIs to get blobs and copy them into this layer's top blob vector.""" cls_prob = bottom[0].data bbox_pred = bottom[1].data rois = bottom[2].data labels = bottom[3].data labels = labels.astype(int) if cfg.TRAIN.BBOX_REG: bbox_target = bottom[4].data bbox_inside_weights = bottom[5].data bbox_outside_weights = bottom[6].data im_data = bottom[7].data # Alice: 2017.11.16 adding roi visualization else: im_data = bottom[4].data # Alice: 2017.11.16 adding roi visualization bbox_target = None bbox_inside_weights = None bbox_outside_weights = None flt_min = np.finfo(float).eps # classification loss loss = [ -1 * np.log(max(x, flt_min)) \ for x in [cls_prob[i,label] for i, label in enumerate(labels)]] if cfg.TRAIN.BBOX_REG: # bounding-box regression loss # d := w * (b0 - b1) # smoothL1(x) = 0.5 * x^2 if |x| < 1 # |x| - 0.5 otherwise def smoothL1(x): if abs(x) < 1: return 0.5 * x * x else: return abs(x) - 0.5 bbox_loss = np.zeros(labels.shape[0]) for i in np.where(labels > 0 )[0]: indices = np.where(bbox_inside_weights[i,:] != 0)[0] bbox_loss[i] = sum(bbox_outside_weights[i,indices] * [smoothL1(x) \ for x in bbox_inside_weights[i,indices] * (bbox_pred[i,indices] - bbox_target[i,indices])]) loss += bbox_loss #original version(don't need to visualization) #blobs = get_ohem_minibatch(loss, rois, labels, bbox_target, \ #bbox_inside_weights, bbox_outside_weights) #Alice: 2017.11.16 (adding bbox visualization, one more parameter) blobs = get_ohem_minibatch(im_data, loss, rois, labels, bbox_target, \ bbox_inside_weights, bbox_outside_weights) for blob_name, blob in blobs.iteritems(): top_ind = self._name_to_top_map[blob_name] # Reshape net's input blobs top[top_ind].reshape(*(blob.shape)) # Copy data into net's input blobs top[top_ind].data[...] = blob.astype(np.float32, copy=False)
def forward(self, bottom, top): """Compute loss, select RoIs using OHEM. Use RoIs to get blobs and copy them into this layer's top blob vector.""" cls_prob = bottom[0].data bbox_pred = bottom[1].data rois = bottom[2].data labels = bottom[3].data if cfg.TRAIN.BBOX_REG: bbox_target = bottom[4].data bbox_inside_weights = bottom[5].data bbox_outside_weights = bottom[6].data else: bbox_target = None bbox_inside_weights = None bbox_outside_weights = None flt_min = np.finfo(float).eps # classification loss loss = [ -1 * np.log(max(x, flt_min)) \ for x in [cls_prob[i,label] for i, label in enumerate(labels)]] if cfg.TRAIN.BBOX_REG: # bounding-box regression loss # d := w * (b0 - b1) # smoothL1(x) = 0.5 * x^2 if |x| < 1 # |x| - 0.5 otherwise def smoothL1(x): if abs(x) < 1: return 0.5 * x * x else: return abs(x) - 0.5 bbox_loss = np.zeros(labels.shape[0]) for i in np.where(labels > 0 )[0]: indices = np.where(bbox_inside_weights[i,:] != 0)[0] bbox_loss[i] = sum(bbox_outside_weights[i,indices] * [smoothL1(x) \ for x in bbox_inside_weights[i,indices] * (bbox_pred[i,indices] - bbox_target[i,indices])]) loss += bbox_loss blobs = get_ohem_minibatch(loss, rois, labels, bbox_target, \ bbox_inside_weights, bbox_outside_weights) for blob_name, blob in blobs.iteritems(): top_ind = self._name_to_top_map[blob_name] # Reshape net's input blobs top[top_ind].reshape(*(blob.shape)) # Copy data into net's input blobs top[top_ind].data[...] = blob.astype(np.float32, copy=False)
def forward(self, bottom, top): """Compute loss, select RoIs using OHEM. Use RoIs to get blobs and copy them into this layer's top blob vector.""" cls_prob = bottom[0].data bbox_pred = bottom[1].data rois = bottom[2].data labels = bottom[3].data self._count_iter = (self._count_iter + 1) % self._iter_size if cfg.TRAIN.BBOX_REG: bbox_target = bottom[4].data bbox_inside_weights = bottom[5].data bbox_outside_weights = bottom[6].data else: bbox_target = None bbox_inside_weights = None bbox_outside_weights = None flt_min = np.finfo(float).eps # classification loss loss = [ -1 * np.log(max(x, flt_min)) \ for x in [cls_prob[i,label] for i, label in enumerate(labels)]] if cfg.TRAIN.BBOX_REG: # bounding-box regression loss # d := w * (b0 - b1) # smoothL1(x) = 0.5 * x^2 if |x| < 1 # |x| - 0.5 otherwise def smoothL1(x): if abs(x) < 1: return 0.5 * x * x else: return abs(x) - 0.5 bbox_loss = np.zeros(labels.shape[0]) for i in np.where(labels > 0 )[0]: indices = np.where(bbox_inside_weights[i,:] != 0)[0] bbox_loss[i] = sum(bbox_outside_weights[i,indices] * [smoothL1(x) \ for x in bbox_inside_weights[i,indices] * (bbox_pred[i,indices] - bbox_target[i,indices])]) loss += bbox_loss blobs = [] hard_inds = [] if self._count_iter < self._maintain_before or cfg.TRAIN.OHEM_RATIO < 0.1: blobs, hard_inds = get_ohem_minibatch(loss, rois, labels, bbox_target, bbox_inside_weights, bbox_outside_weights) else: blobs, hard_inds = get_ohem_minibatch_ratio(loss, rois, labels, bbox_target, bbox_inside_weights, bbox_outside_weights, ratio=cfg.TRAIN.OHEM_RATIO, hard_negative=cfg.TRAIN.OHEM_HARD_NEG) for blob_name, blob in blobs.iteritems(): top_ind = self._name_to_top_map[blob_name] # Reshape net's input blobs top[top_ind].reshape(*(blob.shape)) # Copy data into net's input blobs top[top_ind].data[...] = blob.astype(np.float32, copy=False) # used for ASDN if cfg.TRAIN.USE_ASDN: prop_before = cls_prob[hard_inds] top_ind = self._name_to_top_map['prop_before'] top[top_ind].reshape(*(prop_before.shape)) top[top_ind].data[...] = prop_before.astype(np.float32, copy=False)