YOLOv5 に基づく Python 交通標識認識システム [ソース コード、技術ドキュメント、展開ビデオ、データ セット]

1. 画像デモンストレーション:

1.png

2.png

3.png

2. ビデオデモンストレーション:

3. ラベル付きデータセット:

b1.png

b2.png

b3.png

b4.png

b5.png

4. YOLOネットワークの構築:

11.png
ネットワーク構造は、まずFocusを使って計算グラフの長さと幅を元の1/4に変更し、チャネル数を4倍にします。個人的には、CSP はさらにさまざまなチャネルを融合したものであると理解しています。
22.png
次に、maxpooling ダウンサンプリングを使用して機能ピラミッドを構築します。入力を連結して各ステージでダウンサンプリングします。
33.png
次に、ダウンサンプリングによって生成された特徴マップをアップサンプリングし、バックボーン内の対応するレイヤーと融合します。最後に、検出レイヤーを使用してアンカーを予測します。検出レイヤーの出力チャネルは、(クラス番号 + 5) * レイヤーごとの各グリッドによって予測されるアンカーの数です。num class は予測結果が各クラスである確率、5 はアンカーの x、y、w、h とオブジェクトかどうかの信頼度です。デフォルト設定では、maxpooling 後に 3 つのサイズの特徴マップが生成されます。各特徴マップは、アップサンプリングおよび融合操作後のアンカーの予測に使用されます。各グリッドは 3 つのアンカーを予測します。たとえば、yolov5 s は、80 種類のアンカーがあると予測します。x.shape=(bs, 3, 20, 20, 85) を出力します。

5. データの強化:

ディープラーニングの分野では、膨大なデータ量が要求されますが、CVの分野では、既存の画像データを画像データ強化によって処理することで画像トレーニングセットを強化し、モデルを効果的に一般化して問題を解決します。過学習の。

一般的な画像データの強調方法には、画像の回転、画像のトリミング、画像の水平方向または垂直方向の反転、画像の明るさの変更などが含まれます。モデルのトレーニングを容易にするために、通常はデータを正規化または標準化し、画像サイズが同じになるように設定します。
前処理.png

6. コードの実装:

コードの記述に関しては、注目に値することがいくつかあります。

1 まず、フォーカスレイヤーがあり、入力画像スライスの場合、特徴マップを縮小し、チャネルを増やすと計算速度が速くなります。

2 モデルを構築する (parse_model) yolo.py では、各層の出力チャンネルを格納するために配列 (ch) を使用しており、以降の連結時に連結後に出力されるチャンネル数を簡単に形成できます。

3 予測層の最後の層に加えて、出力チャネルの各層は、それが 8 の倍数であるかどうかをチェックして、後続の連結に問題がないことを確認します。

4 common.py にはさまざまな基本ブロックが含まれており、ボトルネック、CSP、concate レイヤーなどに加えて、トランスフォーマーなどのレイヤーもあります。

まず、関連するモジュールをインポートします。

import tensorflow as tf
import numpy as np
import pandas as pd 
import cv2
import matplotlib.pyplot as plt
import os
from sklearn.model_selection import train_test_split

写真の読み取り:target.txtの内容は以下の通りで、前が写真の名前、後ろが写真のカテゴリに対応しています。

x=[]
y=[]
with open ('./target.txt','r') as f:
    for j,i in enumerate(f):
        path=i.split()[0]
        lable=i.split()[1]
        print('读取第%d个图片'%j,path,lable)
        src=cv2.imread('./suju/'+path)
        x.append(src)
        y.append(int(lable))

データを正規化し、トレーニング セットと検証セットを分割します。

x=np.array(x)
y=np.array(y)
x.shape,y.shape
y=y[:,None]
x_train,x_test,y_train,y_test=train_test_split(x,y,stratify=y,random_state=0)
#归一化
x_train=x_train.astype('float32')/255
x_test=x_test.astype('float32')/255

