深度学习:Keras初步识别破解验证码

今天为大家带来一篇 初步使用Keras深度学习破解验证码 的文章。 当然我们这里识别的是普通验证码,是Laravel常用的验证码库

Captcha for Laravel 5

如下图,又5个数字字母所组成的验证码。我用PHP一共生成了5万个验证码。后面也会提供给大家

深度学习:Keras初步识别破解验证码

导入所需的库

这里我们还是使用Keras,底层使用Tensorflow做为底层库。


本次使用的模型是简单的卷积神经网络模型,后面也会使用更加复杂的模型

卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。它包括卷积层(alternating convolutional layer)和池层(pooling layer)。

深度学习:Keras初步识别破解验证码

一般地,CNN的基本结构包括两层,其一为特征提取层,每个神经元的输入与前一层的局部接受域相连,并提取该局部的特征。一旦该局部特征被提取后,它与其它特征间的位置关系也随之确定下来;其二是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射是一个平面,平面上所有神经元的权值相等。特征映射结构采用影响函数核小的sigmoid函数作为卷积网络的激活函数,使得特征映射具有位移不变性。此外,由于一个映射面上的神经元共享权值,因而减少了网络自由参数的个数。卷积神经网络中的每一个卷积层都紧跟着一个用来求局部平均与二次提取的计算层,这种特有的两次特征提取结构减小了特征分辨率。

深度学习:Keras初步识别破解验证码

配置参数

深度学习:Keras初步识别破解验证码

深度学习:Keras初步识别破解验证码

加载数据

训练模型的时候,我们可以选择两种方式来生成我们的训练数据,一种是直接全部载入内存,然后开始训练,一种是定义一个数据生成器,然后利用 fit_generator 分批加载数据来训练。

因为样本是5万张,但是只有200多M,可以一次性载入内存。

最后会生成pickle文件。python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。

如果使用我保存好的pickle文件,可以不用执行下列步骤

深度学习:Keras初步识别破解验证码

加载数据,读取pickle文件

深度学习:Keras初步识别破解验证码

创建模型

深度学习:Keras初步识别破解验证码

深度学习:Keras初步识别破解验证码

开始训练模型

深度学习:Keras初步识别破解验证码

训练完成,进行验证

深度学习:Keras初步识别破解验证码

深度学习:Keras初步识别破解验证码

改进

对于这种按顺序的文字验证码,还有一种更好方法可以使用,那就是循环神经网络来识别序列。 我会在后面继续介绍如何用循环神经网络构建模型。


代码地址:https://github.com/szpnygo/keras-cnn-captcha

Pickle地址:https://pan.baidu.com/s/1i4JiZOT

深度学习Keras实现MNIST数据集手写数字识别

深度学习Keras实现MNIST数据集手写数字识别

利用卷积神经网络实现手写数字识别

今天为大家带来一个小例子,Keras实现MNIST数据集手写数字识别。本文主要为了让大家可以迅速跑通一个可运行测试的深度学习样例,所以不会过多涉及具体原理及内容,只是起抛砖引用的作用。有一点Python基础可快速体验深度学习的奥妙。

Step1: 引入基础库,Keras和numpy

深度学习Keras实现MNIST数据集手写数字识别

引入库

Step2: 配置相关参数

深度学习Keras实现MNIST数据集手写数字识别

配置参数

Step3:引入数据,Keras自带MNIST数据集。MNIST是一个手写数字数据库,它有60000个训练样本集和10000个测试样本集。

深度学习Keras实现MNIST数据集手写数字识别

加载MNIST数据集

Step4:编写深度学习模型,本次模型使用简单的两次卷积神经网络

深度学习Keras实现MNIST数据集手写数字识别

编写模型

Step5:开始训练模型。因为用的自己的笔记本,I7 CPU,所以训练过程还是比较慢的。深度学习的训练需要使用GPU进行训练。不过本次案例比较简单,一个epoch耗时5分钟,训练10个即可达到99%以上的准确率。

图片是Keras的训练进度显示,loss代表损失,正确的训练loss应该是不断降低的。acc代表准确率,不断提升的。

最后输出的测试数据准确率为99.02%

深度学习Keras实现MNIST数据集手写数字识别

开始训练模型

深度学习Keras实现MNIST数据集手写数字识别

训练模型

Step6:测试自己的手写数字

因为训练的时候使用的28*28的图片,所以我就直接在28*28的图片上手写了一个数字3。通过我们之前训练的模型可以预测,得到的结果是数字3,获取正确的判断。其实predict_proba可以看到图片在各个数字上的概率。其实是3的概率已经高达99.9999%。

深度学习Keras实现MNIST数据集手写数字识别

测试自己的书写数字

深度学习Keras实现MNIST数据集手写数字识别

测试自己的手写数字

代码均经过测试运行,欢迎大家自行体验。当你感兴趣以后,关注我们。以后会为您带来更多的深度学习体验。

swift与javascript互相调用

 

swift获取图片像素颜色值

 

Facebook图片加载框架Fresco

关于 Fresco

Fresco 是一个强大的图片加载组件。

Fresco 中设计有一个叫做 image pipeline 的模块。它负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和CPU时间,它含有3级缓存设计(2级内存,1级文件)。

Fresco 中设计有一个叫做 Drawees 模块,方便地显示loading图,当图片不再显示在屏幕上时,及时地释放内存和空间占用。

Fresco 支持 Android2.3(API level 9) 及其以上系统。

特性

内存管理

解压后的图片,即Android中的Bitmap,占用大量的内存。大的内存占用势必引发更加频繁的GC。在5.0以下,GC将会显著地引发界面卡顿。

在5.0以下系统,Fresco将图片放到一个特别的内存区域。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。

