内容

  • 背景
  • 准备
  • 实践
  • 结果
  • 总结
  • 引用

背景

老规矩,先上代码吧

代码所在: https://github.com/BruceDone/darknet_demo

最近在做深度学习相关的项目的时候,了解在现有的深度学习检测流派里面有one-stage ,two stage 两种流派,one-stage流派中yolo模型十分的抢眼

OK,在进一步了解了yolo模型之后,发现不仅有提供速度非快的yolo v3 tiny 版本,而且准确率也非常高,顿时想起了之前在上一篇Tensorflow破解验证码只是做了一些简单的分类任务,还没有正式接触过物体检测的任务,这一次项目刚好可以拿过来测试一下自己工程能力,比如网易验证码之类的

如图很轻松将这些字符框出来,然后在进一步的做分类和识别就很容易了

准备

实践

安装环境

将cuda ,等环境安装好,本次将使用gpu训练,将darknet clone到本地

编译框架

进入darknet文件夹,修改Makefile

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 文件,本次的模型文件选用小版本的,这样训练速度快,而且识别速度也够快,应对本次的验证码定位完全够了,本次的任务是定位任务,所以分类看来只有一类:文字,这里我们需要修改 配置文件中的几项

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 ,安装完成后如图开始进行苦逼的标注工作

因为我们这里只有一类内容,所有只有一类框,大概准备了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 文件夹,使用 命令

./darknet detector train data/train.data cfg/train.cfg weights/darknet53.conv.74 -gpus 1,2,3,4,5,6
1

使用gpu进行并行训练,一般来说我们看到训练的loss 达到0.6左右就可以停止了

结果

使用命令

./darknetdetector test train/train.data cfg/train.cfg session/train_final.weights test_imgs/1.jpg -thresh 0.5 -gpus 0

验证我们训练好的模型,我们可以看到darknet 文件夹里面会产生一个名为 predictions.jpg 的文件,这就是我们验证出来的结果文件,我自己这边手动测试了几好张,效果都还不错





到这里我们只是介绍了如何使用深度学习的模型去定位我们要的文字(或者说框),接下来我们可以crop出来我们的文字,然后送到检测(分类)网络里面,关于分类的网络,看下期有时间就进一步做了(有数据增强的彩蛋)

引用

