Python 建立用于光学字符识别的神经网络模块详解

本章介绍以下主题:

OCR 系统用于将文本图像转换为字母、单词和句子。它被广泛应用于各个领域,用于转换/提取图像中的信息。它还用于签名识别、自动数据评估和安全系统。它在商业上用于验证数据记录、护照文档、发票、银行对账单、计算机化收据、名片、静态数据打印输出等。OCR 是模式识别、人工智能和计算机视觉的一个研究领域。

光学字符可视化是一种常用的打印文本数字化方法,因此这些文本可以通过电子方式编辑、搜索、存储和在线显示。目前,它们被广泛应用于认知计算、机器翻译、文语转换、文本挖掘等领域。

  1. 导入以下包:
import os 
import sys 
import cv2 
import numpy as np 
  1. 加载输入数据:
in_file = 'words.data'  
  1. 定义可视化参数:
scale_factor = 10 
s_index = 6 
e_index = -1 
h, w = 16, 8 
  1. 循环直到遇到Esc键:
with open(in_file, 'r') as f: 
  for line in f.readlines(): 
    information = np.array([255*float(x) for x in line.split('t')[s_index:e_index]]) 
    image = np.reshape(information, (h,w)) 
    image_scaled = cv2.resize(image, None, fx=scale_factor, fy=scale_factor) 
    cv2.imshow('Image', image_scaled) 
    a = cv2.waitKey() 
    if a == 10: 
      break 
  1. 键入python visualize_character.py执行代码:

  1. 执行visualize_character.py时得到的结果如下所示:

本节介绍了基于神经网络的光学字符识别方案。

  1. 导入以下包:
import numpy as np 
import neurolab as nl 
  1. 读取输入文件:
in_file = 'words.data'
  1. 考虑 20 个数据点来构建基于神经网络的系统:
# Number of datapoints to load from the input file 
num_of_datapoints = 20
  1. 表示不同的字符:
original_labels = 'omandig' 
# Number of distinct characters 
num_of_charect = len(original_labels) 
  1. 将 90%的数据用于训练神经网络,剩余的 10%用于测试:
train_param = int(0.9 * num_of_datapoints) 
test_param = num_of_datapoints - train_param 
  1. 定义数据集提取参数:
s_index = 6 
e_index = -1 
  1. 构建数据集:
information = [] 
labels = [] 
with open(in_file, 'r') as f: 
  for line in f.readlines(): 
    # Split the line tabwise 
    list_of_values = line.split('t') 
  1. 执行错误检查以确认字符:
    if list_of_values[1] not in original_labels: 
      continue 
  1. 提取标签并将其附加到主列表:
    label = np.zeros((num_of_charect , 1)) 
    label[original_labels.index(list_of_values[1])] = 1 
    labels.append(label)
  1. 提取字符并将其添加到主列表:
    extract_char = np.array([float(x) for x in     list_of_values[s_index:e_index]]) 
    information.append(extract_char)
  1. 加载所需的数据集后退出循环:
    if len(information) >= num_of_datapoints: 
      break 
  1. 将信息和标签转换为 NumPy 数组:
information = np.array(information) 
labels = np.array(labels).reshape(num_of_datapoints, num_of_charect) 
  1. 提取维度数:
num_dimension = len(information[0]) 
  1. 创建并训练神经网络:
neural_net = nl.net.newff([[0, 1] for _ in range(len(information[0]))], [128, 16, num_of_charect]) 
neural_net.trainf = nl.train.train_gd 
error = neural_net.train(information[:train_param,:], labels[:train_param,:], epochs=10000, show=100, goal=0.01) 
  1. 预测测试输入的输出:
p_output = neural_net.sim(information[train_param:, :]) 
print "nTesting on unknown data:" 
  for i in range(test_param): 
    print "nOriginal:", original_labels[np.argmax(labels[i])] 
    print "Predicted:", original_labels[np.argmax(p_output[i])]
  1. 执行optical_character_recognition.py时得到的结果如下图所示:

构建了一个支持神经网络的光学字符识别系统,用于从图像中提取文本。这个过程包括训练神经网络系统,使用字符数据集进行测试和验证。

读者可以参考文章基于神经网络的光学字符识别系统,了解 OCR 背后的基本原理:http://ieeexplore.ieee.org/document/6419976/

请参阅以下资料:

OCR 系统广泛用于从图像中转换/提取文本(字母和数字)。OCR 系统广泛用于验证业务文档、自动车牌识别以及从文档中提取关键字符。它还用于使打印文档的电子图像可搜索,并为盲人和视力受损用户建立辅助技术。

教程来源于Github,感谢apachecn大佬的无私奉献,致敬!

技术教程推荐

玩转Git三剑客 -〔苏玲〕

Netty源码剖析与实战 -〔傅健〕

人人都能学会的编程入门课 -〔胡光〕

罗剑锋的C++实战笔记 -〔罗剑锋〕

Redis核心技术与实战 -〔蒋德钧〕

如何落地业务建模 -〔徐昊〕

eBPF核心技术与实战 -〔倪朋飞〕

结构执行力 -〔李忠秋〕

结构会议力 -〔李忠秋〕