用两个使用Caffe的小项目案例演示迁移学习的实用性
近年來隨著深度學習的急劇升溫,不管是學術界還是工業界都把大量資源投入了深度學習。作為一個普通的工程師或者程序員,也想對機器學習,尤其是深度學習有所了解,應當如何入手?最好的回答當然是“gets your feet wet”——不下水是終究是學不會游泳的。然而,深度學習火爆的同時,帶來的一個副作用是:面對琳瑯滿目的各色名詞,初學者簡直毫無頭緒,也無從下手。特別是機器學習、深度學習,以及最近炒得很火的強化學習、遷移學習,到底是怎么一回事兒?
本文試圖以自己親自操刀的兩個項目案例演示遷移學習的實際應用,并且在篇頭以維基百科上的定義,對上述幾種機器學習作個簡單的闡明,以及做個對遷移學習的簡單科普。
遷移學習的概念
首先可以看看維基百科上關于機器學習、深度學習、強化學習和遷移學習的定義:
-
機器學習是人工智能的一個分支。人工智能的研究是從以“推理”為重點到以“知識”為重點,再到以“學習”為重點,一條自然、清晰的脈絡。顯然,機器學習是實現人工智能的一個途徑,即以機器學習為手段解決人工智能中的問題。機器學習在近30多年已發展為一門多領域交叉學科,涉及概率論、統計學、逼近論、凸分析、計算復雜性理論等多門學科。機器學習理論主要是設計和分析一些讓計算機可以自動“學習”的算法。
機器學習算法是一類從數據中自動分析獲得規律,并利用規律對未知數據進行預測的算法。因為學習算法中涉及了大量的統計學理論,機器學習與推斷統計學聯系尤為密切,也被稱為統計學習理論。算法設計方面,機器學習理論關注可以實現的,行之有效的學習算法。很多推論問題屬于無程序可循難度,所以部分的機器學習研究是開發容易處理的近似算法。
-
深度學習(英語:deep learning)是機器學習拉出的分支,它試圖使用包含復雜結構或由多重非線性變換構成的多個處理層對數據進行高層抽象的算法。[1][2][3][4][5]深度學習是機器學習中一種基于對數據進行表征學習的方法。觀測值(例如一幅圖像)可以使用多種方式來表示,如每個像素強度值的向量,或者更抽象地表示成一系列邊、特定形狀的區域等。而使用某些特定的表示方法更容易從實例中學習任務(例如,人臉識別或面部表情識別[6])。深度學習的好處是用非監督式或半監督式的特征學習和分層特征提取高效算法來替代手工獲取特征。[7]
-
強化學習是機器學習中的一個領域,強調如何基于環境而行動,以取得最大化的預期利益。其靈感來源于心理學中的行為主義理論,即有機體如何在環境給予的獎勵或懲罰的刺激下,逐步形成對刺激的預期,產生能獲得最大利益的習慣性行為。這個方法具有普適性,因此在其他許多領域都有研究,例如博弈論、控制論、運籌學、信息論、仿真優化、多主體系統學習、群體智能、統計學以及遺傳算法。在運籌學和控制理論研究的語境下,強化學習被稱作“近似動態規劃”(approximate dynamic programming,ADP)。
在最優控制理論中也有研究這個問題,雖然大部分的研究是關于最優解的存在和特性,并非是學習或者近似方面。在經濟學和博弈論中,強化學習被用來解釋在有限理性的條件下如何出現平衡。
-
Inductive transfer, or transfer learning, is a research problem in machine learning that focuses on storing knowledge gained while solving one problem and applying it to a different but related problem.[1] For example, knowledge gained while learning to recognize cars could apply when trying to recognize trucks. This area of research bears some relation to the long history of psychological literature on transfer of learning, although formal ties between the two fields are limited.
維基百科上,機器學習、深度學習、強化學習都已有中文條目。而遷移學習的詞條至今還沒有中文版本,可見這個概念在公共領域才剛剛興起。簡單將英文條目翻譯成中文就是:歸納遷移,也叫做遷移學習,是機器學習中的一個研究問題。它側重于把解決某一問題時的知識儲存起來,以便應用到不同、但是相關的其他問題上去。例如,通過學習識別小轎車獲得的知識,也可以用來嘗試識別大卡車。
一言一蔽之:機器學習(ML)是人工智能(AI)的一個子領域,而深度學習、強化學習、遷移學習都是機器學習的子領域。它們按照各自的特點自成一類,并不意味著它們的定義是互斥的。恰恰相反,本文列舉的兩個例子都是基于深度學習的遷移學習,而且在目前的學術研究和業界應用中也非常常見。
遷移學習的有效性從何而來?
因為現有的機器學習,特別是深度學習的各種模型,在能充分滿足設計時的任務需求之外,往往具備稍加修改就能適用類似任務的能力。這種可能性,就為節省研發資源,以及將大數據機器學習成果轉移到小數據、定制化應用等等提供了一個便捷的渠道。類比人類活學活用的智能:比如一個人扎實地學會了蛙泳,只需要稍加練習,也能較快掌握自由泳的技巧;一個人學會了打網球,那么要學習打壁球也非常容易。
這種舉一反三的能力,既得益于人類的智能,也依賴于學習對象之間的某種類比相似性。而機器學習中的很多模型,恰恰在特定領域具有類似的智能。比如用于圖像識別的深度神經網絡,在使用百萬量級的圖片,完成針對特定一千種物體識別的訓練以后,它不光能勝任這一千種物體的識別,而且它的整個網絡結構、參數設置使它也有可能適應其它物體的圖像識別。
從具體操作的角度,可以有:
樣本遷移,即將任務A中部分適合任務B的數據抽取出來,與其它數據一起針對任務B進行訓練;
特征遷移,比如用于識別小轎車的神經網絡,那些用來識別車輪車窗的網絡參數,可以直接遷移到卡車識別的神經網絡,再輔以卡車圖像數據,就能事半功倍地訓練出卡車識別網絡。
模型遷移,這個跟特征遷移類似,但是更簡單粗暴,不光是特征被遷移用來類似任務,而且是這個模型都被遷移。這個模式的實際案例非常多,很多研究成果都是將AlexNet、GoogLeNet等模型遷移到特定的任務。當然也會根據需求略作改進和添加新的輔助功能,但是總體上看,節省了大量的開發時間、也節省了大量用于學習的計算資源,還能取得相當甚至更好的效果。
關系遷移,即將事物間的相互關系類推到類似事物。這個可能在NLP等有具體規則的機器學習領域更為常見,比如 man->woman, 可以類推到king->queen,還可以推廣到更多詞匯的機器理解。
本文兩個案例都用到了模型遷移,因為簡單有效,直接照搬,非常適合短時間開發可用方案。
案例一
新加坡政府機構組織的視頻分析挑戰賽(參考網址:https://www.imda.gov.sg/infocomm-and-media-news/buzz-central/2015/8/challenge-the-state-of-the-art-in-video-analytics)
我所在實驗室為成像技術實驗室(Imaging Technology Center),而上司非常想在政府組織的比賽里檢測下員工的能力以及增加一下實驗室的曝光率,于是決定參加這一挑戰。時間是2015年8月到11月。
比賽內容就是通過視頻分析,檢測出視頻中出現的人臉并定位。其難度在于:1.機位隱蔽視角刁鉆 2.人流密度極大。否則,用常規計算機視覺的方法就能解決問題了,比如開源的OpenCV中就有haar, HoG, LBP等各種人臉、人身等目標檢測功能。
實際上由于時間倉促,(8月中旬啟動,9月初現場測試,剛好兩周時間)。第一輪選拔比賽我們使用的就是OpenCV的HoG,配以適當的手工微調。如果是應付優化好的機位,稀疏的人群,是沒有什么問題,但是面對任意傾斜角度以及密密麻麻互相遮擋的人群,傳統方法的確是力有不逮。好在我們進入了第二輪也就是最終輪。
第二輪是9月中旬到11月底,時間相對充裕。于是我們決定嘗試用當時已經火了一陣的Caffe作為深度學習庫。此時Google的Tensorflow并沒有開源,并且Tensorflow是在2015年11月才放出第一個公開版本。為了應對比賽的特殊要求,我特地搜索了一下”crowded pedestrian”,”end-to-end”等關鍵詞,于是搜到了一個斯坦福研究員的paper和開源代碼:https://github.com/Russell91/ReInspect 。兩者都很重要,看paper才知道他在做什么,是怎么做到的;而代碼則提供了一個驗證以及“偷懶”的機會。(如果沒有代碼,我怎么知道是作者留了一手,還是我寫不出能復現的代碼呢?雖然后者概率更大)
ReInspect是用Caffe開源庫實現的基于Overfeat-GoogLeNet的深度神經網絡,用來在圖像中檢測出重疊嚴重的密集目標物體。看項目描述就很適合這個比賽的要求。在搭好平臺編譯調試妥當,驗證了原作者示例后,我拿比賽測試用視頻作為測試集,發現比第一輪的HoG要靠譜多了。于是立馬進入下一輪的網絡訓練,同時也是遷移學習的過程。
事實上ReInspect本身也算是遷移學習的成果,因為它的網絡權重就是用GoogLeNet的網絡權重來初始化的。初始化以后,它又用了11917幅圖進行訓練,這一萬多幅圖中有 91146個人頭部被標定出來用于訓練。寫了這么多枯燥的文字,貼個圖展示下直觀的效果:
可以看出ReInspect在這個咖啡館的人頭檢測效果還是不錯的。
相比之下我們用于比賽的測試視頻只有10來個3分鐘長短15fps的短視頻。考慮到連續幀之間差別不大,實際可用于訓練的圖像也就10 x 3 x 60 = 1800張而已(每秒抽取一幀),只有原作者訓練集的15%左右。
我們知道深度學習的關鍵點之一就是大數據。沒有大量訓練數據的支持,再好的模型也可能訓練不足,導致其性能不可靠。幸好我們如法炮制了paper中原作者的方法:用他現成的網絡權重來初始化我們自己的網絡,再用我們自己的訓練集重新訓練。效果真的很不錯,而且比訓練前的表現又有了大幅提升,以下圖為例(比賽簽署了NDA協議,所以比賽用視頻和結果都不能公開,我用互聯網上公開的一段尼泊爾地震廣場上人群蜂擁的視頻做了下測試。圖示幀大概出現在視頻?? 03:34處):
可以看到出在多目標以及目標間有重疊時,經過遷移學習之后的網絡表現還是很不錯的。(由于比賽只要求檢測出可能泄漏隱私的面部——定義比較含糊,我們對于側臉和后腦勺沒有作統一規定,分派給學生做手工標定時沒有作同一標準,因此在檢測側臉和后腦時不保證可靠性。)
比較下具體的量化數據:
原作者:???? 訓練集:? 11917幅照片?????? 準確率: ~78%
我們直接以原作者訓練結果初始化后訓練結果:
新結果:???? 訓練集:?? 1800幅照片??????? 準確率: ~74.1%
這個準確率是比賽組織方人工給我們統計的,所以可信度比較高。也跟作者者準確度十分接近。考慮到我們的比賽測試視頻是在各種不同的場景、更加密集的人流中進行,實際上可以認為我們用更少的數據達到了更好的效果——不僅僅是實際目標檢測效果,也包括解決方案從提出到部署完成所需要的人力物力。
相比GoogLeNet所投入的海量人力物力,相比原作者上萬張圖像的標定和訓練,我們只花了1500張圖像的標定和訓練,就到達了同樣的結果。這也正是遷移學習的優勢所在:站在巨人的肩膀上。前人、學界大牛、業界大牛的成果都可以直接為你所用,你只需要少量的數據就可以達成原本需要十倍百倍數據量才能達到的效果。
案例二
Mindef項目吉普車零件檢測。項目背景:由于視頻分析挑戰賽結果還不錯,我們又接手了一個軍方項目的計算機視覺部分的任務。保密程度不高,可以簡單分享一下。簡單來說就是軍方需要縮減培訓新兵的人手,在維修車輛方面,希望有軟件可以指導新手找到對應零部件。這樣不需要很多人手親自指點,而只需要新兵人手一個平板就可以了。
有了上一次項目的經歷,對這個任務就顯得比較有自信。而且解決方案簡直如出一轍,甚至更為簡單,因為用于識別物體的AlexNet本來就是被設計出來用于識別物體競賽的。它可以識別1000種物體,而項目需要識別的汽車零部件還不到100種,可以說是殺雞用牛刀了。
下面就是經典的AlexNet在Caffe上的再現:
而我們初步交付的就是5個不同的零件識別而已。
由于位置和照明的限制,給訓練圖片采集和實際檢測都增加了不少難度。
這里還有一段用python TkInter寫的一個調用Caffe庫的簡易GUI,基本用來滿足功能需求。
從代碼也可以看到我當時用的就是Caffe移植的Alexnet : models/bvlc_reference_caffenet
最終的結果,每個零件我用了不到100幅照片來做訓練,達到了90%左右的準確度。而AlexNet則使用了上百萬幅照片,即使平攤到1000個種類,每個類別也有1000幅照片作為訓練數據。而且,我們最終節省的不光是采集圖片的時間、標定的時間,連后繼訓練網絡的時間也大為縮短。在很短的時間內就能達到可以交付的效果。
總結
上述兩個例子都是在作者還不了解遷移學習的時候完成的兩個實際項目。按照遷移學習的定義,應該是符合模型遷移的定義的。當然真正研究遷移學習,還有很多深入和細分的技術,如歸納遷移、拜葉斯遷移、繼承式遷移等等。文中的兩個例子應該屬于深度神經網絡的模型遷移學習,即使用能夠勝任類似任務的深度神經網絡模型,并將類似學習訓練產生的網絡配置用于初始化新任務中的網絡參數,以便在更短更快的迭代中獲得可靠的訓練結果。
總結
以上是生活随笔為你收集整理的用两个使用Caffe的小项目案例演示迁移学习的实用性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC++之绘制线条
- 下一篇: 用python简单处理图片(1):打开\