2021 BDCI 華為零售商品識(shí)別競(jìng)賽一等獎(jiǎng)方案分享

【GiantPandaCV導(dǎo)語(yǔ)】上學(xué)期快結(jié)束的時(shí)候參加了華為和CCF組織的零售商品識(shí)別的比賽,隊(duì)伍名稱為GiantPandaCV隊(duì),比賽大約持續(xù)了兩個(gè)月,期間從開始摸索MindSpore框架,配置環(huán)境,上手ModelArts花費(fèi)了不少功夫?,F(xiàn)在比賽終于告一段落,本文進(jìn)行一下復(fù)盤。
背景
CCF大數(shù)據(jù)與計(jì)算智能大賽(CCF Big Data & Computing Intelligence Contest,簡(jiǎn)稱CCF BDCI)由中國(guó)計(jì)算機(jī)學(xué)會(huì)于2013年創(chuàng)辦。大賽由國(guó)家自然科學(xué)基金委員會(huì)指導(dǎo),是大數(shù)據(jù)與人工智能領(lǐng)域的算法、應(yīng)用和系統(tǒng)大型挑戰(zhàn)賽事。大賽面向重點(diǎn)行業(yè)和應(yīng)用領(lǐng)域征集需求,以前沿技術(shù)與行業(yè)應(yīng)用問(wèn)題為導(dǎo)向,以促進(jìn)行業(yè)發(fā)展及產(chǎn)業(yè)升級(jí)為目標(biāo),以眾智、眾包的方式,匯聚海內(nèi)外產(chǎn)學(xué)研用多方智慧,為社會(huì)發(fā)現(xiàn)和培養(yǎng)了大量高質(zhì)量數(shù)據(jù)人才。
本賽題識(shí)別對(duì)象是零售商品,使用的數(shù)據(jù)集是RP2K數(shù)據(jù)集,RP2K是品覽基于零售商品識(shí)別能力發(fā)布的零售數(shù)據(jù)集。不同于一般聚焦新產(chǎn)品的數(shù)據(jù)集,RP2K收錄了超過(guò)50萬(wàn)張零售商品貨架圖片,商品種類超過(guò)2000種,該數(shù)據(jù)集是目前零售類數(shù)據(jù)集中產(chǎn)品種類數(shù)量TOP1,同時(shí)所有圖片均來(lái)自于真實(shí)場(chǎng)景下的人工采集,針對(duì)每種商品,我們提供了十分詳細(xì)的注釋。
RP2K數(shù)據(jù)集(https://arxiv.org/pdf/2006.12634.pdf)具有以下特性:
(1) 迄今為止,就產(chǎn)品類別而言,它是規(guī)模最大的數(shù)據(jù)集。
(2) 所有圖片均在實(shí)體零售店人工拍攝,自然采光,符合實(shí)際應(yīng)用場(chǎng)景。
(3) 為每個(gè)對(duì)象提供了豐富的注釋,包括大小、形狀和味道/氣味。
數(shù)據(jù)分析
數(shù)據(jù)集中的一些樣本如下圖所示,大部分分布是細(xì)長(zhǎng)的,長(zhǎng)寬分布要比ImageNet等數(shù)據(jù)集更加分布不均勻:

此外,該數(shù)據(jù)集的數(shù)據(jù)量和類別數(shù)量也非常多,下圖展示了RP2K和其他零售數(shù)據(jù)集的對(duì)比,RP2K具有2388個(gè)類別的零售商品,屬于大規(guī)模分類問(wèn)題。

此外,數(shù)據(jù)集某一些類間分布差異較小,相同品牌不同子產(chǎn)品之間差異較小,可以歸屬為細(xì)粒度分類問(wèn)題。數(shù)據(jù)質(zhì)量也存在一定的問(wèn)題,比如光照,包裝差異,拍攝角度,標(biāo)注錯(cuò)誤等等問(wèn)題。

經(jīng)過(guò)統(tǒng)計(jì),該數(shù)據(jù)集呈現(xiàn)明顯的長(zhǎng)尾分布:

數(shù)據(jù)預(yù)處理
1. Resize策略
Structure-Retention Resize策略,保留原有的結(jié)構(gòu)化信息。性能上能夠提升3個(gè)百分點(diǎn),如下圖所示,也就是padding黑邊的方式。這個(gè)策略在比賽初期是最有效的策略,比傳統(tǒng)的resize方法能夠提高3.17個(gè)百分點(diǎn)。

2. 數(shù)據(jù)增強(qiáng)
我們測(cè)試了三種經(jīng)典的數(shù)據(jù)增強(qiáng)方法:
- Cutout數(shù)據(jù)增強(qiáng)策略,在隨機(jī)位置Crop正方形Patch。
- AutoAugmentation策略,使用了針對(duì)ImageNet搜索得到的策略。
- Random Erasing策略,隨機(jī)擦除原圖中的一個(gè)矩形區(qū)域,將區(qū)域內(nèi)部像素值替換為隨機(jī)值。
實(shí)驗(yàn)效果如下:

3 后處理方法FixRes
采用了NIPS19年Facebook提出的FixRes的后處理技巧,ImageNet上經(jīng)典的數(shù)據(jù)增強(qiáng)方式會(huì)導(dǎo)致訓(xùn)練時(shí)和測(cè)試時(shí)的模型看到的目標(biāo)尺寸出現(xiàn)差異。
之前寫過(guò)一篇文章解讀FixRes詳細(xì)內(nèi)容可以看這里:
xxx
https://blog.csdn.net/DD_PP_JJ/article/details/121202386?spm=1001.2014.3001.5501
簡(jiǎn)單來(lái)說(shuō)是由于ImageNet經(jīng)典的數(shù)據(jù)處理方法會(huì)導(dǎo)致Region of Classification,即模型看到的目標(biāo)尺寸不同。

可以看到,下圖中通過(guò)訓(xùn)練和測(cè)試過(guò)程得到的“7喜”的logo標(biāo)志大小存在差異,為了彌補(bǔ)兩者差異,最簡(jiǎn)單的方式是提高測(cè)試過(guò)程中分辨率。

FixRes有三步流程:
- 第一步,正常以224分辨率進(jìn)行訓(xùn)練
- 第二步,將測(cè)試分辨率調(diào)高到280
- 第三步,固定backbone,只對(duì)Linear層進(jìn)行finetune。
具體實(shí)驗(yàn)結(jié)果如下:

模型改進(jìn)
1 模型選擇
由于數(shù)據(jù)集規(guī)模比較大,為了快速測(cè)試各個(gè)模型的有效性,使用了50%的數(shù)據(jù)進(jìn)行快速驗(yàn)證,驗(yàn)證選擇的模型包括:
- ResNet50_BAM
- ResNet50
- ResNet101
- ResNet_CBAM
- SEResNet50
- Swin Transformer
- EfficientNet
- SEResNeXt50
- Inception_resnet_v2
我們最終選擇了SEResNeXt50作為主要模型,并配合ResNet50_CBAM還有Inception_resNet_v2進(jìn)行模型集成。Swin Transformer和EfficientNet兩個(gè)模型由于其運(yùn)行速度太慢,在比賽時(shí)間限制下沒有使用兩者。

SEResNeXt模型由兩部分構(gòu)成
- ResNeXt在ResNet基礎(chǔ)上引入了基數(shù), 通過(guò)引入組卷積讓模型能夠?qū)W到更diverse的表示。
- Squeeze & Excitation Module讓模型能夠自適應(yīng)地調(diào)整各個(gè)通道的重要程度,學(xué)習(xí)到了通道之間的相關(guān)性,提升模型表達(dá)能力。
2 模型改進(jìn)
模型改進(jìn)部分是一個(gè)簡(jiǎn)單而符合直覺的方法,我們觀察到,現(xiàn)有的大部分模型都是針對(duì)ImageNet進(jìn)行設(shè)計(jì)的,而ImageNet類別數(shù)為1000個(gè)類別,但RP2K數(shù)據(jù)集規(guī)模比較大,擁有2388個(gè)類別。

