安装

  1. Clone RetinaNet repository

    1
    $ git clone git@github.com:fizyr/keras-retinanet.git
  2. 使用虚拟环境

    1
    2
    $ python -m venv .venv
    $ .venv\Scripts\activate.bat
  3. 安装包

    1
    2
    3
    4
    $ pip install numpy
    $ pip install tensorflow
    $ pip install matplotlib
    $ pip install .

    如果安装过程中出现错误,可能是墙的原因。可使用代理,例如:

    1
    $ pip install --proxy=http://127.0.0.1:7890 .
  4. 编译Cython代码

    1
    $ python setup.py build_ext --inplace

运行例子

  1. 下载RetinaNet模型 https://github.com/fizyr/keras-retinanet/releases ,选择 resnet50_coco_best_v2.1.0.h5

  2. 将下载好的文件放到snapshots文件夹下

  3. 运行examples目录下的例子

    1
    2
    $ cd examples
    $ python resnet50_retinanet.py
  4. 如果正常运行,你将看到一个包含检测结果的窗口

训练自定义数据

  • 步骤 1 :准备数据
  • 步骤 2: 标注
  • 步骤 3 :定义 classes
  • 步骤 4 :训练你自己的模型

准备数据

目录结构长这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
└── dataset
├── Annotations
│ ├── 1.xml
│ ├── 2.xml
│ └── ....
├── ImageSets
│ └── Main
│ ├── train.txt
│ └── val.txt
└── JPEGImages
├── 1.jpg
├── 2.jpg
└── ...

将图片放在JPEGImages目录下

标注

使用LabelImg进行标注,保存格式选择 PASCAL VOC。

将生成的xml放在dataset\Annotations下。

定义Classes

修改 keras_retinanet/preprocessing/pascal_voc.py 文件中的voc_classes定义,例如

1
2
3
4
5
6
voc_classes = {
'a': 0,
'b': 1,
'c': 2,
'd': 3
}

训练

使用下面的脚本生成train.txt 和 val.txt。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from os import listdir
from os.path import isfile, join

dataset_directory = "./dataset/Annotations"

files = [join(dataset_directory,file) for file in listdir(dataset_directory) if isfile(join(dataset_directory,file))]

i = 0
with open("val.txt", "w") as test:
for file in files:
i += 1
if (i % 5) == 0:
name = file.split("\\")[-1]
name = name.split(".")[0]
test.write(name + "\n")
print("test: " + name)

i = 0
with open("train.txt", "w") as train:
for file in files:
i += 1
if (i % 5) != 0:
name = file.split("\\")[-1]
name = name.split(".")[0]
train.write(name + "\n")
print("train: " + name)

test.close()
train.close()

生成后,train.txt中包含80%的图像,val.txt中包含20%的图像。

然后就可以开始训练了

1
2
3
4
5
6
7
$ python keras_retinanet/bin/train.py
--imagenet-weights
--epoch <put your total epoch>
--steps <put your total steps>
--snapshot-path <path to store snapshots of models>
--tensorboard-dir <log directory for Tensorboard output>
pascal <path to dataset directory>

训练完成后在snapshots目录下会生成一个新的h5后缀的文件。

将它转换成inference model:

1
$ python keras_retinanet/bin/convert_model.py </path/to/training/model.h5> </path/to/save/inference/model.h5>

也可以不进行转换,在代码中进行转换。

1
2
model = models.load_model(model_path, backbone_name='resnet50')
model = models.convert_model(model)

然后再修改examples\resnet50_retinanet.py中的labels_to_names和model_path,再进行验证。

Reference