天天看點

使用 AI 為 Web 網頁增加無障礙功能使用 AI 為 Web 網頁增加無障礙功能

<b>本文講的是使用 AI 為 Web 網頁增加無障礙功能,</b>

<b></b>

在我們視力正常的人看來,網際網路是一個充滿了文字、圖檔、視訊等事物的地方,然而對于視力障礙人士來說卻并不是這樣的。有一種可以讀出網頁中文字和中繼資料的工具叫做螢幕閱讀器,然而這種工具的作用十分有限,僅能讓人看到網頁的一部分文本。雖然一些開發人員花時間去改進他們的網站,為視障人士添加圖檔的描述性文字,但是絕大多數程式員都不會花時間去做這件公認冗長乏味的事情。

是以,我決定做這麼一個工具,來幫助視障人士通過 AI 的力量來“看”網際網路。我給它起名為“Auto Alt Text”(自動 Alt 文本添加器),是一個 Chrome 拓展插件,可以讓使用者在圖檔上點選右鍵後得到場景描述 —— 最開始是要這麼做的。

郵件内容如下:“你好,Abhinav,我看了你的 flask-base 項目,我覺得它非常适合我的下個工程。感謝你開發了它。不過我想讓你知道,你應該為你 README 中的圖檔加上 alt 描述。我是盲人,用了很長一段時間才弄清楚它們的内容 :/來自某人”

在收到郵件的時候,無障礙功能的開發是放在我開發隊列的最後面的,基本上它就是個“事後有空再添加”的想法而已。但是,這封郵件喚醒了我。在網際網路中,有許多的人需要無障礙閱讀功能來了解網站、應用、項目等事物的用途。

“現在 Web 中充滿了缺失、錯誤或者沒有替代文本的圖檔” —— WebAIM(猶他州立大學殘障人士中心)

現在其實有一些方法來給圖像加描述文字;但是,大多數方法都有一些缺點:

它們反應很慢,要很長時間才能傳回描述文字。

它們是半自動化的(即需要人類手動按需标記描述文字)。

制作、維護它們需要高昂的代價。

現在,通過建立神經網絡,這些問題都能得到解決。最近我接觸、學習了 Tensorflow —— 一個用于機器學習開發的開源庫,開始深入研究機器學習與 AI。Tensorflow 使開發人員能夠建構可用于完成從對象檢測到圖像識别的各種任務的高魯棒模型。

這個模型的機制相當的精緻,但是它基本上是一個“編碼器 - 解碼器”的方案。首先圖檔會傳入一個名為 Inception v3 的卷積神經網絡進行圖檔分類,接着編碼好的圖檔送入 LSTM 網絡中。LSTM 是一種專門用于序列模型/時間敏感資訊的神經網絡層。最後 LSTM 通過組合設定好的單詞,形成一句描述圖檔内容的句子。LSTM 通過求單詞集中每個單詞在句子中出現的似然性,分别計算第一個詞出現的機率分布、第二個詞出現的機率分布……直到出現機率最大的字元為“.”,為句子加上最後的句号。

根據 Github 庫中的說明,這個模型在 Tesla k20m GPU 上的訓練時間大約為 1-2 周(在我筆記本的标準 CPU 上計算需要更多的時間)。不過值得慶幸的是,Tensorflow 社群提供了一個已經訓練好的模型。

在運作模型時,我試圖使用 Bazel 來運作模型(Bazel 是一個用于将 tensorflow 模型解包成可運作腳本的工具)。但是,當指令行運作時,它需要大約 15 秒鐘的時間才能從擷取一張圖檔的結果!解決問題的唯一辦法就是讓 Tensorflow 的整個 Graph 都常駐記憶體,但是這樣需要這個程式全天候運作。我計劃将這個模型挂在 AWS Elasticbeanstalk 上,在這個平台上是以小時為機關為計算時間計費的,而我們要維持應用程式常駐,是以并不合适(它完全比對了前面章節所說的圖檔描述軟體缺點的第三條缺點)。是以,我決定使用 AWS Lambda 來完成所有工作。

Lambda 是一種無伺服器計算服務,價格很低。此外,它會在計算服務激活時按秒收費。Lambda 的工作原理很簡單,一旦應用收到了使用者的請求,Lambda 就會将應用程式的映象激活,傳回 response,然後再停止應用映象。如果收到多個并發請求,它會喚起多個執行個體以拓展負載。另外,如果某個小時内應用不斷收到請求,它将會保持應用程式的激活狀态。是以,Lambda 服務非常符合我的這個用例。

使用 Lambda 的問題就在于,我必須要為 im2txt 模型建立一個 API。另外,Lambda 對于以功能形式加載的應用有空間限制。上傳整個應用程式的 zip 包時,最終檔案大小不能超過 250 MB。這個限制是一個麻煩事,因為 im2txt 的模型就已經超過 180 MB 了,再加上它運作需要的依賴檔案就已經超過 350 MB 了。我嘗試将程式的一部分傳到 S3 服務上,然後在 Lambda 執行個體運作再去下載下傳相關檔案。然而,Lambda 上一個應用的總存儲限制為 512 MB,而我的應用程式已經超過限制了(總共約 530 MB)。

為了保持應用的快速響應,我建立了一個 CloudWatch 函數,讓 Lambda 執行個體保持”熱“狀态,使應用始終處于激活态。接着,我添加了一些函數用于處理不是 JPG 格式的圖檔,在最後,我做好了一個能提供服務的 API。這些精簡工作讓應用在大多數情況下能夠于 5 秒之内傳回 response。

上圖為 API 提供的圖檔可能内容的機率

此外,Lambda 的價格便宜的令人驚訝。以現在的情況,我可以每個月免費分析 60,952 張圖檔,之後的圖檔每張僅需 0.0001094 美元(這意味着接下來的 60,952 張圖像約花費 6.67 美元)。

剩下的工作就是将其打包為 Chrome 拓展插件,以友善使用者使用。這個工作沒啥挑戰性(僅需要向我的 API 端點發起一個簡單的 AJAX 請求即可)。

上圖為 Auto Alt Text Chrome 插件運作示例

Im2txt 模型對于人物、風景以及其它存在于 COCO 資料集中的内容表現良好。

上圖為 COCO 資料集圖檔分類

這個模型能夠标注的内容還是有所限制;不過,它能标注的内容已經涵蓋了 Facebook、Reddit 等社交媒體上的大多數圖檔。

雖然現在幾乎每周都會湧現一些關于 AI 的新事物,但最重要的是退回一步,看看這些工具能在研究環境之外發揮出怎樣的作用,以及這些研究能怎樣幫助世界各地的人們。總而言之,我希望我能深入研究 Tensorflow 和 in2txt 模型,并将我所學知識應用于現實世界。我希望這個工具能成為幫助視障人士”看“更好的網際網路的第一步。

<b>原文釋出時間為:2017年8月29日</b>

<b>本文來自雲栖社群合作夥伴掘金,了解相關資訊可以關注掘金網站。</b>

繼續閱讀