darknet-yolo 开源深度学习框架 于 车牌检测和识别上的工程应用

       这个算是深度学习的一个工程应用吧。

       首先呢,选择一个深度学习的框架,可以从你熟悉的编程语言下手,目前主流的几个框架支持的语言也挺多的,所以语言基本上不再是限制你的因素了,之前的一篇博文https://blog.csdn.net/chenleiyfk/article/details/64930082,可做参考,不过写得有点早了,近一年多的时间变化还是很大的。对于工程应用来说,找一个易于固化且又持续发展的架构,节省开发成本且又易用的,这得根据你自己项目的实际需求来定了。

       其次呢,深度学习嘛,数据集是少不了的了,目前开源的各方面数据集都不少,有的是可以直接使用拿来主义的,但最好的还是使用应用场景下的实际数据,也就是采集实际的数据制作数据集。

       最后,就是将两者结合,进行符合框架要求的数据集格式的制作和神经网络参数的训练测验调优。

 

1、深度学习框架

       这里我选择了darknet-yolo,原因呢主要是对C/C++支持的非常到位,一个纯低层语言实现的黑暗网络,且此网络在近些年来表现不俗。有关它的介绍网络上一大把的,github上的也不少,在此就不过多介绍了。只做个简单总结吧:

       darknet作为一个较为轻型的完全基于C与CUDA的开源深度学习框架,易安装,没有任何依赖项(OpenCV都可以不用),移植性好,支持CPU与GPU两种计算方式。相比于其它的深度学习框架来说,darknet并没有那么强大,不过确实简单啊:a.完全由C语言实现,没有任何依赖项,当然可以使用OpenCV,但只是为了更好的可视化;b.支持CPU(所以没有GPU也不用紧的)与GPU(CUDA/cuDNN,使用GPU当然更好了),个人强烈建议训练时要用GPU哈;c.因为轻型,所以灵活,适合用来研究底层,可以更为方便的从底层对其进行改进与扩展。

       不过对于这个黑暗网络基于主流的如TensorFlow架构也有实现的版本,且不仅限于C语言的,github上搜索下,一定会找到你想要的。我是基于https://github.com/pjreddie/darknet和https://github.com/AlexeyAB/darknet做的,Windows和Linux任你选。这里有打包好的可以直接使用的程式,仅仅需要自己做数据集就可以训练了,再次建议使用GPU,不过只需要你装好驱动即可。下载地址https://download.csdn.net/download/chenleiyfk/10932915。cublas64_80.dll、cudart32_80.dll、cudart64_80.dll、cudnn64_5.dll、cufft64_80.dll、cufftw64_80.dll这些库没有集成进这个训练工具中,因为大了上传不了,谁需要私我就行。

 

       框架选择了,熟悉了,知道基于此框架训练要准备的数据格式了,下面这个数据集其实花费精力不亚于框架的学习啊。

 

2、数据集的制作

      这里看你工程需要了,数据集我是自己制作的,根据监控摄像头拍下的车牌照片,这里建议一定要根据应用场合制作数据集,不然你的效果不会很理想且基本上是达不到实际的工程应用价值的,仅仅是玩玩而已。

       我大致收集了5000余张车牌的照片,另又准备了近万张的图片进行测试,标注是一个很大的工程,只要记住你在教一个小学生,他学的好与坏教材和老师是很关键的因素,当然,其自身能力也很关键哈(黑暗网络本身潜力无限啊)。这里我使用了两个工具用来标注我的照片,https://github.com/tzutalin/labelImg和https://github.com/AlexeyAB/Yolo_mark,前者有源码和相应的发布版,不限操作系统的,后者也不限操作系统,但只有源码,这里有我编译构建好的https://download.csdn.net/download/chenleiyfk/10933121。

       labelImg可以制作两种格式的标签voc和yolo,我是做的yolo格式,当然格式之间互相转换的脚本也比比皆是,自己看着网上的改吧改吧就行了,谁需要私我就行。

 

3、darknet-yolo的训练

       工具有了,数据有了,接下来训练darknet-yolo的神经网络权重就行了。对于车牌识别来说,应用环境相对没那么复杂,图像质量都较好,使用yolo-tiny就可以了,网络小速度快,且看下面的步骤(以本人制作的训练工具集为例):

       1. 将准备好的数据和标签放在同一个目录中,并将数据集分为训练和验证两部分,这里主要考虑可以将图片train.txt路径设置好。

       2. 文件*.data配置相关的路径和类别的数目,数目就是要检测多少类目标,路径涉及到训练图片和权重保存等路径。

       3. 文件*.names配置类别的名字,车牌识别车牌、数字、字母、省份简称加上特殊类的。

       4. 文件*.cfg,涉及神经网络的训练参数,

           batch=64  subdivisions=16 根据机子的配置,高配机子subdivisions可调小
           把每个`[yolo]`层下面的classes的值改为识别的类别数  
           把每个`[yolo]`层上面的[convolutional]下面的filters改为filters=(classes + 5)x3 
           但是如果`classes=1` 则`filters=18`. `classes=2` 则 `filters=21`.
       5. 训练和验证

           yolov3-tiny.conv.15为预加载权重
          ./darknet_gpu.exe detector train ./*.data ./*.cfg ./yolov3-tiny.conv.15
          若中途终端可接着训练,在backup中找到完整的最后一个保存的权重参数作为 预加载权重
          ./darknet_gpu.exe detector train ./*.data ./*.cfg ./backup/*.weights
     

         ./darknet_gpu.exe detector recall ./*.data ./*.cfg ./backup/*.weights 或者
         ./darknet_gpu.exe detector test ./*.data ./*.cfg ./backup/*.weights -i 0 -thresh 0.25 *.jpg -ext_output
   
   可以在以上命令后加上 > train.log保存训练时的中间参数
   参数说明:
   IOU: 小数或者百分数      这个是预测出的bbox和实际标注的bbox的交集 除以 他们的并集。显然,这个数值越大,说明预测的结果越好。
   Recall: 小数或者百分数   这个表示平均召回率, 意思是检测出物体的个数除以标注的所有物体个数。这个数值越大,说明检测率越好。

你可能感兴趣的:(DeepLearning)