我們關(guān)注大多數(shù)模型的最后一個(gè)linear層的設(shè)計(jì),針對(duì)ImageNet設(shè)計(jì)的模型的Linear層通常由2048維度映射到1000維度,由高緯度映射到低緯度比較合理。
但是由于RP2K的規(guī)模較大,類別數(shù)量為2388,直接由2048映射至2388可能會(huì)導(dǎo)致容量不夠的問(wèn)題,由低緯度映射映射至高緯度則不太符合直覺。
針對(duì)此,我們進(jìn)行了簡(jiǎn)單而符合直覺的改進(jìn),如下圖所示:


通過(guò)以上改進(jìn),擴(kuò)充了模型的容量,取得了0.26%的提升。

3. 模型訓(xùn)練細(xì)節(jié)
使用label smooth來(lái)降低過(guò)擬合,更好地處理難分樣本。
優(yōu)化器使用SGD init lr=0.1
調(diào)度器: Cosine Annealing mini lr=1e-6
Batch Size: 128 Epoch: 75
混合精度:GPU O2 Ascend O3
模型集成:(本次比賽不允許集成,但是這里也展示了一下集成的效果)
SEResNeXt50(96.94)+ResNet50BAM(97.24%)+Inception_resnet_v2(96.35%) + TTA(HorionFlip) = 97.49% top1
錯(cuò)例分析

