上一期用了传统的模板匹配的算法对单字符进行识别,本期就来写简单的机器学习的方式,主要是SVM和CNN,入门级别,可供初学者参考,文章最后给出整个开源的代码和数据集,参考学习。
数据标签为0-9十个文件夹,里面分别包含切割出来的字符图片。

训练集和测试集按如此划分好,接下来就构建机器学习的网络模型了,首先给出SVM。

import numpy as np
from tqdm import tqdm
import glob
import os
from PIL import Image
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV, train_test_split,learning_curve
from sklearn.externals import joblibdef img2vec(filename):dataVec = np.zeros((1,800))img = Image.open(filename)img = img.crop((0,0,20,40))img = np.array(img)for i in range(40):for j in range(20):dataVec[0,20*i+j] = img[i][j]return dataVecdef make_dataset(parent_dir,sub_dirs,file_ext="*.jpg"):label = []feature = []for sub_dir in sub_dirs:for fn in tqdm(glob.glob(os.path.join(parent_dir,sub_dir,file_ext))):label_name =  fn.split("\\")[-2]label_name = label_name.split("/")[-1]imgdata = img2vec(fn)label.extend([label_name])feature.extend([imgdata])return [feature,label]parent_dir = "./data/train"
sub_dirs = np.array(['0','1','2','3','4','5','6','7','8','9'])
temp = make_dataset(parent_dir,sub_dirs)temp = np.array(temp)
data = temp.transpose()
# 获取特征
X = np.vstack(data[:, 0])
# 获取标签
Y = np.array(data[:, 1])
print('X的特征尺寸是:',X.shape)
print('Y的特征尺寸是:',Y.shape)
scaler = StandardScaler()
x_std = scaler.fit_transform(X)  # 标准化
x_train, x_test, y_train, y_test = train_test_split(x_std, Y, test_size=.2)
# rbf核函数,设置数据权重
svc = SVC(kernel='rbf', class_weight='balanced',)
c_range = np.logspace(-5, 4, 10, base=2)
gamma_range = np.logspace(-9, 0, 10, base=2)
# 网格搜索交叉验证的参数范围,cv=3,3折交叉,n_jobs=-1,多核计算
param_grid = [{'kernel': ['rbf'], 'C': c_range, 'gamma': gamma_range}]
grid = GridSearchCV(svc, param_grid, cv=3, n_jobs=-1)
# 训练模型
clf = grid.fit(x_train, y_train)
joblib.dump(clf,"./model_save/svm.pkl")

模型保存再文件夹里,方便后续推理。
下面再给出CNN的baseline代码:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, Flatten, Dense, MaxPool2D, Dropout
from tensorflow.keras.utils import to_categorical
import numpy as np
from PIL import Image
from tqdm import tqdm
import glob
import os
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.externals import joblib
def img2vec(filename):dataVec = np.zeros((1,800))img = Image.open(filename)img = img.crop((0,0,20,40))img = np.array(img)for i in range(40):for j in range(20):dataVec[0,20*i+j] = img[i][j]return dataVecdef make_dataset(parent_dir,sub_dirs,file_ext="*.jpg"):label = []feature = []for sub_dir in sub_dirs:for fn in tqdm(glob.glob(os.path.join(parent_dir,sub_dir,file_ext))):label_name =  fn.split("\\")[-2]label_name = label_name.split("/")[-1]imgdata = img2vec(fn)label.extend([label_name])feature.extend([imgdata])return [feature,label]parent_dir = "./data/train"
sub_dirs = np.array(['0','1','2','3','4','5','6','7','8','9'])
temp = make_dataset(parent_dir,sub_dirs)temp = np.array(temp)
data = temp.transpose()
# 获取特征
X = np.vstack(data[:, 0])# 获取标签
Y = np.array(data[:, 1])
Y = to_categorical(Y)print('X的特征尺寸是:',X.shape)
print('Y的特征尺寸是:',Y.shape)x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
model = Sequential()
x_train = x_train.reshape(-1,40,20,1)
x_test = x_test.reshape(-1,40,20,1)# 输入的大小
input_dim = (40, 20, 1)model.add(Conv2D(64, (3, 3), padding = "same", activation = "relu", input_shape = input_dim))# 卷积层
model.add(MaxPool2D(pool_size=(2, 2)))# 最大池化
model.add(Conv2D(256, (3, 3), padding = "same", activation = "relu")) #卷积层
model.add(MaxPool2D(pool_size=(2, 2))) # 最大池化层
model.add(Dropout(0.3))
model.add(Flatten()) # 展开
model.add(Dense(512, activation = "relu"))
model.add(Dense(10, activation = "softmax"))
# 编译模型,设置损失函数,优化方法以及评价标准
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
model.summary()
# 训练模型
model.fit(x_train, y_train, epochs = 16, batch_size = 16, validation_data = (x_test, y_test))
model.save("./model_save/base_cnn_model")

