網路城邦
上一篇 回創作列表 下一篇   字體:
影像辨識不必用C/C++,OpenCV與機器學習也非必要!
2020/01/03 07:03:50瀏覽18285|回應0|推薦10

現在常常收到這種信!可以印證我一再講過的一句話:「影像辨識還是很不成熟的科技!」拿個對照組來說吧!資料庫的應用大家都會承認是一種很成熟的技術,好好上課或讀書自學,加上網路可以找到的資源,如果你還作不出客戶需要的軟體,那就很奇怪了?應該是自己太笨,退出江湖吧!

但是說到影像辨識就很微妙了!大家都知道這個科技現在很熱門,也不算是太新的科技,一定要「C/C++做影像辨識」這種說法,在我還完全不懂影像辨識的三十年前就常聽到了!近年更是一定要「用機器學習加上OpenCV做影像辨識喊得震天價響!到處都有開課,學費還特別貴?好像影像辨識技術也像資料庫一樣,只要學會了某些程式語言或函式庫的使用,就能順利就業研發了?但事實不然!

在我的觀點,目前影像辨識的教學資源與方向都是錯的!不然像我們這種專做影像辨識的公司應該會很多才對!因為目前很多大學研究所都開設影像辨識課了!號稱可以做影像辨識的機器學習與OpenCV課程、網站與資訊也到處都是!資訊電機領域的教授們都努力將影像辨識,至少影像處理列為自己的專長,這種風潮現象沒十年也有八年了!但市面上能自行開發影像辨識產品的公司仍是鳳毛麟角。

首先所謂用C/C++才能做影像辨識就是一個過時的觀念,此說的起因是三十年前,除了C語言之外的語言,如FortranBasic等等,多半沒有提供處理數位影像所需要的完整低階資料結構,加上影像處理很需要大量運算,C語言與作業系統溝通較為直接,跑得比較快,如此而已!

現在呢?電腦語言都進化了,電腦硬體效能也都變好了!其實任何程式語言都可以做影像辨識,效能也相差無幾!我為了證明這個觀念,曾經用HTML5實作過我早期的車牌辨識核心!就是要打臉只能用C/C++做影像辨識這種無謂的迷思!HTML5的車牌辨識所有程式邏輯完全沒問題,速度也沒特別慢!當然因為JavaScript語言究竟不是為實作演算法程式設計的,寫起來會比較繁瑣。

用JavaScript寫影像辨識程式,真的行欸!

我從做影像辨識研究之初就是使用VB.NET的!有次為了將辨識核心移至某個嵌入式系統,需要將我的VB版影像辨識程式翻譯成C++,我懶得做,就叫我的RD自學C++兩個月之後去實作!她邊做就邊嘀咕:「怎麼會有人笨到用C/C++做影像辨識程式呢?語法太繁瑣了,根本讓我沒法專心思考演算法邏輯了!」

所以本公司的影像辨識產品萬不得已,一定不會用C/C++!不是不會用,而是真的不好用!執行效能與使用VB.NET完全一樣,但開發時間會增加至少一倍以上!最不利的因素是:因為C/C++語法的拘謹繁瑣,會一直讓我們分心於語法格式的書寫控制,對於需要隨時思考新演算法解決問題的研究過程干擾極大!C++我是不熟,但是C#我是很熟的,不僅上課有教,還出過書,有幾個專案因為要交付原始碼,對方要求用C#寫,我也OK的!

另一個極大的謬誤是,因為影像辨識過程很複雜多變,因此好心的學界前輩就建構了如OpenCV這種函式庫。有點像Web程式其實很難寫,所以就出現了PHPASP這類的技術,將複雜的細節封裝起來,使得多數人都可以快速的完成Web應用程式的設計工作。

但是不好意思,費心製作OpenCV的專家學者其實沒幫到影像辨識學習者的忙!因為ASP等東西是幫忙你架橋渡河,或開車載你去上班,過了河或到了辦公室之後,才是你工作的開始!至於怎麼過河?或怎麼到辦公室的經過細節?與你的目的其實無關!那就交給ASP吧!我專心設計使用者介面與SQL邏輯就好了!

可是影像辨識從一開始的每個處理程序,每個參數都會與最後能否得到正確答案密切相關!從全彩如何變灰階?灰階如何二值化?黑白圖如何變輪廓圖?輪廓圖如何變成目標物件?都對你要辨識的目標成功與否有關!OpenCV與ASP設計的原始目的相似,是幫使用者「省略細節」用的,而不是幫你「掌握細節」的!這有點像是我們要找到深山裡的某個鐘乳石洞當作觀光景點,我們的作法就是準備好登山裝備,一路登山涉水邊走邊看,找到最踏實有效的路徑來抵達目標。

OpenCV很像是你買的越野車,或租用的直升機,你可以在群山之間快速移動搜尋,但是永遠無法精確地找到那個洞!也無法準確的建立供後人快速抵達該岩洞觀光的最有效路徑。所以你不會在我或我的RD的電腦中發現任何OpenCV之類的函式庫!因為我們真正需要的只是物理與數學原理,對於要處理的問題做精確的理解分析,然後用基礎的程式技術去實驗探索。

不騙各位!現在跟我買車牌辨識軟體,或找我們開發影像辨識專案的客戶中,很多公司裡都有學過C/C++影像辨識,也熟悉OpenCV的工程師,他們都曾信心滿滿想自行開發他們公司需要的辨識軟體。但是都很快就陷入困境,不知如何繼續?或是勉強作出可以達到辨識目的的軟體,效能或辨識率卻低到無法接受,最後才來找我們的!我們完全不用C/C++,當然也不用OpenCV,但是最終都能做出他們想要的東西。

我不是說OpenCV不好哦!只是告訴大家,如果你希望作出來的是高效率的實用影像辨識軟體,使用那些函式庫不會直接得到很專業的結果!如果你拿這些產品去賣,客戶發現有無法辨識的例外,你也很難診斷原因做好售後服務,因為你的工程也多數是「外包」給OpenCV作的!你能叫寫OpenCV的教授出來幫你做客戶服務嗎?

OpenCV至少還是使用影像辨識的原理概念作出來的程式,也有原始碼可以修改的!機器學習呢?那就更等而下之,連思考原理的部分都簡化了!所以當然是更大的誤導!學越多,使用越多,你就距離完成有效實用辨識軟體的距離越遠!所以回到前面信件最關切的問題:如何有效學習實作影像辨識

首先要確立的觀念是:影像辨識技術的核心是演算法的精確掌握!程式語言或既有的套裝方法技術真的很不重要!如果你的高中物理與數學成績不太好,如果你的幾何學或微積分概念不清楚,考試會被當,建議還是先回去學好這些東西再來玩影像辨識!

如果你這些東西都還OK,以目前的環境來說,我認為OpenCV當作教材範例來深入學習,而不是將它簡化視為「工具」是個好的辦法!就是將每個OpenCV的函數當課本單元深入消化吸收,讓它們變成你不必翻閱拷貝都能直接寫出來的理論基礎與程式經驗。至於機器學習呢?就不必浪費時間學太多了,知道怎麼回事就好,因為實際用處不大的!他們只是幫你猜猜大概答案的技術而已,作對做錯的實際原因你都不會知道的!

( 知識學習科學百科 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=yccsonar&aid=131464673