def __init__(self, fold=0, preprocess_input=preprocess_input):
        super().__init__()
        self.preprocess_input = preprocess_input
        print('build clip transforms')
        self.clip_transforms = {
            video_id: self.transform_for_clip(video_id) for video_id in self.video_clips
        }

        self.data = []  # type: List[FishClassification]
        # video_id->frame->species:
        self.known_species = {}  # type: Dict[str, Dict[int, int]]
        self.data, self.known_species = self.load()

        all_video_ids = set(self.video_clips.keys())
        self.test_video_ids = set(dataset.fold_test_video_ids(fold))
        self.train_video_ids = all_video_ids.difference(self.test_video_ids)

        self.train_data = [d for d in self.data if d.video_id in self.train_video_ids]
        self.test_data_full = [d for d in self.data if d.video_id in self.test_video_ids]
        self.test_data = self.test_data_full[::2]

        self.test_data_for_clip = {}
        for d in self.test_data_full:
            if not d.video_id in self.test_data_for_clip:
                self.test_data_for_clip[d.video_id] = []
            self.test_data_for_clip[d.video_id].append(d)

        self.crops_cache = {}

        print('train samples: {} test samples {}'.format(len(self.train_data), len(self.test_data)))
    def __init__(self,
                 fold,
                 detection_results_dir='../output/detection_results',
                 classification_results_dir='../output/classification_results',
                 train_on_all_dataset=True,
                 load_only_video_ids=None,
                 is_test=False):

        self.video_clips = dataset.video_clips(is_test=is_test)

        if load_only_video_ids is not None:
            all_video_ids = set(load_only_video_ids)
        else:
            all_video_ids = set(self.video_clips.keys())

        if train_on_all_dataset:
            self.test_video_ids = []
            self.train_video_ids = all_video_ids
        else:
            self.test_video_ids = set(dataset.fold_test_video_ids(fold))
            self.train_video_ids = all_video_ids.difference(
                self.test_video_ids)

        self.gt = pd.read_csv(
            '../input/N1_fish_N2_fish_-_Training_set_annotations.csv')
        self.gt.dropna(axis=0, inplace=True)
        self.gt['have_frame'] = 1.0

        self.video_frames_count = {}
        self.video_data = {}
        self.video_data_gt = {}

        print('load video data...')
        cache_fn = '../output/sequence_rnn_test.pkl' if is_test else '../output/sequence_rnn_train.pkl'
        try:
            self.video_frames_count, self.video_data, self.video_data_gt, self.columns = utils.load_data(
                cache_fn)
        except FileNotFoundError:
            self.video_frames_count, self.video_data, self.video_data_gt, self.columns = self.load(
                all_video_ids, detection_results_dir,
                classification_results_dir)
            utils.save_data((self.video_frames_count, self.video_data,
                             self.video_data_gt, self.columns), cache_fn)
        print('loaded')