y_train_onehot=tf.keras.utils.to_categorical(y_train)
y_test_onehot=tf.keras.utils.to_categorical(y_test)

ネットワークモデルを構築する

model=tf.keras.Sequential([
    tf.keras.Input(shape=(80,80,3)),
    tf.keras.layers.Conv2D(filters=32,kernel_size=(3,3),padding='same',activation='relu'),
    tf.keras.layers.MaxPooling2D(pool_size=(2,2),strides=(2,2)),
    tf.keras.layers.Conv2D(filters=64,kernel_size=(3,3),padding='same',activation='relu'),
    tf.keras.layers.MaxPooling2D(pool_size=(2,2),strides=(2,2)),
    tf.keras.layers.Conv2D(filters=32,kernel_size=(3,3),padding='same',activation='relu'),
    tf.keras.layers.MaxPooling2D(pool_size=(2,2),strides=(2,2)),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(1000,activation='relu'),
    tf.keras.layers.Dropout(rate=0.5),
    tf.keras.layers.Dense(43,activation='softmax')
])
model.compile(
    loss='categorical_crossentropy',
    optimizer='adam',
    metrics=['accuracy']
)
train_history=model.fit(x_train,y_train_onehot,batch_size=100,epochs=8,validation_split=0.2,verbose=1,
          )

モデルの損失と加速度を表示するグラフを描画します

la=[str(i) for i in range(1,9)]
def show(a,b,c,d):
    
    
    fig,axes=plt.subplots(1,2,figsize=(10,4))
    axes[0].set_title('accuracy of train and valuation')
    axes[0].plot(la,train_history.history[a],marker='*')
    axes[0].plot(train_history.history[b],marker='*')
    axes[0].set_xlabel('epoch')
    axes[0].set_ylabel('accuracy')
    
    aa=round(train_history.history[a][7],2)
    bb=round(train_history.history[b][7],2)
    
    axes[0].text(la[7],train_history.history[a][7],aa,ha='center',va='bottom')
    axes[0].text(la[7],train_history.history[b][7],bb,ha='center',va='top')
    #axes[0].set_xticks(la,['as','asd',3,4,5,6,7,8])
#     for x1,y1 in zip(la,train_history.history[a]):
#         y1=round(y1,2)
#         axes[0].text(x1,y1,y1,ha='center',va='bottom',fontsize=10,c='b')
        
    axes[0].legend(['train_accuracy','val_accuracy'])
    
    axes[1].set_title('loss of train and valuation')
    axes[1].plot(la,train_history.history[c],marker='*')
    axes[1].plot(train_history.history[d],marker='*')
    axes[1].set_xlabel('epoch')
    axes[1].set_ylabel('loss')
    
    cc=round(train_history.history[c][7],2)
    dd=round(train_history.history[d][7],2)
    
    axes[1].text(la[7],train_history.history[c][7],cc,ha='center',va='top')
    axes[1].text(la[7],train_history.history[d][7],dd,ha='center',va='bottom')
    axes[1].legend(['train_loss', 'val_loss'])
    #axes[1].show()

show('accuracy','val_accuracy','loss','val_loss')

モデルを保存

model.save('traffic_model2.h5')

7. トレーニング結果:

結果.png

8. 完全なソース コードと環境展開ビデオ チュートリアル、データ セット、カスタム トレーニング ビデオ チュートリアル:

[管理者が削除、CSDNは無料共有を禁止]

9. 参考文献:

【1】Xie Dou, Shi Jingwen, Liu Wenjun, Liu Shu.深層学習に基づく交通標識認識アルゴリズムの研究[J] . Computer Knowledge and Technology: Academic Edition, 2022,18(6):116-118.
【 2] Wang Zehua、Song Weihu、Wu Jianhua.改良された YOLOv4 ネットワークに基づく軽量交通標識検出モデル [J] . Computer Knowledge and Technology: Academic Edition、2022、18(5):98-101。

おすすめ

転載: blog.csdn.net/cheng2333333/article/details/126614325