原文地址:
手把手教你:基于深度殘差網(wǎng)絡(luò)(ResNet)的水果分類識(shí)別系統(tǒng)
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
@TOC
</font>
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
一、項(xiàng)目簡(jiǎn)介
本文主要介紹如何使用python搭建:一個(gè)基于深度殘差網(wǎng)絡(luò)(ResNet)的水果圖像分類識(shí)別系統(tǒng)。
項(xiàng)目只是用水果分類作為拋磚引玉,其中包含了使用ResNet進(jìn)行圖像分類的相關(guān)代碼。主要功能如下:
- 數(shù)據(jù)預(yù)處理,生成用于輸入TensorFlow模型的TFRecord的數(shù)據(jù)。
- 模型構(gòu)建及訓(xùn)練,使用tensorflow.keras構(gòu)建深度殘差網(wǎng)絡(luò)。
- 預(yù)測(cè)水果分類并進(jìn)行模型評(píng)估。
如各位童鞋需要更換訓(xùn)練數(shù)據(jù),完全可以根據(jù)源碼將圖像和標(biāo)注文件更換即可直接運(yùn)行。
<font color=#999AAA >博主也參考過網(wǎng)上圖像分類的文章,但大多是理論大于方法。很多同學(xué)肯定對(duì)原理不需要過多了解,只需要搭建出一個(gè)預(yù)測(cè)系統(tǒng)即可。</font>
本文只會(huì)告訴你如何快速搭建一個(gè)基于ResNet的圖像分類系統(tǒng)并運(yùn)行,原理的東西可以參考其他博主。
也正是因?yàn)槲野l(fā)現(xiàn)網(wǎng)上大多的帖子只是針對(duì)原理進(jìn)行介紹,功能實(shí)現(xiàn)的相對(duì)很少。
如果您有以上想法,那就找對(duì)地方了!
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
<font color=#999AAA >不多廢話,直接進(jìn)入正題!
二、水果分類結(jié)果預(yù)測(cè)
首先我們來看下模型最終預(yù)測(cè)的水果類別的情況。本項(xiàng)目采用的數(shù)據(jù)集共有13種水果:香蕉、櫻桃、無花果、芒果等等。博主英語不好就不在這獻(xiàn)丑了,感興趣的同學(xué)可以百度翻譯
[圖片上傳失敗...(image-54eaec-1652018800776)]
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
- 接下來是模型預(yù)測(cè)的結(jié)果,這里我輸入了2個(gè)單張圖片,來驗(yàn)證模型的分類結(jié)果:
[圖片上傳失敗...(image-7e33d3-1652018800776)]
[圖片上傳失敗...(image-1f913a-1652018800776)] - 可以看到2張圖片分別為:香蕉、桔柚,模型都準(zhǔn)確預(yù)測(cè)并分類正確。
三、環(huán)境安裝
1.環(huán)境要求
本項(xiàng)目開發(fā)IDE使用的是:Anaconda中的jupyter notebook,大家可以直接csdn搜索安裝指南非常多,這里就不再贅述。
因?yàn)楸卷?xiàng)目基于TensorFlow因此需要以下環(huán)境:
- tensorflow >= 2.0
- pandas
- scikit-learn
- numpy
- OpenCV2
- matplotlib
2.環(huán)境安裝示例
環(huán)境都可以通過pip進(jìn)行安裝。如果只是想要使用博主訓(xùn)練的模型直接進(jìn)行預(yù)測(cè),不需要對(duì)模型重新訓(xùn)練的話,這邊建議tensorflow安裝cpu版的。
<font color=#999AAA >如果沒使用過jupyter notebook通過pip安裝包的同學(xué)可以參考如下:
- 新建一個(gè)terminal窗口:
[圖片上傳失敗...(image-cfbf21-1652018800776)]
- 在新建的窗口中使用pip進(jìn)行安裝:
[圖片上傳失敗...(image-7f05fb-1652018800776)]
點(diǎn)開“終端”,然后通過pip進(jìn)行安裝pandas,其他環(huán)境包也可以通過上面的方法安裝。
四、重要代碼介紹
環(huán)境安裝好后就可以打開jupyter notebook開始愉快的執(zhí)行代碼了。由于代碼眾多,博客中就不放入最終代碼了,有需要的童鞋可以在博客最下方找到下載地址。
1.數(shù)據(jù)預(yù)處理
- 首先我們將需要處理的圖像分為訓(xùn)練集、測(cè)試集。
[圖片上傳失敗...(image-1607dd-1652018800776)]
其中按13類的水果分別建立文件夾放入對(duì)應(yīng)水果圖片:
[圖片上傳失敗...(image-a27b1b-1652018800776)]這里拿芒果舉例:
[圖片上傳失敗...(image-c6de9a-1652018800776)]使用opencv2來讀取圖像生成:(100,100,3)的三通道圖像數(shù)據(jù)。
# 定義圖像處理函數(shù)
def read_img(path):
print("數(shù)據(jù)集地址:"+path)
imgs = []
labels = []
for root, dirs, files in tqdm(os.walk(path)):
for file in files:
# print(path+'/'+file+'/'+folder)
# 讀取的圖片
img = cv2.imread(os.path.join(root, file))
# 將讀取的圖片數(shù)據(jù)加載到imgs[]列表中
imgs.append(img)
# 將圖片的label加載到labels[]中,與上方的imgs索引對(duì)應(yīng)
labels.append(str(os.path.basename(root)))
return imgs,labels
- 并處理圖像,和對(duì)類別進(jìn)行LabelEncoder編碼處理,處理后情況如下:
- 訓(xùn)練集共計(jì):6560張圖片,測(cè)試集共計(jì):2207張圖片。
[圖片上傳失敗...(image-cd3e6b-1652018800776)] - 然后將數(shù)據(jù)儲(chǔ)存為TFRecord:
[圖片上傳失敗...(image-194afa-1652018800776)]
2.分類模型構(gòu)建
- 使用TensorFlow搭建一個(gè)ResNet模型:
[圖片上傳失敗...(image-936fe0-1652018800776)]
3.模型訓(xùn)練
- 模型訓(xùn)練,設(shè)置批處理batch_size:64,每2個(gè)epoch保存一次模型,博主總共跑了30個(gè)epoch。
from tensorflow.keras.callbacks import (
ReduceLROnPlateau,
EarlyStopping,
ModelCheckpoint,
TensorBoard)
# 編譯模型來配置學(xué)習(xí)過程
ResNet_model.compile(optimizer=optimizer,loss='sparse_categorical_crossentropy',metrics=['accuracy'])
callbacks = [
# ReduceLROnPlateau(verbose=1),
# 提前結(jié)束解決過擬合
# EarlyStopping(patience=10, verbose=1),
# 保存模型
ModelCheckpoint(checkpoints + 'resnet_train_{epoch}.tf', monitor='accuracy',verbose=0,
# 當(dāng)設(shè)置為True時(shí),將只保存在驗(yàn)證集上性能最好的模型
save_best_only=True, save_weights_only=True,
# CheckPoint之間的間隔的epoch數(shù)
period=2),
TensorBoard(log_dir='logs')
]
# 模型訓(xùn)練
history = ResNet_model.fit(data_train, epochs = epoch,callbacks=callbacks,validation_data = data_test)
- 訓(xùn)練和測(cè)試集的準(zhǔn)確率如下,可以看到訓(xùn)練至15個(gè)epoch左右已經(jīng)能達(dá)到很高的準(zhǔn)確率了。
[圖片上傳失敗...(image-24bad1-1652018800776)]
五、訓(xùn)練自己的數(shù)據(jù)
1.項(xiàng)目目錄如下
[圖片上傳失敗...(image-2a36e9-1652018800776)]
2.分類模型訓(xùn)練
- 需要將自己的數(shù)據(jù)集整理后放入以下項(xiàng)目目錄中:
./img/train/
和
./img/test/
下目錄設(shè)置,一個(gè)類別的圖片放入一個(gè)文件夾中,如下:
[圖片上傳失敗...(image-a0fda5-1652018800776)]
然后按順序執(zhí)行下述代碼:
a數(shù)據(jù)預(yù)處理.ipynb
b加載并訓(xùn)練模型.ipynb
c模型評(píng)估及預(yù)測(cè).ipynb
即可開始分類模型訓(xùn)練
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
六、完整代碼地址
由于項(xiàng)目代碼量和數(shù)據(jù)集較大,感興趣的同學(xué)可以下載完整代碼,使用過程中如遇到任何問題可以在評(píng)論區(qū)進(jìn)行評(píng)論,我都會(huì)一一解答。
完整代碼下載:
【代碼分享】手把手教你:基于深度殘差網(wǎng)絡(luò)(ResNet)的水果分類識(shí)別系統(tǒng)