Exemple #3
0
def generate_results_from_detection_crops_on_fold(fold,
                                                  weights,
                                                  crops_dir,
                                                  output_dir,
                                                  video_ids=None,
                                                  hflip=0,
                                                  vflip=0,
                                                  model_type=''):

    preprocess_input_func = preprocess_input

    if model_type in ('densenet', 'densenet2'):
        model = build_model_densenet_161()
    elif model_type in ('densenet121', ):
        model = build_model_densenet_121()
    elif model_type == 'resnet50':
        model = build_model_resnet50()
    elif model_type == 'resnet50_mask':
        model = build_model_resnet50_with_mask()
    elif model_type == 'resnet50_mask5':
        model = build_model_resnet50_with_mask()
    elif model_type in ('xception', 'xception5'):
        model = build_model_xception()
        preprocess_input_func = preprocess_input_xception
    elif model_type == 'inception':
        model = build_model_inception()
        preprocess_input_func = preprocess_input_inception
    else:
        print('Invalid model_type', model_type)
        return

    model.load_weights(weights)

    os.makedirs(output_dir, exist_ok=True)

    executor = concurrent.futures.ThreadPoolExecutor(max_workers=16)

    if video_ids is None:
        video_ids = sorted(dataset.fold_test_video_ids(fold))

    batch_size = 8
    for video_id in video_ids:
        src_dir = os.path.join(crops_dir, video_id)
        try:
            files = [
                f for f in sorted(os.listdir(src_dir)) if f.endswith('.jpg')
            ]
        except FileNotFoundError:
            print('Warning: no images found in ', src_dir)
            files = []

        def load_data():
            for batch_files in utils.chunks(files, batch_size):
                res = []
                for fn in batch_files:
                    # print('load', fn)
                    img = scipy.misc.imread(os.path.join(src_dir, fn))
                    if hflip:
                        img = img[:, ::-1]
                    if vflip:
                        img = img[::-1]
                    # utils.print_stats('img', img)
                    # img = np.load(os.path.join(src_dir, fn))
                    # plt.imshow(img)
                    # plt.show()
                    img = img.astype(np.float32)  # * 255.0
                    res.append(img)
                res = np.array(res)
                yield preprocess_input_func(res)

        results_species = []
        results_cover = []
        for batch_data in utils.parallel_generator(load_data(), executor):
            # for batch_data in load_data():
            res_species, res_cover = model.predict_on_batch(batch_data)
            #
            # for i in range(batch_data.shape[0]):
            #     print(SPECIES_CLASSES[np.argmax(res_species[i])],
            #           COVER_CLASSES[np.argmax(res_cover[i])])
            #     print(res_species[i])
            #     print(res_cover[i])

            results_species.append(res_species)
            results_cover.append(res_cover)

        frames = [int(f[:-len('.npy')]) - 1 for f in files]
        df = pd.DataFrame({'frame': frames})
        df['video_id'] = video_id

        if len(results_species) == 0:
            results_species = np.zeros((0, len(SPECIES_CLASSES)))
            results_cover = np.zeros((0, len(COVER_CLASSES)))
        else:
            results_species = np.row_stack(results_species)
            results_cover = np.row_stack(results_cover)

        for i, species_cls in enumerate(SPECIES_CLASSES):
            df['species_' + species_cls] = results_species[:, i]

        for i, cover_cls in enumerate(COVER_CLASSES):
            df[cover_cls] = results_cover[:, i]

        df.to_csv(os.path.join(output_dir, video_id + '_categories.csv'),
                  index=False,
                  float_format='%.4f')
    def __init__(self,
                 fold,
                 detection_results_dir='../output/detection_results',
                 classification_results_dir='../output/classification_results',
                 load_only_video_ids=None):
        self.video_clips = dataset.video_clips()

        if load_only_video_ids is not None:
            all_video_ids = set(load_only_video_ids)
        else:
            all_video_ids = set(self.video_clips.keys())
        self.test_video_ids = set(dataset.fold_test_video_ids(fold))
        self.train_video_ids = all_video_ids.difference(self.test_video_ids)

        self.gt = pd.read_csv(
            '../input/N1_fish_N2_fish_-_Training_set_annotations.csv')
        self.gt.dropna(axis=0, inplace=True)
        self.gt['have_frame'] = 1.0

        self.video_frames_count = {}
        self.video_data = {}
        self.video_data_gt = {}

        for video_id in sorted(all_video_ids):
            try:
                ds_detection = pd.read_csv(
                    os.path.join(detection_results_dir,
                                 video_id + '_ssd_detection.csv'))
                ds_classification = pd.read_csv(
                    os.path.join(classification_results_dir,
                                 video_id + '_categories.csv'))
            except FileNotFoundError:
                continue

            ds_combined = ds_classification.join(ds_detection,
                                                 on='frame',
                                                 how='left',
                                                 rsuffix='_det')
            ds_combined.x /= IMG_WITH
            ds_combined.y /= IMG_HEIGHT
            ds_combined.w /= IMG_WITH
            ds_combined.h /= IMG_HEIGHT

            nb_frames = len(self.video_clips[video_id])
            self.video_frames_count[video_id] = nb_frames
            all_frames = pd.DataFrame({'frame': list(range(nb_frames))})
            ds_combined = all_frames.merge(ds_combined, on='frame',
                                           how='left').fillna(0.0)

            ds_combined['species__'] = 1.0 - (
                ds_combined['species_fourspot'] +
                ds_combined['species_grey sole'] +
                ds_combined['species_other'] + ds_combined['species_plaice'] +
                ds_combined['species_summer'] +
                ds_combined['species_windowpane'] +
                ds_combined['species_winter'])

            self.columns = [
                'species__', 'species_fourspot', 'species_grey sole',
                'species_other', 'species_plaice', 'species_summer',
                'species_windowpane', 'species_winter', 'no fish',
                'hand over fish', 'fish clear', 'x', 'y', 'w', 'h',
                'detection_conf', 'detection_species'
            ]
            self.video_data[video_id] = ds_combined.as_matrix(
                columns=self.columns)

            gt_combined = all_frames.merge(
                self.gt.loc[self.gt.video_id == video_id],
                on='frame',
                how='left').fillna(0.0)
            self.video_data_gt[video_id] = gt_combined.as_matrix(
                columns=['have_frame'])