日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

深度学习项目实战:垃圾分类系统

發(fā)布時(shí)間:2023/12/24 windows 31 coder
生活随笔 收集整理的這篇文章主要介紹了 深度学习项目实战:垃圾分类系统 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(jiǎn)介:

今天開啟深度學(xué)習(xí)另一板塊。就是計(jì)算機(jī)視覺方向,這里主要討論圖像分類任務(wù)--垃圾分類系統(tǒng)。其實(shí)這個(gè)項(xiàng)目早在19年的時(shí)候,我就寫好了一個(gè)版本了。之前使用的是python搭建深度學(xué)習(xí)網(wǎng)絡(luò),然后前后端交互的采用的是java spring MVC來寫的。之前感覺還挺好的,但是使用起來還比較困難的。不光光需要有python的基礎(chǔ),同時(shí)還需要有一定的java的基礎(chǔ)。尤其是搭建java的環(huán)境,還是很煩的。最近剛好有空,就給這個(gè)項(xiàng)目拿了過來優(yōu)化了一下,本次優(yōu)化主要涉及前后端界面交互的優(yōu)化,另外一條就是在模型的識(shí)別性能上的優(yōu)化,提高模型的識(shí)別速度。

展示:

下面是項(xiàng)目的初始化界面:


使用本系統(tǒng)的話也是比較簡(jiǎn)單的,點(diǎn)擊選擇文件按鈕選擇需要識(shí)別的圖片數(shù)據(jù)。然后再點(diǎn)擊開始識(shí)別就可以識(shí)別了

識(shí)別結(jié)果如下:

實(shí)際的使用請(qǐng)看下面的視頻:
B站--深度學(xué)習(xí)項(xiàng)目實(shí)戰(zhàn):垃圾分類系統(tǒng)

項(xiàng)目實(shí)現(xiàn)思路:

項(xiàng)目主要分為兩塊,第一塊是深度學(xué)習(xí)模塊,另一塊呢就是系統(tǒng)的使用界面了。
1、深度學(xué)習(xí)模塊
先說第一個(gè)模塊,也就是深度學(xué)習(xí)模塊,這塊的主體呢其實(shí)就是深度學(xué)習(xí)的網(wǎng)絡(luò)的搭建以及模型的訓(xùn)練,還有就是模型的使用了。
深度學(xué)習(xí)網(wǎng)絡(luò)的我主要使用的是ResNet的網(wǎng)絡(luò)結(jié)構(gòu),使用這個(gè)網(wǎng)絡(luò)結(jié)構(gòu)來實(shí)現(xiàn)四分類的垃圾分類的任務(wù)肯定是可以的。同時(shí)呢在訓(xùn)練模型的時(shí)候,我這里又使用了一些調(diào)參的手法--遷移學(xué)習(xí)。為什么要使用遷移學(xué)習(xí)呢?由于ResNet在圖像任務(wù)上表現(xiàn)的是比較出色的,同時(shí)我們的任務(wù)也是圖像分類,所以呢是可以使用ResNet來進(jìn)行遷移學(xué)習(xí)的。
下面是相關(guān)代碼:
`import torch
from torch import nn
from torch.nn import functional as F

class ResBlk(nn.Module):

def init(self, ch_in, ch_out, stride=1):
? ? ? ? super(ResBlk, self).init()

self.conv1 = nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=stride, padding=1)
? ? ? ? self.bn1 = nn.BatchNorm2d(ch_out)
? ? ? ? self.conv2 = nn.Conv2d(ch_out, ch_out, kernel_size=3, stride=1, padding=1)
? ? ? ? self.bn2 = nn.BatchNorm2d(ch_out)

self.extra = nn.Sequential()
? ? ? ? if ch_out != ch_in:
? ? ? ? ? ? self.extra = nn.Sequential(
? ? ? ? ? ? ? ? nn.Conv2d(ch_in, ch_out, kernel_size=1, stride=stride),
? ? ? ? ? ? ? ? nn.BatchNorm2d(ch_out)
? ? ? ? ? ? )

def forward(self, x):
? ? ? ? out = F.relu(self.bn1(self.conv1(x)))
? ? ? ? out = self.bn2(self.conv2(out))
? ? ?
? ? ? ? out = self.extra(x) + out
? ? ? ? out = F.relu(out)

return out

class ResNet18(nn.Module):

def init(self, num_class):
? ? ? ? super(ResNet18, self).init()

self.conv1 = nn.Sequential(
? ? ? ? ? ? nn.Conv2d(3, 16, kernel_size=3, stride=3, padding=0),
? ? ? ? ? ? nn.BatchNorm2d(16)
? ? ? ? )
? ? ?
? ? ? ? self.blk1 = ResBlk(16, 32, stride=3)
? ? ? ? self.blk2 = ResBlk(32, 64, stride=3)
? ? ? ? self.blk3 = ResBlk(64, 128, stride=2)
? ? ? ? self.blk4 = ResBlk(128, 256, stride=2)

self.outlayer = nn.Linear(25633, num_class)

def forward(self, x):
? ? ? ? x = F.relu(self.conv1(x))
? ? ? ? x = self.blk1(x)
? ? ? ? x = self.blk2(x)
? ? ? ? x = self.blk3(x)
? ? ? ? x = self.blk4(x)

# print(x.shape)
? ? ? ? x = x.view(x.size(0), -1)
? ? ? ? x = self.outlayer(x)

return x

def main():
? ? blk = ResBlk(64, 128)
? ? tmp = torch.randn(2, 64, 224, 224)
? ? out = blk(tmp)
? ? print('block:', out.shape)

model = ResNet18(5)
? ? tmp = torch.randn(2, 3, 224, 224)
? ? out = model(tmp)
? ? print('resnet:', out.shape)

p = sum(map(lambda p:p.numel(), model.parameters()))
? ? print('parameters size:', p)

if name == 'main':
? ? main()`

