如上圖,我終於設計出一個可以穩定辨識模糊正多邊形所有邊界的演算法。對我來說,這就是一個很重要的AI突破了!這種具有「宏觀」視野,可以從破碎目標的分布趨勢做出穩定判斷的程式,我從博士論文做地形辨識時就開始想了!那是大約1996年的事情,一直想了25年之久!今天也只是在這個有先決條件,知道是正多邊形的前提下發展出一個看起來好像有「宏觀」智慧的演算法。
作影像辨識的專家都知道,所有辨識的起點都是先用所謂的前處理,盡量找到有利於進行辨識的特徵。如果這些特徵很清楚,當然誰都可以完成辨識工作,但是有太多因素會讓攝影變成一個加入雜訊的過程,明明是一個好好的正六邊形,拍成影像之後邊緣就是如此破碎不堪。
在實務上,我們確實可以調整攝影方式讓螺絲釘邊框變得清楚一點,但是常常外框清晰了,內部的字元就模糊了,為了節省時間與成本,我們總是希望可以在一張影像中就可以辨識出所有需要的結果,這就需要我的演算法更聰明一些了!如果凡事都要靠硬體解決,當然就是拉高成本了!
雖然影像辨識很難處理破碎邊界,但是人的眼睛卻很會做這種趨勢判斷,如上面的灰階圖,其實前景與背景的對比度不大,但是範圍拉大之後,我們就很容易從趨勢看出螺絲釘的邊緣。我們作影像辨識者的挑戰,就是我們知道人的腦袋裡面一定有這種辨識邏輯,每個人的腦袋裡面都有,我們卻很難解析這些邏輯到變成穩定的程式軟體。
我是怎麼作到的?其實還是從我的基本理念,以大腦為師開始的!先用二值化找出「概略」的邊緣,即使他們是破碎的,也抽樣嘗試用這些碎片拉出直線,看看怎麼拉的直線可以讓現兩邊的亮度差異最大,就像我們在灰階圖上找明暗區域的交界線了!這是嘗試錯誤的搜尋,你要說這是在用機器學習?好像也可以?
找到至少兩條較清晰的邊線之後,就可以看他們的交角來判斷是幾邊形了!正六邊形的任何一邊交角都應該是60或120度,正方形當然就是90度了。螺絲釘其實也只有圓形、正六角形與極罕見的正方形三種。因為已知是對稱的六邊形,兩對邊一定是平行的,以此為規範要找對邊就很快也不會錯了!還沒找齊的「鄰邊」呢?也可以用已經確認邊的角度去推算,各內角都相等嘛!找特定角度的邊線即可。
就這樣如最前面的圖,我很精準的找出了螺絲釘的六個邊,當然圓心圓周也都可以藉此準確定位,不會錯了!看起來好像不難?但是當你放大看看其實破碎得一蹋糊塗的二值化邊緣,你就知道這真的是很AI的演算法了!我終於想出了跟人眼判斷能力相近的演算法了!其實很像是一個鎖定特殊範圍的機器學習過程?
很微妙的一件事情是,我們通常會想藉著更高解析度的數位影像,把物體看得更清楚,但是解析度太高時,這種目標變得破碎的狀況就更多!如果演算法沒有這種「模糊辨識」的宏觀能力,高解析很可能反而讓你更難辨識成功!
影像辨識需要的處理過程,絕對不是「去除雜訊」這麼單純的概念,很多時候雜訊與訊號是很難分辨的!在此例中看起來破碎像雜訊的邊緣,其實是有用的訊號!你必須有統計整合他們的演算法作為因應,這似乎也有點像機器學習?可見萬流歸宗,能解決問題的就是好方法,我反對以機器學習為影像辨識的主體,但是在模糊枝節上我用到的統計或嘗試錯誤技巧,也不會少於機器學習派的專家。