读者可以加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
放到其中,如下图所示:
选择 提取到n01440764,如下图所示:
解压完成后,桌面的文件夹
keras_RetinaNet
中的情况,如下图所示:
1.2 选择像素足够的图片
在此数据集中,大部分图片都较为清晰,但是有极少数图片像素点少,不清晰。
像素点少的图片不利于模型训练或模型测试,所以在本章节中实现用python代码选出部分图片文件。
下载代码文件01_selectImages.py
,链接: https://pan.baidu.com/s/1wfUnxYeZ1nJ1jk7G_4oQFQ 提取码: gdek
把代码文件01_selectImages.py
放到文件夹keras_RetinaNet
中,如下图所示:
在文件夹
keras_RetinaNet
中运行cmd,即在Windows资源管理器的路径处输入
cmd
,按Enter键运行,如下图所示:
在cmd中运行命令
python 01_selectImages.py -d n01440764
,如下图所示:
运行命令完成后,桌面的文件夹
keras_RetinaNet
中的情况,如下图所示:
1.3 图片数据标注
使用打标签工具LabelImg,下载页面链接:https://tzutalin.github.io/labelImg
如果下载页面链接没法访问,也可以从百度云盘中下载。
百度云盘下载链接:https://pan.baidu.com/s/1jVmkLxqQMZNJIzyv75HilA 提取码:yysh
下载页面如下图所示:
选择下载Windows_v1.8.0,如下图中红色箭头标记处所示:
把压缩文件 windows_v1.8.0.zip放到D盘根目录中,选择 解压到当前文件夹。
解压后D盘根目录下会有 windows_v1.8.0文件夹,LabelImg软件在文件夹中。
选择D盘根目录的原因:如果windows_v1.8.0文件夹路径中带有中文,打开LabelImg软件会 闪退。
打开 LabelImg软件,点击下图红色箭头标记处。
在打开的软件界面,点击 Open Dir按钮,如下图红色箭头标注处所示。
首先打开桌面的文件夹
keras_RetinaNet
,在选中文件夹
01_selectedImages
的情况下,点击下图红色箭头标记处所示的
选择文件夹按钮。
在输入法为英文输入的情况下,按 键盘上的w键则可以开始绘制方框,方框会框住图片中的物体。
完成绘制方框后,还需要为方框标上类别,如下图所示。
注意:每完成一张图的打标签,一定要记得 保存!!!
在本文演示中,需要给图片中的 鲤鱼和 人脸2个类别打标签。
鲤鱼的标签名叫做fish,人脸的标签名叫human_face,打标签的结果如下图所示。
注意:用方框框住物体时,尽量框住物体的所有部位,例如本文中的鱼,鱼鳍是一个重要特征。保证框住物体所有部位的情况下,也不要使方框四周留出过多空白。
遇到特征不明显的图片,可以放弃为此图片打标签,举例如下图所示:
为200张图片打标签,本文作者共花费90分钟。
本文作者提供200张已经标注的图片,便于读者直接复现。
压缩文件
01_selectedImages.zip
下载链接: https://pan.baidu.com/s/1YhLmY-IPpVmyFC4PUjSg_A 提取码: imv4
把压缩文件
01_selectedImages.zip
复制到桌面的文件夹
keras_RetinaNet
中,并选择
提取到01_selectedImages。
完成压缩文件的解压后,桌面的文件夹
keras_RetinaNet
中的情况,如下图所示:
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
,如下图所示:
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
,如下图所示:
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
中的情况,如下图所示:
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左右大小,下载完成如下图所示。
打开安装文件 visualcppbuildtools.exe,初始化安装程序,如下图所示:
安装类型选择 自定义,然后点击 下一步,如下图红色箭头标记处所示。
选择功能只勾选 Windows 10 SDK 10.0.10240,然后点击 下一步,如下图所示:
点击下图红色箭头标记处所示的 安装按钮,则开始安装。
安装过程中截图,如下图所示:
完成安装后,点击 关闭即可。
2.2 下载并安装keras_retinanet库
github工程网页链接:https://github.com/fizyr/keras-retinanet
选择Download ZIP下载工程压缩文件keras-retinanet-master.zip
,如下图所示:
把压缩文件
keras-retinanet-master.zip
复制到桌面的文件夹
keras_RetinaNet
中,并选择
解压到当前文件夹。
完成压缩文件的解压后,桌面的文件夹
keras_RetinaNet
中的情况,如下图所示:
在文件夹
keras-retinanet-master
中运行cmd,即在Windows资源管理器的路径处输入
cmd
,按Enter键运行,如下图所示:
在cmd中运行命令
pip install .
,如下图所示。
出现下图红色箭头标记处所示信息,则表示已经成功安装keras_retinanet库。
如果不成功,请再次确认cmd是否处于文件夹
keras-retinanet-master
路径,如下图红色划线处所示。
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
中的情况,如下图所示:
如果没有如上图所示文件类型为 Windows命令脚本,点击导航栏中的
查看
并勾选
文件扩展名
,如下图所示:
上述步骤的作用是将打开cmd和在cmd中输入命令这2个步骤合并为1个Windows命令脚本。
双击文件
train_command.cmd
,出现的结果如下图所示:
如上图红色箭头标记处所示,正在通过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
,出现的结果如下图所示:
2.4 模型转换
训练完成后,在文件夹keras_RetinaNet
中运行cmd,即在Windows资源管理器的路径处输入cmd
,按Enter键运行。
在cmd中运行命令retinanet-convert-model snapshots/resnet50_csv_20.h5 retinanet_inference.h5
,如下图所示:
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个代码块对单张图片做目标检测。
运行结果如下图所示:
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动态展示检测画框后的图片:
本节实践的结果,视频输出文件
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