RetinaNet 迁移学习到自标数据集


Keras-RetinaNet

在自标数据集 alidq 上训练 detection model RetinaNet

模型部署与环境配置

参考README

数据预处理

数据统计信息:

  • 类别:gun1, gun2
  • 有效数据量:23216
  • 测试集大小:1000
  • 训练验证集大小:22216

由于此次 detection 任务比较简单,为了实验 fine tuning 对模型的影响,我们将训练数据分为 3 个部分,实验在第 1 部分数据上完成。

Part 1 训练数据统计量:

  • gun1 数量:2826
  • gun2 数量:3170
  • 预处理需要将标注数据文件格式转换为固定格式的 csv 文件,schema 为:
    path/to/imagefile,xmin,ymin,xmax,ymax,classname
  • 我们标注的 Raw data 中包含的信息量是足够的,但需要一些针对模型的数据格式调整;
  • 除了 Bounding Box 的坐标和类别名,我们还需要定义类别名到类别ID 映射(class name to class ID mapping),ID 从 0 开始。在这次的例子里很简单,在数据集目录新建一个 csv 文件,其内容为:
    gun1,0
    gun2,1
  • 需要提出的一点是:如果没有特殊要求,我们交付的数据中,Bounding Box 的坐标最好按照普遍通用的顺序处理好,即xmin,ymin,xmax,ymax
  • 预处理完成后,可以使用 keras-retinanet 中的调试工具 debug.py 检查 csv 是否有效且观察标注框在图中的效果:
$ python keras-retinanet/bin/debug.py csv 
/path/to/annotations /path/to/class_label_mapping
$ retinanet-debug csv /path/to/annotations /path/to/class_label_mapping

注:无效标注的框呈红色,有效标注为绿色。

训练

下载在 coco 数据集上训练好的模型 resnet50_coco_best_v2.1.0.h5 到snapshot/
数据准备完成且确认无误后就可以开始训练了。
此次训练起点是预训练过的 resnet50_coco_best_v2.1.0.h5steps=6000epochs=5,在 K80 显卡训练的时间大概是 5-6 小时。

$ python keras-retinanet/bin/train.py --weights snapshots/resnet50_coco_best_v2.1.0.h5 --steps 6000 --epochs 5 --gpu 0 csv /path/to/annotations /path/to/class_label_mapping
$ retinanet-train --weights snapshots/resnet50_coco_best_v2.1.0.h5 --steps 6000 --epochs 5 --gpu 0 csv /path/to/annotations /path/to/class_label_mapping

评价

训练完成后,我们需要用 1000 条测试数据对模型的 performance 做出评价。我在准备评价数据时,发现标注数据(我们标注的 Ground Truth)存在大约 5% 的错误分类。这些错误分类是我通过人工辨识 model 预测的结果与 GT 的差别而得到的。也就是说,刚刚训练好的 model 帮助我找到了很多标注数据的错误标注!

虽然这些错误标注在训练的时候不会产生太大影响(否则也不会帮我找错),但在做评价时会严重影响模型的 performance。可能需要借助刚训练好的 model 对 1000 个测试数据做清洗。


Written with StackEdit.