def data_generator(annotation_lines, batch_size, anchors, num_classes, max_bbox_per_scale, annotation_type): '''data generator for fit_generator''' n = len(annotation_lines) i = 0 #多尺度训练 train_input_sizes = [320, 352, 384, 416, 448, 480, 512, 544, 576, 608] strides = np.array([8, 16, 32]) while True: train_input_size = random.choice(train_input_sizes) # 输出的网格数 train_output_sizes = train_input_size // strides batch_image = np.zeros((batch_size, train_input_size, train_input_size, 3)) batch_label_sbbox = np.zeros((batch_size, train_output_sizes[0], train_output_sizes[0], 3, 5 + num_classes)) batch_label_mbbox = np.zeros((batch_size, train_output_sizes[1], train_output_sizes[1], 3, 5 + num_classes)) batch_label_lbbox = np.zeros((batch_size, train_output_sizes[2], train_output_sizes[2], 3, 5 + num_classes)) batch_sbboxes = np.zeros((batch_size, max_bbox_per_scale, 4)) batch_mbboxes = np.zeros((batch_size, max_bbox_per_scale, 4)) batch_lbboxes = np.zeros((batch_size, max_bbox_per_scale, 4)) for num in range(batch_size): if i == 0: np.random.shuffle(annotation_lines) image, bboxes, exist_boxes = parse_annotation(annotation_lines[i], train_input_size, annotation_type) label_sbbox, label_mbbox, label_lbbox, sbboxes, mbboxes, lbboxes = preprocess_true_boxes(bboxes, train_output_sizes, strides, num_classes, max_bbox_per_scale, anchors) batch_image[num, :, :, :] = image if exist_boxes: batch_label_sbbox[num, :, :, :, :] = label_sbbox batch_label_mbbox[num, :, :, :, :] = label_mbbox batch_label_lbbox[num, :, :, :, :] = label_lbbox batch_sbboxes[num, :, :] = sbboxes batch_mbboxes[num, :, :] = mbboxes batch_lbboxes[num, :, :] = lbboxes i = (i + 1) % n yield [batch_image, batch_label_sbbox, batch_label_mbbox, batch_label_lbbox, batch_sbboxes, batch_mbboxes, batch_lbboxes], np.zeros(batch_size)
def data_generator(annotation_lines, batch_size, input_shape, anchors, num_classes): '''data generator for fit_generator''' n = len(annotation_lines) i = 0 while True: image_data = [] box_data = [] for b in range(batch_size): if i == 0: np.random.shuffle(annotation_lines) image, box = get_random_data(annotation_lines[i], input_shape, random=True) image_data.append(image) box_data.append(box) i = (i + 1) % n image_data = np.array(image_data) box_data = np.array(box_data) y_true = preprocess_true_boxes(box_data, input_shape, anchors, num_classes) yield [image_data, *y_true], np.zeros(batch_size)