Python+VGG+MiniGoogLeNet の簡易版に基づくインテリジェントな 43 種類の交通標識認識 - 深層学習アルゴリズム アプリケーション (すべての Python プロジェクト ソース コードを含む) + データセット + モデル (2)


ここに画像の説明を挿入します

序文

このプロジェクトは、海外での自動運転ツアーの特定のシナリオにおける交通標識認識の問題の解決に焦点を当てています。Kaggle に設定された豊富な交通標識データを使用して、VGG や GoogLeNet などの畳み込みニューラル ネットワーク モデルをトレーニングに使用しました。ネットワーク アーキテクチャとパラメータを巧みに調整することで、さまざまな種類の交通標識を認識するモデルの精度を向上させることに取り組んでいます。

まず、トレーニング データの多様性と豊富さを確保するために、Kaggle 上の高品質の交通標識データセットを選択しました。次に、VGG や GoogLeNet などの高度な畳み込みニューラル ネットワーク モデルが使用され、画像分類タスクで優れたパフォーマンスを発揮します。

このプロジェクトは、賢明なネットワーク アーキテクチャとパラメータ調整を通じて、モデルの精度の向上に取り組んでいます。ネットワークがこれらの特徴をより具体的に学習できるようにするために、さまざまな交通標識の特徴について徹底的な調査を実施し、それによって複雑なシナリオにおけるモデルの一般化能力を強化しました。

最終的に、このプロジェクトは、車で海外旅行するユーザーに効率的かつ正確な交通標識認識システムを提供し、運転の安全性とユーザーエクスペリエンスを向上させることを目的としています。この革新的なソリューションは、自動運転やインテリジェントナビゲーションなどの分野に大きな影響を与えることが期待されています。

全体的なデザイン

このパートには、システム全体の構成図とシステム フローチャートが含まれます。

全体システム構成図

システムの全体構成を図に示します。

ここに画像の説明を挿入します

システムフローチャート

システムフローを図に示します。

ここに画像の説明を挿入します

動作環境

このセクションには、Python 環境と Anaconda 環境が含まれます。

詳細についてはブログを参照してください

モジュールの実装

このプロジェクトには、データの前処理、モデルの構築、モデルのトレーニング、ストレージの 3 つのモジュールが含まれています。各モジュールの機能紹介と関連コードを以下に示します。

1. データの前処理

このプロジェクトでは、ドイツの交通標識認識ベンチマーク データセット (GTSRB) を使用しています。このデータ セットには、さまざまな環境で撮影された 50,000 個の交通標識の画像が含まれています。ダウンロード アドレスは: https://www.kaggle.com/datasets/meowmeowmeowmeowmeow/gtsrb -german-交通標識データセットをダウンロードしたら、データをインポートして前処理を実行します。

詳細についてはブログを参照してください

2. モデルの構築

このセクションには、VGG モデルと GoogLeNet モデルの簡略化されたバージョンが含まれています。

1) VGGモデルの簡易版

モデルのさまざまな簡略化されたバージョンをテストすることにより、ネットワークの深さ (畳み込み層、プーリング層、全結合層の数) とネットワークの幅 (畳み込み層の出力チャネルの数) をさらに減らすことができることがわかりました。 ) 少ないほど良い結果が得られます。このプロジェクトの画像サイズが小さいため、このバージョンのモデルの畳み込み層の出力チャネルの数は、VGG-11 の半分に減少するだけです。入力画像は、3 つの畳み込み層、2 つの最大プーリング層、1 つの全結合層、および 1 つのソフトマックス層を通過します。畳み込み層のストライドは 1 で、出力の幅と高さを入力と同じにするためにパディングが使用されます。最初の 2 つの畳み込み層は 5×5 に調整され、最後の畳み込み層は 3×3 のままで変更されません。3 つの畳み込み層 出力チャネルの数はそれぞれ 32、64、64 です。2 つの最大プーリング層はそれぞれ 2 番目と 3 番目の畳み込み層の後に配置されます。プーリング ウィンドウは両方とも 2×2、ストライドは 2、パディングはありません。これにより、出力の幅と高さが半分になり、各最大プーリング層の後にパラメータ 0.25 のドロップアウト層が続き、過学習を防ぎます。最後に、出力チャネル番号 256 の全結合層とソフトマックス層があり、全結合層の後には、過学習を防ぐためにパラメータ 0.5 のドロップアウト層が続きます。

