畢業(yè)設(shè)計 深度學(xué)習(xí)垃圾圖像分類系統(tǒng)
0 前言
?? 這兩年開始畢業(yè)設(shè)計和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點,往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項目系統(tǒng)達(dá)不到老師的要求。
?? ?opencv python 深度學(xué)習(xí)垃圾分類系統(tǒng)
??學(xué)長這里給一個題目綜合評分(每項滿分5分)
難度系數(shù):3分
工作量:3分
創(chuàng)新點:4分
畢設(shè)幫助,選題指導(dǎo),技術(shù)解答,歡迎打擾,見B站個人主頁
https://space.bilibili.com/33886978
課題簡介
如今,垃圾分類已成為社會熱點話題。其實在2019年4月26日,我國住房和城鄉(xiāng)建設(shè)部等部門就發(fā)布了《關(guān)于在全國地級及以上城市全面開展生活垃圾分類工作的通知》,決定自2019年起在全國地級及以上城市全面啟動生活垃圾分類工作。到2020年底,46個重點城市基本建成生活垃圾分類處理系統(tǒng)。
人工垃圾分類投放是垃圾處理的第一環(huán)節(jié),但能夠處理海量垃圾的環(huán)節(jié)是垃圾處理廠。然而,目前國內(nèi)的垃圾處理廠基本都是采用人工流水線分揀的方式進(jìn)行垃圾分揀,存在工作環(huán)境惡劣、勞動強度大、分揀效率低等缺點。在海量垃圾面前,人工分揀只能分揀出極有限的一部分可回收垃圾和有害垃圾,絕大多數(shù)垃圾只能進(jìn)行填埋,帶來了極大的資源浪費和環(huán)境污染危險。
隨著深度學(xué)習(xí)技術(shù)在視覺領(lǐng)域的應(yīng)用和發(fā)展,讓我們看到了利用AI來自動進(jìn)行垃圾分類的可能,通過攝像頭拍攝垃圾圖片,檢測圖片中垃圾的類別,從而可以讓機器自動進(jìn)行垃圾分揀,極大地提高垃圾分揀效率。
基于深度學(xué)習(xí)的垃圾分類系統(tǒng),是非常好的畢業(yè)設(shè)計課題
一、識別效果
老樣子, 廢話不多說,先展示圖像垃圾分類的識別效果
訓(xùn)練模型精度:

可以看到,只迭代了10輪精度達(dá)到87.50%,而且沒有出現(xiàn)過擬合現(xiàn)象
我最高訓(xùn)練達(dá)到96%,迭代200輪
識別結(jié)果:

實際驗證正確率還是很高的。
二、實現(xiàn)
1.數(shù)據(jù)集
該數(shù)據(jù)集包含了 2507 個生活垃圾圖片。數(shù)據(jù)集的創(chuàng)建者將垃圾分為了 6 個類別,分別是:

如下所示:

一共6類垃圾, 比如玻璃類的如下:

塑料類的如下:

其他的不列舉了。
2.實現(xiàn)原理和方法
使用深度殘差網(wǎng)絡(luò)resnet50作為基石,在后續(xù)添加需要的層以適應(yīng)不同的分類任務(wù) 模型的訓(xùn)練需要用生成器將數(shù)據(jù)集循環(huán)寫入內(nèi)存,同時圖像增強以泛化模型 使用不包含網(wǎng)絡(luò)輸出部分的resnet50權(quán)重文件進(jìn)行遷移學(xué)習(xí),只訓(xùn)練我們在5個stage后增加的層
需要的第三方庫主要有tensorflow1.x,keras,opencv,Pillow,scikit-learn,numpy 安裝方式很簡單,打開terminal,例如:pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple 數(shù)據(jù)集與權(quán)重文件比較大,所以沒有上傳 如果環(huán)境配置方面有問題或者需要數(shù)據(jù)集與模型權(quán)重文件,可以在評論區(qū)說明您的問題,我將遠(yuǎn)程幫助您
3.網(wǎng)絡(luò)結(jié)構(gòu)
這里我只使用了resnet50的5個stage,后面的輸出部分需要我們自己定制,網(wǎng)絡(luò)的結(jié)構(gòu)圖如下:

stage5后我們的定制網(wǎng)絡(luò)如下:
"""定制resnet后面的層"""
def custom(input_size,num_classes,pretrain):
? ?# 引入初始化resnet50模型
? ?base_model = ResNet50(weights=pretrain,
? ? ? ? ? ? ? ? ? ? ? ? ?include_top=False,
? ? ? ? ? ? ? ? ? ? ? ? ?pooling=None,
? ? ? ? ? ? ? ? ? ? ? ? ?input_shape=(input_size,input_size, 3),
? ? ? ? ? ? ? ? ? ? ? ? ?classes=num_classes)
? ?#由于有預(yù)權(quán)重,前部分凍結(jié),后面進(jìn)行遷移學(xué)習(xí)
? ?for layer in base_model.layers:
? ? ? ?layer.trainable = False
? ?#添加后面的層
? ?x = base_model.output
? ?x = layers.GlobalAveragePooling2D(name='avg_pool')(x)
? ?x = layers.Dropout(0.5,name='dropout1')(x)
? ?#regularizers正則化層,正則化器允許在優(yōu)化過程中對層的參數(shù)或?qū)拥募せ钋闆r進(jìn)行懲罰
? ?#對損失函數(shù)進(jìn)行最小化的同時,也需要讓對參數(shù)添加限制,這個限制也就是正則化懲罰項,使用l2范數(shù)
? ?x = layers.Dense(512,activation='relu',kernel_regularizer= regularizers.l2(0.0001),name='fc2')(x)
? ?x = layers.BatchNormalization(name='bn_fc_01')(x)
? ?x = layers.Dropout(0.5,name='dropout2')(x)
? ?#40個分類
? ?x = layers.Dense(num_classes,activation='softmax')(x)
? ?model = Model(inputs=base_model.input,outputs=x)
? ?#模型編譯
? ?model.compile(optimizer="adam",loss = 'categorical_crossentropy',metrics=['accuracy'])
? ?return model
網(wǎng)絡(luò)的訓(xùn)練是遷移學(xué)習(xí)過程,使用已有的初始resnet50權(quán)重(5個stage已經(jīng)訓(xùn)練過,卷積層已經(jīng)能夠提取特征),我們只訓(xùn)練后面的全連接層部分,4個epoch后再對較后面的層進(jìn)行訓(xùn)練微調(diào)一下,獲得更高準(zhǔn)確率,訓(xùn)練過程如下:
class Net():
? ?def __init__(self,img_size,gar_num,data_dir,batch_size,pretrain):
? ? ? ?self.img_size=img_size
? ? ? ?self.gar_num=gar_num
? ? ? ?self.data_dir=data_dir
? ? ? ?self.batch_size=batch_size
? ? ? ?self.pretrain=pretrain
? ?def build_train(self):
? ? ? ?"""遷移學(xué)習(xí)"""
? ? ? ?model = resnet.custom(self.img_size, self.gar_num, self.pretrain)
? ? ? ?model.summary()
? ? ? ?train_sequence, validation_sequence = genit.gendata(self.data_dir, self.batch_size, self.gar_num, self.img_size)
? ? ? ?epochs=4
? ? ? ?model.fit_generator(train_sequence,steps_per_epoch=len(train_sequence),epochs=epochs,verbose=1,validation_data=validation_sequence,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? max_queue_size=10,shuffle=True)
? ? ? ?#微調(diào),在實際工程中,激活函數(shù)也被算進(jìn)層里,所以總共181層,微調(diào)是為了重新訓(xùn)練部分卷積層,同時訓(xùn)練最后的全連接層
? ? ? ?layers=149
? ? ? ?learning_rate=1e-4
? ? ? ?for layer in model.layers[:layers]:
? ? ? ? ? ?layer.trainable = False
? ? ? ?for layer in model.layers[layers:]:
? ? ? ? ? ?layer.trainable = True
? ? ? ?Adam =adam(lr=learning_rate, decay=0.0005)
? ? ? ?model.compile(optimizer=Adam, loss='categorical_crossentropy', metrics=['accuracy'])
? ? ? ?model.fit_generator(train_sequence,steps_per_epoch=len(train_sequence),epochs=epochs * 2,verbose=1,
? ? ? ? ? ?callbacks=[
? ? ? ? ? ? ? ?callbacks.ModelCheckpoint('./models/garclass.h5',monitor='val_loss', save_best_only=True, mode='min'),
? ? ? ? ? ? ? ?callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1,patience=10, mode='min'),
? ? ? ? ? ? ? ?callbacks.EarlyStopping(monitor='val_loss', patience=10),],
? ? ? ? ? ?validation_data=validation_sequence,max_queue_size=10,shuffle=True)
? ? ? ?print('finish train,look for garclass.h5')
最后
畢設(shè)幫助,選題指導(dǎo),技術(shù)解答,歡迎打擾,見B站個人主頁
https://space.bilibili.com/33886978