def __iter__(self): """ Yields: Batched data by stacking each component on an extra 0th dimension. """ ##### pick a scale and shape aligment holder = [] for data in self.ds: image, boxes_, klass_ = data[0], data[1], data[2] ###cove the small faces boxes_clean = [] for i in range(boxes_.shape[0]): box = boxes_[i] if (box[3] - box[1]) < cfg.DATA.cover_small_face or ( box[2] - box[0]) < cfg.DATA.cover_small_face: image[int(box[1]):int(box[3]), int(box[0]):int(box[2]), :] = np.array( cfg.DATA.PIXEL_MEAN, dtype=image.dtype) continue else: boxes_clean.append(box) boxes_ = np.array(boxes_) data = [image, boxes_, klass_] holder.append(data) if len(holder) == self.batch_size: target = self.produce_target(holder) yield BatchData._aggregate_batch(target, self.use_list) del holder[:] if self.remainder and len(holder) > 0: yield BatchData._aggregate_batch(holder, self.use_list)
def __iter__(self): """ Yields: Batched data by stacking each component on an extra 0th dimension. """ ##### pick a scale and shape aligment holder = [] for data in self.ds: image, boxes_, klass_ = data[0], data[1], data[2] data = [image, boxes_, klass_] holder.append(data) ### do crazy crop if random.uniform(0, 1) < cfg.DATA.cracy_crop and self.traing_flag: if len(holder) == self.batch_size: crazy_holder = [] for i in range(0, len(holder), 4): crazy_iamge = np.zeros(shape=(2 * cfg.DATA.hin, 2 * cfg.DATA.win, 3), dtype=holder[i][0].dtype) crazy_iamge[:cfg.DATA.hin, :cfg.DATA. win, :] = holder[i][0] crazy_iamge[:cfg.DATA.hin, cfg.DATA.win:, :] = holder[i + 1][0] crazy_iamge[cfg.DATA.hin:, :cfg.DATA.win, :] = holder[ i + 2][0] crazy_iamge[cfg.DATA.hin:, cfg.DATA.win:, :] = holder[i + 3][0] holder[i + 1][1][:, [0, 2]] = holder[ i + 1][1][:, [0, 2]] + cfg.DATA.win holder[i + 2][1][:, [1, 3]] = holder[ i + 2][1][:, [1, 3]] + cfg.DATA.hin holder[i + 3][1][:, [0, 2]] = holder[ i + 3][1][:, [0, 2]] + cfg.DATA.win holder[i + 3][1][:, [1, 3]] = holder[ i + 3][1][:, [1, 3]] + cfg.DATA.hin tmp_bbox = np.concatenate( (holder[i][1], holder[i + 1][1], holder[i + 2][1], holder[i + 3][1]), axis=0) tmp_klass = np.concatenate( (holder[i][2], holder[i + 1][2], holder[i + 2][2], holder[i + 3][2]), axis=0) ### do random crop 4 times: for j in range(4): curboxes = tmp_bbox.copy() cur_klasses = tmp_klass.copy() start_h = random.randint(0, cfg.DATA.hin) start_w = random.randint(0, cfg.DATA.win) cur_img_block = np.array( crazy_iamge[start_h:start_h + cfg.DATA.hin, start_w:start_w + cfg.DATA.win, :]) for k in range(len(curboxes)): curboxes[k][0] = curboxes[k][0] - start_w curboxes[k][1] = curboxes[k][1] - start_h curboxes[k][2] = curboxes[k][2] - start_w curboxes[k][3] = curboxes[k][3] - start_h curboxes[:, [0, 2]] = np.clip(curboxes[:, [0, 2]], 0, cfg.DATA.win - 1) curboxes[:, [1, 3]] = np.clip(curboxes[:, [1, 3]], 0, cfg.DATA.hin - 1) ###cove the small faces boxes_clean = [] klsses_clean = [] for k in range(curboxes.shape[0]): box = curboxes[k] if not ( (box[3] - box[1]) < cfg.DATA.cover_obj or (box[2] - box[0]) < cfg.DATA.cover_obj): boxes_clean.append(curboxes[k]) klsses_clean.append(cur_klasses[k]) boxes_clean = np.array(boxes_clean) klsses_clean = np.array(klsses_clean) crazy_holder.append( [cur_img_block, boxes_clean, klsses_clean]) del holder holder = crazy_holder if len(holder) == self.batch_size: target = self.produce_target(holder) yield BatchData.aggregate_batch(target, self.use_list) del holder[:] if self.remainder and len(holder) > 0: yield BatchData._aggregate_batch(holder, self.use_list)