一、介紹
寵物識別系統,本系統使用Python作為主要開發語言,基於TensorFlow搭建卷積神經網絡算法,並收集了37種常見的貓狗寵物種類數據集【'阿比西尼亞貓(Abyssinian)', '孟加拉貓(Bengal)', '暹羅貓(Birman)', '孟買貓(Bombay)', '英國短毛貓(British Shorthair)', '埃及貓(Egyptian Mau)', '緬因貓(Maine Coon)', '波斯貓(Persian)', '布偶貓(Ragdoll)', '俄羅斯藍貓(Russian Blue)', '暹羅貓(Siamese)', '斯芬克斯貓(Sphynx)', '美國鬥牛犬(American Bulldog)', '美國比特犬(American Pit Bull Terrier)', '巴賽特獵犬(Basset Hound)', '比格犬(Beagle)', '拳師犬(Boxer)', '吉娃娃(Chihuahua)', '英國可卡犬(English Cocker Spaniel)', '英國賽特犬(English Setter)', '德國短毛指示犬(German Shorthaired)', '大比利牛犬(Great Pyrenees)', '哈瓦那犬(Havanese)', '日本 chin(Japanese Chin)', '德國狐犬(Keeshond)', '萊昂貝格犬(Leonberger)', '迷你杜賓犬(Miniature Pinscher)', '紐芬蘭犬(Newfoundland)', '博美犬(Pomeranian)', '哈巴狗(Pug)', '聖伯納犬(Saint Bernard)', '薩摩耶犬(Samoyed)', '蘇格蘭梗犬(Scottish Terrier)', '柴犬(Shiba Inu)', '斯塔福郡鬥牛犬(Staffordshire Bull Terrier)', '小麥梗(Wheaten Terrier)', '約克夏梗(Yorkshire Terrier)'】
再使用通過搭建的算法模型對數據集進行訓練得到一個識別精度較高的模型,然後保存為為本地h5格式文件。最後使用Django框架搭建了一個Web網頁平台可視化操作界面,實現用户上傳一張寵物圖片識別其名稱。
二、系統效果圖片展示
三、完整代碼 and 演示視頻 and 安裝
地址:https://www.yuque.com/ziwu/yygu3z/blwx3d16qfusg8hg
四、系統關鍵技術~ResNet50算法
ResNet50(Residual Network 50)是一種深度卷積神經網絡(CNN)模型,提出者為微軟研究院的Kaiming He等人。它是ResNet系列模型的一部分,通過引入殘差學習(Residual Learning)的思想,解決了深度神經網絡在加深時訓練變得困難的問題。ResNet50的"50"指的是該網絡的層數,模型包含50個卷積層、池化層和全連接層。ResNet通過跳躍連接(Skip Connections)或殘差連接(Residual Connections)將輸入直接傳遞給後續層,避免了深層網絡中梯度消失和梯度爆炸的問題,從而使得網絡能夠有效地訓練更加深層次的結構。
ResNet50的特點:
- 殘差塊(Residual Blocks):ResNet通過引入跳躍連接,允許信號在某些層之間跳躍,直接傳遞。這些殘差連接可以有效緩解網絡層數加深後梯度消失的問題,確保訓練過程中的梯度仍然能夠有效傳播。
- 更深的網絡:與傳統的CNN相比,ResNet50能夠在較深的網絡結構中訓練並取得優異的性能,因為它通過跳躍連接解決了深度網絡訓練中的難題。
- 模塊化設計:ResNet50由多個殘差模塊構成,每個模塊包含兩個或更多的卷積層,通過快捷連接將輸入直接與輸出相加。這種設計使得網絡能夠有效地捕捉到不同層次的特徵信息。
ResNet50的結構:
ResNet50的網絡結構由多個殘差模塊(Residual Blocks)堆疊而成,每個模塊內部包含兩個3x3的卷積層以及一個捷徑連接。整個網絡可以分為四個階段(Stage),每個階段的輸出通道數逐漸增加,具體結構如下:
- Stage 1:由一個卷積層和池化層組成。
- Stage 2-4:每個階段包含多個殘差模塊。
- 最後,使用全局平均池化層(Global Average Pooling)將特徵圖縮減為一個向量,並通過一個全連接層輸出最終的分類結果。
優勢:
- 訓練深層次網絡:通過引入殘差學習,ResNet可以輕鬆訓練非常深的網絡,像ResNet50、ResNet101、ResNet152等都取得了極大的成功。
- 避免了梯度消失:殘差連接有助於保持信號的傳播,使得梯度能夠有效地從輸出層傳播回輸入層,從而避免梯度消失問題。
下面是一個使用ResNet50模型進行圖像分類的簡單TensorFlow代碼示例:
import tensorflow as tf
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras import layers, models
# 加載ResNet50預訓練模型(不包括頂部分類層)
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# 固定ResNet50的卷積層,不進行訓練
base_model.trainable = False
# 構建自定義分類模型
model = models.Sequential([
base_model, # 使用預訓練的ResNet50卷積層
layers.GlobalAveragePooling2D(), # 全局平均池化層
layers.Dense(512, activation='relu'), # 全連接層
layers.Dense(10, activation='softmax') # 輸出10個類別的預測
])
# 編譯模型
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 數據預處理:加載訓練和驗證數據集
train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
'data/train', # 訓練數據路徑
target_size=(224, 224),
batch_size=32,
class_mode='sparse'
)
# 訓練模型
model.fit(train_generator, epochs=10)
代碼説明:
- ResNet50模型:通過
ResNet50函數加載預訓練的ResNet50模型,並去掉頂部的全連接層(include_top=False),因為我們會自定義一個新的分類器。 - 全局平均池化:
GlobalAveragePooling2D將特徵圖的空間維度壓縮為單個數值,以減少參數量。 - 訓練過程:使用
Adam優化器、sparse_categorical_crossentropy損失函數進行訓練,並在訓練時加載圖像數據集。
ResNet50能夠有效利用預訓練權重來提取圖像特徵,從而在各種圖像分類任務中表現優異。