OpenCV系列之使用OCR手写数据集运行SVM | 五十六
目标
在本章中,我们将重新识别手写数据集,但是使用SVM而不是kNN。
识别手写数字
在kNN中,我们直接使用像素强度作为特征向量。这次我们将使用定向梯度直方图(HOG)作为特征向量。
在这里,在找到HOG之前,我们使用其二阶矩对图像进行偏斜校正。因此,我们首先定义一个函数deskew(),该函数获取一个数字图像并将其校正。下面是deskew()函数:
def deskew(img):m = cv.moments(img)if abs(m['mu02']) < 1e-2:return img.copy()skew = m['mu11']/m['mu02']M = np.float32([[1, skew, -0.5*SZ*skew], [0, 1, 0]])img = cv.warpAffine(img,M,(SZ, SZ),flags=affine_flags)return img
下图显示了应用于零图像的上偏移校正功能。左图像是原始图像,右图像是偏移校正后的图像。
接下来,我们必须找到每个单元格的HOG描述符。为此,我们找到了每个单元在X和Y方向上的Sobel导数。然后在每个像素处找到它们的大小和梯度方向。该梯度被量化为16个整数值。将此图像划分为四个子正方形。对于每个子正方形,计算权重大小方向的直方图(16个bin)。因此,每个子正方形为你提供了一个包含16个值的向量。(四个子正方形的)四个这样的向量共同为我们提供了一个包含64个值的特征向量。这是我们用于训练数据的特征向量。
def hog(img):gx = cv.Sobel(img, cv.CV_32F, 1, 0)gy = cv.Sobel(img, cv.CV_32F, 0, 1)mag, ang = cv.cartToPolar(gx, gy)bins = np.int32(bin_n*ang/(2*np.pi)) # quantizing binvalues in (0...16)bin_cells = bins[:10,:10], bins[10:,:10], bins[:10,10:], bins[10:,10:]mag_cells = mag[:10,:10], mag[10:,:10], mag[:10,10:], mag[10:,10:]hists = [np.bincount(b.ravel(), m.ravel(), bin_n) for b, m in zip(bin_cells, mag_cells)]hist = np.hstack(hists) # hist is a 64 bit vectorreturn hist
最后,与前面的情况一样,我们首先将大数据集拆分为单个单元格。对于每个数字,保留250个单元用于训练数据,其余250个数据保留用于测试。完整的代码如下,你也可以从此处下载:
#!/usr/bin/env python
import cv2 as cv
import numpy as np
SZ=20
bin_n = 16 # Number of bins
affine_flags = cv.WARP_INVERSE_MAP|cv.INTER_LINEAR
def deskew(img):m = cv.moments(img)if abs(m['mu02']) < 1e-2:return img.copy()skew = m['mu11']/m['mu02']M = np.float32([[1, skew, -0.5*SZ*skew], [0, 1, 0]])img = cv.warpAffine(img,M,(SZ, SZ),flags=affine_flags)return img
def hog(img):gx = cv.Sobel(img, cv.CV_32F, 1, 0)gy = cv.Sobel(img, cv.CV_32F, 0, 1)mag, ang = cv.cartToPolar(gx, gy)bins = np.int32(bin_n*ang/(2*np.pi)) # quantizing binvalues in (0...16)bin_cells = bins[:10,:10], bins[10:,:10], bins[:10,10:], bins[10:,10:]mag_cells = mag[:10,:10], mag[10:,:10], mag[:10,10:], mag[10:,10:]hists = [np.bincount(b.ravel(), m.ravel(), bin_n) for b, m in zip(bin_cells, mag_cells)]hist = np.hstack(hists) # hist is a 64 bit vectorreturn hist
img = cv.imread('digits.png',0)
if img is None:raise Exception("we need the digits.png image from samples/data here !")
cells = [np.hsplit(row,100) for row in np.vsplit(img,50)]
# First half is trainData, remaining is testData
train_cells = [ i[:50] for i in cells ]
test_cells = [ i[50:] for i in cells]
deskewed = [list(map(deskew,row)) for row in train_cells]
hogdata = [list(map(hog,row)) for row in deskewed]
trainData = np.float32(hogdata).reshape(-1,64)
responses = np.repeat(np.arange(10),250)[:,np.newaxis]
svm = cv.ml.SVM_create()
svm.setKernel(cv.ml.SVM_LINEAR)
svm.setType(cv.ml.SVM_C_SVC)
svm.setC(2.67)
svm.setGamma(5.383)
svm.train(trainData, cv.ml.ROW_SAMPLE, responses)
svm.save('svm_data.dat')
deskewed = [list(map(deskew,row)) for row in test_cells]
hogdata = [list(map(hog,row)) for row in deskewed]
testData = np.float32(hogdata).reshape(-1,bin_n*4)
result = svm.predict(testData)[1]
mask = result==responses
correct = np.count_nonzero(mask)
print(correct*100.0/result.size)
这种特殊的方法给我们近94%的准确性。你可以为SVM的各种参数尝试不同的值,以检查是否可以实现更高的精度。或者,你可以阅读有关此领域的技术论文并尝试实施它们。
附加资源
1.Histograms of Oriented Gradients Video:https://www.youtube.com/watch?v=0Zib1YEE4LU
练习
1.OpenCV示例包含digits.py,它对上述方法进行了一些改进以得到改进的结果。它还包含参考资料。检查并了解它。
☆☆☆为方便大家查阅,小编已将OpenCV-Python专栏文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“文章”,如图:或点击下方“阅读原文”,进入OpenCV-Python专栏,即可查看系列文章。
深度学习与计算机视觉交流群
关注最新最前沿计算机视觉技术相关专业知识,扫码添加mthler拉你入群,如果已经是mthler帐号好友直接私信即可。
(加群或私信请注明:交流群)
不断更新资源
获取更多精彩
长按二维码扫码关注
OpenCV系列之使用OCR手写数据集运行SVM | 五十六相关推荐
- OpenCV系列之使用OCR手写数据集运行KNN | 五十四
目标 在本章中 我们将使用我们在kNN上的知识来构建基本的OCR应用程序. 我们将尝试使用OpenCV自带的数字和字母数据集. 手写数字的OCR 我们的目标是构建一个可以读取手写数字的应用程序.为此, ...
- 【无标题】OCR手写数据集
SCUT-EPT SCUT-EPT 数据集包含 50,000 个文本行图像,其中 40,000 个用于训练,10,000 个用于测试,选自 2,986 名志愿者的试卷.除了 HCTR 中的常见问题,D ...
- Python,OpenCV使用KNN来构建手写数字及字母识别OCR
Python,OpenCV使用KNN来构建手写数字及字母识别OCR 1. 原理 1.1 手写数字识别 1.2 字母识别 2. 源码 2.1 手写数字OCR 2.2 字母OCR 参考 这篇博客将介绍如何 ...
- 【机器学习】PCA主成分项目实战:MNIST手写数据集分类
PCA主成分项目实战:MNIST手写数据集分类 PCA处理手写数字集 1 模块加载与数据导入 2 模型创建与应用 手动反爬虫:原博地址 https://blog.csdn.net/lys_828/ar ...
- OpenCV-python:SVM(支持向量机)OCR手写识别
1.SVM理解 SVM按照百度百科的解释,他属于一种监督分类的方法,对数据进行二元分类,分类的标准就是决策边界. 看下面的图片就很容易能够理解.如果说要给红点和蓝点分类的话,以绿线作为分界线,那么找到 ...
- 2.2 Mnist手写数据集
2.2 Mnist手写数据集 全连接网络:网络层的每一个结点都与上一层的所有结点相连. 多隐层全连接神经网络: 代码如下: 1. 导入必要的模块 import numpy as np import p ...
- OCR手写文字怎么识别
在日常生活工作里面,有的时候发现自己幸苦写完的资料文件,经过打印后源文件不知不觉丢了,还有的快递公司每天花费时间录入运单,效率简直低的可怕,那怎么去解决这一问题呢,今天小编就来教大家一招. 第一步:打 ...
- OCR手写数字识别什么软件好用?介绍一种
OCR是指用电子设备检查文本上的资料,然后对图像文件进行分析处理,从而获取文字及版面信息的过程.那OCR手写数字识别有好用的软件吗?当我们需要整理大量手写资料需要整理时,下面这两款软件就派上用场了. ...
- 利用Python对MNIST手写数据集进行数字识别(初学者入门级)
利用Python对MNIST手写数据集进行数字识别 一.编程环境Jupyter Notebook Jupyter Notebook,之前被称为IPython notebook,是一个交互式的Web应用 ...
最新文章
- 线性回归之梯度下降法介绍
- VMware Workstation 15 Pro 永久激活密钥 下载
- 一个帮助Java开发者快速学会Kotlin的开源项目
- 【NLP】270篇ACL 2019代码开源的论文,全在这里了!
- linux(ubuntu)新建用户只有一个$问题,Ubuntu新建用户并指定目录
- CentOS 7安装redis及php扩展
- SQL Server 数据库管理常用的SQL和T-SQL语句
- CentreonMonitoringEvent Logs没有结果的解决方法
- JavaScript实现模糊推荐的input框(类似百度搜索框)
- 软件需求与分析——大二下需会知识点
- 2021年危险化学品经营单位安全管理人员新版试题及危险化学品经营单位安全管理人员模拟考试系统
- RabbitMQ教程(安装与使用详解,Spring集成)
- Vue el-menu-item路由跳转
- 前端实现文件在线预览
- 如何在cad中导入谷歌地图_如何在Google地图中设置出发和到达时间
- 数据结构:(c实现)单向链表,单链表的头增,尾增,头删,尾删,任意位置的删除与插入。
- 实现Ubuntu同时安装open_jdk 和 oracle_jdk
- 【乐易考看高校】大学生创业孵化基地启动仪式暨2015届毕业生供需洽谈会11月16日在赤峰学院举行
- 环糊精改性纳米银水凝胶;金纳米颗粒(AuNPs)@DNA水凝胶的应用介绍
- 计算机怎么放音乐怎么按,QQ音乐怎么用手机控制电脑放歌曲
热门文章
- CSS布局—— float布局和flex布局
- 泛微OA字段联动设置
- pythonaccess系统_Win7(64位系统)中用Python连接access数据库(access2010)
- 四种禁止下载软件的方法
- 简单聊一聊什么是鉴权?
- Java stream 处理分组后[升降序key]取每组最大
- 户外导航软件OruxMaps及其相关地图资源_我是亲民_新浪博客
- php日历天气预报下载安装手机桌面_怎样设置我手机上的时间和天气预报放到桌面上?...
- 面试官:聊聊 Java 的几把 JVM 级锁吧
- 五大主流浏览器和四大浏览器内核