2

因为我在其他地方找不到答案,所以我决定在这里描述我的问题。我正在尝试创建Eachine TrashCan Drone 的关键点检测器以估计其姿势。我遵循了一些教程。第一个是使用 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/1AllLZxrR64irms9mm-RiZ4DNOs2CaAEZ9?usp=sharing

我创建了这么小的数据集,因为首先,我想经历一下训练过程。如果我能做到这一点,我会让我的数据集更大。

现在我什至不确定是否有可能重新训练人类关键点模型来获取类似无人机的物体或任何其他物体的关键点。我需要说我对这个话题很陌生,所以我请求你的理解。如果您知道任何有关创建自定义(非人类)关键点检测器的教程,我将不胜感激。

此致!

4

1 回答 1

2

欢迎来到堆栈溢出!

马上,我可以注意到您的json文件与 COCO 数据集在官方 coco 网站上的描述方式之间存在一些差异。有些键是多余的,例如“关键点颜色”。但是,根据我对detectron2多余键的经验,它们会被忽略并且不会造成问题。

您收到的实际错误消息是由于您的注释没有考虑到category_id该映射。detectron's

文件的“类别”部分中只有 1 个类别mask_test.json,但您有 2 个注释,一个带有 = 11 category_id = 9,另一个带有category_id= 11。

detectron2所做的是,它计算 json 的类别字段中的类别数,如果它们不是从 1 到n编号,它会在您的情况下生成它自己的映射,它将 11(您当前的 id)转换为 1(都在注释中和类别字段),但不知道如何处理具有类别 9 的注释。这会导致第 185 行的错误消息,obj["category_id"] = id_map[obj["category_id"]]因为根本没有从 9 到任何内容的映射。

需要注意的一件事是,据我所知(很高兴在 github 页面上询问如何执行此操作detectron2),您无法使用detectron2 训练具有多个“类”关键点的关键点检测

无论如何,您的问题的解决方案相当简单,只需id: 1类别字段中添加一个类别,然后将注释category_id字段中的所有内容更改为 1。然后运行您的培训

编辑:您还需要更改其他一些configs 以cfg使其正常工作。也就是说,您还TEST.KEYPOINT_OKS_SIGMAS = sigmas_used_for_evaluation_per_keypoint MODEL.ROI_KEYPOINT_HEAD.NUM_KEYPOINTS = number_of_keypoints_in_your_category 需要在数据集的元数据中拥有什么。要设置它,您可以使用 where obj 将是上述元数据keypoint_flip_mapkeypoint_nameskeypoint_connection_rulesMetadataCatalog.get('name_of_your_set').set(obj)

于 2020-07-15T14:57:35.333 回答