文章目录

  • 一、训练分类器
  • 二、导入训练权重,使用图片检测

一、训练分类器

步骤如下:

  • 计算数据库中每个样本的HOG特征。
  • 使用每个样本的HOG特征以及相应的标签训练多类线性SVM。
  • 将分类器保存在文件中

由于是灰度图(二值化图)不能用图像的直方图来作为图像特征,这里用到了HOG方向梯度直方图,可以说,正合适。

数据集下载地址:http://yann.lecun.com/exdb/mnist/
当然,你也可以在线下载

from sklearn.externals import joblib
from sklearn import datasets
from skimage.feature import hog
from sklearn.svm import LinearSVC
import numpy as np
import os
import struct# 在线下载特征获取代码
dataset = datasets.fetch_mldata("MNIST Original")
features = np.array(dataset.data, 'int16')
labels = np.array(dataset.target, 'int')# 获取土图片HOG特征
list_hog_fd = []
for feature in features:fd = hog(feature.reshape((28, 28)), orientations=9, pixels_per_cell=(14, 14), cells_per_block=(1, 1), visualise=False)list_hog_fd.append(fd)
hog_features = np.array(list_hog_fd, 'float64')# 创建clf对象
clf = LinearSVC()
clf.fit(hog_features, labels)
joblib.dump(clf, "digits_cls.pkl", compress=3)

离线下载数据集读取并训练

def load_mnist(path):            #读取数据函数#Load MNIST data from pathlabels_path = os.path.join(path, 'train-labels.idx1-ubyte')images_path = os.path.join(path, 'train-images.idx3-ubyte')with open(labels_path, 'rb') as lbpath:magic, n = struct.unpack('>II',lbpath.read(8))labels = np.fromfile(lbpath, dtype=np.uint8)with open(images_path, 'rb') as imgpath:magic, num, rows, cols = struct.unpack(">IIII",imgpath.read(16))images = np.fromfile(imgpath, dtype=np.uint8).reshape(len(labels), 784)return images, labelsfeatures,labels = load_mnist("./")
print('Rows: %d, columns: %d' % (features.shape[0], labels.shape[0]))list_hog_fd = []
for feature in features:fd = hog(feature.reshape((28, 28)),     # hog 特征orientations=9, pixels_per_cell=(14, 14), cells_per_block=(1, 1), visualise=False)list_hog_fd.append(fd)
hog_features = np.array(list_hog_fd, 'float64')clf = LinearSVC()                                # 定义分类器
clf.fit(hog_features, labels)                    # 训练
joblib.dump(clf, "digits_cls.pkl", compress=3)   # 模型保存# 压缩:0到9的整数可选
# 压缩级别:0没有压缩。越高意味着更多的压缩,而且读取和写入越慢。使用3的值通常是一个很好的折衷。

二、导入训练权重,使用图片检测

import cv2
from sklearn.externals import joblib
from skimage.feature import hog
import numpy as npclf = joblib.load("digits_cls.pkl")                 # 读取分类器
im = cv2.imread("./num.png")                        # 读取输入图片
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)      # 灰度图化
im_gray = cv2.GaussianBlur(im_gray, (5, 5), 0)      # 高斯模糊(去噪)ret, im_th = cv2.threshold(im_gray, 90, 255, cv2.THRESH_BINARY_INV)              # 阈值:二值化
ctrs, hier = cv2.findContours(im_th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 查询图像轮廓
rects = [cv2.boundingRect(ctr) for ctr in ctrs]    # 框出目标# 对查询的目标识别:计算HOG特征图并且使用SVM预测数字
for rect in rects:cv2.rectangle(im, (rect[0], rect[1]), (rect[0] + rect[2], rect[1] + rect[3]), (0, 255, 0), 3) leng = int(rect[3] * 1.6)pt1 = int(rect[1] + rect[3] // 2 - leng // 2)pt2 = int(rect[0] + rect[2] // 2 - leng // 2)roi = im_th[pt1:pt1+leng, pt2:pt2+leng]# resize 图片roi = cv2.resize(roi, (28, 28), interpolation=cv2.INTER_AREA)roi = cv2.dilate(roi, (3, 3))# 计算 HOG featuresroi_hog_fd = hog(roi, orientations=9, pixels_per_cell=(14, 14), cells_per_block=(1, 1), visualise=False)nbr = clf.predict(np.array([roi_hog_fd], 'float64'))cv2.putText(im, str(int(nbr[0])), (rect[0], rect[1]),cv2.FONT_HERSHEY_DUPLEX, 2, (0, 255, 255), 3)
cv2.imshow("Resulting Image with Rectangular ROIs", im)
cv2.waitKey(0)
cv2.destroyAllWindows()

数字应该相互分开。否则,如果数字太接近,则会干扰每个数字周围的正方形区域。在这种情况下,我们需要创建一个新的方形图像,然后我们需要复制该方形图像中的轮廓。

对于我们在测试中使用的图像,固定阈值工作得很好。在大多数现实世界的图像中,固定阈值不会产生好的结果。在这种情况下,我们需要使用自适应阈值。

在预处理步骤中,我们只做了高斯模糊处理。在大多数情况下,在二进制图像上,我们需要打开和关闭图像以去除小的噪点像素并填充小孔。

特别鸣谢
http://hanzratech.in/2015/02/24/handwritten-digit-recognition-using-opencv-sklearn-and-python.html

OpenCV—python 手写数字字体识别(使用HOG特征)相关推荐

  1. linux手写数字识别opencv,opencv实现KNN手写数字的识别

    人工智能是当下很热门的话题,手写识别是一个典型的应用.为了进一步了解这个领域,我阅读了大量的论文,并借助opencv完成了对28x28的数字图片(预处理后的二值图像)的识别任务. 预处理一张图片: 首 ...

  2. Dataset之MNIST:MNIST(手写数字图片识别+ubyte.gz文件)数据集的下载(基于python语言根据爬虫技术自动下载MNIST数据集)

    Dataset之MNIST:MNIST(手写数字图片识别+ubyte.gz文件)数据集的下载(基于python语言根据爬虫技术自动下载MNIST数据集) 目录 数据集下载的所有代码 1.主文件 mni ...

  3. python 手写数字识别 封装GUI,手写板获取鼠标写字轨迹信息

    python 手写数字识别知识不用多说,本文用深度学习Python库Keras实现深度学习入门教程mnist手写数字识别.mnist手写数字识别是机器学习和深度学习领域的"hello wor ...

  4. DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Functional)利用MNIST(手写数字图片识别)数据集实现多分类预测

    DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Functional)利用MNIST(手写数字图片识别)数据集实现多分类预测 目录 输出结果 设计思路 核心代码 输出结果 下边两张 ...

  5. TF之NN:利用DNN算法(SGD+softmax+cross_entropy)对mnist手写数字图片识别训练集(TF自带函数下载)实现87.4%识别

    TF之NN:利用DNN算法(SGD+softmax+cross_entropy)对mnist手写数字图片识别训练集(TF自带函数下载)实现87.4%识别 目录 输出结果 代码设计 输出结果 代码设计 ...

  6. DL之NN:利用(本地数据集50000张数据集)调用自定义神经网络network.py实现手写数字图片识别94%准确率

    DL之NN:利用(本地数据集50000张数据集)调用自定义神经网络network.py实现手写数字图片识别94%准确率 目录 输出结果 代码设计 输出结果 更新-- 代码设计 import mnist ...

  7. TF之LiR:基于tensorflow实现手写数字图片识别准确率

    TF之LiR:基于tensorflow实现手写数字图片识别准确率 目录 输出结果 代码设计 输出结果 Extracting MNIST_data\train-images-idx3-ubyte.gz ...

  8. Dataset之MNIST:MNIST(手写数字图片识别+ubyte.gz文件)数据集简介、下载、使用方法(包括数据增强)之详细攻略

    Dataset之MNIST:MNIST(手写数字图片识别+ubyte.gz文件)数据集简介+数据增强(将已有MNIST数据集通过移动像素上下左右的方法来扩大数据集为初始数据集的5倍) 目录 MNIST ...

  9. DL之NN/CNN:NN算法进阶优化(本地数据集50000张训练集图片),六种不同优化算法实现手写数字图片识别逐步提高99.6%准确率

    DL之NN/CNN:NN算法进阶优化(本地数据集50000张训练集图片),六种不同优化算法实现手写数字图片识别逐步提高99.6%准确率 目录 设计思路 设计代码 设计思路 设计代码 import mn ...

