使用的模型是retinanet,其中的两个retinanet模型,resnet-50和resnet-101使用了keras进行了优化,并且已经在ImageNet上做了预训练。Retinanet网络用于解决数据不平衡问题,即正负样本差距较大的情况;
将25684张图像分为:训练集95%,验证集5%。没有使用高分辨率的图像,而是使用了224 x 224分辨率的图像,作者认为在该任务中不需要使用高分辨图像,另外这也使得训练过程更加高效;
数据增强:rotation, translation, scaling, horizontal flipping, 以及在图像上增加随机常数(想法来源于post by @ZFTurbo);(train.py
)
在每个epoch后,计算score threshold,提高验证集上的最大约登指数(这一点不是特别理解,因为代码没有跑完一个epoch,看不到每个epoch发生的情况);
在后处理阶段,作者使用了Faster-NMS, 比通常tensorflow自带的NMS效果要好;
作者从两个训练的神经网络中取重叠边界框的加权平均,使用每个网络中框的得分作为权重。使用了一个单独的更高阈值来决定是否应该保留孤立框 ;(predict.py
)
对最终所有剩余的bbox采用一个固定的百分比进行缩小(边界框收缩);
我创建了一个python3.6.6的环境,上述包可以在该目录下执行:
pip install -r requirements.txt
一并安装;
python setup.py build_ext --inplace
时会报错setup.py
文件(需要勾选右侧的两个蓝色小),安装空间需要较大,所以我没有安装到C盘;prepare_data.py
划分数据集Git Bash
中分别执行 train_50.sh
和train_101.sh
文件(激活虚拟环境再执行),这两个文件会去调用train.py
文件进行训练。由于训练时间太长,我只运行到第一个epoch
的第12步。执行完这两个retinanet网络后就可以执行predict,py
文件。(当然,也可以将代码中的25个epoch改小,以及每个epoch的step也改小去执行)