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

Posted 小胖子小胖子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python数据分析与挖掘学习笔记-交通路标自动识别实战与神经网络算法相关的知识,希望对你有一定的参考价值。

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

交通路标的自动识别其实就是一个分类问题。对于分类问题,我们有很多的方法来实现,比如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 img
import os


def 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 += 1
cutimg("XX\\\\data\\\\交通路标\\\\timg.jpg","XX\\\\data\\\\交通路标\\\\sub\\\\", 4, 6)

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

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

得到的交通图标结果为:


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

# 先将所有图片转为固定宽高,比如93*94,然后再转为文本
# pillow
from PIL import Image

def 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 pda
def 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 Sequential
from keras.layers.core import Dense,Activation
model = Sequential()
# 输入层
model.add(Dense(10, input_dim=len(x2[0])))
model.add(Activation("relu"))
# 输出层
model.add(Dense(1,input_dim=3))
# 模型的编译categorical_crossentropy
model.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数据分析与挖掘学习笔记-交通路标自动识别实战与神经网络算法的主要内容,如果未能解决你的问题,请参考以下文章

交通标志识别基于matlab HOG特征机器学习交通标识识别含Matlab源码 2200期

python数据分析与挖掘学习笔记-电商网站数据分析及商品自动推荐实战与关联规则算法

python数据分析与挖掘学习笔记-电商网站数据分析及商品自动推荐实战与关联规则算法

python数据分析与挖掘学习笔记-垃圾邮件自动识别

BI产品学习笔记

基于Matlab的交通指示路标识别