【深度学习】简单地利用keras做车标识别

一次简简单单的实验课的内容而已。

首先把给出的样本素材放缩的32*32的大小,这部分可以用Python的批处理和opencv中的放缩函数resize()来做,在此我就不列出代码了。

列举出一部分放缩好的图片。

然后在利用keras简历卷积神经网络的模型,在做此实验之前,电脑要配置好Python+Theano+Keras的环境。

#生成一个model
def __CNN__(testdata,testlabel,traindata,trainlabel):
    model = Sequential()

    #第一个卷积层,4个卷积核,每个卷积核大小5*5。1表示输入的图片的通道,灰度图为1通道。
    model.add(Convolution2D(20 , 5 , 5, border_mode='valid',input_shape=(1,32,32)))
    model.add(Activation('sigmoid'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    #第二个卷积层,30个卷积核,每个卷积核大小5*5。
    #采用maxpooling,poolsize为(2,2)
    model.add(Convolution2D(30 , 5 , 5, border_mode='valid'))
    model.add(Activation('sigmoid'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    #第三个卷积层,16个卷积核,每个卷积核大小3*3
    #激活函数用tanh
    #采用maxpooling,poolsize为(2,2)
    #model.add(Convolution2D(16 , 3 , 3, border_mode='valid'))
    #model.add(Activation('tanh'))
    #model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Flatten())
    model.add(Dense(500, init='normal'))
    model.add(Activation('sigmoid'))

    #Softmax分类,输出是4类别
    model.add(Dense(4, init='normal'))
    model.add(Activation('softmax'))

CNN调整参数是一个很麻烦的事情,上面各个层的参数和层数是我参考LENET-5然后自己调试出来的。我本来我没打算用keras做这个,是在caffe上做的,经过多次调整卷积核大小,模型层数,输出神经元个数等等。最后在caffe上跑出来的结果是98%也还不错。在keras上的效果更加理想。

Keras做卷积神经网络的另一个部分就是如何把图片样本变成合格的样本供其训练,具体说来就是分为两个列XY,其中X列是一个四维数组X(x1,x2,x3,x4).x1表示的是样本的数目;x2,表示图片的通道值,是RGB还是灰度图;x3,x4表示图片像素点的矩阵,一般为统一大小(这就是前面为什么要划分成32*32的原因,开心的话划分成64*64也行)。

Y列标记的就是和X列对应的图片的标记。划分的函数代码如下:

#统计样本的数目
def __getnum__(path):
    fm=os.listdir(path)
    i=0
    for f in fm:
        ff= os.listdir(path+f+'/')
        for n in ff:
            i+=1
    return i      

#生成X,Y列
def __data_label__(path,count):
    data = np.empty((count,1,32,32),dtype="float32")
    label = np.empty((count,),dtype="uint8")
    i=0;
    filename= os.listdir(path)
    for ff in filename :
        fi=os.listdir(path+ff+'/')
        for f in fi:
            img = cv2.imread(path+ff+'/'+f,0)
            arr = np.asarray(img,dtype="float32")
            data[i,:,:,:] = arr
            label[i]=int(ff)
            i+=1
    return data,label

代码写好,各个参数调整好以后,在虚拟机或者直接调用终端运行程序,便可以得到训练的结果的啦。

(依我看,就速度方面而言,keras远胜于caffe。准确率也挺高的。我在cafe上调了无数的参数最后准确率也就98%最多了,然而相同的模型放在keras下就只错几个或者根本不错。究其原因,我还不知道,还要继续努力学习呀QAQ)

下面是这次实验的源代码:

# coding=utf-8
import cv2
import os
import numpy as np

#导入各种用到的模块组件
#from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.advanced_activations import PReLU
from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D
from keras.optimizers import SGD, Adadelta, Adagrad
from keras.utils import np_utils, generic_utils
import numpy as np
from PIL import Image
from keras import backend as k

#统计样本的数目
def __getnum__(path):
    fm=os.listdir(path)
    i=0
    for f in fm:
        ff= os.listdir(path+f+'/')
        for n in ff:
            i+=1
    return i      

#生成X,Y列
def __data_label__(path,count):
    data = np.empty((count,1,32,32),dtype="float32")
    label = np.empty((count,),dtype="uint8")
    i=0;
    filename= os.listdir(path)
    for ff in filename :
        fi=os.listdir(path+ff+'/')
        for f in fi:
            img = cv2.imread(path+ff+'/'+f,0)
            arr = np.asarray(img,dtype="float32")
            data[i,:,:,:] = arr
            label[i]=int(ff)
            i+=1
    return data,label

###############
#开始建立CNN模型
###############

#生成一个model
def __CNN__(testdata,testlabel,traindata,trainlabel):
    model = Sequential()

    #第一个卷积层,4个卷积核,每个卷积核大小5*5。1表示输入的图片的通道,灰度图为1通道。
    model.add(Convolution2D(20 , 5 , 5, border_mode='valid',input_shape=(1,32,32)))
    model.add(Activation('sigmoid'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    #第二个卷积层,30个卷积核,每个卷积核大小5*5。
    #采用maxpooling,poolsize为(2,2)
    model.add(Convolution2D(30 , 5 , 5, border_mode='valid'))
    model.add(Activation('sigmoid'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    #第三个卷积层,16个卷积核,每个卷积核大小3*3
    #激活函数用tanh
    #采用maxpooling,poolsize为(2,2)
    #model.add(Convolution2D(16 , 3 , 3, border_mode='valid'))
    #model.add(Activation('tanh'))
    #model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Flatten())
    model.add(Dense(500, init='normal'))
    model.add(Activation('sigmoid'))

    #Softmax分类,输出是4类别
    model.add(Dense(4, init='normal'))
    model.add(Activation('softmax'))

    #############
    #开始训练模型
    ##############
    #使用SGD + momentum冲量
    sgd = SGD(lr=0.05, decay=1e-6, momentum=0.9, nesterov=True)
    #model.compile里的参数loss就是损失函数(目标函数)
    model.compile(loss='binary_crossentropy', optimizer=sgd,metrics=['accuracy'])
    #开始训练, show_accuracy在每次迭代后显示正确率 。  batch_size是每次带入训练的样本数目 , nb_epoch 是迭代次数,  shuffle 是打乱样本随机。
    model.fit(traindata, trainlabel, batch_size=16,nb_epoch=15,shuffle=True,verbose=1,show_accuracy=True,validation_data=(testdata, testlabel))
    #设置测试评估参数,用测试集样本
    model.evaluate(testdata, testlabel, batch_size=16,verbose=1,show_accuracy=True)

############
#主模块
############
trainpath = '/home/emmons/carband_resize/train/'
testpath = '/home/emmons/carband_resize/test/'
testcount=__getnum__(testpath)
traincount=__getnum__(trainpath)
testdata,testlabel= __data_label__(testpath, testcount)
traindata,trainlabel= __data_label__(trainpath, traincount)

#label为0~3共4个类别,keras要求格式为binary class matrices,转化一下,直接调用keras提供的这个函数
testlabel = np_utils.to_categorical(testlabel, 4)
trainlabel = np_utils.to_categorical(trainlabel, 4)

__CNN__(testdata, testlabel, traindata, trainlabel)
时间: 2024-10-05 16:54:24

【深度学习】简单地利用keras做车标识别的相关文章

[深度学习工具]·极简安装Dlib人脸识别库

[深度学习工具]·极简安装Dlib人脸识别库 Dlib介绍 Dlib是一个现代化的C ++工具箱,其中包含用于在C ++中创建复杂软件以解决实际问题的机器学习算法和工具.它广泛应用于工业界和学术界,包括机器人,嵌入式设备,移动电话和大型高性能计算环境.Dlib的开源许可证 允许您在任何应用程序中免费使用它.Dlib有很长的时间,包含很多模块,近几年作者主要关注在机器学习.深度学习.图像处理等模块的开发. 安装 此博文针对Windows10安装,其他平台可以仿照这个步骤来安装 安装Minicond

深度学习简单知识

卷积神经网络 http://blog.csdn.net/u010555688/article/details/24848367 https://www.toutiao.com/i6479655961521816078/ http://blog.csdn.net/u010555688/article/details/24848367 循环神经网络 https://www.toutiao.com/i6482640110192951821/ 长短时记忆网络 https://www.toutiao.co

Python还真当是无所不能!利用Python做指纹识别播报!闻所未闻!

一.实验器材 1.TPYBoard v 102开发板 1块 2.指纹识别模块 1块 3.语音播报模块 1块 私信小编01-04均可获得PDF呢!希望你早点入门! 二.AS608光学指纹识别模块 指纹模块为集成了光路和指纹处理部分的一体化指纹处理模块,具有体积小.功耗低.接口简单的特点,可靠性高.识别速度快.干湿手指适应性好,指纹搜索速度快.通讯接口为USB和UART两种通信接口. 四.硬件接线图 下面带大家先把指纹模块和语音播报模块接起来,接线方法很简单,大家可以按照下面的接线方式将硬件连接起来

学习参考+《深度学习基于Keras的Python实践》PDF+ 源代码+魏贞原

深度学习学习框架有tensorflow.pytorch.keras.学习keras时,推荐<深度学习:基于Keras的Python实践>,适合深度学习入门和实践. 尤其是第三部分,利用卷积神经网络解决情感分析问题比较好. <深度学习:基于Keras的Python实践>系统讲解了深度学习的基本知识,以及使用深度学习解决实际问题,详细介绍了如何构建及优化模型,并针对不同的问题给出不同的解决方案,通过不同的例子展示了在具体项目中的应用和实践经验. 推荐参考:<深度学习:基于Kera

对比《Keras图像深度学习实战》PDF+《深度学习技术图像处理入门》PDF代码分析

将深度学习技术应用于图像处理,推荐阅读<深度学习技术图像处理入门>,基于理论讲解,由浅入深地引出若干个经典案例,讲解当前深度神经网络在图像处理领域的应用.提供了基于云GPU容器(Docker)的完整在线开发环境,方便初学者直接学习核心代码. <深度学习技术图像处理入门>以通俗易懂的语言简要讲解机器学习的核心概念,通过比较传统机器学习和深度神经网络的区别,引入深度神经网络的应用领域,将一个完整的深度神经网络的复杂结构拆成输入处理.模型元件以及模型优化三个子块,并详细说明如何将深度神经

利用keras搭建CNN进行mnist数据集分类

当接触深度学习算法的时候,大家都很想自己亲自实践一下这个算法,但是一想到那些复杂的程序,又感觉心里面很累啊,又要学诸如tensorflow.theano这些框架.那么,有没有什么好东西能够帮助我们快速搭建这个算法呢?当然是有咯!,现如今真不缺少造轮子的大神,so,我强烈向大家推荐keras,Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow或Theano.Keras为支持快速实验而生,能够把你的idea迅速转换为结果. 具体keras的安装与使用,请参

《卷积神经网络的Python实现》PDF代码+《解析深度学习卷积神经网络原理与视觉实践》PDF分析

CNN正在革新几个应用领域,如视觉识别系统.自动驾驶汽车.医学发现.创新电子商务等.需要在专业项目或个人方案中利用复杂的图像和视频数据集来实现先进.有效和高效的CNN模型. 深度卷积网络DCNN是目前十分流行的深度神经网络架构,它的构造清晰直观,效果引人入胜,在图像.视频.语音.语言领域都有广泛应用. 深度学习,特别是深度卷积神经网络是人工智能的重要分支领域,卷积神经网络技术也被广泛应用于各种现实场景,在许多问题上都取得了超越人类智能的结果. <卷积神经网络的Python实现>作为深度学习领域

深度学习在图像识别中的研究进展与展望

深度学习在图像识别中的研究进展与展望 深度学习是近十年来人工智能领域取得的最重要的突破之一.它在语音识别.自然语言处理.计算机视觉.图像与视频分析.多媒体等诸多领域都取得了巨大成功.本文将重点介绍深度学习在物体识别.物体检测.视频分析的最新研究进展,并探讨其发展趋势. 1.深度学习发展历史的回顾 现在的深度学习模型属于神经网络.神经网络的历史可以追溯到上世纪四十年代,曾经在八九十年代流行.神经网络试图通过大脑认知的机理,解决各种机器学习的问题.1986年Rumelhart.Hinton和Will

图像识别中的深度学习 转

转:http://mp.weixin.qq.com/s?__biz=MzAwNDExMTQwNQ==&mid=209152042&idx=1&sn=fa0053e66cad3d2f7b107479014d4478#rd#opennewwindow 1.深度学习发展历史 深度学习是近十年来人工智能领域取得的重要突破.它在语音识别.自然语言处理.计算机视觉.图像与视频分析.多媒体等诸多领域的应用取得了巨大成功.现有的深度学习模型属于神经网络.神经网络的起源可追溯到20世纪40年代,曾经