Open1

faster_coco_eval - TypeError: unhashable type: 'list'

PINTOPINTO

faster_coco_evalPyTorchTorchVision のバージョン

pip show faster_coco_eval torch torchvision | grep Version

Version: 1.6.5
Version: 2.8.0.dev20250313+cu126
Version: 0.22.0.dev20250313+cu126

eval の際に下記のエラーが発生する。

[rank0]: Traceback (most recent call last):
[rank0]:   File "/home/ubuntu/DEIM/train.py", line 84, in <module>
[rank0]:     main(args)
[rank0]:   File "/home/ubuntu/DEIM/train.py", line 54, in main
[rank0]:     solver.fit()
[rank0]:   File "/home/ubuntu/DEIM/engine/solver/det_solver.py", line 108, in fit
[rank0]:     test_stats, coco_evaluator = evaluate(
[rank0]:   File "/home/ubuntu/.local/lib/python3.10/site-packages/torch/utils/_contextlib.py", line 116, in decorate_context
[rank0]:     return func(*args, **kwargs)
[rank0]:   File "/home/ubuntu/DEIM/engine/solver/det_engine.py", line 156, in evaluate
[rank0]:     coco_evaluator.update(res)
[rank0]:   File "/home/ubuntu/DEIM/engine/data/dataset/coco_eval.py", line 58, in update
[rank0]:     coco_eval.evaluate()
[rank0]:   File "/home/ubuntu/.local/lib/python3.10/site-packages/faster_coco_eval/core/faster_eval_api.py", line 44, in evaluate
[rank0]:     self._prepare()  # not more bottleneck!
[rank0]:   File "/home/ubuntu/.local/lib/python3.10/site-packages/faster_coco_eval/core/cocoeval.py", line 133, in _prepare
[rank0]:     dts = self.cocoDt.loadAnns(self.cocoDt.getAnnIds(imgIds=p.imgIds, catIds=cat_ids))
[rank0]:   File "/home/ubuntu/.local/lib/python3.10/site-packages/faster_coco_eval/core/coco.py", line 166, in getAnnIds
[rank0]:     anns = list(filter(lambda ann: ann["category_id"] in catIds, anns))
[rank0]:   File "/home/ubuntu/.local/lib/python3.10/site-packages/faster_coco_eval/core/coco.py", line 166, in <lambda>
[rank0]:     anns = list(filter(lambda ann: ann["category_id"] in catIds, anns))
[rank0]: TypeError: unhashable type: 'list'

faster_coco_eval を下記のように修正する。

~/.local/lib/python3.10/site-packages/faster_coco_eval/core/coco.py
103         if "annotations" in self.dataset and "categories" in self.dataset:
104             for ann in self.dataset["annotations"]:
105                 if isinstance(ann["category_id"], list):
106                     ann["category_id"] = ann["category_id"][0]
107                 else:
108                     ann["category_id"] = int(ann["category_id"])
109                 catToImgs[ann["category_id"]].append(ann["image_id"])
~/.local/lib/python3.10/site-packages/faster_coco_eval/core/coco.py
165             if check_cat:
166                 sanitized_anns = []
167                 for ann in anns:
168                     if isinstance(ann["category_id"], list):
169                         ann["category_id"] = ann["category_id"][0]
170                     else:
171                         ann["category_id"] = int(ann["category_id"])
172                     if ann["category_id"] in catIds:
173                         sanitized_anns.append(ann)
174                 anns = sanitized_anns