def generate_crops_test(): detection_dataset = fish_detection.FishDetectionDataset(is_test=True) def decode_clip(video_id): frames = detection_dataset.video_clips[video_id] print(video_id) os.makedirs('{}/{}'.format(dataset.RULER_CROPS_DIR_TEST, video_id), exist_ok=True) dest_w = 720 dest_h = 360 transform = detection_dataset.transform_for_clip( video_id, dest_w, dest_h) for frame in frames: src_fn = '{}/{}/{}.jpg'.format(IMAGES_DIR_TEST, video_id, frame) dst_fn = '{}/{}/{}.jpg'.format(dataset.RULER_CROPS_DIR_TEST, video_id, frame) if os.path.isfile(dst_fn): continue img = scipy.misc.imread(src_fn) crop = skimage.transform.warp(img, transform, mode='edge', order=3, output_shape=(dest_h, dest_w)) scipy.misc.imsave(dst_fn, crop) pool = ThreadPool(processes=8) pool.map(decode_clip, detection_dataset.video_clips.keys())
def prepare_submission(): orig_submission = pd.read_csv('../input/submission_format_zeros.csv') key_frames = load_key_frames() detection_ds = fish_detection.FishDetectionDataset(is_test=True) print('load detections:') try: detections, classifications, fish_numbers = utils.load_data( '../output/cache_submission_det_csl.pkl') raise FileNotFoundError # TODO: does not worth to cache except FileNotFoundError: detections = {} for video_id in orig_submission.video_id.unique(): df = pd.read_csv( '../output/detection_results_test/resnet_53/{}_ssd_detection.csv' .format(video_id)) df_full = pd.DataFrame({'frame': range(MAX_ROWS)}) detection_res = df_full.merge(df, on='frame', how='left') detections[video_id] = detection_res['w'].fillna(0.0).as_matrix() print('load classifications:') classifications = {} cls_models = [('inception', 1.0)] fn_mask = '../output/classification_results_test_combined/{}/{}/{}_categories.csv' for video_id in orig_submission.video_id.unique(): cls_res = np.zeros((MAX_ROWS, len(CLS_COLS)), dtype=np.float32) for det_id, det_weight in [('resnet_53', 0.5), ('resnet_62', 0.5)]: for cls_model_name, cls_model_weight in cls_models: df = pd.read_csv( fn_mask.format(det_id, cls_model_name, video_id)) df_full = pd.DataFrame({'frame': range(MAX_ROWS)}) cls_res += df_full.merge( df, on='frame', how='left').fillna(0.0).as_matrix( columns=CLS_COLS) * det_weight * cls_model_weight classifications[video_id] = cls_res print('load fish numbers:') fish_numbers = {} for video_id in orig_submission.video_id.unique(): fish_numbers[video_id] = key_frames_to_frame_numbers( sorted(key_frames[video_id]), res_size=MAX_ROWS) utils.save_data([detections, classifications, fish_numbers], '../output/cache_submission_det_csl.pkl') print('generate transforms') transforms = {} for video_id in orig_submission.video_id.unique(): transforms[video_id] = detection_ds.transform_for_clip(video_id) orig_submission_array = orig_submission.as_matrix() for res_row in range(orig_submission_array.shape[0]): row = orig_submission_array[res_row] video_id = row[VIDEO_ID_IDX] frame = row[FRAME_IDX] if res_row % 1000 == 0: print(res_row, res_row * 100.0 / orig_submission_array.shape[0]) orig_submission_array[res_row, FISH_NUMBER_IDX] = fish_numbers[video_id][frame] w = detections[video_id][frame] vector_global = transforms[video_id](np.array([[0, 0], [w, 0]])) length = np.linalg.norm(vector_global[0] - vector_global[1]) orig_submission_array[res_row, LENGTH_IDX] = length cls = classifications[video_id][frame] clear_conf = cls[-1] orig_submission_array[res_row, SPECIES_START_IDX:] = cls[:len(SPECIES_COLS)] * ( 0.5 + 0.5 * clear_conf) orig_submission_array = combine_group_species(orig_submission_array) orig_submission[ 'fish_number'] = orig_submission_array[:, FISH_NUMBER_IDX].astype( np.float32) orig_submission['length'] = orig_submission_array[:, LENGTH_IDX].astype( np.float32) for species_idx, species in enumerate(SPECIES_COLS): orig_submission[species] = orig_submission_array[:, SPECIES_START_IDX + species_idx].astype( np.float32) orig_submission.to_csv('../output/submission30_inception_only.csv', index=False, float_format='%.8f')