Example #1
0
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())
Example #2
0
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')