最新文章

  1. android setAlpha 与 getBackground().setAlpha
  2. Mybatis传多个参数(推荐)
  3. [转]Flex unit testflex-4-create-a-simple-unit-test-in-flash-builder
  4. 17种常用的JS正则表达式 非负浮点数 非负正数
  5. C# 缓存学习第一天
  6. gan网络损失函数_生成对抗网络的最新研究进展
  7. 2020年商用的5G,中兴通讯已经下了哪些先手棋?
  8. javac 与java_javac和参数用法java命令的-d -cp
  9. TP框架log日志使用方法
  10. 学习OpenCV3:计算点到直线的距离并画出垂线(含公式和推导)
  11. 简单案例:注册登录功能实现
  12. 【DAOS】Intel DAOS 分布式异步对象存储|Architecture Overview|架构概述
  13. 免流服务器系统怎么选,免流云服务器选
  14. 小白深度学习入坑指南
  15. Laravel php 框架的使用写出第一个hello world,Laravel 入门配置
  16. 线性空间,线性子空间,基与维数
  17. STM32 SPI片选信号拉不高的解决方案
  18. winds操作系统下登录本地MySQL和远程MySQL
  19. 歪唱《七里香》——致敬杰伦
  20. 海外社交媒体SNS运营之社交媒体概览

热门文章

  1. 虚拟服务器怎么传文件,怎么在虚拟主机中上传东西
  2. eclipse搜索查询--快捷键
  3. 中国内管行业市场供需与战略研究报告
  4. 黑色星期五!!  mysql 数据损坏了~~
  5. 好雨科技发布 SaaS 应用市场“云市”,做软件厂商与用户的连接器
  6. 优秀的监工:InstallWatch Pro
  7. 又一“交通大学”,要来了?
  8. mysql error parsing_Go 解析日期格式-解决 parsing time xx as xx: cannot parse xx as xx 错误
  9. linux deamon函数使用方法说明
  10. HENKAKU!PSV(Vita)编程小白探索笔记(零)