[深度学习] 使用Darknet YOLO 模型破解中文验证码点击识别的更多相关文章

  1. 深度学习实战篇-基于RNN的中文分词探索

    深度学习实战篇-基于RNN的中文分词探索 近年来,深度学习在人工智能的多个领域取得了显著成绩.微软使用的152层深度神经网络在ImageNet的比赛上斩获多项第一,同时在图像识别中超过了人类的识别水平 ...

  2. zz深度学习中的注意力模型

    中间表示: C -> C1.C2.C3 i:target -> IT j: source -> JS sim(Query, Key) -> Value Key:h_j,类似某种 ...

  3. 时间序列深度学习:状态 LSTM 模型预测太阳黑子

    目录 时间序列深度学习:状态 LSTM 模型预测太阳黑子 教程概览 商业应用 长短期记忆(LSTM)模型 太阳黑子数据集 构建 LSTM 模型预测太阳黑子 1 若干相关包 2 数据 3 探索性数据分析 ...

  4. 学习《TensorFlow实战Google深度学习框架 (第2版) 》中文PDF和代码

    TensorFlow是谷歌2015年开源的主流深度学习框架,目前已得到广泛应用.<TensorFlow:实战Google深度学习框架(第2版)>为TensorFlow入门参考书,帮助快速. ...

  5. 深度学习中的序列模型演变及学习笔记(含RNN/LSTM/GRU/Seq2Seq/Attention机制)

    [说在前面]本人博客新手一枚,象牙塔的老白,职业场的小白.以下内容仅为个人见解,欢迎批评指正,不喜勿喷![认真看图][认真看图] [补充说明]深度学习中的序列模型已经广泛应用于自然语言处理(例如机器翻 ...

  6. 深度学习教程 | Seq2Seq序列模型和注意力机制

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/35 本文地址:http://www.showmeai.tech/article-det ...

  7. 时间序列深度学习:状态 LSTM 模型预測太阳黑子(一)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/kMD8d5R/article/details/82111558 作者:徐瑞龙,量化分析师,R语言中文 ...

  8. 深度学习中的Normalization模型

    Batch Normalization(简称 BN)自从提出之后,因为效果特别好,很快被作为深度学习的标准工具应用在了各种场合.BN 大法虽然好,但是也存在一些局限和问题,诸如当 BatchSize ...

  9. [优化]深度学习中的 Normalization 模型

    来源:https://www.chainnews.com/articles/504060702149.htm 机器之心专栏 作者:张俊林 Batch Normalization (简称 BN)自从提出 ...

随机推荐

  1. [转].NET设计模式系列文章

    最初写探索设计模式系列的时候,我只是想把它作为自己学习设计模式的读书笔记来写,可是写到今天,设计模式带给我的震撼,以及许多初学者朋友的热心支持,让我下定决心要把这个系列写完写好,那怕花上再多的时间也无 ...

  2. python中matplotlib总结

    该总结只是为了记录自己学习过程中容易遗忘的问题,权当一个记事本使用. 1:散点图 plt.scatter()函数的原型 scatter(x, y, s=s, c=c, marker=marker, c ...

  3. Blocking Master Example QT 自带 的 serial 即 串口 例子

    1.官方解释文档:http://doc.qt.io/qt-5/qtserialport-blockingmaster-example.html Blocking Master shows how to ...

  4. ./redis-trib.rb 报错:/usr/local/rvm/gems/ruby-2.4.2/gems/redis-4.0.1/lib/redis/client.rb:119:in `call': ERR Slot 0 is already busy (Redis::CommandError)

    错误提示是 slot插槽被占用了(这是 搭建集群前时,以前redis的旧数据和配置信息没有清理干净.) 解决方案是 用redis-cli 登录到每个节点执行  flushall  和 cluster ...

  5. Java中的引用:强引用、软引用、弱引用、幻象引用(虚引用)

    Java语言中,除了原始数据类型的变量(八大基本数据类型),其他都是引用类型,指向各种不同的对象. 理解引用对于我们掌握Java对象生命周期和JVM内部相关机制都是有帮助的. 不同的应用类型,不同之处 ...

  6. CentOS 7紧急救援模式修改root用户密码的方法

    最近无聊在网上搜索linux系统root用户密码破解方法,看来很多朋友的博文,同时也试了一下,但是感觉他们写的还是不是很清晰.简洁,因此自己就心血来潮写了这篇博文,提供一个比较清晰的思路给新手,如果有 ...

  7. jQuery笔记: 基本概念与jQuery核心

    目录 初识jQuery 为什么要使用jQuery? 如何使用jQuery? jQuery与js加载模式不同 jQuery入口函数的四种写法 jQuery的访问符冲突问题 jQuery核心函数和jQue ...

  8. 最新学习springboot 配置注解

    一.概述      Spring Boot设计目的是用来简化新Spring应用的初始搭建以及开发过程.Spring Boot并不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式. ...

  9. Spring AOP代理模式

    代理模式 代理模式是一种设计模式,提供了对目标对象的另外的访问方式.即通过代理访问目标对象. 好处:可以再目标对象实现的基础上,增加额外的功能的操作.扩展目标对象的功能,而不改变现有的功能逻辑. 1. ...

  10. 我们比较常见的PHP实现openSug.js参数调试

    这是一款利PHP对百度搜索下拉框提示免费代码实现参数配置调试的程序源代码. 由想要对网站进行搜索下拉调试的站长朋友们进行方便.快速的效果演示,具体参考下面的PHP代码. 如何使用? 请新建一份PHP文 ...