focal loss | Retinanet keras 训练Pascal VOC 2007数据集、训练coco数据集、训练自己数据集(csv格式)以及map评价

     本篇是讲述的focal loss论文中利用retinanet网络训练Pascal VOC 2007数据集,coco数据集,训练自己的数据集csv。主要根据这篇github——fizyr/keras-retinanet.非常详尽。

一、安装Retinanet

  • 1、克隆这个存储库。git clone https://github.com/fizyr/keras-retinanet.git
  • 2、在存储库目录/keras-retinanet/中,执行pip3 install . --user。 请注意,由于应该如何安装tensorflow,这个软件包并没有定义对tensorflow的依赖关系,因为它会尝试安装(至少在Arch Linux导致错误的安装)。 请确保tensorflow按照您的系统要求进行安装。 另外,确保安装Keras 2.1.3或更高版本。注意:或者pip2 install . --user,针对python2版本。这里做第2步目的是为了后面导入包 import  keras_resnet等不报错。
  • 3、方法一,如果想 训练/测试MS COCO数据集,请安装pycocotools运行pip3 install --user git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI
  • 方法二,先下载这个cocoapi的repository ,命令如下:
  • git clone https://github.com/cocodataset/cocoapi.git
  • cd cocoapi/PythonAPI
  • make
  • 附:python3 与windows安装pycocotools参考这里

update:2018.5.26

注意:如果出现了tensorlfow错误mortError: libcusolver.so.8.0: cannot open shared object file: No such file or directory

请在终端输入

export LD_LIBRARY_PATH=/usr/local/cuda/lib64/

二、voc 2007、coco、自己数据集csv 三大数据集训练和评估的详细步骤

1、Pascal VOC 2007

I、voc 2007数据集

<VOC2007>
|———  Annotations
|       └─  *.xml # 存放图片的 类别与边框
|
|———  JPEGImages
|       └─ *.jpg # 存放图片
|
|———  SegmentationClass # 类别掩膜
|
|——— SegmentationObject # 对象掩膜
|
|___ ImageSets
  • Retinanet只需要 Annotations(存放图片的 类别与边框)与 JPEGImages(存放图片)和ImageSets中的Main文件夹,其他的都使用不到(可以删除)


II、train

先去这里下需要的预训练的模型存放在./keras_retinanet/snapshots/

# train

python3 keras_retinanet/bin/train.py pascal /path/to/VOCdevkit/VOC2007

# 使用 --backbone=xxx 选择网络结构,默认是resnet50

# xxx可以是resnet模型(`resnet50`,`resnet101`,`resnet152`)
# 或`mobilenet`模型(`mobilenet128_1.0`,`mobilenet128_0.75`,`mobilenet160_1.0`等)

# 也可以使用models目录下的 resnet.py,mobilenet.py等来自定义网络

III、test

参考:ResNet50RetinaNet.ipynb

class_name=['diningtable', 'person', 'bottle', 'boat', 'train', 'bird', 'dog', 'cat', 'tvmonitor', 'cow', 'car', 'sofa', 'horse', 'chair', 'pottedplant', 'bicycle', 'motorbike', 'aeroplane', 'sheep', 'bus']
class_name=sorted(class_name)
labels_to_names=dict(zip(range(len(class_name)),class_name))
  • model_path 改成保存的模型路径 如:resnet50_pascal_01.h5(snapshots存放模型)


2、MS COCO数据

I、coco数据集制作

这里直接将Pascal VOC 2007转成MS COCO格式来训练

参考:Pascal VOC转COCO数据

  • ./keras-retinanet建一个目录用来存放COCO格式数据mkdir COCO

  • Pascal VOC转COCO数据 生成的new.json 复制instances_train2017.jsoninstances_val2017.json 存放在./keras-retinanet/COCO/annotations/

  • JPEGImages复制成train2017val2017 放在./keras-retinanet/COCO/images

  • 最终COCO目录如下:

<COCO>
|———— annotations
|         |—— instances_train2017.json
|         └  instances_val2017.json
|
|____ images
         |—— train2017
                └─ *.jpg
         |___ val2017
                └─ *.jpg

II、train

先去这里下需要的预训练的模型存放在./keras_retinanet/snapshots/

# train

python3 keras_retinanet/bin/train.py coco /path/to/MS/COCO

# 使用 --backbone=xxx 选择网络结构,默认是resnet50

# xxx可以是resnet模型(`resnet50`,`resnet101`,`resnet152`)
# 或`mobilenet`模型(`mobilenet128_1.0`,`mobilenet128_0.75`,`mobilenet160_1.0`等)

# 也可以使用models目录下的 resnet.py,mobilenet.py等来自定义网络
# 为了演示,只运行200步
python3 keras_retinanet/bin/train.py --steps 200 coco ./COCO

III、test

参考:ResNet50RetinaNet.ipynb

