python数据分析与挖掘学习笔记(7)-交通路标自动识别实战与神经网络算法

来源:互联网 发布:websphere mac 编辑:程序博客网 时间:2024/04/28 18:19

这一节主要涉及神经网络算法,由此展开交通路标自动识别的应用。

交通路标的自动识别其实就是一个分类问题。对于分类问题,我们有很多的方法来实现,比如KNN,贝叶斯等。关键点在于图片转文本。本节采用人工神经网络算法来进行识别。

人工神经网络(Artificial Neural Network)是简称神经网络(NN),是基于生物学中神经网络的基本原理,在理解和抽象了人脑结构和外界刺激响应机制后,以网络拓扑知识为理论基础,模拟人脑的神经系统对复杂信息的处理机制的一种数学模型。

其结构为:

                         

对于一系列输入变量(信号)x1,x2,...xn,每一个变量具有一个权重,求和之后通过激活函数f得到一个输出的反馈。常见的激活函数有:

Relu,Sigmoid函数等。常见的神经网络算法包含BP神经网络,LM神经网络,FNN神经网络。这一节涉及的是BP神经网络。突然想起我本科毕设也是用的BP,这应该算是最基础的易理解的一种神经网络。

其结构为:


其分为输入层,隐含层和输出层。输入层交叉连接到隐含层,是按误差逆传播算法训练的多层前馈网络,得到误差后反向调整各个点的权重,直到最后的误差值在可接受范围内(小于设置的阈值)。

BP神经网络的实现是使用python的keras模块。该模块在深度学习中应用也非常广。

首先路标的数据是一张含有许多个路标的图片,


首先需要对这些图片进行切割成单个图标,可以使用python下面的PIL模块来实现。

from os import listdir# 1、图片转文本# 图片处理# 切割图片from PIL import Image as imgimport osdef cutimg(path1, path2, x, y):    thisimg = img.open(path1)    width, height = thisimg.size    xsize = height//x    ysize = width//y    print(xsize)    print(ysize)    # if(xsize > width or ysize > height):    #    raise SizeError("切割大小大于原图大小")    n = 0    for i in range(0, x):        for j in range(0, y):            cutvalue = (j*xsize, i*ysize, (j+1)*xsize, (i+1)*ysize) # 表示切割的起始点和终点像素            thiscut = thisimg.crop(cutvalue)            thiscut.convert('1').save(path2+str(n)+".jpg")            print("正在处理第"+str(n)+"张图片")            n += 1cutimg("XX\\data\\交通路标\\timg.jpg","XX\\data\\交通路标\\sub\\", 4, 6)

path2将最后得到的图片放到sub文件夹路径下。注意这里一开始切割出来是黄色的图标,这里我们想要灰色的,因此在代码中使用
thiscut.convert('1')

转换成黑白。切割图片用到的函数是crop().

得到的交通图标结果为:


下面一步是将图片转化为文本,将黑色像素写为1,白色的像素点写为0,这样生成图片的文本矩阵。

# 先将所有图片转为固定宽高,比如93*94,然后再转为文本# pillowfrom PIL import Imagedef img2txt(ipath, opath):    im = Image.open(ipath)    fh = open(opath, "a")    width = im.size[0]    height = im.size[1]    for i in range(0, width):        for j in range(0, height):            cl = im.getpixel((i, j))            #  print(cl)            #clall=cl[0]+cl[1]+cl[2]            if(cl == 255):                # 黑色                fh.write("1")            else:                fh.write("0")        fh.write("\n")    fh.close()#img2txt("D:\\data\\交通路标\\1.jpg","D:\\data\\交通路标\\0.txt")filelist = listdir("D:\\我的教学\\Python\\CSDN-Python数据分析\\data\\交通路标\\sub\\")for i in range(0, len(filelist)):    thisfilename = filelist[i].split(".")[0]    print(thisfilename)    img2txt("D:\\data\\交通路标\\sub\\"+thisfilename+".jpg","D:\\data\\交通路标\\doc\\"+thisfilename+".txt")


这样就得到我们的交通图标的文本。

下面就来实现BP神经网络。

实现步骤为:

1、读取数据
2、keras.models Sequential /keras.layers.core Dense Activation
3、Sequential建立模型
4、Dense建立层
5、Activation激活函数
6、compile模型编译
7、fit训练(学习)
8、验证(测试,分类预测)

下面是实现的代码:

# 使用人工神经网络识别路标# 加载数据import pandas as pdadef datatoarray(fname):    arr = []    fh = open(fname)    for i in range(0, 93):        thisline = fh.readline()        for j in range(0, 94):            arr.append(int(thisline[j]))    return arr# 数据的读取与整理x = []y = []filelist = listdir("D:\\我的教学\\Python\\CSDN-Python数据分析\\data\\交通路标\\sub\\")for i in range(0, len(filelist)):    thisfilename = filelist[i].split(".")[0]    thisdata = datatoarray("D:\\我的教学\\Python\\CSDN-Python数据分析\\data\\交通路标\\doc\\"+thisfilename+".txt")    x.append(thisdata)    y.append(thisfilename)print("数据读取成功")# 数据预处理xf = pda.DataFrame(x)yf = pda.DataFrame(y)x2 = xf.as_matrix().astype(int)y2 = yf.as_matrix().astype(int)# 使用人工神经网络模型from keras.models import Sequentialfrom keras.layers.core import Dense,Activationmodel = Sequential()# 输入层model.add(Dense(10, input_dim=len(x2[0])))model.add(Activation("relu"))# 输出层model.add(Dense(1,input_dim=3))# 模型的编译categorical_crossentropymodel.compile(loss="mean_squared_error", optimizer="adam")# 训练model.fit(x2, y2, nb_epoch=1000, batch_size=6)# 预测分类# 实现预测路标rst = model.predict_classes(x2[0:7, :])

首先写了一个函数将数据转化为数组来加载,之后对数据进行读取和整理(注:我们得到的最后每一张图片的大小为93x94.)。x相当于特征,y相当于类别,其实就是文件名的前缀。listdir模块可以自动加载文件夹下面的所有文件。

对数据的预处理,先转化成数据框,再转化成整型矩阵。

这里使用Dense来建立层,这里建立的层数可以自己设置,input_dim这个不能随便设置,必须与我们输入的特征数目一致,否则会出错。输出层的层数为1,损失函数设置为mean_squared_error。optimizer是设置求解方法。nb_epoch是训练次数,这里设为1000,batch_size是批大小,这个数目的设置尽量不要太大。

最后再来思考一些问题:

1. 如何实现多种类别预测?
可以使用数据标准化来实现多类别预测, 也可以设置输出层为多层来实现多类别预测
2. 如果使用数据标准化,应该怎么实现?
有多种数据标准化方法,比如Min-Max方法:新数据=(原数据-极小值)/(极大值-极小值),z-score标准化:新数据=(原数据-均值)/标准差,Decimal scaling等
3. batch_size定为多少是有技巧的,请研究一下该技巧,并简单描述一下?
可以设置为5,6,8,9等,不要过大
4. 总结一下常见的激活函数与loss(损失)函数
常见的激活函数:Relu,Leaky Relu, PRelu, Randomized Leaky ReLu, Sigmoid,tanh,Maxout,
常见的损失函数:0-1损失函数,Log损失函数,Hinge损失函数,指数损失,感知损失。


1 0
原创粉丝点击