深度学习之图像分类
第一篇CSDN文章,寫的不好,還請各位大佬指正。萬事開頭難,千里之行始于足下!
1.什么是圖像分類
圖像分類,核心是從給定的分類集合中給圖像分配一個標簽的任務。實際上,這意味著我們的任務是分析一個輸入圖像并返回一個將圖像分類的標簽。標簽總是來自預定義的可能類別集。
示例:我們假定一個可能的類別集categories = {dog, cat, eagle},之后我們提供一張圖片(圖1)給分類系統:
圖1 圖像分類目標是根據輸入圖片且根據預定義類別分配標簽
這里的目標是根據輸入圖像,從類別集中分配一個類別,這里為eagle,我們的分類系統也可以根據概率給圖像分配多個標簽,如eagle:95%,cat:4%,panda:1%。
2.圖像分類和圖像識別的區別
圖像分類和圖像識別這兩個概念很容易搞混,很多做了幾年視覺的人也搞不清它倆的區別,在此說明他倆的區別,讓初學者少走彎路。
以人臉識別為例,假設一個班級里有20個人,用圖像分類做來區分每個學生,可以采集20個人的人臉圖片進行訓練模型分類,但是如果班級新來一個同學,我們就需要采集新來同學的圖像重新訓練模型,預測的圖像是把訓練好的模型作為特征提取器給softmax分類器做分類;而圖像識別是使用卷積網絡訓練大量人臉圖像,訓練好的模型作為特征提取器,預測的時候利用特征提取器和注冊人臉圖像計算相似度。
3.圖像分類適合什么場景
圖像中待分類物體是單一的,如上圖(1),如果圖像中包含多個目標物,如下圖(2),可以使用多標簽分類或者目標檢測算法。
4.目前圖像分類的網絡模型
常用的標準網絡模型:Lenet、Alxnet、Vgg系列、Resnet系列、Inception系列、Densenet系列、Googlenet、Nasnet、Xception、Senet(state of art)
輕量化網絡模型:Mobilenet v1,v2、Shufflenet v1,v2,Squeezenet
以上網絡模型不做具體說明,網絡博客很多,如有不懂,可加我微信:JGQ863995835
目前輕量化模型在具體項目應用時用的比較廣泛:
優點:(1)參數模型小,方便部署(2)計算量小,速度快
缺點:(1)輕量化模型在精度上沒有Resnet系列、Inception系列、Densenet系列、Senet的accuracy高
如果使用Finetune tricks,輕量化模型也能達到上述模型精度的水平,所以在此力推輕量化模型。
(注:我個人在項目中常用的網絡模型resnet系列、mobilenet v2、lenet,不要小瞧lenet,在工業領域絕對大殺器,自然場景不適用。我自己改進lenet的模型,在項目應用中比lenet高3%,大家可以參考:https://github.com/machine52vision/Imporve-lenet
5.圖像分類中的tricks
利用好tricks可以有效改善模型精度,下面介紹各種方法
方法一:魔改網絡結構
(1)使用resnet的shortcut方法
(2)使用Inception 多尺度卷積核
(3)使用convolution的stride代替pool層
(4)使用正則化方法Batch normalization、Layer normalization、Instance normalization、Group Normalization;如果使用多GPU可以使Synchronized Batch Normalization
(5)對于不規則目標使用deform convolution
(6)輕量化模型使用group convolution
(7)小卷積核大視野使用dilate convolution
(8)去掉線性層使用全卷積層
(9)如果使用線性層,使用一維的Normalization,可以加快收斂并且(此方法其他網絡沒有)
方法二:模型初始化
(1)如果不使用finetune方法,盡量不使用隨機初始化,推薦kaiming方法初始化,是xavier的改進版;
(2)大力推薦finetune方法,少量數據就可達到較高的accuracy;
方法三:損失函數和優化器
(1)一般分類使用softmax+Cross Entropy損失,MSE(均方誤差)由于非凸函數,盡量不使用
(2)優化器推薦又快又好的AdaBound(新鮮出爐的算法,比SGD快,比Adam好,反正是又快又好!!!)
方法四:學習率調整
(1)Warmup
(2)Linear scaling learning rate
(3)力薦cosine learning rate或ReduceLROnPlateau learing rate
方法五:激活函數
(1)sigmoid,tanh由于后期梯度消失或者梯度很小,導致收斂比較慢,盡量不使用;
(2)推薦relu及其各種改進版本,Elus、Leaky relu、Slus、PRelu、RRule等;
方法六:數據擴增方法
(1)Random image cropping and patching (RICP)
(2Cutout
(3)Mixup train
(4)隨機旋轉
(5)上下、左右flip
(6)調整亮度、對比度、飽和度
(7)其他各種裁剪方法
方法七:其他方法
(1)Knowledge distillation
(2)batch size不要設置太大(收斂慢),也不要太小(梯度隨機性大),依據經驗在224*224圖像,在現存不溢出的時候,batch size=64。
(3)使用finetune方法,一般epoch=10左右就可達到很高的accuracy;如果不使用finetune方法,一般epoch=50~100左右(以上是根據工程經驗,數據集在幾萬張,類別小于100的情況下,如果誤導,還請指正)
(4)對權重使用L2正則化,可以有效抑制過擬合
(5)Momentum一般設置0.9,根據前10次梯度方向向量的經驗來加上此次的梯度方向向量來更新梯度(防止梯度突變;1/(1-0.9)=10)
(6)label smooth
以上是我依據工程項目經驗的一些心得,如果寫的有誤還請多多包涵并指出!喜歡可關注我微信公眾號:52機器視覺
下一篇會介紹深度學習之目標檢測,這是一個大坑
總結
- 上一篇: linux PROC文件系统详解
- 下一篇: React开发(200):三种截取字符串