目标检测实践_keras版RetinaNet训练自己的数据

读者可以加QQ群解决此篇文章复现遇到的问题,群号:111958809

致谢声明

1.本文学习fizyr的github工程《keras-retinanet》,此github工程链接:https://github.com/fizyr/keras-retinanet
此链接中已经具备充分且详细的工程使用指导,本文在此基础上实现选择像素足够的图片、检查标注文件、图像压缩、划分训练集测试集、多张图片目标检测这5个功能。

0.配置代码运行环境

0.1 硬件配置要求

所有的目标检测工程都需要有较大显存的显卡才能够运行,本文作者在编写此文时使用的是8GB显存的RTX2070显卡。
本文作者没有测试6GB显存的显卡是否能运行此工程,读者可以自己尝试。
只有Nvidia品牌的显卡可以运行深度学习,AMD品牌的显卡不可以运行深度学习。
那么Nvidia品牌具有8GB显存的最低价格显卡的型号为GTX1070。
如果购买资金充足,建议购买GTX1080Ti,此版本已经停售,市面上可购二手,11G显存可以运行绝大多数的目标检测算法模型。
如果购买资金不足,最少也得购买GTX1070,否则可能无法继续本文下面的实验。
如果没有nvidia显卡,但有visa信用卡,请阅读我的另一篇文章《在谷歌云服务器上搭建深度学习平台》,链接:https://www.jianshu.com/p/893d622d1b5a

0.2 软件配置要求

各种软件版本:
操作系统:Windows10
Anaconda :5.2
python : 3.6
CUDA :9.0
cudnn :7.3
tensorflow_gpu :1.10
Keras :2.2.4
有显卡之后需要配置深度学习环境,请阅读我的另一篇文章《深度学习环境搭建-CUDA9.0、cudnn7.3、tensorflow_gpu1.10的安装》,链接:https://www.jianshu.com/p/4ebaa78e0233

1.数据准备

1.1 数据下载

如果读者有已经使用labelImg软件标注好的数据,可以直接跳到1.4节检查标注xml文件
本文作者给读者演示的图片数据是来自ImageNet中的鲤鱼分类。
数据集压缩文件n01440764.tar下载链接: https://pan.baidu.com/s/1NksESNqBX--YqMJ4zptGdw 提取码: 6p3u
在桌面新建文件夹keras_RetinaNet,把下载好的压缩文件n01440764.tar放到其中,如下图所示:

目标检测实践_keras版RetinaNet训练自己的数据_第1张图片
image.png

选择 提取到n01440764,如下图所示:
目标检测实践_keras版RetinaNet训练自己的数据_第2张图片
image.png

解压完成后,桌面的文件夹 keras_RetinaNet中的情况,如下图所示:
目标检测实践_keras版RetinaNet训练自己的数据_第3张图片
image.png

1.2 选择像素足够的图片

在此数据集中,大部分图片都较为清晰,但是有极少数图片像素点少,不清晰。
像素点少的图片不利于模型训练或模型测试,所以在本章节中实现用python代码选出部分图片文件。
下载代码文件01_selectImages.py,链接: https://pan.baidu.com/s/1wfUnxYeZ1nJ1jk7G_4oQFQ 提取码: gdek
把代码文件01_selectImages.py放到文件夹keras_RetinaNet中,如下图所示:

目标检测实践_keras版RetinaNet训练自己的数据_第4张图片
image.png

在文件夹 keras_RetinaNet中运行cmd,即在Windows资源管理器的路径处输入 cmd,按Enter键运行,如下图所示:
目标检测实践_keras版RetinaNet训练自己的数据_第5张图片
image.png

在cmd中运行命令 python 01_selectImages.py -d n01440764,如下图所示:
目标检测实践_keras版RetinaNet训练自己的数据_第6张图片
image.png

运行命令完成后,桌面的文件夹 keras_RetinaNet中的情况,如下图所示:
目标检测实践_keras版RetinaNet训练自己的数据_第7张图片
image.png

1.3 图片数据标注

使用打标签工具LabelImg,下载页面链接:https://tzutalin.github.io/labelImg
如果下载页面链接没法访问,也可以从百度云盘中下载。
百度云盘下载链接:https://pan.baidu.com/s/1jVmkLxqQMZNJIzyv75HilA 提取码:yysh
下载页面如下图所示:

目标检测实践_keras版RetinaNet训练自己的数据_第8张图片
image.png

