如何用Python搭建神经网络并识别书籍号码
一些前言以及感想
首先要先搭建神经网络,然后用数据集进行训练(其实就是用数字的图片集进行训练),这个地方有一个很大的坑,因为书号(或者车牌)都是印刷体,其实字体是比较规矩的,所以起初笔者用了MINST手写体数据集进行训练(字体很不规范),想法就是“不规范”的都能认出来,规范的一定也能识别出来,但问题出来了,用MINST数据集训练后,识别结果一塌糊涂,驴唇不对马嘴。上网查了一下发现神经网络对这些东西似乎很敏感(也可以说它很笨,非常非常笨),“喂一口吃一口”,没见过的东西是绝对不会的。
训练完网络后,接下来就是对书籍的ISBN号照片进行处理(要识别ISBN总要把ISBN提取出来,去掉后面的条形码),方法也很简单,只要对照片进行简单的二值化,然后对像素进行扫描就可以(方法比较简单,因为要处理的图片比较简单),获得ISBN后将每个数字提取出来放进神将网络里面去识别就OK了。好了 话不多说,直接上代码。
import numpy
import scipy.special
import matplotlib.pyplot
import cv2
import os
#搭建神经网络
class neuralNetwork:
def __init__(self,Inodes,Hnodes,Onodes,Lrate): #初始化函数
self.inodes=Inodes
self.hnodes=Hnodes
self.onodes=Onodes
self.L=Lrate
self.activation_function=lambda x:scipy.special.expit(x) #使用lambda匿名函数,x为参数
self.wih = numpy.random.rand(self.hnodes, self.inodes) - 0.5 # 输入层与隐含层连接权
#print(self.wih)
self.who = numpy.random.rand(self.onodes, self.hnodes) - 0.5 # 输出层与隐含层连接权
#print(self.who)
def train(self,inputs_list,targets_list): #训练函数
inputs=numpy.array(inputs_list,ndmin=2).T
targets=numpy.array(targets_list,ndmin=2).T
hidden_inputs=numpy.dot(self.wih,inputs)
hidden_outputs=self.activation_function(hidden_inputs)
final_inputs = numpy.dot(self.who, hidden_outputs)
final_outputs = self.activation_function(final_inputs)
output_errors=targets-final_outputs
hidden_errors=numpy.dot(self.who.T,output_errors)
# 更新隐层和输出层权重
self.who+=self.L*numpy.dot((output_errors*final_outputs*(1.0-final_outputs)),numpy.transpose(hidden_outputs))
#更新输入层与隐层之间权重
self.wih += self.L * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)),
numpy.transpose(inputs))
def query(self,input_list): #查询函数
inputs=numpy.array(input_list,ndmin=2).T #convert inputs list to ad arr