人工智能实战2——从0开始手写符号识别

接上一篇博客 人工智能实战——人工神经网络(C库iOS交叉编译),这篇博客之前发布在qq空间一直没挪过来... 

回顾下第一个例子中我用到NN(神经网络)的地方:
假设了一个目标函数 f = x==y ,设计了一个3层结构的神经网络,经过训练让神经网络自己学会如果判断两个数相等。

由于目标函数只有2个变量和一个结果,因此网络结构的输入元件只有2个,输出元件只有1个,并且输出元件的区间是[-1,1].

然而这个例子太过于简单,仅作为刚接触人工智能的一个小小的入门试探而已。接下来是时候展现人工神经的魅力所在了。把NN运用到真正适合他的场景,比如文章归类、图像识别、语音识别、用户喜好筛选等实际场景。

这篇文章就要揭开图像识别的神秘面纱,从0开始教会人工大脑如何识别手写符号,然后是手写数字,终极挑战是识别出手写汉字。在开始这篇文章前,我们先分析文字识别的几种方式:
1.能够获取用户下笔的顺序,每一笔画的方向,轻重等信息,从而将用户的笔画提取成坐标+向量集合,然后作为输入源给NN,训练NN,输出正确的结果。
2.无法获取用户下笔的顺序,轻重等信息(往往是拍照、扫描得来的图片),将图片进行简单的处理,去除噪点,黑白化,然后将各个像素点的灰度值建立成矩阵或数组,作为输入源给NN,训练NN,输出正确的结果。

方式1一般用于客户端上的手势识别,比如浏览器的手势操作等,手写输入法等,缺点是一旦无法获取下笔顺序基本上没啥用处了,通用性低。
方式2一般用于纸质文档的数字化,也就是我们常说的OCR(光学字符识别),缺点是a.需要庞大的训练数据(如果你要识别所有中国人的手写体,你需要所有中国人的手写体训练数据,包括医生开的处方^^) b.对图片的去噪、裁边、黑白过程比较难处理或者耗时间。

这里我选择了方式2,因为方式2的普适性比较高,那么首先我们的程序就需要做一点点调整:
用于识别一张图片中包含单个手写符号(假设我们来识别0~9的数字,那么一共有10中不同的输出)的程序,图片尺寸是100x100,那么这个图片就包含10000个像素点,每个像素点都有自己的颜色,输入源应该是一个100x100的矩阵,输出源要能表示10种不同的结果。

10000个像素点作为10000个输入源太庞大了,因此我们要把原始图片的质量降低一点,比如我把所有的图片压缩到16*16个像素(追求识别的精度应该扩大尺寸,牺牲性能),用来识别简单的图像。
输出的值如果是0~9的10个数字,那么输出元件如果只能输出0或1的话,我们至少需要2^4=16个排列,因此我们需要4个输出元件。

图片

这个过程看其实无非是我们第一个程序的例子中2个输入变成了16x16个,1个输出变成了4个输出,仅此而已!!而他能做的事情却发生了天翻地覆的变化。。。。这就是NN解决问题的魅力所在

只不过这次我们不能让用户从16x16个文本框中一个个来输入,而是直接让用户画,所以首先我们创建画图控件~继承UIView,用贝塞尔曲线+touchEvents可以很快写出来:

//

//  XYDrawingView.m

//  小歪

//

//  Created by reese on 16/3/23.

//  Copyright © 2016 com.ifenduo. All rights reserved.

//


#import "XYDrawingView.h"


@interface XYDrawingView ()


//所有的贝塞尔曲线

@property (nonatomicNSMutableArray *lines;


//当前的贝塞尔曲线

@property (nonatomicUIBezierPath *currentPath;


@end


@implementation XYDrawingView


- (NSMutableArray *)lines {

    if (!_lines) {

        _lines = [NSMutableArray array];

    }

    return _lines;

}


//重写drawRect方法

- (void)drawRect:(CGRect)rect {

    

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值