Excel狂魔?單元格做計算機視覺:人臉檢測、OCR都不在話下

機器之心報道

參與:一鳴、張倩、杜偉

計算機視覺是什麼?過於專業,一步勸退?在普通人看來,計算機視覺是軟件開發者才能涉足的領域,需要用到很多專業的框架,普通人只能圍觀。但 GitHub 上的一個項目似乎顛覆了我們的認知。

Excel 基本操作會吧?上網搜索公式會吧?基本的數學理解能力有吧?OK,如果以上你都能做到,你也能上手計算機視覺項目了。

圖 1:將一張圖像轉換為 Excel 單元格表示的灰度圖像。可以看到,只要單元格細粒度足夠高,就可以存儲足夠的圖像信息。

具體來說,在這個項目中,作者嘗試用 Excel 實現的樣本算法來幫助我們學習計算機視覺的基礎知識。為此,他用到了很多隻有一行的 Excel 公式。作者表示,在這個項目中,用 Excel 做人臉檢測、霍夫變換都不在話下,而且不依賴任何腳本或第三方插件。

以下是使用 Excel 進行的一些計算機視覺任務。首先,我們有一個示例圖像。這是一個護照。如圖所示,Excel 的算法可以實現對照片人像的檢測(使用傳統手工算法)。

同樣,這幅圖像也可以被 Excel 轉換,然後找到邊和線的特徵。

最後,Excel 還可以進行 OCR 操作。首先對圖像進行手工分割,找到相關的圖像文本,然後進行 OCR 即可。

這個項目不要求你提前掌握計算機視覺背景知識,但需要了解 Microsoft Excel 基礎操作,會閱讀 Excel 文檔或上網搜索需要用到的公式的相關解釋。對於後者,推薦使用 Exceljet。

此外,你還需要具備一些數學理解能力:如果理解不了加權平均數,可能很難繼續學下去。掌握偏微分很有幫助,但不是硬性要求。項目中用到的複雜數學概念大多數是特徵值。

Excel 怎麼計算圖像數據?

使用 Excel 做計算機視覺,乍一聽顯得有點魔幻。但其實原理很簡單:這個教程利用了 Excel 強大的單元格計算能力,只要將圖像的像素數據轉換為單元格(如下圖所示),然後計算即可。我們知道每個單元格都可以表示一個值,那麼很多個單元格是不是就可以表示成矩陣了?

對示例文件的截圖(樣本圖片局部),可以看到 Excel 單元格表示了圖像的灰度。

而另一方面,我們可以很方便地利用 Excel 計算單元格的數據。那麼整合起來,是不是和矩陣計算很相似了?這樣,不同圖像位置表示的特徵也就很容易被計算出來。自然也就方便完成下游計算機視覺的任務了,不管是傳統算法也好,還是機器學習也好。

可是,圖像怎樣輸入到 Excel 中呢?作者提供了一個方法:用 CSV 呀。

你可以用很多種方式轉換 RGB 圖像到像素點數據,如使用一個程序等:

https://alvinalexander.com/blog/post/java/getting-rgb-values-for-each-pixel-in-image-using-java-bufferedi

當圖像的像素轉換為 CSV 後,使用 Excel 讀取即可。

項目指南

項目需要的關鍵材料都可以在「Downloads」部分找到。這些材料都帶有註釋,通俗易懂,可以按部就班,一步一步學。

軟件要求

這個項目是在 Excel 2016 上創建的,在其他版本上應該也能打開(目前已經在 Excel 2007 和 Mac 的 Excel 上進行了測試)。

此外,雖然這些文件能在 LibreOffice 上打開(測試版本是 6.4.0.3 (x64)),但速度極慢,可以說沒辦法用。目前還沒有在 Apache OpenOffice 上進行測試。

相關 Excel 公式選項

在打開項目中的 Excel 文件之前,請先把 Excel 的「公式」→「計算選項」調為「手動」,因為有些計算(尤其是霍夫變換)非常耗時。然後根據需要手動觸發重算。


此外,不要勾選「保存工作簿前重新計算」,否則 Excel 將在每次保存文件時重新計算所有公式。

注意:這個項目做完後,記得把設置改回來。

熟悉 Excel 中 R1C1 公式引用樣式的人或者喜歡冒險的人,應該嘗試通過查看 Excel 選項來切換到 R1C1 引用樣式。

參考下面的屏幕截圖,勾選 R1C1 引用樣式對應的複選框來啟用這個選項。如此一來,我們可以把公式從「D5」類型的格式更改為「R[-1]C[2]」這樣的相對樣式,使其更接近編程語言並有助於理解。

教程目錄和代碼文件

下圖所示為本項目的相關教程目錄和項目文件,總共 50MB,大家可以前往 GitHub 下載。

這一項目分為五個部分:

1. 計算機視覺 Excel 基礎

2. 邊和線

3. 關鍵點和描述算子

4. 人臉檢測