选择下载Windows_v1.8.0,如下图中红色箭头标记处所示:
目标检测实践_keras版RetinaNet训练自己的数据_第9张图片
image.png

把压缩文件 windows_v1.8.0.zip放到D盘根目录中,选择 解压到当前文件夹
解压后D盘根目录下会有 windows_v1.8.0文件夹,LabelImg软件在文件夹中。
选择D盘根目录的原因:如果windows_v1.8.0文件夹路径中带有中文,打开LabelImg软件会 闪退
打开 LabelImg软件,点击下图红色箭头标记处。
目标检测实践_keras版RetinaNet训练自己的数据_第10张图片
image.png

在打开的软件界面,点击 Open Dir按钮,如下图红色箭头标注处所示。
目标检测实践_keras版RetinaNet训练自己的数据_第11张图片
image.png

首先打开桌面的文件夹 keras_RetinaNet,在选中文件夹 01_selectedImages的情况下,点击下图红色箭头标记处所示的 选择文件夹按钮。
目标检测实践_keras版RetinaNet训练自己的数据_第12张图片
image.png

在输入法为英文输入的情况下,按 键盘上的w键则可以开始绘制方框,方框会框住图片中的物体。
完成绘制方框后,还需要为方框标上类别,如下图所示。
注意:每完成一张图的打标签,一定要记得 保存!!!
目标检测实践_keras版RetinaNet训练自己的数据_第13张图片
image.png

在本文演示中,需要给图片中的 鲤鱼人脸2个类别打标签。
鲤鱼的标签名叫做fish,人脸的标签名叫human_face,打标签的结果如下图所示。
注意:用方框框住物体时,尽量框住物体的所有部位,例如本文中的鱼,鱼鳍是一个重要特征。保证框住物体所有部位的情况下,也不要使方框四周留出过多空白。
目标检测实践_keras版RetinaNet训练自己的数据_第14张图片
image.png

遇到特征不明显的图片,可以放弃为此图片打标签,举例如下图所示:
目标检测实践_keras版RetinaNet训练自己的数据_第15张图片
image.png

为200张图片打标签,本文作者共花费90分钟。
本文作者提供200张已经标注的图片,便于读者直接复现。
压缩文件 01_selectedImages.zip下载链接: https://pan.baidu.com/s/1YhLmY-IPpVmyFC4PUjSg_A 提取码: imv4
把压缩文件 01_selectedImages.zip复制到桌面的文件夹 keras_RetinaNet中,并选择 提取到01_selectedImages
完成压缩文件的解压后,桌面的文件夹 keras_RetinaNet中的情况,如下图所示:
目标检测实践_keras版RetinaNet训练自己的数据_第16张图片
image.png

1.4 检查标注xml文件

下载代码文件02_checkAnnotations.py,链接: https://pan.baidu.com/s/1sk-tdeaFS44OW5yNVk4X6Q 提取码: m22s
把代码文件02_checkAnnotations.py放到桌面的文件夹keras_RetinaNet中。
在文件夹keras_RetinaNet中运行cmd,即在Windows资源管理器的路径处输入cmd,按Enter键运行。
在cmd中运行命令python 02_checkAnnotations.py -d 01_selectedImages,如下图所示:

目标检测实践_keras版RetinaNet训练自己的数据_第17张图片
image.png

1.5 图像压缩

下载代码文件03_compressImages.py,链接: https://pan.baidu.com/s/1pKPhr7N_GAOIzehhvcUt0g 提取码: sdgz
把代码文件03_compressImages.py放到桌面的文件夹keras_RetinaNet中。
在文件夹keras_RetinaNet中运行cmd,即在Windows资源管理器的路径处输入cmd,按Enter键运行。
在cmd中运行命令python 03_compressImages.py -d 01_selectedImages,如下图所示:

目标检测实践_keras版RetinaNet训练自己的数据_第18张图片
image.png

1.6 划分训练集和测试集

下载代码文件04_xml2csv.py,链接: https://pan.baidu.com/s/1cygU3AfkPmF3gmCmdlU1oQ 提取码: amja
把代码文件04_xml2csv.py放到桌面的文件夹keras_RetinaNet中。
在文件夹keras_RetinaNet中运行cmd,即在Windows资源管理器的路径处输入cmd,按Enter键运行。
在cmd中运行命令python 04_xml2csv.py -d images_416x416,如下图所示:

目标检测实践_keras版RetinaNet训练自己的数据_第19张图片
image.png

