太依賴工具不是好事

現在搜尋影像辨識工程師關鍵字,會發現很多高薪的好工作,各大軟體公司對這個專長求才若渴!正如我去年在MOPCON 2015發表的小演講時所說,影像辨識需求的軟體業大海嘯已經來襲了!但是看看那些廣告的應徵人數就知道,即使直接宣稱月薪高達6-13萬,相當於教授等級的薪資,應徵人數仍然極少!都是聞著吃不著的好康職位。
這些工作需要的條件是甚麼?徵人啟事一定會寫的是要「熟悉C++語言與OpenCV」等機器視覺程式庫,糟糕!這下連教授我也無法應徵了!這兩種東西我都久仰大名卻說不上熟悉。但是很詭異的!有幾間大公司真的已經請到了上述的稀有人才,依舊會找我解決影像辨識的相關問題,我多半也能順利完成任務,這種業務還是本公司現階段的主要收入來源咧!
為什麼做影像辨識必須熟悉C++OpenCV?原因是大家普遍認為作影像辨識很難!完全靠自己的演算法的素養寫程式,製作複雜的辨識軟體緩不濟急,所以必須盡量引用現成的資源組裝。傳統上因為影像辨識需要極高的運算效能,前輩們在電腦上都會使用效能最高的C++語言,甚至更低階的C語言,來開發影像辨識的程式。
也因此OpenCV這種電腦視覺程式庫裡面提供的程式資源多半以C++語言為主,有點像現在英語是世界通用語言,就算講得不溜也要能閱讀英文,不然甚麼程式都自己土法煉鋼,就會很像鍋碗瓢盆都自己製作的原始人,太沒效率了!看不懂C++程式就很難模仿使用前輩累積的程式資源,當然會被認定是「外行」了!以此邏輯,我是難登大雅之堂的!
我知道很多大學的研究所,已經注意到市場的需求,很努力的在培養影像辨識的人才了!但都還是強調如何熟悉使用OpenCV,也讓學生寫C++,最多加上更早流行常用於影像處理的MatLab軟體,卻很少硬碰硬的強調要教這些技術的根源,就是:影像辨識演算法的原理
但是如果我就是從演算法出發,自己組織推導演算法,自己寫程式呢?我可沒讀過甚麼影像辨識相關的研究所,我的基礎就是自修的數位影像處理,加上高中大學時學的物理與數學課。我的團隊也在使用C++語言,但目的並不是去使用既有的影像辨識程式資源,只是用於產品輸出端,我的影像辨識產品真的都是自己從原理到程式完全自主開發的!我會參考書籍、論文與網路資訊,就是不曾直接使用過任何不透明的APISDK或抄一段別人公開的程式碼來改!Never
主要原因就像我在本地住了十幾年,根本就熟知所有市區的道路,如果我要去市政府洽公,騎上摩托車就一路穿越最近的小路捷徑殺過去了!我不會想坐公車,更不可能為此叫計程車的!那些交通工具是給不知道路的外地人坐的嘛!作影像辨識時,熟悉道路的程度就是我對演算法的素養,我的「機車」就是VB程式而已,我不用C++作研究的,因為太囉嗦的C語法只會讓我分心,很難專注地思考演算法的設計!演算法程式寫好了,要用哪種程式作成終端產品都可以的!翻譯程式是比較簡單的事情。
事實上,我的行事風格比大家想像的更誇張!我不但沒用過別人的程式,連自己開發過的程式,也傾向不直接套用到下一個專案!大家都知道我作車牌辨識成果不錯,接著有人請我作文件的影像辨識,人家也是因為知道我會作車牌辨識找來的,但是我並不是直接拿舊程式為基礎來修改!而是完全依據新的辨識目標特性重新設計一套辨識流程,寫出來的程式連幫我處理車牌辨識程式已經很久的員工都看不懂,我還上了好多「課」才讓他們完全理解跟上!
我這種作風不是賣弄炫技,其實是覺得徒法不足以自行!方法、技術與工具都是幫我們達成目標的!但是影像辨識真的每個案子目標特性都不同,拿哥哥的舊衣服改給妹妹穿不是不行,但要改到很合身,看得很順眼,就不如直接替妹妹量身訂做新衣服會更快也更好!而且從原理出發到目的地並不如大家想得這麼遙遠,只是大家習慣坐車之後,走一兩公里的路就覺得很恐怖,那是自我設限,自己嚇自己而已!
舉個例子吧!有個狀況我必須讓影像先平滑化之後,再計算兩相鄰點的亮度差值,在此以A1, A2, A3, A4代表連續四個像素的原始亮度。我們用最簡單的移動平均(Moving Average)概念做平滑化計算:
A2=(A1+A2+A3)/3A3=(A2+A3+A4)/3
接下來A2-A3的差值經過簡單的數學推導會變成: (A1-A4)/3因為我要知道的是「相對」差值,所以連分母的3都不必除了,直接算出A1-A4就是我要知道的結果!這是任何讀過大學,甚至稍有數學概念的高中生都可以輕易理解並做到的推導,就是一個簡單的減法就完成了平滑化加上差分(或稱微分)的運算!
如果我用工具程式做這件事,就是先呼叫一個平滑化函數,將整個影像中的每一點都老老實實的與多個鄰點平均;之後再引用差分運算函數將這些平滑化之後的點數值相減。如果我不用這些工具函數,直接依據自己推導的上述「公式」寫出程式等於走了一個極短的捷徑,即使像OpenCV這種偉大的程式庫,宣稱自己的運算效能再高,執行速度也跟不上我的小程式!
這很像大家相信走高速公路比較快,所以盲目地搶著上高速公路,即使目標距離很近,只有五公里,也還是只會找某個交流道上去,從某個交流道下來,而交流道之間的距離可能就大於五公里了!雖然在高速路上飆了幾分鐘百公里以上的時速,但一來一往花了半小時,同時間,直接騎腳踏車過去的人卻只花十幾分鐘就到了!
有很多人說理論只是講好聽的,光靠理論沒現成工具根本做不了事情,其實影像辨識是可以不必這樣的!有好的理論基礎,對問題有正確的理解,加上一點想像力,還有任何一種程式語言的實作能力,就真的可以不必依賴視覺程式庫,也能將影像辨識做好的,我就是!







來源:鄉下老師
Share on Google Plus

About Unknown

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.