def decode_netout(self, netout, obj_threshold=0.3, nms_threshold=0.3): grid_h, grid_w, nb_box = netout.shape[:3] boxes = [] # decode the output by the network netout[..., 4] = self.sigmoid(netout[..., 4]) netout[..., 5:] = netout[..., 4][..., np.newaxis] * self.softmax( netout[..., 5:]) netout[..., 5:] *= netout[..., 5:] > obj_threshold for row in range(grid_h): for col in range(grid_w): for b in range(nb_box): # from 4th element onwards are confidence and class classes classes = netout[row, col, b, 5:] if np.sum(classes) > 0: # first 4 elements are x, y, w, and h x, y, w, h = netout[row, col, b, :4] x = (col + self.sigmoid(x) ) / grid_w # center position, unit: image width y = (row + self.sigmoid(y) ) / grid_h # center position, unit: image height w = self.anchors[2 * b + 0] * np.exp( w) / grid_w # unit: image width h = self.anchors[2 * b + 1] * np.exp( h) / grid_h # unit: image height confidence = netout[row, col, b, 4] box = BoundBox(x, y, w, h, confidence, classes) boxes.append(box) # suppress non-maximal boxes for c in range(self.nb_class): sorted_indices = list( reversed(np.argsort([box.classes[c] for box in boxes]))) for i in range(len(sorted_indices)): index_i = sorted_indices[i] if boxes[index_i].classes[c] == 0: continue else: for j in range(i + 1, len(sorted_indices)): index_j = sorted_indices[j] if self.bbox_iou(boxes[index_i], boxes[index_j]) >= nms_threshold: boxes[index_j].classes[c] = 0 # remove the boxes which are less likely than a obj_threshold boxes = [box for box in boxes if box.get_score() > obj_threshold] return boxes
def decode_netout(self, netout, obj_threshold=0.3, nms_threshold=0.3): grid_h, grid_w, nb_box = netout.shape[:3] boxes = [] # decode the output by the network netout[..., 4] = self.sigmoid(netout[..., 4]) netout[..., 5:] = netout[..., 4][..., np.newaxis] * self.softmax(netout[..., 5:]) netout[..., 5:] *= netout[..., 5:] > obj_threshold for row in range(grid_h): for col in range(grid_w): for b in range(nb_box): # from 4th element onwards are confidence and class classes classes = netout[row,col,b,5:] if np.sum(classes) > 0: # first 4 elements are x, y, w, and h x, y, w, h = netout[row,col,b,:4] x = (col + self.sigmoid(x)) / grid_w # center position, unit: image width y = (row + self.sigmoid(y)) / grid_h # center position, unit: image height w = self.anchors[2 * b + 0] * np.exp(w) / grid_w # unit: image width h = self.anchors[2 * b + 1] * np.exp(h) / grid_h # unit: image height confidence = netout[row,col,b,4] box = BoundBox(x, y, w, h, confidence, classes) boxes.append(box) # suppress non-maximal boxes for c in range(self.nb_class): sorted_indices = list(reversed(np.argsort([box.classes[c] for box in boxes]))) for i in xrange(len(sorted_indices)): index_i = sorted_indices[i] if boxes[index_i].classes[c] == 0: continue else: for j in xrange(i+1, len(sorted_indices)): index_j = sorted_indices[j] if self.bbox_iou(boxes[index_i], boxes[index_j]) >= nms_threshold: boxes[index_j].classes[c] = 0 # remove the boxes which are less likely than a obj_threshold boxes = [box for box in boxes if box.get_score() > obj_threshold] return boxes
def decode_netout(self, netout, obj_threshold=0.25, nms_threshold=0.7, hand_label=-1): grid_h, grid_w, nb_box = netout.shape[:3] boxes = [] # decode the output by the network netout[..., 4] = self.sigmoid(netout[..., 4]) netout[..., 5:] = netout[..., 4][..., np.newaxis] * self.softmax( netout[..., 5:]) netout[..., 5:] *= netout[..., 5:] > obj_threshold for row in range(grid_h): for col in range(grid_w): for b in range(nb_box): # from 4th element onwards are confidence and class classes classes = netout[row, col, b, 5:] if np.sum(classes) > 0: # first 4 elements are x, y, w, and h x, y, w, h = netout[row, col, b, :4] x = (col + self.sigmoid(x) ) / grid_w # center position, unit: image width y = (row + self.sigmoid(y) ) / grid_h # center position, unit: image height w = self.anchors[2 * b + 0] * np.exp( w) / grid_w # unit: image width h = self.anchors[2 * b + 1] * np.exp( h) / grid_h # unit: image height confidence = netout[row, col, b, 4] box = BoundBox(x, y, w, h, confidence, classes) boxes.append(box) # suppress non-maximal boxes for c in range(self.nb_class): sorted_indices = list( reversed(np.argsort([box.classes[c] for box in boxes]))) for i in range(len(sorted_indices)): index_i = sorted_indices[i] if boxes[index_i].classes[c] == 0: continue else: for j in range(i + 1, len(sorted_indices)): index_j = sorted_indices[j] if self.bbox_iou(boxes[index_i], boxes[index_j]) >= nms_threshold: boxes[index_j].classes[c] = 0 # remove the boxes which are less likely than a obj_threshold boxes = [box for box in boxes if box.get_score() > obj_threshold] if len(boxes) == 0: return boxes # select highest score of left and right filtered_boxes = [] max_score_r = 0 max_score_l = 0 count_l_index = -1 count_r_index = -1 for i in range(len(boxes)): if boxes[i].get_label() == 0: if boxes[i].get_score() > max_score_l: max_score_l = boxes[i].get_score() count_l_index = i elif boxes[i].get_label() == 1: if boxes[i].get_score() > max_score_r: max_score_r = boxes[i].get_score() count_r_index = i else: print('label: ', boxes[i].get_label()) if hand_label == 0: if count_l_index < 0: # Ugly box = boxes[count_r_index] box.label = 0 filtered_boxes.append(box) else: filtered_boxes = [boxes[count_l_index]] elif hand_label == 1: if count_r_index < 0: # Ugly box = boxes[count_l_index] box.label = 1 filtered_boxes.append(box) else: filtered_boxes = [boxes[count_r_index]] elif hand_label == 2: if count_l_index < 0: print('error bl') if count_r_index < 0: print('error br') #if count_l_index >= 0: filtered_boxes.append(boxes[count_l_index]) #if count_r_index >= 0: filtered_boxes.append(boxes[count_r_index]) #if bbox_iou(boxes[count_l_index] != boxes[count_r_index]) < 0.8: # boxes = [boxes[count_l_index], boxes[count_r_index]] #else: elif hand_label == -1: filtered_boxes.append(boxes[count_l_index]) filtered_boxes.append(boxes[count_r_index]) return filtered_boxes