五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動態(tài)

python之tensorflow手把手實例講解斑馬線識別實現(xiàn)

發(fā)布日期:2022-01-01 21:18 | 文章來源:gibhub

一,斑馬線的數(shù)據(jù)集

數(shù)據(jù)集的構(gòu)成:

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

二,代碼部分

1.導(dǎo)包

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

2.數(shù)據(jù)導(dǎo)入

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,  #旋轉(zhuǎn)
 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.搭建模型

模型的建立仁者見智,可自己調(diào)節(jié)尋找更好的模型。

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)),
 
 # 數(shù)據(jù)鋪平
 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,模型訓(xùn)練

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

模型訓(xùn)練過程:

可以看到我們的模型在20輪的訓(xùn)練后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,模型預(yù)測

雖然我們的模型在訓(xùn)練過程中acc一度達到0.96,但測試集才是檢驗?zāi)P偷奈ㄒ粯藴?,在model.evaluate(test_generator)中的評分只有0.91左右,說明我們的模型已經(jīng)能以很高的正確率來完成”斑馬線“與“非斑馬線”的二分類問題了,但我們還是要查看具體是哪些數(shù)據(jù)沒有被模型正確得識別。

pred=model.predict(test_generator) #獲取test集的輸出
filenames = test_generator.filenames  #獲取test數(shù)據(jù)的文件名

錯誤輸出過程:

  • 1,循環(huán)測試集長度,通過if語句先判斷others還是zebra,再通過one-hot編碼判斷是否預(yù)測正確。
  • 2,根據(jù)labels可知others': 0, 'zebra crossing': 1,以此來判斷是否預(yù)測正確。
  • 3,對 filenames[0]='others\\103.png',進行切片處理。
  • 4,找到others的‘s'或 zebra crossing的‘g',使用find()在基礎(chǔ)上+2為正切片的起點(樣本編號前有'\'符號,故+2才能正確取出編號)。
  • 5,如 :將filenames[i]的值賦給a,a[int(a.find('s')+2):]則表示為 'xx.png'。
  • 6,將取出的樣本編號與路徑拼接,讀取后作圖。
  • 7,break跳出循環(huán)。
for i in range(len(filenames)):
 if filenames[i][:6]=='others':
  if np.argmax(pred[i]) != 0:
a=filenames[i]
plt.figure()
print('預(yù)測錯誤的圖片:'+a[int(a.find('s')+2):])
print('錯誤識別為"zebra crossing",正確類型是"others"')
print('預(yù)測標簽為:'+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('預(yù)測錯誤的圖片:'+b[int(b.find('g')+2):])
print('錯誤識別為"others",正確類型是"zebra crossing"')
print('預(yù)測標簽為:'+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

看到這個錯誤樣本,我猜想可能是因為斑馬線的部分只占了圖像的一半左右,所以預(yù)測錯誤了。

這里是我做預(yù)測判斷的思路,本可以不這么復(fù)雜的可以用test_generator.labels來獲取數(shù)據(jù)的標簽,再做判斷。

test_generator.labels

上面只輸出了第一個錯誤的樣本,所以接下來我們要看所有錯誤預(yù)測的樣本

sum=0
for i in range(len(filenames)):
 if filenames[i][:6]=='others':
  if np.argmax(pred[i]) != 0:
a=filenames[i]
print('預(yù)測錯誤的圖片:'+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('預(yù)測錯誤的圖片:'+b[int(b.find('g')+2):]+',錯誤識別為"others",正確類型是"zebra crossing"')
sum=sum+1
print('錯誤率:'+str(sum/100)+'%')
print('正確率:'+str((10000-sum)/100)+'%')

三,分析

在構(gòu)建模型時我嘗試在最后一層只用一個神經(jīng)元,用sigmoid激活函數(shù),其他參數(shù)不變,在同樣epochs=20的條件,也能很快收斂,達到很高的acc,測試集的評分也能在0.9左右,但是在最后輸出全部錯誤樣本的時候發(fā)現(xiàn)錯誤的樣本遠超過softmax,可能其中有些參數(shù)我沒有根據(jù)sigmoid來調(diào)整,所以會有如此高的錯誤率,歡迎在評論區(qū)討論。

到此這篇關(guān)于python之tensorflow手把手實例講解斑馬線識別實現(xiàn)的文章就介紹到這了,更多相關(guān)python tensorflow 斑馬線識別內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部