関連するコードは次のとおりです。

#导入需要的包
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import BatchNormalization
from tensorflow.keras.layers import Conv2D
from tensorflow.keras.layers import MaxPooling2D
from tensorflow.keras.layers import Activation
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import Dense
class VGGN:
    def build(width, height, depth, classes):
        #使用Keras框架的Sequential模式编写代码
        model = Sequential()
        inputShape = (height, width, depth)
        chanDim = -1
    #卷积核大小为5*5,步幅为1,输出通道数32,填充使得输出的宽和高与输入相同
     model.add(Conv2D(32, (5, 5), padding="same",input_shape=inputShape))
    #Relu激活函数+批量归一化
        model.add(Activation("relu"))
        model.add(BatchNormalization(axis=chanDim))  
    #卷积核大小为5*5,步幅为1,输出通道数64,填充使得输出的宽和高与输入相同 
 model.add(Conv2D(64, (5, 5), padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(axis=chanDim))
    #池化窗口为2*2,步幅为2,不填充,输出的宽和高减半(变为16*16)
        model.add(MaxPooling2D(pool_size=(2, 2)))
    #最大池化层后接一个参数为0.25的Dropout层防止过拟合
        model.add(Dropout(0.25))
    #卷积核大小为3*3,步幅为1,输出通道数64,填充使得输出的宽和高与输入相同
        model.add(Conv2D(64, (3, 3), padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(axis=chanDim))
    #池化窗口为2*2的最大池化层,步幅为2,不填充,输出的宽和高减半(变为8*8)
        model.add(MaxPooling2D(pool_size=(2, 2)))
    #最大池化层后接一个参数为0.25的Dropout层防止过拟合
        model.add(Dropout(0.25))
        model.add(Flatten())
    #输出通道数为256的全连接层
        model.add(Dense(256))
        model.add(Activation("relu"))
        model.add(BatchNormalization())
    #全连接层后接一个参数为0.5的Dropout层防止过拟合
        model.add(Dropout(0.5))
    #最后是一个softmax层输出各类别的概率
        model.add(Dense(classes))
        model.add(Activation("softmax"))       
        return model

2) GoogLeNet の簡易版 — MiniGoogLeNet

MiniGoogLeNet は、インセプション モジュール、ダウンサンプル モジュール、およびコンボリューション モジュールで構成されます。コンボリューション モジュールには、コンボリューション層、アクティベーション関数、およびバッチ正規化が含まれます。インセプション モジュールは、コンボリューション カーネル サイズが 1×1 および 3×3 の 2 つのコンボリューションで構成されます。モジュールは並列に接続されています。チャネルのマ​​ージを容易にするために、入力と出力の高さと幅が同じになるように両方のコンボリューション モジュールがパディングされています。ダウンサンプル モジュールは、コンボリューション カーネル サイズが 3×3 のコンボリューション モジュールとプーリング ウィンドウで構成されています。 of 3× 3 の最大プーリング層を並列に構成し、畳み込みモジュールと最大プーリング層は埋めず、ストライドは 2 なので、入力通過後に幅と高さが半分になります。MiniGoogLeNet の入力画像は畳み込みモジュールを通過し、異なる数のチャネルを持つインセプション モジュールを出力します。最後に、グローバル平均プーリング層とソフトマックス層があります。グローバル平均プーリング層は、各チャネルの高さと幅を次のように変更します。 1、オーバーフィッティングを効果的に軽減します。

関連するコードは次のとおりです。

#导入需要的包
from tensorflow.keras.layers import BatchNormalization
from tensorflow.keras.layers import Conv2D
from tensorflow.keras.layers import AveragePooling2D
from tensorflow.keras.layers import MaxPooling2D
from tensorflow.keras.layers import Activation
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Input
from tensorflow.keras.models import Model
from tensorflow.keras.layers import concatenate
from tensorflow.keras import backend as K
class MiniGoogLeNet:
    #定义卷积模块,x表示输入数据,K表示输出通道的数量,KX、KY表示卷积核的大小
    def conv_module(x,K,KX,KY,stride,chanDim,padding="same"):
        #卷积+激活函数+批量归一化,默认填充使得输出的宽和高不变
        x = Conv2D(K, (KX, KY), strides=stride, padding=padding)(x)
        x = Activation("relu")(x)
        x = BatchNormalization(axis=chanDim)(x)
        return x
 #定义Inception模块,x表示输入数据,numK1_1,numK3_3表示两个卷积模块输出通道数量
    def inception_module(x,numK1_1,numK3_3,chanDim):
        #并联的两个卷积模块,卷积核大小分别为1*1和3*3
        conv1_1=MiniGoogLeNet.conv_module(x,numK1_1,1,1,(1,1),chanDim)    
        conv3_3=MiniGoogLeNet.conv_module(x,numK3_3,3,3,(1,1),chanDim)    
        x=concatenate([conv1_1,conv3_3],axis=chanDim)
        return x
 #定义Downsample模块,x表示输入数据,K表示卷积模块的输出通道数
    def downsample_module(x,K,chanDim):  
        #并联的卷积模块和最大池化层,均使用3*3窗口,步幅2,不填充,输出的宽和高减半
conv3_3=MiniGoogLeNet.conv_module(x,K,3,3,(2,2),chanDim,padding='valid')
        pool=MaxPooling2D((3,3),strides=(2,2))(x)        
        x=concatenate([conv3_3,pool],axis=chanDim)
        return x
    #定义模型
    def build(width, height, depth, classes):        
        inputShape = (height, width, depth)
        chanDim = -1   
        #如果通道在前,将chanDim设为1         
        if K.image_data_format() == "channels_first":            
            inputShape = (depth, height, width)            
            chanDim = 1  
        #使用Keras的Model模式编写代码             
        inputs = Input(shape=inputShape)
        #输入图片先经过一个卷积核大小3*3,输出通道数96的卷积模块
        x = MiniGoogLeNet.conv_module(inputs, 96, 3, 3, (1, 1),chanDim)    
        #2个Inception模块(输出通道数32+32、32+48)+1个Downsample模块
        x = MiniGoogLeNet.inception_module(x, 32, 32, chanDim)        
        x = MiniGoogLeNet.inception_module(x, 32, 48, chanDim)       
        x = MiniGoogLeNet.downsample_module(x, 80, chanDim)           
       #4个Inception模块(输出通道数112+48、96+64、80+80、48+96)+1Downsample模块
        x = MiniGoogLeNet.inception_module(x, 112, 48, chanDim)        
        x = MiniGoogLeNet.inception_module(x, 96, 64, chanDim)        
        x = MiniGoogLeNet.inception_module(x, 80, 80, chanDim)        
        x = MiniGoogLeNet.inception_module(x, 48, 96, chanDim)        
        x = MiniGoogLeNet.downsample_module(x, 96, chanDim)         
        #2个Inception模块+1个Downsample模块+1个全局平均池化层+1个Dropout层
        x = MiniGoogLeNet.inception_module(x, 176, 160, chanDim)        
        x = MiniGoogLeNet.inception_module(x, 176, 160, chanDim)
#输出7*7*(160+176)经过平均池化之后变成了1*1*376        
        x = AveragePooling2D((7, 7))(x)  
        x = Dropout(0.5)(x)         
             #特征扁平化 
        x = Flatten()(x)
        #softmax层输出各类别的概率       
        x = Dense(classes)(x)       
        x = Activation("softmax")(x)        
        #创建模型        
        model = Model(inputs, x, name="googlenet")               
        return model   

3. モデルのトレーニングと保存

ランダムなローテーションなどの方法でデータの強化を行い、最適化アルゴリズムとして Adam アルゴリズムを選択します。反復回数が増加するにつれて学習率は低下します。試行後、学習率を 0.001 に設定した場合が最も効果的です。前のモデルを呼び出し、損失関数としてクロス エントロピーを使用し、Kerasfit_generator()メソッドを使用してモデルをトレーニングし、最後に評価してディスクに保存します。

関連するコードは次のとおりです。

#设置初始学习速率、批量大小和迭代次数
INIT_LR = 1e-3
BS = 64
NUM_EPOCHS = 10
#使用随机旋转、缩放,水平/垂直移位、透视变换、剪切等方法进行数据增强(不用水平或垂直翻转
aug = ImageDataGenerator(
    rotation_range=10,
    zoom_range=0.15,
    width_shift_range=0.1,
    height_shift_range=0.1,
    shear_range=0.15,
    horizontal_flip=False,
    vertical_flip=False,
    fill_mode="nearest")
print("[INFO] compiling model...")
#选用Adam作为优化算法,初始学习速率0.001,随着迭代次数增加降低学习速率
opt = Adam(lr=INIT_LR, decay=INIT_LR / (NUM_EPOCHS * 0.5))
#调用MiniGoogLeNet,使用VGG网络时把MiniGoogLeNet更改为VGGN
model = MiniGoogLeNet.build(width=32, height=32, depth=3,
    classes=numLabels)
#编译模型,使用交叉熵作为损失函数
model.compile(loss="categorical_crossentropy", optimizer=opt,
    metrics=["accuracy"])
#使用Keras的fit_generator方法训练模型
print("[INFO] training network...")
H = model.fit_generator(
    aug.flow(trainX, trainY, batch_size=BS),
    validation_data=(testX, testY),
    steps_per_epoch=trainX.shape[0] ,
    epochs=NUM_EPOCHS,
    verbose=1)
#评估模型,打印分类报告
print("[INFO] evaluating network...")
predictions = model.predict(testX, batch_size=BS)
print(classification_report(testY.argmax(axis=1),
	predictions.argmax(axis=1), target_names=labelNames))
#将模型存入磁盘
print("[INFO]serializing network to'{}'...".format('output/testmodel.pb'))
model.save('output/testmodel.pb')
#绘制loss和accuracy随迭代次数变化的曲线
N = np.arange(0, NUM_EPOCHS)
plt.style.use("ggplot")
plt.figure()
plt.plot(N, H.history["loss"], label="train_loss")
plt.plot(N, H.history["val_loss"], label="val_loss")
plt.plot(N, H.history["acc"], label="train_acc")
plt.plot(N, H.history["val_acc"], label="val_acc")
plt.title("Training Loss and Accuracy on Dataset")
plt.xlabel("Epoch #")
plt.ylabel("Loss/Accuracy")
plt.legend(loc="lower left")
plt.savefig('output/test.png')

関連する他のブログ

Python+VGG+MiniGoogLeNet の簡易版に基づくインテリジェントな 43 種類の交通標識認識 - 深層学習アルゴリズム アプリケーション (すべての Python プロジェクト ソース コードを含む) + データセット + モデル (1)

Python+VGG+MiniGoogLeNet の簡易版に基づくインテリジェントな 43 カテゴリの交通標識認識 - 深層学習アルゴリズム アプリケーション (すべての Python プロジェクト ソース コードを含む) + データ セット + モデル (3)

プロジェクトのソースコードのダウンロード

詳細については、私のブログ リソースのダウンロード ページをご覧ください。


その他の情報をダウンロードする

人工知能に関連する学習ルートと知識システムを引き続き理解したい場合は、私の別のブログ「ヘビー級 | 完全な人工知能 AI 学習 - 基礎知識の学習ルート」を参照してください。すべての情報はネットワーク ディスクから直接ダウンロードできます。》このブログは、Github の有名なオープンソース プラットフォーム、AI テクノロジー プラットフォーム、および関連分野の専門家 (Datawhale、ApacheCN、AI Youdao、Dr. Huang Haiguang など) について言及しています
。関連情報は 100G 近くあります。私の友人全員を助けることができれば幸いです。

おすすめ

転載: blog.csdn.net/qq_31136513/article/details/135146512