内容
- 背景
- 准备
- 实践
- 结果
- 总结
- 引用
背景
老规矩,先上代码吧
最近在做深度学习相关的项目的时候,了解在现有的深度学习检测流派里面有one-stage ,two stage 两种流派,one-stage流派中yolo模型十分的抢眼
![《[深度学习] 使用Darknet YOLO 模型破解中文验证码点击识别》](https://bruce-blog.oss-cn-hongkong.aliyuncs.com/2018/12/stage.png)
OK,在进一步了解了yolo模型之后,发现不仅有提供速度非快的yolo v3 tiny 版本,而且准确率也非常高,顿时想起了之前在上一篇Tensorflow破解验证码只是做了一些简单的分类任务,还没有正式接触过物体检测的任务,这一次项目刚好可以拿过来测试一下自己工程能力,比如网易验证码之类的
![《[深度学习] 使用Darknet YOLO 模型破解中文验证码点击识别》](https://bruce-blog.oss-cn-hongkong.aliyuncs.com/2018/12/code-1.jpeg)
准备
- 系统:ubuntu16.04
- python: 3.6
- cuda: 10.0
- GPU: GeForce GTX 1080
- Darknet :http://github.com/pjreddie/darknet
- labelImg: https://github.com/tzutalin/labelImg
实践
安装环境
将cuda ,等环境安装好,本次将使用gpu训练,将darknet clone到本地
编译框架
进入darknet文件夹,修改Makefile
1 2 3 4 5 6 7 8 9 |
GPU=0 #如果使用GPU改为1 CUDNN=0 #如果使用CUDNN改为1 OPENCV=0 #opencv就不用使用了,下面两个一样 OPENMP=0 DEBUG=0 ...... C=gcc CPP=g++ NVCC=nvcc #这里如果编译报错,可以换成全路径 |
使用命令make ,得到二进制的文件darknet
,训练框架已经准备好了
修改配置
这里重点修改cfg/yolov3-tiny.cfg
文件,本次的模型文件选用小版本的,这样训练速度快,而且识别速度也够快,应对本次的验证码定位完全够了,本次的任务是定位任务,所以分类看来只有一类:文字,这里我们需要修改 配置文件中的几项
1 2 3 4 5 6 |
Line 3: set batch=24 → using 24 images for every training step Line 4: set subdivisions=8 → the batch will be divided by 8 Line 127: set filters=(classes + 5)*3 → in our case filters=18 Line 135: set classes=1 → the number of categories we want to detect Line 171: set filters=(classes + 5)*3 → in our case filters=18 Line 177: set classes=1 → the number of categories we want to detect |
至于为什么fliters = (classes + 5) * 3 ,参考 yolov3 paper https://pjreddie.com/media/files/papers/YOLOv3.pdf 第2.3节的内容
准备数据
我自己使用selenium的google driver 下载了很多图片,接下来就是标注数据了
下载并编译labelimage工具 : https://github.com/tzutalin/labelImg ,安装完成后如图开始进行苦逼的标注工作
![《[深度学习] 使用Darknet YOLO 模型破解中文验证码点击识别》](https://bruce-blog.oss-cn-hongkong.aliyuncs.com/2018/12/label_2.png?x-oss-process=style%2Flarge)
因为我们这里只有一类内容,所有只有一类框,大概准备了500张训练数据,120张验证数据,将原始的图片文件夹imgs
,和label
文件夹准备好,使用代码data.py
生在训练能使用的txt训练文件配置,另外会将label出的xml 文件以规整的形式在图片文件生成同名的标注文件(darknet的训练就是这么定义的)
准备配置
在./weights
文件夹下使用使用 darknet53.sh 文件下载我们的预训练的权重文件,进入data
文件夹,我们准备如下文件
- train.txt – 训练数据文件,由data.py产生
- char.names – 类别配置文件
- val.txt – 验证数据文件
- train.data – 训练配置表
开始训练
进入darknet 文件夹,使用 命令
1 |
./darknet detector train data/train.data cfg/train.cfg weights/darknet53.conv.74 -gpus 1,2,3,4,5,6 |
使用gpu进行并行训练,一般来说我们看到训练的loss 达到0.6左右就可以停止了
![《[深度学习] 使用Darknet YOLO 模型破解中文验证码点击识别》](https://bruce-blog.oss-cn-hongkong.aliyuncs.com/2018/12/train.png)
结果
使用命令 ./darknet
detector test train/train.data cfg/train.cfg session/train_final.weights test_imgs/1.jpg -thresh 0.5 -gpus 0
验证我们训练好的模型,我们可以看到darknet 文件夹里面会产生一个名为 predictions.jpg
的文件,这就是我们验证出来的结果文件,我自己这边手动测试了几好张,效果都还不错
![《[深度学习] 使用Darknet YOLO 模型破解中文验证码点击识别》](https://bruce-blog.oss-cn-hongkong.aliyuncs.com/2018/12/pre_1.jpg)
![《[深度学习] 使用Darknet YOLO 模型破解中文验证码点击识别》](https://bruce-blog.oss-cn-hongkong.aliyuncs.com/2018/12/pre_2.jpg)
![《[深度学习] 使用Darknet YOLO 模型破解中文验证码点击识别》](https://bruce-blog.oss-cn-hongkong.aliyuncs.com/2018/12/pre_3.jpg)
到这里我们只是介绍了如何使用深度学习的模型去定位我们要的文字(或者说框),接下来我们可以crop出来我们的文字,然后送到检测(分类)网络里面,关于分类的网络,看下期有时间就进一步做了(有数据增强的彩蛋)
大鱼老哥,6666啊
感谢感谢~
谢谢骚当
客气
感觉这个有点杀鸡用牛刀感觉
哈哈,能用上就可以了,我还特意选的小模型网络
请问为什么修改的是yolov3-tiny.cfg 但是最后训练运行命令时是用的train.cfg?
你好,训练和实际使用的模型层的文件定义是不一样的。
6666,牛逼,我也在搞深度学习,还在学习中呢。
加油 :)
大佬,请问下我现在已经训练模型已经不错了,我想打断它,需要我手动修改session下的train.backup文件为final.weights吗?
他有每训练多少次会保存一次的操作,如果中途打断,你找最近那一步保存的训练结果,下次将他做为预训练的文件就可以了。