下面是遷移學(xué)習(xí)的主要代碼:
trained_model=resnet18(pretrained=True) ? ? model = nn.Sequential(*list(trained_model.children())[:-1], ? ? ? ? ? ? ? ? ? ? ? ? ? Flatten(), ? ? ? ? ? ? ? ? ? ? ? ? ? nn.Linear(512,4) ? ? ? ? ? ? ? ? ? ? ? ? ? ).to(device)

這部分代碼將預(yù)訓(xùn)練模型的所有層(除了最后一層)復(fù)制到新模型中。Flatten()是將最后一層的輸出展平,以便可以輸入到全連接層(nn.Linear(512,4))。nn.Linear(512,4)是一個(gè)全連接層,有512個(gè)輸入節(jié)點(diǎn)和4個(gè)輸出節(jié)點(diǎn),對(duì)應(yīng)于任務(wù)中的類別數(shù)。
最后,.to(device)將模型移動(dòng)到指定的設(shè)備上(例如GPU或CPU)。如果你沒有指定設(shè)備,那么默認(rèn)會(huì)使用CPU。

之后呢設(shè)置batchsize、learning rate、優(yōu)化器就可以進(jìn)行模型的訓(xùn)練了
參數(shù)設(shè)置如下:
batchsz = 64 lr = 1e-4 epochs = 5

2、使用界面
接下來呢,就是關(guān)于使用界面的實(shí)現(xiàn)思路介紹了。使用界面就是為了方便對(duì)模型使用不是很了解的小伙伴使用的。如下所示,可以看到我們只需要點(diǎn)擊兩個(gè)按鈕就可以使用了。

這里的實(shí)現(xiàn)呢,主要采用的是Flask進(jìn)行開發(fā)的,以前的版本是采用java的方式開的,使用起來不但笨重,同時(shí)模型識(shí)別的速度還比較的慢。最要命的是,搭建環(huán)境也是讓人頭疼的一件事。所以這次我給整個(gè)項(xiàng)目做了優(yōu)化。主要就是提高模型的識(shí)別速度,同時(shí)讓使用者擁有良好的使用體驗(yàn)。
系統(tǒng)主要架構(gòu)如下圖所示:

其實(shí)比較簡(jiǎn)單,其實(shí)也就4步:
第一步:就是給通過使用端選擇需要識(shí)別的圖片數(shù)據(jù)
第二步:給數(shù)據(jù)傳到指定目錄下,然后給模型識(shí)別使用
第三步:模型進(jìn)行識(shí)別
第四步:給識(shí)別結(jié)果以網(wǎng)頁的方式進(jìn)行展示,這里做的是四分類的任務(wù),所以主要設(shè)計(jì)了四個(gè)網(wǎng)頁。還有一個(gè)就是出現(xiàn)意外狀況的test.html
我舉一個(gè)例子:比如我們輸入的圖片是廚房的垃圾圖片,那么模型識(shí)別以后給識(shí)別結(jié)果交給Flask代碼,F(xiàn)lask代碼會(huì)根據(jù)對(duì)應(yīng)的識(shí)別結(jié)果給跳轉(zhuǎn)到kitch.html界面中,最后的結(jié)果如下所示,可以看到的有識(shí)別結(jié)果還有識(shí)別的圖片,以及對(duì)于相應(yīng)的垃圾的分類的定義還有一些小貼士。
Flask的主要代碼如下:
`uploaded_file = request.files['file']
? ? file_name = uploaded_file.filename
? ? if not os.path.exists(UPLOAD_FOLDER):
? ? ? ? os.makedirs(UPLOAD_FOLDER)

# get file path
? ? file_path = os.path.join(UPLOAD_FOLDER, file_name)

# write image to UPLOAD_FOLDER
? ? with open(file_path, 'wb') as f:
? ? ? ? f.write(uploaded_file.read())`
下面的代碼主要就是獲取到form傳遞過來的圖片數(shù)據(jù),然后整個(gè)代碼就會(huì)給數(shù)據(jù)上傳到指定的文件夾下面。

最后說明:
由于筆者能力有限,所以在描述的過程中難免會(huì)有不準(zhǔn)確的地方,還請(qǐng)多多包含!
更多NLP和CV文章以及完整代碼請(qǐng)到"陶陶name"獲取。
項(xiàng)目實(shí)戰(zhàn)持續(xù)更新,大家加油!!!!

總結(jié)

以上是生活随笔為你收集整理的深度学习项目实战:垃圾分类系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。