同理,模型保存好,可以利用测试集测试准确率,代码如下:

from sklearn.externals import joblib
from sklearn.preprocessing import StandardScaler
from tensorflow.keras.models import load_model
import numpy as np
from tqdm import tqdm
import os
import glob
from PIL import Imagedef img2vec(filename):dataVec = np.zeros((1,800))img = Image.open(filename)img = img.crop((0,0,20,40))img = np.array(img)for i in range(40):for j in range(20):dataVec[0,20*i+j] = img[i][j]return dataVecdef make_dataset(parent_dir,sub_dirs,file_ext="*.jpg"):feature = []for sub_dir in sub_dirs:for fn in tqdm(glob.glob(os.path.join(parent_dir,sub_dir,file_ext))):imgdata = img2vec(fn)feature.extend([imgdata])return featuredef svm_pred(root_dir,sub_dirs,data="*.jpg"):img_total = 0acc_total = 0clf = joblib.load("./model_save/svm.pkl")data = make_dataset(root_dir,sub_dirs)data = np.array(data)X = np.vstack(data[:, 0])scaler = StandardScaler()x_std = scaler.fit_transform(X)  # 标准化pred = clf.predict(x_std)k = 0for sub_dir in sub_dirs:acc = 0sub_path = os.path.join(root_dir,sub_dir)num = len(os.listdir(sub_path))img_total+=numfor i in range(num):if pred[k] == sub_dir:acc+=1k+=1else:k+=1print("当前识别数字为:",sub_dir, "    识别正确个数为:",acc, "总数为:",num, "识别准确率为:",float(acc/num))acc_total+=accprint("训练集总数:",img_total, "正确识别总数:",acc_total, "准确率:",float(acc_total/img_total))def cnn_pred(root_dir,sub_dirs):model = load_model("./model_save/base_cnn_model")img_total = 0acc_total = 0for sub_dir in sub_dirs:acc = 0sub_path = os.path.join(root_dir,sub_dir)num = len(os.listdir(sub_path))img_total+=numimgfile = [os.path.join(sub_path,x) for x in os.listdir(sub_path)]for img in imgfile:pred_img = img2vec(img)pred_img = pred_img.reshape(-1,40,20,1)predlabel = np.argmax(model.predict(pred_img))if str(predlabel) == sub_dir:acc+=1print("当前识别数字为:",sub_dir, "    识别正确个数为:",acc, "总数为:",num, "识别准确率为:",float(acc/num))acc_total+=accprint("训练集总数:", img_total, "正确识别总数:", acc_total, "准确率:", float(acc_total / img_total))def main():i = input("请输入识别类别1.train   2.test")if i == '1':root_dir = "./data/train"sub_dirs = np.array(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])print("svm+++++++Train++++++++")svm_pred(root_dir,sub_dirs)print("cnn+++++++train+++++++")cnn_pred(root_dir,sub_dirs)if i == '2':root_dir = "./data/test"sub_dirs = np.array(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])print("svm+++++++TEST++++++++")svm_pred(root_dir,sub_dirs)print("cnn+++++++TEST+++++++")cnn_pred(root_dir,sub_dirs)if __name__ == "__main__":main()

欢迎入门者参考学习!
源码资源:源码+数据集+预训练模型