运行命令完成后,桌面的文件夹 keras_RetinaNet中的情况,如下图所示:
目标检测实践_keras版RetinaNet训练自己的数据_第20张图片
image.png

2.模型训练

2.1 下载并安装Microsoft C++ build 14.0

只有先安装C++的编译工具,才能在Windows系统上安装keras_retinanet库。
首先下载Microsoft C++ build 14.0,链接:https://go.microsoft.com/fwlink/?LinkId=691126
文件只有3M左右大小,下载完成如下图所示。

目标检测实践_keras版RetinaNet训练自己的数据_第21张图片
image.png

打开安装文件 visualcppbuildtools.exe,初始化安装程序,如下图所示:
目标检测实践_keras版RetinaNet训练自己的数据_第22张图片
image.png

安装类型选择 自定义,然后点击 下一步,如下图红色箭头标记处所示。
目标检测实践_keras版RetinaNet训练自己的数据_第23张图片
image.png

选择功能只勾选 Windows 10 SDK 10.0.10240,然后点击 下一步,如下图所示:
目标检测实践_keras版RetinaNet训练自己的数据_第24张图片
image.png

点击下图红色箭头标记处所示的 安装按钮,则开始安装。
目标检测实践_keras版RetinaNet训练自己的数据_第25张图片
image.png

安装过程中截图,如下图所示:
目标检测实践_keras版RetinaNet训练自己的数据_第26张图片
image.png

完成安装后,点击 关闭即可。

2.2 下载并安装keras_retinanet库

github工程网页链接:https://github.com/fizyr/keras-retinanet
选择Download ZIP下载工程压缩文件keras-retinanet-master.zip,如下图所示:

目标检测实践_keras版RetinaNet训练自己的数据_第27张图片
image.png

把压缩文件 keras-retinanet-master.zip复制到桌面的文件夹 keras_RetinaNet中,并选择 解压到当前文件夹
完成压缩文件的解压后,桌面的文件夹 keras_RetinaNet中的情况,如下图所示:
目标检测实践_keras版RetinaNet训练自己的数据_第28张图片
image.png

在文件夹 keras-retinanet-master中运行cmd,即在Windows资源管理器的路径处输入 cmd,按Enter键运行,如下图所示:
目标检测实践_keras版RetinaNet训练自己的数据_第29张图片
image.png

在cmd中运行命令 pip install .,如下图所示。
出现下图红色箭头标记处所示信息,则表示已经成功安装keras_retinanet库。
如果不成功,请再次确认cmd是否处于文件夹 keras-retinanet-master路径,如下图红色划线处所示。
目标检测实践_keras版RetinaNet训练自己的数据_第30张图片
image.png

2.3 开始训练

在文件夹keras_RetinaNet中新建文本文件并重命名为train_command.cmd,文件中添加下面2行指令内容并保存:

retinanet-train --batch-size 4 --epochs 20 --steps 500 --workers=0 csv train.csv class.csv --val-annotation test.csv

retinanet-train命令参数解释:
1.batch-size,设置为4,表示每步训练使用4张图片;
2.epochs,设置为20,表示训练总共进行20轮;
3.steps,设置为500,表示每个epoch训练500步;
4.workers,设置为0,表示关闭多进程功能,Windows操作系统必须设置此参数,否则无法训练,Ubuntu系统可以不设置此参数。
5.csv,表示使用csv文件表示数据的标注,后面接4段:训练集数据csv文件路径、类别数据csv文件路径、参数--val-annotation、测试集数据csv文件路径
完成文本文件的编辑后,桌面的文件夹keras_RetinaNet中的情况,如下图所示:

目标检测实践_keras版RetinaNet训练自己的数据_第31张图片
image.png

如果没有如上图所示文件类型为 Windows命令脚本,点击导航栏中的 查看并勾选 文件扩展名,如下图所示:
目标检测实践_keras版RetinaNet训练自己的数据_第32张图片
image.png

上述步骤的作用是将打开cmd和在cmd中输入命令这2个步骤合并为1个Windows命令脚本。
双击文件 train_command.cmd,出现的结果如下图所示:
目标检测实践_keras版RetinaNet训练自己的数据_第33张图片
image.png

