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损失函数,指数损失,感知损失。
- python数据分析与挖掘学习笔记(7)-交通路标自动识别实战与神经网络算法
- python数据分析与挖掘学习笔记(4)-垃圾邮件自动识别
- 笔记《Python数据分析与实战挖掘》
- 《Python数据分析与挖掘实战》上机实验1—电力窃漏电用户自动识别
- python数据分析与挖掘学习笔记(6)-电商网站数据分析及商品自动推荐实战与关联规则算法
- python数据分析与挖掘学习笔记(6)-电商网站数据分析及商品自动推荐实战与关联规则算法
- 《Python数据分析与挖掘实战》笔记(一):数据挖掘基础
- 《Python数据分析与挖掘实战》笔记(二):Python2.7语法和第三方库
- 《python数据分析与挖掘实战》笔记-3.1代码问题
- 《python数据分析与挖掘实战》笔记-3.1代码问题
- python数据分析与挖掘实战-4
- python 数据分析与挖掘实战
- Python数据分析与实战挖掘
- python数据分析与挖掘学习笔记(5)-公司客户价值判断分析与聚类算法
- Python数据分析与挖掘实战(数据预处理)
- 《Python数据分析与挖掘实战》笔记(三):数据探索
- 《Python数据分析与挖掘实战》笔记(四):数据预处理
- 《Python数据分析与挖掘实战》笔记(五):数据建模
- hdoj 2033
- Python中的map(),reduce(),filter(),sorted()函数知识点总结
- Direct3D---模板测试之镜面特效
- CentOS 6.8上升级MySQL到5.7版本
- recyclerView-自定义itemDecoration详解
- python数据分析与挖掘学习笔记(7)-交通路标自动识别实战与神经网络算法
- 大O记法
- 关于在spring依赖注入的类中使用测试类解决办法
- java克隆类
- VSCode编译调试C/C++
- mysql 查询汉字的全拼音以及查询各个汉字的拼音首字母
- 2016年12月智能手机分析报告
- 一行代码搞定android应用升级——EasyAndroidUpgrade
- 蓝桥杯的训练-表达式计算