Advertisement

CenterNet 训练自己的数据集

阅读量:

github地址:https://github.com/Duankaiwen/CenterNet

论文:https://arxiv.org/abs/1904.08189

1、在github上下载,配置好环境。

2、准备数据

将自己收集的数据转换为COCO数据格式。可以通过多种途径获取相应的工具包进行操作。我的数据采用的是YOLOv5格式,在需要时可以分享YOLOv5到COCO数据转化的具体代码实现。YOLOv5到COCO数据转化小工具参考自https://github.com/surserrr/yolo_to_coco(随手star啦谢谢~~)

将数据划分为train和val两类。 将图片文件夹的名称更改为trainval2014和minival2014,并将其放置于CenterNet-master/data/coco/images目录内; 同时将json格式的标注文件命名为instances_trainval2014.json和instances_minival2014.json,并将其放置于CenterNet-master/data/coco/annotations目录中。

请注意,在进行模型训练之前使用coco数据集进行测试,请将此文件从磁盘中删除!如果您未曾进行过训练,则无需操作。(因为在初次运行时代码会将COCO数据集中的实例转换为其所需格式。若未按要求删除该文件,在后续自定义数据集的训练过程中会导致模型在验证阶段无法正确读取COCO相关数据。)

请注意,在进行模型训练之前使用coco数据集进行测试,请将此文件从磁盘中删除!如果您未曾进行过训练,则无需操作。(因为在初次运行时代码会将COCO数据集中的实例转换为其所需格式。若未按要求删除该文件,在后续自定义数据集的培训过程中会导致模型在验证阶段无法正确读取COCO相关数据。)

3、修改参数。

我数据集的类别只有1类,GPU1个。

必须修改的参数:

在第132行处,默认设置为80个类别数量的输出维度;但根据你的训练需求,在该位置可调整为单一类别输出

将批量大小从48更改为6(我的显卡型号为NVIDIA Titan X)。您可以尝试根据自己的显存配置进行设置,并在实际运行时如遇到超出内存限制的情况,则适当减少批量大小。

在配置文件config/CenterNet-52.py第22行中:

  • 原文中"chunk_size": [6,6,6,6,6,6,6,6] 被更改为"chunk_size": [6]"。
  • 其中:
    • chunk_size的长度对应于GPU的数量
    • chunk_size的所有元素之和即为batchsize
    • 在当前环境中(拥有8个GPU)的情况下:
      • batchsize被设定为48
      • 每个GPU将分配到batchsize中的一个固定部分(即每个GPU负责处理batchsize中的一个固定数量)
      • 因此每个GPU负责处理的数量为48除以8等于六
    • 现在你仅拥有一个GPU:
      • 所以你需要将chunk_size配置为[六]
      • 如果你拥有两个GPU:
        • batchsize则应设置为12(每个GPU处理六个)
        • 因此chunk_size应该设为[六六]
      • 如果你只有一个GPU:
        • batchsize应设为二
        • chunk_size则应设为[二]
  1. config/CenterNet-52.py第45行 “categories":80 ==> “categories":1 (类别数)

在第8行将self._configs中的"categories"键设置为1,并在注释中标明该数值表示"类别数"

6)db/coco.py 第47行 self._cat_ids 改为 self._cat_ids = [1] (看你有几个类别)

7)db/detection.py 第72行 num_classes=81 ==> num_classes=2 (类别数+1)

选择修改的参数:

config/CenterNet-52.py中 18行 -20行

复制代码
 "max_iter": 40000,   #迭代次数

    
 "stepsize": 10000,   #learning rate下降次数
    
 "snapshot": 1000,    #模型每隔snapshot保存一次

4、训练

复制代码
    python train.py CenterNet-52

就可以训练啦,30小时以后看看训练效果怎么样。

5、更新

失败了。。。上面的训练是没有问题的。

失败的原因是和我的数据集不合适。

CenterNet的核心主要通过预测边界框的顶点位置和同时定位目标的中心位置,在判断目标的中心与边界的类型是否一致的基础上,从而判定所检测的目标框是否正确。

然而我的数据集属于刚体表面检测中的划痕问题划痕与普通检测存在明显不同也许这个特殊的划痕并未穿透中心点因而上述设定下的约束条件将面临巨大挑战最终导致实验失败尽管如此但从这篇论文中我还是学到了不少

之前学习人体姿态检测已有一定时日,并且一直认为bottom-up方法相较于up-down而言更为高明。然而如今通过一系列基于keypoint的技术实现的人体姿态检测,在效果上与传统的bottom-up方法差距并不算大。若有条件则渴望深入了解此类技术

全部评论 (0)

还没有任何评论哟~