天天看點

Python-基于卷積神經網絡斑馬線識别分類,準确率高達99%

Python-基于卷積神經網絡斑馬線識别分類,準确率高達99%

引言

目前智慧城市的發展,人們生活處處有科技,比如人臉識别,智慧交通,無人駕駛等前沿的科技産品也都融入了人們生活中;

智慧交通的發展也越來越成熟,車輛識别,車輛跟蹤,車輛分析,行人跟蹤檢測與行為分析,這些都越來越成熟,但是都是建立在斑馬線的基礎上來實作的。

智慧斑馬線,嚴格地說,是用于(單條或區域多條)人行橫道(斑馬線)上,人、車、路、環境協同的一整套軟硬體産品與服務,主要通過提高斑馬線标線的清晰度和醒目度,以及智能網聯控制,實作智能的斑馬線通行的警示、排程、控制、多點關聯。

智慧斑馬線首先是斑馬線。斑馬線是一條線,對行人來說是保護道路通行安全的生命線;對城市交通管理來說,是對人、車、路進行協同工作的一條協同線,隻有人和車、路都是按規則有秩序地協同,才能達到交通文明有序。智慧斑馬線就是以技術為出發點,幫助行人和城市交管做到斑馬線生命線和協同線的一種智能産品和服務。

神經網絡的結構

神經網絡模型包含三個部分:input layer(輸入層)、hidden layer(中間層或隐藏層)、output layer(輸出層)。其中,hidden layer的層數不固定,在某些簡單問題中,hidden layer的層數可能為0,僅有input layer和output layer;在複雜問題中,hidden layer的層數也可能成百上千。

Python-基于卷積神經網絡斑馬線識别分類,準确率高達99%

模型中每一層的節點稱為“神經元”。位于input layer的神經元對應着訓練資料的特征。hidden layer和output layer中的神經元由activation function(激活函數)表達,我們用字母 g ​ g​ g​表示。Activation function有很多種類型,最常用是sigmoid函數,它的表達式如下:

Python-基于卷積神經網絡斑馬線識别分類,準确率高達99%

sigmoid函數圖像如下圖所示。當 x > > 0 ​ x>>0​ x>>0​時, f ( x ) ​ f(x)​ f(x)​無限逼近于1;當 x < < 0 ​ x<<0​ x<<0​時, f ( x ) ​ f(x)​ f(x)​無限逼近于0;當 x = 0 ​ x=0​ x=0​時, f ( x ) = 0.5 ​ f(x)=0.5​ f(x)=0.5​。

搭模組化型

一、引入基本庫

環境配置:

  • Windows10系統
  • Python–3.7.3
  • tensorflow–2.3
  • OpenCV–4.5.1
import tensorflow as tf
import matplotlib.pyplot as plt
import cv2 as cv
import pandas as pd
import numpy as np
import os
import shutil
from keras.models import Sequential, load_model
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
           

Conv2D :卷積

MaxPooling2D: 最大池化

Flatten: 從卷積層到全連接配接層的過渡(卷積),扁平資料

Dense: 全連接配接

二、資料集準備
Python-基于卷積神經網絡斑馬線識别分類,準确率高達99%
Python-基于卷積神經網絡斑馬線識别分類,準确率高達99%

資料集來源:斑馬線資料集

在這裡我們使用Keras自帶的圖像生成器

ImageDataGenerator

,在這裡下載下傳下來的資料集并不需要我們去處理,我們隻需要下載下傳,解壓就行;

Python-基于卷積神經網絡斑馬線識别分類,準确率高達99%

ImageDataGenerator圖像生成器他會根據train和test的子檔案資訊來給予标簽;

Python-基于卷積神經網絡斑馬線識别分類,準确率高達99%
#簡單的二分類
train_dir = 'G:\\深度學習\\Zebra\\Zebra\\train'#訓練集檔案
val_dir = 'G:\\深度學習\\Zebra\\Zebra\\test'  #驗證集檔案
train_datagen = ImageDataGenerator(rescale=1/255)
train_generator = train_datagen.flow_from_directory(train_dir, (50, 50), batch_size=20, class_mode='binary', shuffle=True)
validation_datagen = ImageDataGenerator(rescale=1/255)
validation_generator = validation_datagen.flow_from_directory(val_dir, (50, 50), batch_size=20, class_mode='binary')
           
三、模型搭建

在這裡我們使用的是sigmoid函數作為輸出層的激活函數,二分類

model = Sequential()
model.add(Conv2D(32, (3, 3),activation='relu', input_shape=(50, 50, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.summary()
           
四、模型訓練
model.compile(loss='binary_crossentropy',#二分類,使用binary_crossentropy損失函數
              optimizer=optimizers.Adam(), #Adam優化器
              metrics=['acc']
             )
history = model.fit_generator(train_generator,
                              steps_per_epoch=17, 
                              epochs=25,
                              validation_data=validation_generator, 
                              validation_steps=6)

           
Python-基于卷積神經網絡斑馬線識别分類,準确率高達99%
五、總結
Python-基于卷積神經網絡斑馬線識别分類,準确率高達99%
Python-基于卷積神經網絡斑馬線識别分類,準确率高達99%

我們根據模型訓練過程當中的損失值和正确率可以看出模型的訓練集acc達到了99.7%,而驗證集達到95.45%,學習遇到了瓶頸;

train loss 不斷下降,test loss趨于不變,說明網絡過拟合;

這裡我們就需要來調整參數:

  • 改變模型,模型太大,太深,參數太多難以收斂,建議使用簡單的模型
  • 增加資料集
  • 增大batch_size
  • 添加正則
  • dropsort 減少參數

    這些方法都可以在抑制模型過拟合,但是最好的方法是改變模型和增加資料集

斑馬線源代碼

希望本博文對正在學習的你有用!

謝謝點贊評論!

繼續閱讀