人脸口罩检测现开源PyTorch、TensorFlow、MXNet等全部五大主流深度学习框架模型和代码...
號外!號外!
現在,AIZOO開源PyTorch、TensorFlow、MXNet、Keras和Caffe五大主流深度學習框架的人臉檢測模型和代碼啦!
先附上Github鏈接為敬。
https://github.com/AIZOOTech/FaceMaskDetection
前兩天,AIZOO開源的近8000張人臉口罩數據和模型,得到了很多朋友的積極反饋,也有很多朋友留言贊賞我們的開源精神。其中一位粉絲朋友說:“公開這么多數據,你好無私啊”,一句話,瞬間讓元峰標注數據的痛苦煙消云散了。
但是,筆者開源的是Keras和Caffe版本,有更多的朋友發消息告訴我說,如果開源PyTorch版本就好了,畢竟,PyTorch是當今科研圈最流行的深度學習框架了。還有粉絲朋友私信元峰要TensorFlow版本。對此,元峰讓明星范偉替我回答一下,請看下面小視頻。
對于人臉口罩檢測模型和數據的基本說明,因為前文已經做了介紹,這里不再額外贅述,有需要的朋友請閱讀AIZOO周三發表的《AIZOO開源人臉口罩檢測數據+模型+代碼+在線網頁體驗,通通都開源了》這篇文章。本文,我們重點介紹一下各大深度學習框架之間的轉換方法,尤其是目標檢測模型如何互轉。
1
模型轉換工具介紹
這都2020年了,深度學習也經歷了八年的蓬勃發展。這八年,深度學習可以說是人工智能領域最璀璨的一顆明星。過去的近十年,有眾多的深度學習框架誕生——Torch、Theao、Caffe、TensorFlow、Keras、MXNet、PyTorch、CNTK、Chainer、Deepleaning4Java以及百度的PaddlePaddle等,可以說這些優秀的框架極大的方便了學者和工程師進行學術研究以及工業實現,也極大的促進了AI領域的發展,對此,我們應該向這些發布框架的作者們說一聲致謝。
不過,深度學習經過這幾年的發展和沉淀,深度學習框架的頭部聚集效應越來越明顯。Theano和Caffe在發布1.0版本后便停止了官方更新,Chainer母公司在2019年12月宣布轉向PyTorch,MXNet雖然擁有李沐等大神,背靠Amazon大山,但一直不溫不火;百度的Paddle最近仍然在頑強的掙扎,瘋狂的做推廣,大有一副“扶我起來,我還能戰”的態勢。而曾經一時風頭無兩的TensorFlow,也在自己的作死中漸失人心(主要是1.x版本的時候API太過混亂,僅一個conv2d,在slim、tf.layers、tf.contrib、tf.nn中參數名字和風格都很不一樣)。當然,因為TensoFlow對Linux、Windows、安卓、iOS、嵌入式和JavaScript都有很好的支持,所以還是工業界應用非常廣泛的一個框架,我們的官網AIZOO.com里面的算法,都是使用TensorFlow.js做的。
目前,學術界越來越傾向于使用小清新PyTorch了。這也是為什么元峰開源Keras和Caffe的模型后,不少學術界的朋友找我要PyTorch模型了。至于為什么當今PyTorch和TensorFlow逐漸成雙雄鼎力之勢,我想有一大原因是深度學習的基礎構成,例如卷積、池化、BatchNorm等基本部件已經基本定型,各大框架都提供基本相同的功能,這時候,就是誰的代碼風格和易用性更優,誰就更容易勝出了?;鞠嗤牟考δ?#xff0c;帶來一個益處就是我們使用一個框架訓練好后,可以較為方便的轉為其他框架的模型。元峰是用Keras訓練的模型,但是可以無誤差的轉成了Caffe、TensorFlow、PyTorch、MXNet模型。
模型轉換,其實本質上就是從原模型里面讀取拓撲結構和權重,使用目標框架構建同樣的拓撲結構,并把權重賦值給新構建的網絡,這樣,使用目標框架構建的模型就可以與原模型具有一樣的輸出值。
一個非常好用的模型轉換工具是微軟亞洲研究院開源的MMdnn,其基本的原理是將所有不同的框架,都轉為一種叫做“中間表示”(Intermediate和Representation,簡稱為IR)的拓撲和權重文件,然后使用這個中間表示生成目標框架的模型。其基本原理如下圖所示:
對于普通的分類和分割網絡,一般情況下,使用一條命令,就可以使用MMdnn都可以很方便的進行模型轉換。下面是一個實例,可以說非常簡單了。
2
目標檢測模型轉換經驗
對于普通的模型,MMdnn可以很方便的轉換,但是,如果那么簡單,筆者豈不是早就可以開源五大框架的模型了嗎。這其中,設計到一個很棘手的地方。
大家應該知道,對于TensorFlow和Keras,其默認的數據表示順序為NHWC,也就是[batch, height, width, channel]格式,但是,對于Caffe、PyTorch和MXNet三兄弟,卻都是NCHW格式的,也就是通道在第二個維度。這一點,MMdnn當然知道,所以對于普通的模型,放心轉就可以了。但是,對于SSD、Yolo 系列包括Anchor Free的模型,就需要注意了。
熟悉目標檢測的朋友們都知道,對于目標檢測的一個定位分類層,假設其特征圖是4x4大小,一共需要識別兩類的話(假設需要檢測貓和狗,如下圖),而每個特征圖上有三組anchor的話,那么定位分類層的分類部分的卷積層輸出通道數,為2x3=6個通道,那么使用TensorFlow和Keras,這一個分類層的輸出矩陣為[N, 4, 4, 6], 前面的N為batch size大小,而對于其他三大框架,則是通道在第二維度,即為[N,6,?4,?4]。
對于SSD和YoloV3等框架,具有多個定位層,一般我們都會在模型內部將其拼接起來,也就是concatanate起來。假設有兩個定位層,特征圖大小分別為8x8和4x4,則輸出分類層特征圖為[N, 8,?8, 6]和[N, 4,?4, 6],這樣兩個矩陣,因為有兩個維度的大小都不同,所以無法直接concatanate,因此一般需要reshape,也就是將第二和第三維展開成一個維度,將最后一個維度分裂為以2個一組(就是類別數)的片段,以[N, 8,?8, 6]為例,即將它reshape為[N, 8*8*3, 2],也就是[N, 192, 2]的矩陣,對于[N, 4,?4,?6]這個特征圖,reshape為[N, 48,2]的矩陣。這樣,兩個矩陣[N, 192, 2]、[N, 48,2]就可以通過第二維度進行拼接成為一個[N, 240, 2]的矩陣。
使用TensorFlow和Keras框架,對于多個定位分類層,只需要reshape,然后concatanate就可以了。但是,對于其他三大框架,因為他們通道在第二個維度,為了獲得一致的結果,所以一般需要在reshape前,將通道轉置到最后一個維度,然后再reshape和concatanate。
但是,MMdnn并!不!知!道!在reshape前需要做一個transpose的操作,它在轉換模型的時候,還是使用(N, -1, ?2)這個reshape參數,結果就是完全錯誤的了。
這是對于目標檢測模型,使用通道在后的TensorFlow、Keras轉PyTorch、Cafffe等通道在前的框架時候,需要特別注意的地方。
下面筆者寫一下Keras轉各個框架的心酸歷程,看完,各位朋友請幫我轉發一下朋友圈或者點個再看唄。(公眾號剛開,關注數還很少,對不住我一把辛酸淚啊!)
Keras轉TensorFlow
因為Keras的后端一般就是TensorFlow,所以Keras轉TensorFlow就很容易了。
加載Keras模型后,可以獲取session,然后從session中讀取圖結構,保存成TensorFlow的圖結構就完事了。核心代碼如下:
Keras轉Caffe
因為上面提到的通道的原因,使用MMdnn轉換不成功,因此元峰是使用自己寫的一個工具轉成Caffe的,原理就是讀Keras模型的拓撲,構建Caffe的層拓撲結構,然后把權重賦值給新網絡,就完事了。這個代碼,后面整理好了會開源(主要是代碼現在不優雅,對于有強迫癥的人是做不到開源丑陋的代碼的)。
? Keras轉PyTorch
? ?
使用MMdnn,可以生成PyTorch的結構代碼文件和權重,但是,不要忘了前面提到的通道問題,筆者在五個定位分類層,需要transpose的地方,手動加入了transpose操作。
以第一組定位分類層為例,請注意其中的permute操作,permute也就是本文提到的transpose。具體可以看我們開源的代碼,有完整的網絡構建代碼。
cls_0_reshape = torch.reshape(input = cls_0_conv.permute(0,2,3,1) , shape = (cls_0_conv.size(0),-1,2))loc_0_reshape???=?torch.reshape(input?=?loc_0_conv.permute(0,2,3,1)?,?shape?=?(loc_0_conv.size(0),-1,4))Keras轉MXNet
這個是元峰花時間最長的一個,花了一天多時間,因為筆者也不太懂MXNet。我嘗試了各種方法,使用Keras模型轉,使用PyTorch、TensorFlow和Caffe,都不能成功的轉成MXNet模型。
中間,我無數次想放棄了,畢竟MXNet用戶量并不大。但是,因為我一直覺得只有集齊五大主流框架,才能夠召喚神龍,如果只有四個,我怎么召喚呢,我也對不起使用MXNet的朋友啊;另外,我一直覺得,李沐團隊寫的《動手學深度學習》一書,是非常贊的(請私下給元峰打廣告費)。所以,我強迫自己努力實現MXNet的模型。
具體是怎么做的呢??其實很簡單,筆者簡單的學了一下MXNet,使用MXNet的Gluon接口,實現了跟Caffe模型一模一樣的結構,然后,寫個函數,將權重給MXNet模型賦過去,索性沒遇到什么大坑,Caffe和MXNet模型輸出一模一樣,謝天謝地。
至此,元峰終于集齊了五大主流深度學習框架的模型,可以召喚神龍了。
不過玩笑歸玩笑,集齊五大框架的模型,還是挺辛苦的,所以,元峰請大家幫忙把本文轉發到AI交流群,或者朋友圈,或者給俺點個再看吧。畢竟,剛立志創業,遇上這個疫情環境,真是倒了霉了。大門出不去,那就讓元峰的AIZOO公眾號多積累一些粉絲吧。
最后,元峰再次謝謝粉絲朋友們了。
3
開源資料獲取
最后,是我們開源的相關資料的獲取方式。
數據下載地址(在公眾號后臺回復“口罩數據集”也可以)
百度網盤鏈接: https://pan.baidu.com/s/1nsQf_Py5YyKm87-8HiyJeQ?
提取碼: eyfz
開源五大主流深度學習模型和代碼鏈接
????????https://github.com/AIZOOTech/FaceMaskDetection
在線體驗鏈接
https://aizoo.com/face-mask-detection.html
☆ END ☆
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習在線手冊深度學習在線手冊AI基礎下載(pdf更新到25集)備注:加入本站微信群或者qq群,請回復“加群”獲取一折本站知識星球優惠券,請回復“知識星球”喜歡文章,點個在看
總結
以上是生活随笔為你收集整理的人脸口罩检测现开源PyTorch、TensorFlow、MXNet等全部五大主流深度学习框架模型和代码...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【NLP傻瓜式教程】手把手带你RNN文本
- 下一篇: 疫情之下,将业务迁移至云端会是一个正确的