【图像分类】 基于Pytorch的细粒度图像分类实战
歡迎大家來(lái)到《圖像分類》專欄,今天講述基于pytorch的細(xì)粒度圖像分類實(shí)戰(zhàn)!
作者&編輯 | 郭冰洋
1 簡(jiǎn)介
針對(duì)傳統(tǒng)的多類別圖像分類任務(wù),經(jīng)典的CNN網(wǎng)絡(luò)已經(jīng)取得了非常優(yōu)異的成績(jī),但在處理細(xì)粒度圖像數(shù)據(jù)時(shí),往往無(wú)法發(fā)揮自身的最大威力。
這是因?yàn)榧?xì)粒度圖像間存在更加相似的外觀和特征,同時(shí)在采集中存在姿態(tài)、視角、光照、遮擋、背景干擾等影響,導(dǎo)致數(shù)據(jù)呈現(xiàn)類間差異性大、類內(nèi)差異性小的現(xiàn)象,從而使分類更加具有難度。
為了改善經(jīng)典CNN網(wǎng)絡(luò)在細(xì)粒度圖像分類中的表現(xiàn),同時(shí)不借助其他標(biāo)注信息,人們提出了雙線性網(wǎng)絡(luò)(Bilinear CNN)這一非常具有創(chuàng)意的結(jié)構(gòu),并在細(xì)粒度圖像分類中取得了相當(dāng)可觀的進(jìn)步。
本次實(shí)戰(zhàn)將通過(guò)CUB-200數(shù)據(jù)集進(jìn)行訓(xùn)練,對(duì)比經(jīng)典CNN網(wǎng)絡(luò)結(jié)構(gòu)和雙線性網(wǎng)絡(luò)結(jié)構(gòu)間的差異性。
2 數(shù)據(jù)集
首先我們回顧一下在多類別圖像分類實(shí)戰(zhàn)中所提出的圖像分類任務(wù)的五個(gè)步驟。其中,在整個(gè)任務(wù)中最基礎(chǔ)的一環(huán)就是根據(jù)數(shù)據(jù)集的構(gòu)成編寫相應(yīng)的讀取代碼,這也是整個(gè)訓(xùn)練的關(guān)鍵所在。
本次實(shí)戰(zhàn)選擇的數(shù)據(jù)集為CUB-200數(shù)據(jù)集,該數(shù)據(jù)集是細(xì)粒度圖像分類領(lǐng)域最經(jīng)典,也是最常用的一個(gè)數(shù)據(jù)集。共包括annotations、attributes、attributes-yaml、images、lists五個(gè)文件夾。
此次實(shí)戰(zhàn)中,我們只利用數(shù)據(jù)集提供的類別標(biāo)注信息。因此只需要關(guān)注lists文件夾下的train.txt和test.txt文件即可。
通過(guò)圖片我們可以看到,兩個(gè)txt文件中給出了不同圖片的相對(duì)路徑,而開頭數(shù)字則代表了對(duì)應(yīng)的標(biāo)記信息,但是pytorch中的標(biāo)簽必須從0開始,因此我們只需要借助strip和split函數(shù)即可完成圖像和標(biāo)簽信息的獲取。
# txt文件路徑
path = '/media/by/Udata/Datasets/bird/lists/train.txt'
txt = open(path,'r')
imgs = []
# 讀取每行信息
? ?line = line.strip('\n')
? ?# 將每行內(nèi)容以'.'為標(biāo)記劃分
? ?# 添加至列表
輸出結(jié)果示例如下圖所示:
此時(shí)我們只需要將上述模塊融合進(jìn)pytorch的數(shù)據(jù)集讀取模塊即可,代碼如下:
class cub_dataset(Dataset):
? ?def __init__(self, transform):
????????'/media/by/Udata/Datasets/bird/lists/train.txt', 'r')
????? ? '/media/by/Udata/Datasets/bird/images/' + fn)
3 網(wǎng)絡(luò)搭建
本次實(shí)戰(zhàn)主要選取了經(jīng)典Resnet 50網(wǎng)絡(luò)結(jié)構(gòu)和基于Resnet 50的雙線性網(wǎng)絡(luò)結(jié)構(gòu)。
Resnet 50作為經(jīng)典的分類網(wǎng)絡(luò),其結(jié)構(gòu)不再贅述,在此詳細(xì)介紹一下雙線性網(wǎng)絡(luò)的構(gòu)建。
如上圖所示,雙線性網(wǎng)絡(luò)包括兩個(gè)分支CNN結(jié)構(gòu),這兩個(gè)分支可以是相同的網(wǎng)絡(luò),也可以是不同的網(wǎng)絡(luò),本次實(shí)戰(zhàn)使用Resnet 50做為相同的分支網(wǎng)絡(luò),以保證對(duì)比的客觀性。
在此網(wǎng)絡(luò)下將圖像送入兩個(gè)分支Resnet 50之后,把獲取到的兩個(gè)特征分支進(jìn)行相應(yīng)的融合操作。
具體代碼如下:
class Net(nn.Module):
??????????????????????????????????????????????????????resnet50().bn1,?
???? ???????????????????????????????????????????????? resnet50().relu,?
????????????????????????????????????????????????????? resnet50().maxpool,?
????????????????????????????????????????????????????? resnet50().layer1,
????????????????????????????????????????????????????? resnet50().layer2,
??????????????????????????????????????????????????????resnet50().layer3,
??????????????????????????????????????????????????????resnet50().layer4)
? ? ? ?torch.transpose(x, 1, 2)) / 28 ** 2).view(batch_size, -1)
??????????????torch.sqrt(torch.abs(x) + 1e-10))
? ? ? ?x = self.classifiers(x)
4 訓(xùn)練及參數(shù)調(diào)試
損失函數(shù)選擇交叉熵?fù)p失函數(shù),優(yōu)化方式選擇SGD優(yōu)化。初始學(xué)習(xí)率設(shè)置為0.01,batch size設(shè)置為8,衰減率設(shè)置為0.00001,迭代周期為20,采用top-5評(píng)價(jià)指標(biāo)
最終的訓(xùn)練結(jié)果如下圖所示:
Resnet 50最終取得的準(zhǔn)確率約52%左右,而基于Resnet 50的雙線性網(wǎng)絡(luò)取得了近80%的準(zhǔn)確率,由此可見(jiàn)不同的網(wǎng)絡(luò)在細(xì)粒度分類任務(wù)上的性能差異非常巨大。
項(xiàng)目代碼:發(fā)送“細(xì)粒度分類”到有三AI公眾號(hào)后臺(tái)可獲取。
總結(jié)
以上就是整個(gè)細(xì)粒度圖像分類實(shí)戰(zhàn)的過(guò)程,本次實(shí)戰(zhàn)并沒(méi)有進(jìn)行精細(xì)的調(diào)參工作,因此雙線性網(wǎng)絡(luò)的性能與原文中具有一定的差異,同時(shí)也期待大家去發(fā)掘更有效、更精準(zhǔn)的細(xì)粒度分類網(wǎng)絡(luò)哦!
有三AI夏季劃
有三AI夏季劃進(jìn)行中,歡迎了解并加入,系統(tǒng)性成長(zhǎng)為中級(jí)CV算法工程師。
轉(zhuǎn)載文章請(qǐng)后臺(tái)聯(lián)系
侵權(quán)必究
往期精選
【技術(shù)綜述】你真的了解圖像分類嗎?
【技術(shù)綜述】多標(biāo)簽圖像分類綜述
【圖像分類】分類專欄正式上線啦!初入CV、AI你需要一份指南針!
【圖像分類】從數(shù)據(jù)集和經(jīng)典網(wǎng)絡(luò)開始
【圖像分類】 基于Pytorch的多類別圖像分類實(shí)戰(zhàn)
【圖像分類】細(xì)粒度圖像分類是什么,有什么方法,發(fā)展的怎么樣
總結(jié)
以上是生活随笔為你收集整理的【图像分类】 基于Pytorch的细粒度图像分类实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【知识星球】ElementAI提出超复杂
- 下一篇: 如何系统性掌握深度学习中的数据使用