我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python之tensorflow手把手实例讲解斑马线识别实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python之tensorflow手把手实例讲解斑马线识别实现

一,斑马线的数据集

数据集的构成:

test train
zebra corssing:56 zebra corssing:168
other:54 other:164

二,代码部分

1.导包


import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import numpy as np
import matplotlib.pyplot as plt
import keras

2.数据导入


train_dir=r'C:\Users\zx\深度学习\Zebra\train'
test_dir=r'C:\Users\zx\深度学习\Zebra\test'
train_datagen = ImageDataGenerator(rescale=1/255,
                                   rotation_range=10,  #旋转
                                   horizontal_flip=True)
train_generator = train_datagen.flow_from_directory(train_dir,
                                                    (50,50),
                                                    batch_size=1,
                                                    class_mode='binary',
                                                    shuffle=False)
test_datagen = ImageDataGenerator(rescale=1/255)
test_generator = test_datagen.flow_from_directory(test_dir,
                                                 (50,50),
                                                  batch_size=1,
                                                  class_mode='binary',
                                                  shuffle=False)

3.搭建模型

模型的建立仁者见智,可自己调节寻找更好的模型。


model = tf.keras.models.Sequential([
    # 第一层卷积,卷积核为,共16个,输入为150*150*1
    tf.keras.layers.Conv2D(16,(3,3),activation='relu',padding='same',input_shape=(50,50,3)),
    tf.keras.layers.MaxPooling2D((2,2)),
    
    # 第二层卷积,卷积核为3*3,共32个,
    tf.keras.layers.Conv2D(32,(3,3),activation='relu'),
    tf.keras.layers.MaxPooling2D((2,2)),
    
    # 第三层卷积,卷积核为3*3,共64个,
    tf.keras.layers.Conv2D(64,(3,3),activation='relu'),
    tf.keras.layers.MaxPooling2D((2,2)),
    
    # 第四层卷积,卷积核为3*3,共128个
#     tf.keras.layers.Conv2D(128,(3,3),activation='relu'),
#     tf.keras.layers.MaxPooling2D((2,2)),
    
    # 数据铺平
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(32,activation='relu'),
    tf.keras.layers.Dense(16,activation='relu'),
    tf.keras.layers.Dense(2,activation='softmax')
])
print(model.summary())
model.compile(optimize='adam',
             loss=tf.keras.losses.sparse_categorical_crossentropy,
              metrics=['acc'])

4,模型训练


history = model.fit(train_generator,
                    epochs=20,
                    verbose=1)
model.save('./Zebra.h5')

模型训练过程:

在这里插入图片描述

可以看到我们的模型在20轮的训练后acc从0.63上升到了0.96左右。

5,模型评估


model.evaluate(test_generator)

在这里插入图片描述


#可视化
plt.plot(history.history['acc'], label='accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0.7, 1])
plt.legend(loc='lower right')
plt.title('acc')
plt.show()

在这里插入图片描述

6,模型预测

虽然我们的模型在训练过程中acc一度达到0.96,但测试集才是检验模型的唯一标准,在model.evaluate(test_generator)中的评分只有0.91左右,说明我们的模型已经能以很高的正确率来完成”斑马线“与“非斑马线”的二分类问题了,但我们还是要查看具体是哪些数据没有被模型正确得识别。


pred=model.predict(test_generator) #获取test集的输出
filenames = test_generator.filenames  #获取test数据的文件名

错误输出过程:

  • 1,循环测试集长度,通过if语句先判断others还是zebra,再通过one-hot编码判断是否预测正确。
  • 2,根据labels可知others': 0, 'zebra crossing': 1,以此来判断是否预测正确。
  • 3,对 filenames[0]='others\\103.png',进行切片处理。
  • 4,找到others的‘s'或 zebra crossing的‘g',使用find()在基础上+2为正切片的起点(样本编号前有'\'符号,故+2才能正确取出编号)。
  • 5,如 :将filenames[i]的值赋给a,a[int(a.find('s')+2):]则表示为 'xx.png'。
  • 6,将取出的样本编号与路径拼接,读取后作图。
  • 7,break跳出循环。

for i in range(len(filenames)):
    if filenames[i][:6]=='others':
        if np.argmax(pred[i]) != 0:
            a=filenames[i]
            plt.figure()
            print('预测错误的图片:'+a[int(a.find('s')+2):])
            print('错误识别为"zebra crossing",正确类型是"others"')
            print('预测标签为:'+str(np.argmax(pred[i]))+',真实标签为:0')
            img = plt.imread('Zebra/test/others/'+a[int(a.find('s')+2):])
            plt.imshow(img)
            plt.title(a[int(a.find('s')+2):])
            plt.grid(False)
            break
    if filenames[i][:6]=='zebra ':
        if np.argmax(pred[i]) != 1:
            b= filenames[i]
            plt.figure()
            print('预测错误的图片:'+b[int(b.find('g')+2):])
            print('错误识别为"others",正确类型是"zebra crossing"')
            print('预测标签为:'+str(np.argmax(pred[i]))+',真实标签为:1')
            img = plt.imread('Zebra/test/zebra crossing/'+b[int(b.find('g')+2):])
            plt.imshow(img)
            plt.title(b[int(b.find('g')+2):])
            plt.grid(False)
            break

在这里插入图片描述

看到这个错误样本,我猜想可能是因为斑马线的部分只占了图像的一半左右,所以预测错误了。

这里是我做预测判断的思路,本可以不这么复杂的可以用test_generator.labels来获取数据的标签,再做判断。


test_generator.labels

在这里插入图片描述

上面只输出了第一个错误的样本,所以接下来我们要看所有错误预测的样本


sum=0
for i in range(len(filenames)):
    if filenames[i][:6]=='others':
        if np.argmax(pred[i]) != 0:
            a=filenames[i]
            print('预测错误的图片:'+a[int(a.find('s')+2):]+',错误识别为"zebra crossing",正确类型是"others"')
            sum=sum+1
    if filenames[i][:6]=='zebra ':
        if np.argmax(pred[i]) != 1:
            b= filenames[i]
            print('预测错误的图片:'+b[int(b.find('g')+2):]+',错误识别为"others",正确类型是"zebra crossing"')
            sum=sum+1
print('错误率:'+str(sum/100)+'%')
print('正确率:'+str((10000-sum)/100)+'%')

在这里插入图片描述

三,分析

在构建模型时我尝试在最后一层只用一个神经元,用sigmoid激活函数,其他参数不变,在同样epochs=20的条件,也能很快收敛,达到很高的acc,测试集的评分也能在0.9左右,但是在最后输出全部错误样本的时候发现错误的样本远超过softmax,可能其中有些参数我没有根据sigmoid来调整,所以会有如此高的错误率,欢迎在评论区讨论。

到此这篇关于python之tensorflow手把手实例讲解斑马线识别实现的文章就介绍到这了,更多相关python tensorflow 斑马线识别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python之tensorflow手把手实例讲解斑马线识别实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录