在林臻幫助下,手工分析了一下錯(cuò)誤樣例(注:以上分析去除了others類別錯(cuò)分樣本),可以發(fā)現(xiàn)這個(gè)數(shù)據(jù)集比較難處理的是細(xì)粒度帶來(lái)的識(shí)別困難、疑似數(shù)據(jù)標(biāo)注錯(cuò)誤、以及長(zhǎng)尾分布的尾部類別,這也符合我們數(shù)據(jù)分析的結(jié)論。
MindSpore框架使用感受
本次比賽面向國(guó)產(chǎn)AI框架,基于MindSpore開發(fā)商品識(shí)別算法,必須在昇騰910平臺(tái)訓(xùn)練和部署模型,以官方復(fù)現(xiàn)結(jié)果為準(zhǔn)。
使用MindSpore的感受:
優(yōu)點(diǎn):
最大的優(yōu)點(diǎn),與昇騰平臺(tái)兼容好,訓(xùn)練效率比較高。我們這邊沒有昇騰平臺(tái),大部分實(shí)驗(yàn)在GPU上跑的,后期進(jìn)行驗(yàn)證的過(guò)程中發(fā)現(xiàn),GPU上運(yùn)行速度要遠(yuǎn)低于昇騰平臺(tái)運(yùn)行速度(同一套代碼,唯一區(qū)別可能是O2與O3的區(qū)別),大概速度上能快接近一倍。
支持動(dòng)態(tài)圖和靜態(tài)圖,動(dòng)態(tài)圖方面進(jìn)行調(diào)試,靜態(tài)圖運(yùn)行效率更高。
社群友好,加入了MindSpore高校網(wǎng)絡(luò)調(diào)試聯(lián)盟,其中負(fù)責(zé)復(fù)現(xiàn)Swin Transformer的作者@項(xiàng)靖陽(yáng)等人的指點(diǎn),在我們遇到一些坑的過(guò)程中能快速跳出來(lái)。
快速開發(fā),在擁有Pytorch經(jīng)驗(yàn)的基礎(chǔ)上,轉(zhuǎn)到MindSpore之后結(jié)合API查詢,可以比較快上手。
數(shù)據(jù)預(yù)處理部分與PyTorch不同的是,MS提供了c_transforms和py_transforms,經(jīng)過(guò)實(shí)測(cè)c_transforms在數(shù)據(jù)處理速度上要比py_transforms快非常多,如果沒有特殊需要,還是建議使用c_transforms。
缺點(diǎn):說(shuō)幾個(gè)開發(fā)過(guò)程中缺點(diǎn)
- 預(yù)訓(xùn)練模型不太友好,個(gè)人感覺model zoo支持模型比較少,甚至有一部分?jǐn)?shù)量的權(quán)重是基于CIFAR10訓(xùn)練的,并沒有ImageNet訓(xùn)練的模型,如果需要用的話還需要將PyTorch的權(quán)重轉(zhuǎn)換過(guò)來(lái)才能使用。
- 動(dòng)態(tài)圖運(yùn)行效率非常低,這個(gè)坑浪費(fèi)了我?guī)缀跻惶斓臅r(shí)間,調(diào)試的過(guò)程中忘記將動(dòng)態(tài)圖轉(zhuǎn)化為靜態(tài)圖了,然后發(fā)現(xiàn)運(yùn)行時(shí)間翻倍,仔細(xì)一看GPU利用率非常低,仔細(xì)排查以后發(fā)現(xiàn)使用的是動(dòng)態(tài)圖。由此看來(lái)MS的動(dòng)態(tài)圖支持(GPU上的)效率不是很高,我們轉(zhuǎn)化為靜態(tài)圖之后瞬間利用率高了很多。
- 封裝過(guò)程略深,官方推薦的運(yùn)行方式其實(shí)更接近于Keras,構(gòu)建callbacks來(lái)完成訓(xùn)練過(guò)程的處理。(當(dāng)然官方也支持像PyTorch那種展開的寫法)
最后對(duì)MindSpore感興趣的小伙伴可以使用以下的參考資料快速上手:
MindSpore 安裝問(wèn)題:https://www.mindspore.cn/install
最直接的學(xué)習(xí)資料,官方教程: https://www.mindspore.cn/tutorials/zh-CN/r1.5/index.html
最簡(jiǎn)單的分類例程:https://www.mindspore.cn/docs/programming_guide/zh-CN/master/quick_start/quick_video.html
可白嫖的模型模型庫(kù):https://gitee.com/mindspore/models
開源代碼
GiantPandaCV隊(duì)比賽的全部源碼已經(jīng)開源,收集了非常多的模型,歡迎嘗試MindSpore框架。

Github地址:https://github.com/pprp/GoodsRecognition.MindSpore
Gitee地址:https://gitee.com/pprp/GoodsRecognition.MindSpore