5. 文本識別(OCR)

這些項目都有相關說明和代碼,非常詳細。

常見問題和解答

作者在留下教程之餘,也對相關的一些問題提供瞭解答。

問題 1:這些技術是否可被深度學習替代?

這些技術依然是相關的。儘管神經網絡已經替代了所有複雜的計算機視覺問題,特別是那些傳統技術沒有解決的問題。但是在簡單的計算上,傳統方法更快,而且計算效率更高。另外,傳統方法依然是邊緣設備(智能手機、網絡客戶端)等的首選,雖然已有很多硬件加速的方法。

問題 2:為什麼使用圖像的綠通道,而不是紅或藍?如果想在 Excel 中用這種方式展示彩色圖像要怎麼做?

作者表示,三種基本的顏色通道中,綠通道對亮度的影響最大。理論上,圖像會首先被轉換為灰度圖,即計算其亮度,在教程中為了簡便被省略了。關於彩色圖像的表示,可以看一下第 6 個問題。

問題 3:護照中帶有水印的人臉為什麼沒被檢測到?

作者使用的是一個流行的人臉檢測算法,僅使用三個類 Haar 特徵和兩個步驟。這一算法是針對蒙娜麗莎(示例)中的圖像手工設計的。而在實際應用中,機器學習可以學習數千個這樣的特徵,因此才能準確檢測到人臉。

問題 4:在 OCR 示例中如何選擇 mask 以及方向?

對於文檔 OCR(與場景文本識別相反)來說,在識別文檔中的字符之前,文檔通常先被拉直。所以,字符一般為直立的。

在示例中,作者使用單神經元來識別大寫字母「E」。神經網絡利用多層神經元來識別所有感興趣的字符。然後神經網絡輸出輸入端出現的字符。需要注意的是,組合神經元將在識別每個字符的過程中共享一些神經元。

問題 5:OCR 方法在不同字體上的效果如何?

作為示例,作者使用單卷積神經元來識別大寫字母「E」。實際系統通常會使用到神經網絡(並不僅是單神經元),並且在不同字體和語言上都表現良好。

具體是如何實現的呢?作者使用單神經元來同時掃描圖像和識別字母。通常情況下,掃描不同篇幅的文本需要通過不同的方法單獨完成。一旦文本的每個字符被隔離,則字符重新縮放至一個固定大小,然後使用神經網絡來識別字母。

手寫識別更加困難。當筆畫數據為時間函數(如在觸摸屏上識別是寫輸入)時,能夠實現最佳效果。此外,在示例中,即使單個神經元的權重是手工的,實際上也不使用訓練算法來學習。在實際訓練時,單個神經元的效果也比 demo 展示中的要好。

問題 6:作者是如何想到用 Excel 做計算機視覺的呢?

起初,作者要給亞馬遜內部員工講授計算機視覺教程,但他們對該主題不熟悉。所以,作者通過展示圖像本質上是數字的 2D 陣列來講述計算機視覺的基礎知識,並想要使用 Excel 來展示。作者大約花費 7 個小時來創建了第一個功能完善的版本,但不涵蓋人臉檢測和文本識別。之後的版本又做了進一步完善。

自那時起,作者已經創建了以下在 Excel 中展示圖像的視頻作品或教程(附鏈接):

Excel 電子表格中的圖像(包括顏色):https://www.youtube.com/watch?v=UBX2QQHlQ_IExcel 光線跟蹤:https://www.youtube.com/watch?v=m28jJ7CMp8A&feature=emb_logoExcel 3D 引擎:https://www.youtube.com/watch?v=bFOL9kantXAExcel 3D 圖形:https://www.gamasutra.com/view/feature/131968/microsoft_excel_revolutionary_3d_.php

問題 7:是否有計算機視覺的交互式開發者環境?

由於 Matlab 具有內置或在工具箱中具有很多計算機視覺功能,所以它通常用於計算機視覺任務。其中,「imshow」功能可直接將陣列數據以圖像的形式顯示出來。此外,基於 Python 和 Notebooks 的工具也很流行。

項目作者

項目作者有兩位,分別為 Alok Govil 和合作者 Venkataramanan Subramanian,他們都是亞馬遜的首席工程師。

其中,Alok Govil 是一位全棧技術架構師,本科和碩士分別畢業於德里技術大學(Delhi Technological University)和美國南加利福尼亞大學。他畢業後曾先後就職于飛利浦美國研究院、高通等公司,現為亞馬遜首席工程師。

Alok Govil。

合作者 Venkataramanan Subramanian 本科畢業於印度馬德拉斯大學,之後攻讀班加羅爾國際信息技術學院的在職碩士。他畢業後先後就職於 Hexaware Technologies 和甲骨文公司,並於 2011 年入職亞馬遜擔任首席工程師至今。

參考鏈接:

https://news.ycombinator.com/item?id=22357374
https://github.com/amzn/computer-vision-basics-in-microsoft-excel