基于机器学习的数字电表数字识别二(源码+数据集)相关推荐

  1. 基于DEAP的脑电情绪识别论文源码改进版本(附论文代码,lstm和rnn)

    论文及改进版源码链接: (论文加源码)基于DEAP的脑电情绪识别论文源码改进版本(附论文代码,lstm和rnn) https://download.csdn.net/download/qq_45874 ...

  2. 基于tensorflow2.0+opencv的花卉识别系统源码(含数据集)

    花卉识别-基于tensorflow2.3实现 完整代码下载地址:基于tensorflow2.0+opencv的花卉识别系统源码( 文件目录 # 数据下载地址 https://storage.googl ...

  3. 【毕业设计_课程设计】基于神经网络学习的在线纸币识别【源码+论文】

    文章目录 0 项目说明 1 项目说明 2 系统设计 2.1 设计要求 2.2 设计方案 3 效果展示 4 论文目录 5 项目工程 0 项目说明 基于神经网络学习的在线纸币识别 提示:适合用于课程设计或 ...

  4. java 图像识别包_Java基于百度API的图片文字识别免费源码和jar包

    1.准备工作(jdk1.8) 使用之前需要获取对应的项目API_KEY,SECRET_KEY,这些参数在使用API的时候必须用到,用于生成access_token. 如何获取这些参数? 登陆后创建一个 ...

  5. 基于模板匹配的数字电表数字识别(python)

    模板匹配可以说是比较传统的数学方法去做图像识别,以往的模板匹配往往只是让原图像与模板图像做减运算,最后选出最小误差的那张,但在实际识别中,这一方法识别的效果并不是很有效,特别对于两张数字类型并不是很相 ...

  6. 程序设计-在校整理-07 基于机器学习算法的DGA域名识别(NB、XGboost、MLP初探)

    [在校整理-07 基于机器学习算法的DGA域名识别(NB.XGboost.MLP初探)](注:仅供参考学习使用) 一.课题内容和要求 二.理论基础 2.1 DGA域名生成算法 2.2 DGA算法原理 ...

  7. 如何将 Credly 中的数字徽章转成二维码

    如何将 Credly 中的数字徽章转成二维码 在 Credly 数字证书 这一篇文章中要说过当完成 AWS Academy Cloud Foundations 课程后,可以申请一个结业证书徽章,已下逐 ...

  8. 基于51单片机的简易数字计算器Proteus仿真(源码+仿真+全套资料)

     资料编号:115 全套资料齐全,功能说明: 该计算器系统51 系列的单片机进行的数字计算器系统设计,可以完成计算器的键盘输入, 进行加. 减.乘.除的简单四则运算,并在 LCD屏幕上相应的显示结果. ...

  9. 树莓派python识别二维码_Zbar树莓派二维码(QR)识别(基于图片)

    注意:如果二维码太小的话,zbar是很难识别的,这也是我在公司解决的问题(不然随便调用下zbar就解决问题了,图像算法工程师就没有存在的必要了,下文虽然是一个通用的解决方案,但对一般识别应用场景来说是 ...

最新文章

  1. Google团队在DNN的实际应用方式的整理
  2. Maven 的 Scope 区别,你知道吗?
  3. 如何使用idea远程debug调试代码详解
  4. SpringMVC之源码分析--ThemeResolver(三)
  5. 易筋SpringBoot 2.1 | 第三十三篇:SpringBoot Reactor响应式编程实战二 Redis Lettuce
  6. 《统计学》第八版贾俊平第三章课后习题及答案总结
  7. HTML中怎么点击超链接让新页面在另一个窗口打开?
  8. PhotoShop 之钢笔工具
  9. html标签各属性之间用空格隔开对吗,03-HTML标签(二)
  10. CVPR2021 | CVPR2021最全整理,CVPR2021下载链接,CVPR2021全部论文代码
  11. JAVA进阶—注解,对象克隆,设计模式
  12. 信息系统项目管理师学习笔记5——信息化与信息系统5
  13. 蓝牙BR/EDR和Bluetooth Smart的十大重要区别
  14. 已经有几百个制造企业的痛点问题在这了,你的在哪?
  15. 为什么说裁员18000只是微软计划的一部分
  16. 企业级SaaS CRM管理系统产品拆解:纷享销客
  17. 成都计算机中心起名,成都给宝宝起名字的地方
  18. 精诚EAS-WMS条码化仓库物流软件
  19. 2018洛谷8月月赛第一题_U28036 Nagisa loves Tomoya
  20. android批量添加联系人,Android实现批量添加联系人到通讯录

热门文章

  1. 90% 的企业偏爱!你需要摆脱 Windows 系统思维
  2. MapXtreme开发(一)
  3. 毕业设计-基于微信小程序的用药咨询系统
  4. 海康网络摄像机如何配置网络硬盘
  5. PPT(美化入门第一课)
  6. 基于python的购物比价毕设_【Python爬虫】淘宝商品比价定向爬虫
  7. 什么是威胁情报(Threat Intelligence)
  8. win10自带虚拟机好用吗_Win10自带的虚拟机功能,教你这样设置,免费让一台电脑变3台!...
  9. 我和X-Plane 11首席程序员谈API设计
  10. 埃拉托斯特尼筛法 the Sieve of Eratosthenes method