# 需根据JSON文件字段 categories 对类别标记的id顺序排列
class_name=['diningtable', 'person', 'bottle', 'boat', 'train', 'bird', 'dog', 'cat', 'tvmonitor', 'cow', 'car', 'sofa', 'horse', 'chair', 'pottedplant', 'bicycle', 'motorbike', 'aeroplane', 'sheep', 'bus']
labels_to_names=dict(zip(range(len(class_name)),class_name)) # Retinanet要求类别从0开始,背景默认为空,不用显示标记,Mask RCNN 、FCN、RFCN 类别从1开始,0默认为背景
  • model_path 改成保存的模型路径,如:./snapshots/resnet50_coco_01.h5


3、自己的CSV数据集

I、自己制作CSV数据集

训练自己数据集csv时候参考下述博客:

注意:训练自己的数据集需要先将自己的数据制作成VOC 2007数据集[1],然后将VOC2007数据集转换成CSV格式[2],这两步具体参考:

[1].VOC2007数据集制作-进行自己数据集的训练,可用于目标检测、图像分隔等任务

[2].利用Retinanet 训练自己的数据集 | keras retinanet - focal loss 网络训练过程中使用csv格式进行训练自己的数据

经过这两步骤,可以得到自己的数据集CSV格式。

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

csv数据集步骤如下:

这里将Pascal VOC 2007转成CSV格式训练,注意生成csv目录中的annotations.csvclasses.csv 是编程实现的,下面的(1)和(2)先看看这两个文件长啥样。

(1)csv/annotations.csv长啥样?

  • ./keras-retinanet 新建一个目录mkdir CSV
  • 在CSV目录中放入annotations.csv 每行对应一个对象,格式如下:
path/to/image.jpg,x1,y1,x2,y2,class_name

/data/imgs/img_001.jpg,837,346,981,456,cow
/data/imgs/img_002.jpg,215,312,279,391,cat # 02图片第一个对象
/data/imgs/img_002.jpg,22,5,89,84,bird # 02图片第二个对象
/data/imgs/img_003.jpg,,,,, # 背景图片,没有任何要检查的对象

这定义了一个包含3个图像的数据集。 img_001.jpg包含一头母牛。 img_002.jpg包含一只猫和一只鸟。 img_003.jpg不包含有趣的对象/动物。

注意:annotations.csv中这里的路径均为相对路径,博主自己的某个检测任务的annotations.csv如下所示:


(2)csv/classes.csv长啥样?

  • 在CSV目录 放入classes.csv 类名与id对应,索引从0开始。不要包含背景类,因为它是隐式的。具体格式如下:
class_name,id

cow,0
cat,1
bird,2
# 因为这里的背景对应的类别为 空 ,
# 而mask RCNN 与 FCN(RFCN)都是使用0来表示背景
  • CSV目录结构如下:
<CSV>
|———— annotations.csv # 必须
|———— classes.csv # 必须
|
|____ JPEGImages  # (可选),这样 annotations.csv可以使用图片的相对路径       
         └─ *.jpg

博主自己的某个检测任务的classes.csv如下:


(3)自动生成annotations.csv和 classes.csv 

完整程序参考

利用Retinanet 训练自己的数据集 | keras retinanet - focal loss 网络训练过程中使用csv格式进行训练自己的数据

参考:PascalVOC2CSV.py

II、train

# Running directly from the repository:
python3 keras_retinanet/bin/train.py csv ./CSV/annotations.csv ./CSV/classes.csv

# 使用 --backbone=xxx 选择网络结构,默认是resnet50

# xxx可以是resnet模型(`resnet50`,`resnet101`,`resnet152`)
# 或`mobilenet`模型(`mobilenet128_1.0`,`mobilenet128_0.75`,`mobilenet160_1.0`等)

# 也可以使用models目录下的 resnet.py,mobilenet.py等来自定义网络

III、test

参考:ResNet50RetinaNet.ipynb

# 需根据classes.csv文件中类别名与id对应顺序排列

class_name=['diningtable', 'person', 'bottle', 'boat', 'train', 'bird', 'dog', 'cat', 'tvmonitor', 'cow', 'car', 'sofa', 'horse', 'chair', 'pottedplant', 'bicycle', 'motorbike', 'aeroplane', 'sheep', 'bus']
class_name=sorted(class_name)
labels_to_names=dict(zip(range(len(class_name)),class_name)) # Retinanet要求类别从0开始,背景默认为空,不用显示标记,Mask RCNN 、FCN、RFCN 类别从1开始,0默认为背景
  • model_path 改成保存的模型路径,如:./snapshots/resnet50_csv_01.h5

完毕。

参考:

致谢:

本文参考博文https://blog.csdn.net/wc781708249/article/details/79643484,内容有完善和改动。

猜你喜欢

转载自blog.csdn.net/u012426298/article/details/80450537