1.簡(jiǎn)介
? ? ? ?現(xiàn)在這個(gè)時(shí)代吧咽白,你說你不知道大數(shù)據(jù)晶框,不知道深度學(xué)習(xí),都不敢說自己是做軟件的蹲蒲。侵贵。】溃可是深度學(xué)習(xí)這東西吧漱抓,雖然有諸如Caffe、Torch瞬逊、Tensorflow等架構(gòu)补胚,但也不是一兩天就能入門的溶其,再者說這東西也吃硬件敦间,沒個(gè)金剛鉆,也做不好這瓷器活厢绝。
? ? ? ?不過話說回來带猴,大部分人也只是使用模型,并不會(huì)自己訓(xùn)練模型靶病。深度學(xué)習(xí)架構(gòu)中口予,資歷老沪停、“活”還好的Caffe一直被大部分人使用(貌似是大神賈楊清的博士畢設(shè)裳涛。端三。鹃彻。)。眾所周知虚婿,有個(gè)叫Caffe Model Zoo的伊甸園泳挥,里面不僅僅包括在ImageNet上訓(xùn)練的模型,還有許多別的模型剧浸,能滿足你的大部分需求唆香。傳送門:https://github.com/BVLC/caffe/wiki/Model-Zoo
? ? ? ?然而新的問題來了吨艇,怎么用模型呢?caffemodel文件是啥冯吓,prototxt又是啥疮跑?正常情況下祖娘,我們肯定是用Caffe架構(gòu)中已經(jīng)寫好的函數(shù),或者使用PyCaffe中的python接口掀潮≌裕可是你可以去嘗試配置一下Caffe。邑商。。(博主身邊有個(gè)大牛就喜歡干這種事吭从,所以復(fù)不復(fù)雜自己去試試吧)
? ? ? ?這里就需要感謝一下國(guó)外的大牛了啊恶迈,他們開發(fā)出了opencv_contrib包暇仲,里面的dnn模塊可以直接使用caffemodel。(差距啊全度。斥滤。。)
? ? ? ?最后就是博主寫這篇文章的最終原因了顶掉。挑胸。痒筒。為毛dnn模塊里不能加載均值文件,至于啥是均值文件我會(huì)在下文中講嗜暴。
2.“愛”之初體驗(yàn)
? ? ? ?有一個(gè)ImageNet-1K的數(shù)據(jù)集凸克,即數(shù)據(jù)集中共有1K個(gè)類別的實(shí)際生活中東東。那我們?nèi)绾巫寵C(jī)器進(jìn)行分類呢闷沥?分類,說白了就是讓機(jī)器告訴我這個(gè)圖片里主要是啥咐容。好舆逃,裝X開始,你只需要編譯好你的opencv_contrib(我使用的是3.2版本)包戳粒,然后ctrl+c路狮,ctrl+v鏈接中的代碼:
裝X代碼傳送門:http://docs.opencv.org/master/d5/de7/tutorial_dnn_googlenet.html
? ? ? ?當(dāng)機(jī)器返回給你space shuttle的時(shí)候蔚约,是不是非常激動(dòng)奄妨?你的機(jī)器居然認(rèn)識(shí)了航天飛機(jī),還是在你啥事沒做的情況下苹祟。砸抛。评雌。在這里我們也不去吹噓CNN為啥這么牛逼之類的,畢竟這不是本文的初衷直焙。? ? ? ? 這個(gè)時(shí)候景东,有些做過Caffe模型訓(xùn)練的人就會(huì)問了,均值文件呢奔誓?Caffe在實(shí)際訓(xùn)練的過程中斤吐,圖像的各個(gè)通道都會(huì)減去均值文件進(jìn)行訓(xùn)練,會(huì)提高速度和精度厨喂『痛耄可是為什么Opencv官方的demo里壓根就沒提及?
? ? ? ? 無奈蜕煌,去看了dnn類是如何實(shí)現(xiàn)的臼婆。。幌绍。
? ? ? ? 看完了之后颁褂,除了驚訝還是驚訝。第一個(gè)驚訝是因?yàn)榭悖尤贿€能讀Tensorlfow的checkpoint和Torch的model颁独。第二個(gè)驚訝是,壓根沒法讀取均值文件伪冰。誓酒。。它的函數(shù)就是dnn::readNetFromCaffe(const string protofile, const string model)贮聂。靠柑。。那均值文件怎么辦吓懈?
3.“愛”之思考
? ? ? ?我個(gè)人只想到兩個(gè)辦法歼冰,反正均值文件不就記錄了圖像通道中的像素值嗎,會(huì)protobuf讀取不就好了耻警?(忘了說了隔嫡,我們正常使用的均值文件都是.binaryproto文件)可惜,我并不會(huì)甘穿。腮恩。。
? ? ? ?第二個(gè)辦法就是我現(xiàn)在用的温兼,借助Caffe接口秸滴,利用PyCaffe將binaryproto轉(zhuǎn)成npy,至于這個(gè)代碼募判,網(wǎng)上一大把荡含。咒唆。。npy文件内颗,直接用np.load就好钧排。我直接把它轉(zhuǎn)成圖片存儲(chǔ)了下來,注意在存儲(chǔ)的時(shí)候均澳,需要用np.transpose(2,0,1)轉(zhuǎn)置一下恨溜,至于為啥,你用np.shape自己看看就知道了找前,這里我給出我的均值文件生成的圖像:
? ? ? ?這個(gè)時(shí)候你應(yīng)該知道我要做啥了吧糟袁,剩下來的就是把我們自己進(jìn)行測(cè)試圖片與這張圖片做減法咯,首先將這張圖片以及測(cè)試圖片resize到網(wǎng)絡(luò)的輸入尺寸躺盛,然后進(jìn)行cv::substract操作项戴。然后將這個(gè)Mat丟入到blobFromImage中就大功告成了。
? ? ? ?實(shí)際測(cè)試中槽惫,我們發(fā)現(xiàn)均值文件對(duì)分類的結(jié)果影響不是很大周叮,但是置信度提升還是有的。
? ? ? ?其實(shí)我一直想規(guī)避Caffe接口界斜,但是我個(gè)人看源碼得出的結(jié)論是無法使用均值文件的仿耽,也許是因?yàn)槲宜讲粔虬桑?/p>
4.莫名奇妙看到的
? ? ? ?前兩天剛剛考了設(shè)計(jì)模式,今天看到了有人問Caffe使用了哪種設(shè)計(jì)模式各薇?
? ? ? ?答案貌似是抽象工廠项贺。。峭判。
? ? ? ?長(zhǎng)年寫腳本語言的人开缎,看著類啊類的真是累啊累。林螃。奕删。