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

这篇学习笔记介绍了如何使用神经网络算法,特别是BP神经网络,进行交通路标的自动识别。首先,将图像切割成单个图标,然后利用Python的Keras模块构建和训练模型,最终实现分类预测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

```code
    thiscut.convert('1')
[/code]

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

得到的交通图标结果为:

![](https://img-blog.csdn.net/20170210154321043)  

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

```code
    # 先将所有图片转为固定宽高,比如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, :])
[/code]

  

首先写了一个函数将数据转化为数组来加载,之后对数据进行读取和整理(注:我们得到的最后每一张图片的大小为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损失函数,指数损失,感知损失。

  


![在这里插入图片描述](https://img-blog.csdnimg.cn/20210608151750993.gif)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值