Как обучить пользовательский детектор ключевых точек для оценки позы дрона. Detectron2

Поскольку я не мог найти ответа в другом месте, я решил описать свою проблему здесь. Я пытаюсь создать детектор ключевых точек Drone Eachine TrashCan для оценки его позы. Я следил за некоторыми уроками. Первый был с TensorFlow ObjectDetectionAPI, и поскольку я не смог найти с его помощью решения, я попытался использовать detectron2. Все было хорошо, пока мне не понадобилось зарегистрировать собственный набор данных для переобучения модели.

Я запускаю код в Google Colab и использую coco-annotator для создания аннотаций (https://github.com/jsbroks/coco-annotator/)

Я не думаю, что я неправильно аннотировал свой набор данных, но кто знает, я покажу в гиперссылке ниже, чтобы немного представить ее вам: Картинка с аннотациями, сделанными мной

Я использовал этот код для регистрации данных:

from detectron2.data.datasets import register_coco_instances
register_coco_instances("TrashCan_train", {}, "./TrashCan_train/mask_train.json", "./TrashCan_train")
register_coco_instances("TrashCan_test", {}, "./TrashCan_test/mask_test.json", "./TrashCan_test")

Это не выдает мне ошибки, но когда я пытаюсь начать процесс обучения с этим кодом:

from detectron2.engine import DefaultTrainer

cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x.yaml"))
cfg.DATASETS.TRAIN = ("TrashCan_train",)
cfg.DATASETS.TEST = ("TrashCan_test")
cfg.DATALOADER.NUM_WORKERS = 2
cfg.MODEL.WEIGHTS = ("detectron2://COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x/137849621/model_final_a6e10b.pkl")  # Let training initialize from model zoo
cfg.SOLVER.IMS_PER_BATCH = 2
cfg.SOLVER.BASE_LR = 0.00025  # pick a good LR
cfg.SOLVER.MAX_ITER = 25    # 300 iterations seems good enough for this toy dataset; you may need to train longer for a practical dataset
cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 128   # faster, and good enough for this toy dataset (default: 512)
cfg.MODEL.ROI_HEADS.NUM_CLASSES = 1  # liczba klas

os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)
trainer = DefaultTrainer(cfg) 
trainer.resume_or_load(resume=False)
trainer.train()

Я получаю вот что:

WARNING [07/14 14:36:52 d2.data.datasets.coco]: 
Category ids in annotations are not in [1, #categories]! We'll apply a mapping for you.

[07/14 14:36:52 d2.data.datasets.coco]: Loaded 5 images in COCO format from ./mask_train/mask_train.json

---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

<ipython-input-12-f4f5153c62a1> in <module>()
     14 
     15 os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)
---> 16 trainer = DefaultTrainer(cfg)
     17 trainer.resume_or_load(resume=False)
     18 trainer.train()

7 frames

/usr/local/lib/python3.6/dist-packages/detectron2/data/datasets/coco.py in load_coco_json(json_file, image_root, dataset_name, extra_annotation_keys)
    183             obj["bbox_mode"] = BoxMode.XYWH_ABS
    184             if id_map:
--> 185                 obj["category_id"] = id_map[obj["category_id"]]
    186             objs.append(obj)
    187         record["annotations"] = objs

KeyError: 9

Здесь вы можете скачать мои файлы:

https://github.com/BrunoKryszkiewicz/EachineTrashcan-keypoints/blob/master/TrashCan_Datasets.zip

а где вы найдете мою записную книжку Colab:

https://colab.research.google.com/drive/1AlLZxrR64irms9mm-RiZ4DNOs2CaAEZ9?usp=sharing

Я создал такой небольшой набор данных, потому что в первую очередь я хотел пройти через тренировочный процесс. Если мне это удастся, я увеличу свой набор данных.

Теперь я даже не уверен, можно ли переобучить человеческую модель ключевых точек для получения ключевых точек беспилотного объекта или любого другого. Я должен сказать, что я новичок в этой теме, поэтому прошу вашего понимания. Если вы знаете какие-либо руководства по созданию пользовательского (не человеческого) детектора ключевых точек, я буду благодарен за любую информацию.

С наилучшими пожеланиями!


person BrunoK    schedule 14.07.2020    source источник


Ответы (1)


Добро пожаловать в stackoverflow!

Сразу же я могу заметить некоторые различия между вашим json файлом и способом описания набора данных COCO здесь официальный сайт кокоса. Некоторые клавиши излишни, например, цвета ключевых точек. Однако по моему опыту detectron2 лишние ключи игнорируются и не представляют проблемы.

Фактическое сообщение об ошибке, которое вы получаете, связано с тем, что у вас есть аннотации, category_id которые detectron's сопоставление не учитывают.

В разделе категорий вашего mask_test.json файла есть только 1 категория, но у вас есть 2 аннотации: одна с category_id = 9, а другая с category_id = 11.

detectron2 подсчитывает количество категорий в поле Categories json и, если они не пронумерованы от 1 до n, генерирует собственное сопоставление, в вашем случае он преобразует 11 (ваш текущий идентификатор) в 1 (как в полях аннотаций, так и категорий), но не знает, что делать с аннотацией который имеет категорию 9. И это вызывает сообщение об ошибке в строке 185 obj["category_id"] = id_map[obj["category_id"]], потому что просто нет сопоставления от 9 ни с чем.

Следует отметить, что НАСКОЛЬКО Я МОГУ СКАЗАТЬ (было бы неплохо спросить, как это сделать на странице github detectron2), вы не можете обучить обнаружение ключевых точек с несколькими классами ключевых точек с помощью detectron2

В любом случае решение вашей проблемы довольно простое: просто укажите одну категорию с id: 1 в поле Categories и напишите изменение category_id всего в поле annotations на 1. И запустите ваше обучение

ИЗМЕНИТЬ: вам также нужно будет изменить несколько других config в cfg, чтобы это работало. А именно TEST.KEYPOINT_OKS_SIGMAS = sigmas_used_for_evaluation_per_keypoint MODEL.ROI_KEYPOINT_HEAD.NUM_KEYPOINTS = number_of_keypoints_in_your_category И более того, вам нужно иметь keypoint_flip_map, keypoint_names и keypoint_connection_rules в метаданных вашего набора данных. Чтобы установить это, вы можете использовать MetadataCatalog.get('name_of_your_set').set(obj), где obj будет вашими метаданными, описанными выше.

person Vahagn Tumanyan    schedule 15.07.2020
comment
Как мне найти конфигурацию для обнаружения ключевых точек в detectron2? - person Seunghyeon; 07.12.2020
comment
Он находится в папке с конфигурациями репозитория Git. - person Vahagn Tumanyan; 07.12.2020
comment
@Vahagn Tumanyan, не могли бы вы объяснить, как рассчитать TEST.KEYPOINT_OKS_SIGMAS (список поплавков) мне непонятно? Спасибо - person JammingThebBits; 25.06.2021
comment
@JammingTheBits Официальный набор данных MSCOCO дает значения по умолчанию для ключевых точек человеческого скелета. Эти числа в основном показывают, насколько близко (в каком эпсилон-радиусе) должна быть каждая точка шаблона к исходной позиции, поэтому мы считаем ее правильной точкой. Они вычислили, что принадлежат им, путем экспериментов, проб и ошибок. Обычно глаз не может быть слишком далеко, но точка на колене может иметь большую свободу действий. Нет специального способа их вычислить, вам просто нужно приспособиться к своей проблеме. - person Vahagn Tumanyan; 01.07.2021