如上图红色箭头标记处所示,正在通过url链接下载权重并存放到本地某处路径下,此步骤可能花费时间较长。
推荐从云盘下载模型权重文件并存放到本地合适的路径下,此方法花费时间较短。
模型权重文件 ResNet-50-model.keras.h5下载链接: https://pan.baidu.com/s/1OWofCyBLwJDSJz3ao9_vog 提取码: r1ev
把模型权重文件 ResNet-50-model.keras.h5放到文件夹路径 C:\Users\Administrator\.keras\models 中。
如果你的用户名为 xiaosakun,则把模型权重文件 ResNet-50-model.keras.h5放到文件夹路径 C:\Users\xiaosakun\.keras\models 中。
重新双击文件 train_command.cmd,出现的结果如下图所示:
目标检测实践_keras版RetinaNet训练自己的数据_第34张图片
image.png

2.4 模型转换

训练完成后,在文件夹keras_RetinaNet中运行cmd,即在Windows资源管理器的路径处输入cmd,按Enter键运行。
在cmd中运行命令retinanet-convert-model snapshots/resnet50_csv_20.h5 retinanet_inference.h5,如下图所示:

目标检测实践_keras版RetinaNet训练自己的数据_第35张图片
image.png

3.模型测试

本文作者训练20个epoch,花费时间为2.5小时左右,已经训练好的模型权重文件上传到百度网盘。
如果读者没有完成文章的第2.3节,可以先下载本文作者已经训练好的模型权重文件完成本章内容。
链接: https://pan.baidu.com/s/1aqTL-_tRAn9IA92aVSmDCA 提取码: aem7
把模型权重文件retinanet_inference.h5放到桌面的文件夹keras_RetinaNet中。

3.1 单张图片目标检测

下载代码文件05_retinanetTest.ipynb,链接: https://pan.baidu.com/s/1bwK2yGS2iTlBQMD8-6hXXA 提取码: qx86
把代码文件05_retinanetTest.ipynb放到桌面的文件夹keras_RetinaNet中。
在文件夹keras_RetinaNet中运行cmd,即在Windows资源管理器的路径处输入cmd,按Enter键运行。
在cmd中运行命令jupyter notebook,浏览器会自动打开并访问jupyter页面。
在jupyter页面打开代码文件05_retinanetTest.ipynb,依次运行代码块即可。
第1个代码块加载必要的库;
第2个代码块加载模型权重文件retinanet_inference.h5,并定义字典类型的变量labels_to_names
第3个代码块定义函数getFilePathList和detect_image;
第4个代码块对单张图片做目标检测。
运行结果如下图所示:

目标检测实践_keras版RetinaNet训练自己的数据_第36张图片
image.png

3.2 多张图片目标检测

读取文件夹的若干图片做目标检测并展示为视频效果。
运行代码可以完成2个功能:
1.实时展示若干图片的目标检测结果;
2.将若干图片的检测结果保存为avi格式的视频文件。
下载代码文件06_detectImages.py,链接: https://pan.baidu.com/s/11bxYW8cHDp_qmoXwWQYsvA 提取码: 2cdy
把代码文件06_detectImages.py放到桌面的文件夹keras_RetinaNet中。
在文件夹keras_RetinaNet中运行cmd,即在Windows资源管理器的路径处输入cmd,按Enter键运行。
在cmd中运行命令python 06_detectImages.py,运行结果如下图所示,同时有opencv动态展示检测画框后的图片:

目标检测实践_keras版RetinaNet训练自己的数据_第37张图片
image.png

本节实践的结果,视频输出文件 fish_output.avi上传到百度云盘。
链接: https://pan.baidu.com/s/1wy1Vu-pWcmEz-e9KRVv9CA 提取码: s9ue

4.总结

1.RetinaNet目标检测模型在公司的实际业务中取得了较好的效果,所以有必要记录其实践过程。
本文作者花费2天完成本篇文章的写作,非常易于新手展开RetinaNet目标检测模型的实践。
2.本篇文章的代码集成性强,当读者理解工程逻辑后,只需要很短的时间即可开始模型训练。
3.RetinaNet是2017年的ICCV最佳学生论文,其中的Focal loss思想值得花时间去理解。
4.在前面的章节中,每节代码的下载链接都是单独列出,是为了帮助读者理清工程的逻辑。
也为了方便读者复现工程,提供整个工程压缩文件keras_RetinaNet.zip下载。
链接: https://pan.baidu.com/s/178zUPbCxJU5pGhhfAAbREg 提取码: mnru

你可能感兴趣的:(目标检测实践_keras版RetinaNet训练自己的数据)