Fresco 在低端机器上表现一样出色,你再也不用因图片内存占用而思前想后。

图片的渐进式呈现

渐进式的JPEG图片格式已经流行数年了,渐进式图片格式先呈现大致的图片轮廓,然后随着图片下载的继续,呈现逐渐清晰的图片,这对于移动设备,尤其是慢网络有极大的利好,可带来更好的用户体验。

Android 本身的图片库不支持此格式,但是Fresco支持。使用时,和往常一样,仅仅需要提供一个图片的URI即可,剩下的事情,Fresco会处理。

Gif图和WebP格式

是的,支持加载Gif图,支持WebP格式。

图像的呈现

Fresco 的 Drawees 设计,带来一些有用的特性:

  • 自定义居中焦点(对人脸等图片显示非常有帮助)
  • 圆角图,当然圆圈也行。
  • 下载失败之后,点击重现下载
  • 自定义占位图,自定义overlay, 或者进度条
  • 指定用户按压时的overlay

图像的加载

Fresco 的 image pipeline 设计,允许用户在多方面控制图片的加载:

  • 为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片
  • 先显示一个低解析度的图片,等高清图下载完之后再显示高清图
  • 加载完成回调通知
  • 对于本地图,如有EXIF缩略图,在大图加载完成之前,可先显示缩略图
  • 缩放或者旋转图片
  • 处理已下载的图片
  • WebP 支持

关于fresco在AndroidStudi中的使用,只需要在gradle中配置

Github地址:https://github.com/facebook/fresco

 

RecyclerView右滑打开菜单删除

因为已经放弃使用ListView,所以是在RecyclerView的基础下做的。

主要使用ViewDragHelper,V4包下的一个类来实现布局的拖动。

ViewDragHelper可以很方便的控制管理布局的拖曳。思路是让两个布局相互叠加。拖动上层布局后显示下层布局。

代码如下:

GitHub地址:https://github.com/szpnygo/android-SwipeRecyclerView 

已经更新当有点击事件的时候,无法拖动的问题。

在ViewDragCallBack中添加如下代码

 

Android Studio Gradle批量打包渠道包

Android Studio下使用grable进行批量打包,非常的简单快捷。

修改app下的build.gradle

修改AndroidManifest.xml中umeng的字段

QQ截图20150605154542

QQ截图20150605153509

 

Android support-annotations注解支持,封装更优美的框架

Google提供了不少很实用的支持包,其中有一个support-annotations,默认没有包含在V4 V7中。Android Studio可以用如下方式添加。

这个包是个注解包,但是不是VIEW的注解,是一些字段的注解。

下面是一个使用例子:

 

@DrawableRes 限制img必须为图片资源,不能单纯的传int进去。对于一些封装,例如传入layout string drable,可以通过这种方式进行限制。在调用该方法的时候,就直接进行比对。如果不符合设置的要求,直接就会提示错误。

AnimatorRes Denotes that an integer parameter, field or method return value is expected to be an animator resource reference (e.g.
AnimRes Denotes that an integer parameter, field or method return value is expected to be an anim resource reference (e.g.
AnyRes Denotes that an integer parameter, field or method return value is expected to be a resource reference of any type.
ArrayRes Denotes that an integer parameter, field or method return value is expected to be an array resource reference (e.g.
AttrRes Denotes that an integer parameter, field or method return value is expected to be an attribute reference (e.g.
BoolRes Denotes that an integer parameter, field or method return value is expected to be a boolean resource reference.
ColorRes Denotes that an integer parameter, field or method return value is expected to be a color resource reference (e.g.
DimenRes Denotes that an integer parameter, field or method return value is expected to be a dimension resource reference (e.g.
DrawableRes Denotes that an integer parameter, field or method return value is expected to be a drawable resource reference (e.g.
FractionRes Denotes that an integer parameter, field or method return value is expected to be a fraction resource reference.
IdRes Denotes that an integer parameter, field or method return value is expected to be an id resource reference (e.g.
IntDef Denotes that the annotated element of integer type, represents a logical type and that its value should be one of the explicitly named constants.
IntegerRes Denotes that an integer parameter, field or method return value is expected to be an integer resource reference (e.g.
InterpolatorRes Denotes that an integer parameter, field or method return value is expected to be an interpolator resource reference (e.g.
LayoutRes Denotes that an integer parameter, field or method return value is expected to be a layout resource reference (e.g.
MenuRes Denotes that an integer parameter, field or method return value is expected to be a menu resource reference.
NonNull Denotes that a parameter, field or method return value can never be null.
Nullable Denotes that a parameter, field or method return value can be null.
PluralsRes Denotes that an integer parameter, field or method return value is expected to be a plurals resource reference.
RawRes Denotes that an integer parameter, field or method return value is expected to be a raw resource reference.
StringDef Denotes that the annotated String element, represents a logical type and that its value should be one of the explicitly named constants.
StringRes Denotes that an integer parameter, field or method return value is expected to be a String resource reference (e.g.
StyleableRes Denotes that a integer parameter, field or method return value is expected to be a styleable resource reference (e.g.
StyleRes Denotes that a integer parameter, field or method return value is expected to be a style resource reference (e.g.
VisibleForTesting Denotes that the class, method or field has its visibility relaxed, so that it is more widely visible than otherwise necessary to make code testable.
XmlRes Denotes that an integer parameter, field or method return value is expected to be an XML resource reference.

这是整个包中目前支持的类型,基本已经包含了所有的类型的。

其中NonNull表示该字段不能为空,Nullable表示该字段可以为空。

我的Github地址:https://github.com/szpnygo/android-RecyclerView-Palette-demo

Android实现不规则按钮

GitHub地址:https://github.com/szpnygo/Android-AnomalyButton

通过判断图形意外像素值进行判断: