全文大約:5600字
讀完可能需要下面這首歌的時間
??
隨著 AI 越來越深入的發(fā)展,智能革命的浪潮隱約到來,悄然的影響著軟件行業(yè)。
那么,作為多年的程序員,或者準備著成為新一代程序員的讀者們,該如何為智能時代做好準備,成為 AI 時代的程序員呢?
網(wǎng)上鋪天蓋地的教程,大部分都是從高數(shù)、線代、概率講起的算法基礎(chǔ),或者是討論某某網(wǎng)絡(luò)的算法,比較模型的效果,偏研究和數(shù)據(jù)科學。
多學一些知識,當然是很好的,但畢竟需要不少的時間,在軟件開發(fā)中積累的經(jīng)驗好像也用不上太多。
如果程序員們從自己擅長的領(lǐng)域出發(fā),逐步融入 AI 熱潮中,豈不是取長補短,事半功倍?從另一方面來看,以后是不是只需要開發(fā) AI 模型就夠了呢?顯然不是,AI 模型會帶來智能革命,但傳統(tǒng)的軟件開發(fā)仍然是基礎(chǔ)。
就像工業(yè)革命發(fā)生后,人類仍然需要農(nóng)業(yè)提供足夠的糧食;信息革命發(fā)生后,也需要工業(yè)革命所帶來的巨大工業(yè)生產(chǎn)力。因此,智能革命也會基于信息革命所構(gòu)建的巨大的軟件制造經(jīng)驗和能力之上。
本文幫你入門 AI 應(yīng)用開發(fā),寫出第一個 AI 程序 -- 手寫識別(見下圖)。同時會穿插著講一些必備的 AI 知識和背景,帶你走入 AI 新世界的大門。
找個網(wǎng)絡(luò)環(huán)境較好的地方,計劃好空閑的時間,放松心情,一步步學習下來,保準你收獲滿滿。
注意:安裝過程中要下載的軟件較多,建議在網(wǎng)速穩(wěn)定且較快的環(huán)境下進行。整個時長取決于預先安裝的情況,以及網(wǎng)絡(luò)狀況。通常一個多小時即可完成環(huán)境搭建和 AI 應(yīng)用。
Windows 64 位版本
強烈推薦升級到 Windows 10 的最新發(fā)行版,并安裝上所有更新。Windows 7,Windows 8 也需要64位版本,推薦安裝所有系統(tǒng)更新。
Visual Studio
本教程將安裝 Visual Studio 2017。如果有舊版的 Visual Studio 且條件允許,最好先行卸載。特別是 Visual Studio 2012,可能會出現(xiàn)兼容性問題。
Python
在安裝 Visual Studio 2017 時,會安裝 Python 3.6 版本。如果系統(tǒng)已經(jīng)有 Python 3.6 將不會再安裝它。如果是這種情況,在本文中配置路徑時,應(yīng)配置成當前 Python 3.6 的路徑。
AI 框架
本安裝過程會安裝 TensorFlow,CNTK,pytorch,Keras,Caffe2,Theano,MXNe,Chainer 等流行的 AI 框架。如果你的 Python 環(huán)境已經(jīng)有了一些框架并正在使用中,建議最好選擇干凈的 Python 環(huán)境來安裝。以免產(chǎn)生版本沖突,或影響正在使用已安裝框架的代碼。
Git 是流行的源代碼版本管理工具,應(yīng)用非常廣泛。在接下來的安裝過程中,會通過它下載一些 AI 組件。
先打開命令行或終端窗口,輸入 git
,看是否能找到此命令。如果命令行返回了 Git 命令的用法說明,則表示已經(jīng)安裝了 Git,可跳過 Git 安裝部分。
如果沒有安裝 Git,打開安裝頁面,自動下載 Git 安裝包。下載完后,點擊安裝。為了方便使用,在安裝向?qū)е行柽x擇在命令提示符中使用 Git(見下圖)。其它步驟直接點擊 Next。
在機器學習中,有的算法在并行計算下速度會得到很大的提升。而 GPU 由于要進行快速的圖形處理,且這類計算可并行程度很高,所以 GPU 有很強的并行計算能力。在運行一些機器學習算法時,同等價位的 GPU 的速度會比 CPU 快上數(shù)十倍、甚至百倍。
NVIDIA 的顯卡是機器學習領(lǐng)域中最流行的硬件之一,幾乎所有框架都集成了對它的支持。安裝過程也包括了 NVIDIA 顯卡的配置。
如果沒有 NVIDIA 的顯卡,則可跳過這步,直接安裝或配置 Visual Studio 2017。
確認自己的顯卡是 NVIDIA 的,并支持 CUDA
CUDA(Compute Unified Device Architecture)是 NVIDIA 公司推出的通用并行計算架構(gòu),能將顯卡用于解決各種復雜的計算問題。通過顯卡的成百甚至上千個并行核心來加速計算。
訪問 NVIDIA 的桌面或筆記本顯卡列表,并找到自己的顯卡型號,點開詳情頁面。如果在左邊能看到下圖的高亮部分,則表示支持 CUDA(部分高端顯卡會進入購買頁面,這也表示支持 CUDA),否則開始安裝或配置 Visual Studio 2017。
如果不太清楚如何檢查 GPU 型號或找不到自己的顯卡,可先跳過下面 CUDA 與 cuDNN 的安裝過程,在接下來安裝AI框架時能夠自動檢測 GPU 是否受支持,是否安裝了 CUDA,cuDNN。
如果發(fā)現(xiàn)顯卡是支持的,但沒有安裝 CUDA 與 cuDNN,可以在安裝結(jié)束后再進行這一步。
4. 安裝 NVIDIA 機器學習相關(guān)組件
如果確認了是支持 CUDA 的 NVIDIA 顯卡,根據(jù)下面的步驟來完成配置。
1. 確認安裝了最新的顯卡驅(qū)動
如已安裝,接下來我們安裝 CUDA
2. 安裝 CUDA 9.0
為了減少 TensorFlow 等機器學習框架的兼容性問題,這里選擇了安裝兼容性最佳的 CUDA 9.0。
首先,進入 CUDA 9.0 下載頁面。
然后,選擇對應(yīng)的操作系統(tǒng)、CPU 架構(gòu)、操作系統(tǒng)版本來確認安裝包。安裝包本身也比較大,如果網(wǎng)速穩(wěn)定,可以選擇網(wǎng)絡(luò)(network)版本來按需安裝。如果網(wǎng)速不穩(wěn)定,或者要在多臺機器上安裝,可選擇本地安裝(local)版本一次性完成下載。
選擇好后,直接點擊打開或另存到本地再運行。
注意:如果安裝過程中出現(xiàn)了以下錯誤,可能是由于顯卡較新,而 CUDA 9.0 中不包含對應(yīng)的驅(qū)動。這時候可以重新開始安裝過程,選擇自定義安裝,并取消勾選顯卡驅(qū)動(Driver Components)再試一次。
3.配置 cuDNN
cuDNN(CUDA Deep Neural Network)是 NVIDIA 基于 CUDA 的專為深度神經(jīng)網(wǎng)絡(luò)優(yōu)化的計算庫。cuDNN 的下載安裝過程比較復雜,需要在 NVIDIA 網(wǎng)站進行注冊后才可下載。
首先進入 cuDNN 下載頁面,點擊展開 Download cuDNN v7.0.5 (Dec 5, 2017), for CUDA 9.0。然后根據(jù)對應(yīng)的操作系統(tǒng)選擇對應(yīng)的版本,隨后會進入下面的登錄界面。
注冊或者登錄后,就能看到下載鏈接,或者重新點擊下載頁面再來一遍。
解壓開會有一個 dll 擴展名的動態(tài)鏈接庫文件,將其拷貝到 CUDA 安裝目錄的 bin 目錄中即可。CUDA 的默認安裝路徑路徑如下:
注意:如果有 Visual Studio 的其它版本,盡可能卸載后,再安裝 Visual Studio 2017。特別是 Visual Studio 2012 或者更低版本,否則在使用時有可能發(fā)生版本沖突相關(guān)的問題。
如果已經(jīng)安裝了 Visual Studio 2017,只需要從開始菜單中搜索并打開 Visual Studio Installer。選擇更多中的修改來確認是否安裝了 Python開發(fā) 與 .NET 桌面開發(fā)這兩個工作負載。如果沒有,則選上并安裝。
1.進入下載頁面,指向下載 Visual Studio,并點擊 Community 2017。
Visual Studio Community 版是完全免費的,包含有 Visual Studio 的大部分基礎(chǔ)功能,也能全面的支持 AI 應(yīng)用開發(fā)。只需要用微軟賬戶登錄后,就可以一直使用。
2.運行安裝程序后,會打開工作負載的選擇界面。至少要選擇 Python 開發(fā)與 .NET 桌面開發(fā)。
Visual Studio 將多種場景下的開發(fā)都按照工作負載的方式進行了組合,只需要勾選上,就能順暢的進行對應(yīng)場景下的開發(fā)了。安裝完成后,可以通過開始菜單中的 Visual Studio Installer 再次打開這個界面,安裝其它工作負載。
隨后點擊右下方的安裝按鈕,即可開始安裝。根據(jù)選擇的內(nèi)容多少以及網(wǎng)絡(luò)情況,安裝時長也會很不一樣。此處需耐心等待。
Visual Studio Tools for AI 是 AI 集成開發(fā)環(huán)境中較核心的部分,包含了訓練任務(wù)管理、模型推理等功能。
1.啟動 Visual Studio,在菜單欄中選擇工具 -> 擴展和更新。
2.點擊聯(lián)機,并在右上方輸入 tools for ai 后回車。如果第一次沒有搜索出來,可再增加一個空格,并再次回車搜索。搜索結(jié)果出來后,點擊 Microsoft Visual Studio Tools for AI 的下載按鈕。
3.下載完成后,關(guān)閉所有 Visual Studio 窗口,來觸發(fā)插件的安裝過程。關(guān)閉 Visual Studio 后,稍等數(shù)秒鐘,即會出現(xiàn)安裝界面,點擊修改。等待整個安裝過程結(jié)束,然后點擊關(guān)閉。
4.再次打開 Visual Studio,在菜單欄會看到 AI 工具,表示安裝完成。
在機器學習中,特別是深度學習中,經(jīng)常會因為各種原因,需要在不同的 AI 框架之間切換。而不同的框架可能還依賴于不同的底層庫版本。因此,搭建一個順手的 AI 開發(fā)環(huán)境,頗會花些時間和精力。
本文通過微軟 AI 示例庫中的一鍵安裝腳本,簡化了 AI 框架的安裝過程。
一次性就能裝上 TensorFlow,CNTK,pytorch,Keras,Caffe2,Theano,MXNet,Chainer 等流行框架,以及 jupyter,matplotlib, pandas,scipy,onnx,tf2onnx,scikit - learn,xgboost,libsvm 等流行工具。這個 1000 多行的安裝腳本會節(jié)省大量的安裝配置時間,也讓新手不再被卡在安裝配置環(huán)境這一步上。
打開命令提示符或終端窗口,選擇并進入某個用來存放代碼的目錄,如 %USERPROFILE%
。運行下列命令,來下載微軟 AI 示例庫,完成后進入該目錄。
注意:請確保整個路徑中沒有中文。不少機器學習框架對多語言支持并不好,為了防止因此出現(xiàn)的問題,保證整個路徑?jīng)]有中文等擴展字符集。
注意:推薦用管理員權(quán)限打開命令提示符窗口。以免 Python 安裝目錄需要管理員權(quán)限才能寫入文件。步驟:打開開始菜單 -> 用鍵盤輸入 cmd -> 右擊出現(xiàn)的命令提示符 -> 選擇以管理員身份運行-> 通過 cd
命令選擇一個合適的目錄,如 cd /d %USERPROFILE%
。
1.命令提示符下可能沒有配置 Python 的路徑。運行 python --version
檢查一下。
如出現(xiàn)上圖的內(nèi)容,表示系統(tǒng)路徑中沒有 Python ,則根據(jù)系統(tǒng)中 Visual Studio 的安裝路徑,用下列命令來設(shè)置 Python 路徑。
注意:如果修改過 Visual Studio 的默認安裝路徑,則此命令也需要做相應(yīng)的修改。
2.執(zhí)行 install.py
3.檢查并配置 CUDA、cuDNN
如果前面的步驟中,因為不確定顯卡是否支持 CUDA 等原因,而跳過了 CUDA 安裝部分。這里可以看一下輸出。如果在輸出的前面幾行里發(fā)現(xiàn)了以下字樣,則表示支持 CUDA,且沒有正確安裝好 CUDA 或(和)cuDNN。等待安裝腳本運行完后,參考前文完成 CUDA 和 cuDNN 的安裝。
安裝結(jié)束后,如果有任何紅色的錯誤文字,請參考常見問答:運行 install.py 時出現(xiàn)紅色錯誤文字時,該如何處理?。
命令行窗口完成后回車一下,但不要關(guān)閉,接著開始訓練第一個模型。
下載的 samples-for-ai 中包含了大量的機器學習訓練和應(yīng)用的示例。使用 TensorFlow 的 MNIST 示例來測試一下環(huán)境安裝是否成功,也為下一步準備好 AI 模型。
運行過程中會打印出一些 error 字樣。別擔心,這都是 AI 訓練過程中正常的錯誤率信息。隨著訓練過程的進行,模型在訓練時的錯誤率會逐步下降,這表示 AI 模型推理預測出的結(jié)果越來越準確了。
克隆代碼,并導入訓練好的模型,就可以試試自己的第一個 AI 應(yīng)用了!當然,不僅要知其然,也知其所以然,接下來還會分析一下核心的代碼。
使用下面的命令來克隆 AI 應(yīng)用的代碼。代碼里有一個應(yīng)用的窗體項目,預先寫好了所有的代碼。同上,要選擇好放置代碼的路徑,如:cd /d %USERPROFILE%
注意:放置克隆代碼的路徑中不能含有中文。
運行完上面的腳本后,就會在 Visual Studio 2017 中打開這個解決方案。
1.首先創(chuàng)建模型項目。在解決方案資源管理器中,右擊解決方案,指向添加,再點擊新建項目。
注意,一定要在解決方案上右擊,否則不會出現(xiàn)新建項目的菜單。
2.在彈出的添加新項目的對話框里,選擇 AI Tools 下的 Inference 后,在右邊選擇模型推理類庫(.NET Framework)。
然后在下面的名稱處改為 Model,并點擊確定。
注意:名稱一定要保持一致(包括大小寫),這是生成代碼的命名空間。
3.點擊確定后,Visual Studio 會提示在檢查環(huán)境,完成后會顯示下圖。紅色的框先不用擔心,點擊瀏覽。
4.瀏覽到示例代碼的下載路徑,并繼續(xù)選擇到如下路徑中的 saved_model.pb 文件,并點擊打開。
注意:參考前文訓練模型部分的代碼來找到示例的路徑。
5.點擊打開后,會出現(xiàn)分析模型的過程,完成后,就會如下圖。這時候,再在類名中輸入 Mnist,最后點擊確定。
第一次導入模型會下載所依賴的庫,因此,正在創(chuàng)建項目 “ Model ” ... 的對話框會顯示較長時間。
注意:Mnist 會是生成代碼的類名,所以也要保持一致(包括大小寫)。另注意單詞中 n 和 i 的位置。
分析模型會調(diào)用 TensorFlow 來分析模型文件的輸入輸出等信息,以便生成相應(yīng)的代碼,有時會花一兩分鐘。
6.一旦創(chuàng)建項目完成后,先檢查一下是不是如下圖產(chǎn)生了 Model 項目,并且里面有 packages.config 文件。如果沒有看到此文件,通常是由于網(wǎng)速過慢,下載超時造成的。請參考常見問題:創(chuàng)建模型項目時出現(xiàn)錯誤,該如何處理?
然后,右擊 MNIST.App 項目的引用,并點擊添加引用。
如果有興趣的話,可以點開 Mnist 目錄看看生成的代碼。這里面還包含了優(yōu)化后的模型數(shù)據(jù)文件。
注意:要在引用上右擊。
7.在彈出的對話框中,點擊項目,并在右側(cè)將 Model 勾上。這樣就能在窗體項目中引用 Model 項目了。
8.現(xiàn)在按下 CTRL F5,或者點擊工具欄上的啟動按鈕。你的第一個 AI 應(yīng)用就運行起來了!666。
知其然,還要知其所以然,所以要簡單介紹一下代碼以及必須的知識。代碼的邏輯都在 MNIST.App 項目的 MainWindow.cs 文件中,剩下的都是自動生成的代碼。該文件包括了界面聯(lián)動、數(shù)據(jù)預處理兩部分的代碼,以及一行推理預測的代碼。界面聯(lián)動是為了實現(xiàn)手寫輸入時的良好體驗,而數(shù)據(jù)預處理部分是在推理前,將用戶輸入的筆跡變?yōu)槟P退枰斎氲母↑c數(shù)組。
注意:代碼中包含了非常詳盡的注釋。建議在讀完本章節(jié)后,再通讀代碼中的注釋,以便更深入的理解整個代碼邏輯。
1.展開 MNIST.App 項目,找到 MainWindow.cs 文件。所有的界面設(shè)計和代碼都在這里。先雙擊它,打開設(shè)計界面??梢钥吹剑O(shè)計界面和程序?qū)嶋H運行起來的效果非常像。窗體上包含了三個控件:PictureBox,Label,以及Button。稍后會介紹控件對應(yīng)的變量名稱,以及添加的事件、用途等。
2.在窗體的設(shè)計界面上右擊,并選擇查看代碼,可以看到核心的代碼。
3.打開代碼后,可以看到,幾乎每一行代碼都有對應(yīng)的注釋。除了類里的 ImageSize 等幾個變量外,剩下的邏輯幾乎都在事件響應(yīng)函數(shù)中。這些響應(yīng)函數(shù)是在控件屬性的事件面板中添加的。每個控件都在代碼中可以通過變量名稱來使用。
具體信息如下:
數(shù)據(jù)預處理
數(shù)據(jù)預處理是 AI 應(yīng)用的重要一環(huán)。
在大部分 AI 應(yīng)用中,特別是本文的圖片分類應(yīng)用中,通過監(jiān)督學習來訓練模型。即先提供一些標記過分類的圖片來訓練出模型,然后輸入未知的圖片,推理預測出此圖片的類別。因此,在訓練和推理過程中,每次輸入模型的數(shù)據(jù)格式必須完全一致,這樣才能保證預測推理的效果。
本示例已知了訓練數(shù)據(jù)的輸入形式,所以按圖索驥就能寫出代碼。在 AI 的實際應(yīng)用中,一定要了解模型輸入數(shù)據(jù)的格式細節(jié),嚴格的實現(xiàn)它。如果數(shù)據(jù)格式細節(jié)不一致,通常會降低推理結(jié)果的正確率。而這類問題幾乎不會產(chǎn)生編譯或運行錯誤,而且數(shù)據(jù)是不易直觀理解的浮點數(shù)組,所以對此類問題的診斷和修正較困難。
下面會介紹一下本例中的數(shù)據(jù)預處理過程,從而體會一下數(shù)據(jù)預處理中的細節(jié)問題。
1. 數(shù)據(jù)預處理的第一步,在窗體設(shè)計時,手寫區(qū)域調(diào)整為了正方形,和訓練數(shù)據(jù)的形狀保持一致。
2. 定義了類變量 ImageSize 常量等于 28。這是訓練數(shù)據(jù)的實際圖片尺寸。
界面上的正方形最終會縮小為 28 x 28。以下均為C#代碼
3.clear
函數(shù)中設(shè)置了手寫區(qū)域的背景為白色。訓練數(shù)據(jù)是黑白的,需要將前景、背景顏色同樣設(shè)置,從而與訓練數(shù)據(jù)一樣,達到最大的對比度。
4. writeArea_MouseMove
事件中設(shè)置了手寫筆風格。手寫筆跡寬度是 40,顏色為黑色,開始、結(jié)束位置設(shè)成圓頭。
筆跡寬度與圖片尺寸的比例基本匹配了訓練數(shù)據(jù)的比例。但無法控制用戶輸入的文字大小,還會有一些誤差。好在深度學習的模型適應(yīng)性較強,對識別準確率的影響不太大。
黑色筆跡配合了白色背景,形成最大的對比度。
筆跡的開始、結(jié)束位置為圓頭。在書寫過程中會多次調(diào)用到鼠標移動事件中,每次根據(jù)上一次的結(jié)束位置到當前位置畫了一條直線。如果不將筆頭設(shè)置為圓頭,就會像下圖一樣,這些直線會形成矩形拼接起來,形成很多不連續(xù)的位置。既影響識別,也不美觀。
5. writeArea_MouseUp
事件中包含了其它的數(shù)據(jù)處理邏輯。首先構(gòu)造了 28 x 28 的圖片,將手寫的圖片縮放到了新的圖片對象中。
6. 按行、列遍歷了 28 x 28 位圖中的所有節(jié)點,并取出了每個像素,處理后存入數(shù)組中。
7. 將紅綠藍通道加和并平均,完成了像素灰度化。手寫識別模型的輸入數(shù)據(jù)是黑白圖。
手寫區(qū)是白底黑字,每個顏色通道的值其實是一樣的。為了邏輯上的嚴密和便于理解,所以對值取了均值,進行灰度化。
8. 將取值范圍變換到了 0 ~ 1。機器學習中取值范圍變化很大,因此絕大部分機器學習模型都用浮點數(shù)進行計算。
9. 將數(shù)值翻轉(zhuǎn),并做了 0.5 的位移。這一步減少輸入數(shù)據(jù)中零值的數(shù)量。過多的零,會讓中間結(jié)果也出現(xiàn)更多的零,在神經(jīng)網(wǎng)絡(luò)中容易丟失信息。
白色背景通過灰度化之后是 255,變換后為 - 0.5;黑色筆跡灰度化之后是 0,變換后為 0.5。這樣處理后,大部分值都成為了非零值。
對于數(shù)據(jù)的取反,是經(jīng)驗的做法。通過試驗,在很多情況下取反后的訓練效果會更好。MNIST 數(shù)據(jù)集的數(shù)據(jù)也是取反保存的。
推理即輸入數(shù)據(jù)并獲取模型的預測結(jié)果。這一步非常簡單,輸入變換后的一維數(shù)組,輸出預測結(jié)果即可。推理函數(shù)每次調(diào)用可以輸入多張圖片,進行批量預測。
本示例非常簡單,還不足以成為實際的手寫識別產(chǎn)品。但邁出這小小的一步,就進了 AI 應(yīng)用開發(fā)的門檻。這里先拋磚引玉,再提出一些實際中會遇到的問題,并給出部分解決方案供參考。
在真正應(yīng)用時還會發(fā)現(xiàn)更多的問題,如連筆文字,歪斜矯正,梯形校正等等。因此,加入 AI 模型后,能將不可能變?yōu)榭赡?,但所需要的軟件開發(fā)工程量仍然很大,傳統(tǒng)軟件開發(fā)中的挑戰(zhàn)一樣也不會少。
在思考實際場景的同時,也會逐漸培養(yǎng)出 AI 的應(yīng)用意識。做產(chǎn)品時,如果遇到了有很多數(shù)據(jù),但很難找到規(guī)律的情況。不妨思考一下,能否用 AI 模型解決這個問題?有了這樣的 AI 意識,就能更好的將 AI 和傳統(tǒng)軟件相結(jié)合,創(chuàng)造出讓人眼前一亮、用戶體驗自然的產(chǎn)品。
在大部分 AI 應(yīng)用中,數(shù)據(jù)非常重要。經(jīng)??梢钥吹骄W(wǎng)上的討論認為:數(shù)據(jù)是 AI 應(yīng)用的基礎(chǔ)。在下面的解決方案中也能看出,很多方案依賴于大量的、有代表性的數(shù)據(jù)。
傳統(tǒng)方案很易于理解和實現(xiàn),但需要巧妙的算法,處理噪音等非常規(guī)情況也比較棘手。AI 模型的質(zhì)量則取決于數(shù)據(jù)、特征工程及算法,不需要鉆研算法。
究竟哪個更好,要在實際場景中驗證后,才能有結(jié)論。也可以同時使用多種方案,再通過一個 AI 模型來決定使用哪個方法的結(jié)果。
當字寫得小一點,或者寫偏一點,識別錯誤的情況就會變多。這是因為訓練數(shù)據(jù)為了提高模型的識別率,對數(shù)據(jù)都進行了居中、縮放的處理??赡艿慕鉀Q方案如:
1.采用一些圖像算法,如:找到筆跡像素的分布中心,將其居中,并根據(jù)外圍的筆跡像素來進行縮放,適配到識別區(qū)中。此方法邏輯清晰,不需要數(shù)據(jù)進行訓練。缺點是如果手寫數(shù)據(jù)來源于攝像頭,會有很多噪點,會造成誤判。
2.訓練一個目標檢測(Object Detect)的 AI 模型來自動框出合適的大小。這種方法會將需要的目標(即字符)用矩形框出來、并基本保證其居中。將矩形做適當?shù)目s放后,即可作為輸入。如果數(shù)據(jù)量足夠且有代表性,這種方法的效果會不錯。但目標檢測需要的數(shù)據(jù)標記工作卻很繁瑣,需要對每個訓練數(shù)據(jù)中的字符畫框標記,標記的質(zhì)量也直接影響到了識別的質(zhì)量。
在書寫時,通常是連續(xù)的一段話或者一個等式,很少只輸入一個字符。需要將其分割為單字符,再逐個識別。有兩個問題需要解決:一是將圖片分割出單個字符,二是將字符進行排序。
分割字符
傳統(tǒng)的解決方案較多,如:
找到相鄰的點進行擴展,找到每個連通區(qū)域,然后將重合的矩形合并起來,作為一個字。這種方法的缺點是如果在識別中文等情況下,遇到左右或者上下結(jié)構(gòu),可能會被識別成兩個字符。
檢查每一列像素,如果沒有任何筆跡像素,則將左右兩側(cè)切割開來。但這樣在左右結(jié)構(gòu)時仍然會遇到問題,也不支持縱向書寫。
用 AI 模型,可以使用上文提到的目標檢測(Object Detect)方法,框出每個字符。
字符排序。
單個字符本身的意義還不夠,語言文字中需要將字符組成詞語和句子,才有更豐富的含義。在上一步中,分割出了單個的字符,完成識別后,要將它們組合成詞語和句子。
除了常見的橫向書寫外,還有縱向書寫。如果紙上沒有畫線,還可能越寫越歪。這些問題都給字符排序帶來了麻煩。這一步可以用傳統(tǒng)的方法根據(jù)各個方向的距離等因素綜合判斷是否是連續(xù)的字符串。
解決此問題,主要依靠搜集不同的寫作風格來解決。如果有了有代表性的數(shù)據(jù)集,這個問題就迎刃而解了。
同上,數(shù)據(jù)是最重要的。另外,隨著問題規(guī)模的變大,使用的 AI 模型有可能也要修改,要有足夠的復雜度來容納更多的信息。
如:中文字符比較復雜,可能 28x28 的大小不夠表達足夠多的細節(jié),需要原始輸入的尺寸更大。
因為 Python 語言的異常信息通常是在最下面的一行,所以需要認真閱讀紅色文字的最后一行,尋找關(guān)鍵字。根據(jù)不同的問題進行處理:
time out
access denied 或“拒絕訪問”
其它錯誤 大部分其它錯誤都可能是網(wǎng)絡(luò)問題,可以參考 time out 部分的處理方法。 另外還有可能有版本兼容性問題。如果有多個 Python 環(huán)境,推薦選擇干凈的 Python 環(huán)境進行安裝。
Python 是 AI 訓練中使用得最多的語言,絕大部分 AI 框架和庫都基于 Python。
一個操作系統(tǒng)中可以安裝多個 Python 實例,但并不是每個 Python 環(huán)境都能用來做 AI 開發(fā)。在本安裝過程中使用了 64 位的 Python 3.6。原因如下:
Python 2.x 下受支持的 AI 框架逐漸變少,但 3.x 下幾乎全部支持。
Python 32 位下的 AI 框架也很少。
Python 3.6 是相對較新,且目前兼容性較好的版本。
pip
命令只會將 Python 的包安裝在一個 Python 實例中,只有在當前實例中安裝了某個包,才能使用它。
如果以前安裝過機器學習的軟件包,推薦安裝全新的 Python,從而獲得最好的兼容性。如果沒安裝過,則參考下面的步驟,檢查當前環(huán)境是否能直接使用。
參考前文 python --version
命令的結(jié)果,如果輸出結(jié)果不是 Python 3.6.x 或 Python 3.5.x,則必須安裝新的 Python 環(huán)境。下圖為 3.6.5,是正確的 Python 版本。
運行 python -c 'importplatform;print(platform.architecture())'
來檢查是否是 64 位 Python。下圖中包含了 “ 64bit ” 字樣,Python 的平臺滿足需求。
如果上述任何條件不滿足,或安裝過其它機器學習組件,推薦安裝新的 Python。
在教育網(wǎng)等網(wǎng)絡(luò)環(huán)境里,訪問 GitHub 較不穩(wěn)定。如果不能找到其它網(wǎng)絡(luò)環(huán)境,只能在網(wǎng)絡(luò)的非高峰使用期嘗試。
如果在添加模型項目完成后,沒有在目錄下看到 packages.config
文件。通常是因為網(wǎng)絡(luò)不穩(wěn)定,下載超時造成的。參考下面的過程手工下載依賴的庫。
右擊 Model 項目,選擇 管理 NuGet 程序包...。
在彈出的 NuGet 頁面里,點擊瀏覽,然后輸入 ml.scoring,來手工搜索需要的 NuGet 包。
點選搜索出的 Microsoft.ML.Scoring,點擊右邊的安裝,然后點擊確定。
會在輸出界面看到開始添加 Microsoft.ML.Scoring 的信息。如果網(wǎng)速較慢,這一步會花費一些時間。完成后,即可根據(jù)本文內(nèi)容進行下一步操作。
一般是由于路徑中有中文字符造成的,需要將整個解決方案移動到不包含中文等擴展字符集的路徑中。
本文為特約作者鄒欣撰寫