Quality evaluation module and benchmark application#11
Conversation
|
@ismukhin Добавил оценку качества на датасете hpatches-release. |
|
@SimonovDmitry, боюсь, так мы не сможем оценить качество нейросетевых методов, плюсом оценка качества только по дескрипторам будто бы не имеет отношение к задачи сопоставления (хотя в HPatches она именно так и называется). |
|
@ismukhin Поменял датасет на hpatches-sequences-release. Метрика mAP теперь вычисляется с помощью матрицы гомографии после вычисления матчей. |
| try: | ||
| if not args.path.exists(): | ||
| logger.error(f"Dataset path does not exist: {args.path}") | ||
| return 1 |
| scene_dir = self._raw_data_path / scene | ||
| self._logger.info(f"Loading {scene_dir}") | ||
|
|
||
| ref_path = scene_dir / "1.ppm" |
There was a problem hiding this comment.
Надо вынести значение константы 1.ppm
| } | ||
|
|
||
| dataset[scene] = scene_data | ||
|
|
There was a problem hiding this comment.
Надо прологировать завершение чтения набора данных.
| if seq not in matching_data: | ||
| continue | ||
|
|
||
| for i in range(2, 7): |
There was a problem hiding this comment.
"Магический" range, который не понятно,откуда берется.
| import sys | ||
| import logging | ||
| from pathlib import Path | ||
|
|
|
|
||
| h_path = scene_dir / f"H_1_{i}" | ||
| if img_target is not None and h_path.exists(): | ||
| H = np.loadtxt(str(h_path)) |
There was a problem hiding this comment.
Надо посмотреть как парсится матрица из файла
|
@ismukhin Добавил вычисление метрик AUC@npx и MatchingScore, которые вы объяснили на собрании. Про вычисление MatchingScore: посмотрел различные статьи, пришел к выводу, что для нашей задачи подойдет формула MatchingScore = |inliers| / min(|K1|, |K2|), где inliers — это хорошие матчи, у которых евклидово расстояние между точкой, которую выдал наш матчер, и точкой, которую мы получили матрицей гомографии < threshold, а K1 и K2 — точки, которые нашел наш детектор на 1 и 2 изображении |
| ds_group.add_argument('-bs', '--batch-size', type=int, default=4, | ||
| help='Batch size for processing images/scenes') |
There was a problem hiding this comment.
Переименовать во что-то другое, так как batch_size связан с входом нейронных сетей
|
|
||
| self._raw_data_path = Path(config.pop("raw_data_path", "hpatches-sequences-release")) | ||
| self._num_scenes = config.pop("num_scenes", 116) | ||
| self._batch_size = config.pop("batch_size", 4) |
|
|
||
| def _get_all_scenes(self): | ||
| scenes = [d for d in self._raw_data_path.iterdir() if d.is_dir()] | ||
| scenes.sort() |
There was a problem hiding this comment.
Проверить целесобразность сортировки, возможно она не нужна
| task = HPatchesTask.create(task_name=args.task, logger=logger, config=config['task']) | ||
|
|
||
| results = {} | ||
| while dm.has_more_data(): |
There was a problem hiding this comment.
Изучить случай, когда размер пачки данных больше размера самого датасета
| pts_tgt_gt = cv.perspectiveTransform(pts_ref, H) | ||
|
|
||
| distances = np.linalg.norm(pts_tgt_pred - pts_tgt_gt, axis=2).flatten() | ||
| labels = (distances <= self.pixel_threshold).astype(int) |
There was a problem hiding this comment.
Не понятно, зачем преобразование к int
| 'distances': distances, | ||
| 'num_kp_ref': len(kp_ref), | ||
| 'num_matches': len(matches), | ||
| 'scores': np.array([-m.distance for m in matches]) |
| def report_metrics(self, results, task_name="Feature Matching (mAP)"): | ||
| rows = [{'Scene': s, 'mAP': np.mean([m['ap'] for m in r.values()])} | ||
| for s, r in results.items() if r] | ||
| df = pd.DataFrame(rows).sort_values('mAP', ascending=False) |
There was a problem hiding this comment.
Скорее всего сортировка здесь тоже не нужна
| accuracies = [np.mean(scene_errors < t) for t in thresholds] | ||
|
|
||
| area = np.trapezoid(accuracies, thresholds) | ||
| scene_auc = area / self._pixel_threshold |
There was a problem hiding this comment.
Надо считать по всему датасету, а не по каждой папке в отдельности. Считаем Corner Errors для каждой папки, потом по ним AUC
No description provided.