又是一個很有熱度的周末,除了炎熱的天氣,還有火熱的世界杯。今天人工智能頭條為大家準備的技術(shù)干貨,讓大家可以在空調(diào)下,吃瓜看球兩不耽誤就可以輕松完成AI應用實踐入門。多少次,在我們查找很多資源、技術(shù)指導后,實操時還是會被一個報錯而終止了前進的道路。小編也曾經(jīng)歷過這樣的心路歷程,所以一份好的指南對于剛開始實踐操作的同學來說簡直太有愛了,不僅節(jié)約了很多時間,操作和思路也都是清晰的。如果你是剛?cè)腴T的AI小白,想通過一些簡單的應用實踐對AI應用有更深入的了解,現(xiàn)在就開始和我們一起開始吧!
作者簡介:鄒欣,現(xiàn)任微軟亞洲研究院研發(fā)經(jīng)理,負責必應搜索客戶端、必應輸入法、必應詞典、微軟小娜等產(chǎn)品。曾出版《移山之道》、《編輯之美》(合作)、《構(gòu)建之法》三部書籍。
下面為大家介紹鄒欣老師的AI應用開發(fā)實踐系列教程之手寫識別應用入門,本次教程學習主要分三步:
從零開始搭建你的開發(fā)環(huán)境,無論是Windows 還是 MAC OS 環(huán)境
簡單的 MNIST 模型訓練
入門手寫體識別應用實踐
這波操作大家放心可以輕松完成,教程中不僅介紹了每步需要做什么,還為你準備了有參考價值的命令行、代碼、各安裝軟件版本號的明確說明、需要下載或者訪問的鏈接以及截圖和教程視頻,可以說非常全面、到位了。
▌為你的 Windows 搭建開發(fā)環(huán)境并開始訓練第一個模型
(1)準備工作:一臺能聯(lián)網(wǎng)的電腦,使用 win10 64 位操作系統(tǒng),請確保鼠標、鍵盤、顯示器都是好的
(2)安裝步驟:
安裝 Git
安裝 VS,等待時間看網(wǎng)絡狀況,沒準可以看半場球反正不用擔心不用著急。
安裝 python
安裝 CUDA 和 cuDNN:這是教程中最繁瑣的一步,這一步直接拉高教程的平均難度。
配置機器學習環(huán)境:這是教程中最簡單的一步,為了方便用戶配置環(huán)境,微軟提供了一鍵安裝工具!簡直業(yè)界良心!
安裝 VS Tools For AI插件
(3)離線模型的訓練:注意在此過程中使用最新的 mnist.py 文件
文章鏈接:
https://blog.csdn.net/softwareteacher/article/details/80770079
▌為你的 MAC OS 搭建開發(fā)環(huán)境并開始訓練第一個模型
(1)準備工作:一臺能聯(lián)網(wǎng)的電腦,使用 MAC OS 操作系統(tǒng),請確保鼠標、鍵盤、顯示器都是好的
(2)安裝步驟:
安裝 VS,同樣時間長的小伙伴們不妨考慮去看半場球啊!
安裝 python
安裝 Tools for AI 插件
安裝 Git
下載機器學習示例庫
(3)模型訓練:也是小編的第一個模型!在教程中孩子特別補充講解了如何在遠程 Linux 上進行訓練。
文章鏈接:
https://blog.csdn.net/softwareteacher/article/details/80770239
▌AI應用開發(fā)實踐—手寫識別應用入門
敲重點!!!環(huán)境搭建和模型訓練都搞定后,接下來終于可以上手應用實踐了,以下為手寫識別應用教程全文,enjoy!
手寫體識別的應用已經(jīng)非常流行了,如輸入法,圖片中的文字識別等。但對于大多數(shù)開發(fā)人員來說,如何實現(xiàn)這樣的一個應用,還是會感覺無從下手。本文從簡單的 MNIST 訓練出來的模型開始,和大家一起入門手寫體識別。
在本教程結(jié)束后,會得到一個能用的 AI應用,也許是你的第一個AI應用。雖然離實際使用還有較大的距離(具體差距在文章后面會分析),但會讓你對AI應用有一個初步的認識,有能力逐步搭建出能夠?qū)嶋H應用的模型。
原文鏈接:
https://blog.csdn.net/softwareteacher/article/details/80770347
▌準備工作
使用 win10 64 位操作系統(tǒng)的計算機
參考上一篇博客 AI應用開發(fā)實戰(zhàn) - 從零開始配置環(huán)境。在電腦上訓練并導出 MNIST 模型。
▌一. 思路
通過上一篇文章搭建環(huán)境的介紹后,就能得到一個能識別單個手寫數(shù)字的模型了,并且識別的準確度會在 98%,甚至 99% 以上了。那么我們要怎么使用這個模型來搭建應用呢?
大致的步驟如下:
實現(xiàn)簡單的界面,將用戶用鼠標或者觸屏的輸入變成圖片。
將生成的模型包裝起來,成為有公開數(shù)據(jù)接口的類。
將輸入的圖片進行規(guī)范化,成為數(shù)據(jù)接口能夠使用的格式。
最后通過模型來推理 (inference) 出圖片應該是哪個數(shù)字,并顯示出來。
是不是很簡單?
▌二.動手
步驟一:獲取手寫的數(shù)字
提問:那我們要怎么獲取手寫的數(shù)字呢?
回答:我們可以寫一個簡單的 WinForm 畫圖程序,讓我們可以用鼠標手寫數(shù)字,然后把圖片保存下來。
首先,我們打開 Visual Studio,選擇文件->新建->項目。
在彈出的窗口里選擇 Visual C#->Windows窗體應用,項目名稱不妨叫做 DrawDigit,解決方案名稱不妨叫做 MnistForm,點擊確定。
此時,Visual Studio 也自動彈出了一個窗口的設計圖。
在 DrawDigit 項目上點擊右鍵,選擇屬性,在生成一欄將平臺目標從 Any CPU 改為 x 64。
否則,DrawDigit(首選32位)與它引用的 MnistForm(64位)的編譯平臺不一致會引發(fā) System.BadImageFormatException 的異常。
然后我們對這個窗口做一些簡單的修改:
首先我們打開 VS 窗口左側(cè)的工具箱,這個窗口程序需要以下三種組件:
1. PictureBox:用來手寫數(shù)字,并且把數(shù)字保存成圖片
2. Label:用來顯示模型的識別結(jié)果
3. Button:用來清理PictureBox的手寫結(jié)果
那經(jīng)過一些簡單的選擇與拖動還有調(diào)整大小,這個窗口現(xiàn)在是這樣的:
一些注意事項
這些組件都可以通過右鍵->查看屬性,在屬性里修改它們的設置
為了方便把 PictureBox 里的圖片轉(zhuǎn)化成 Mnist 能識別的格式,PictureBox 的需要是正方形
可以給這些控件起上有意義的名稱。
可以調(diào)整一下 label 控件大小、字體等,讓它更美觀。
經(jīng)過一些簡單的調(diào)整,這個窗口現(xiàn)在是這樣的:
現(xiàn)在來讓我們愉快地給這些組件添加事件!
還是在屬性窗口,我們選擇某個組件,右鍵->查看屬性,點擊閃電符號,給組件綁定對應的事件。每次綁定后,會跳到代碼部分,生成一個空函數(shù)。點回設計視圖繼續(xù)操作即可。
組件類型 | 事件 |
pictureBox1 | 在Mouse下雙擊MouseDown、MouseUp、MouseMove來生成對應的響應事件函數(shù)。 |
button1 | 如上,在Action下雙擊Click。 |
Form1 | 如上,在Behavior下雙擊Load。 |
然后我們開始補全對應的函數(shù)體內(nèi)容。
注意,如果在上面改變了控件的名稱,下面的代碼需要做對應的更改。
廢話少說上代碼!
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Drawing.Drawing2D;//用于優(yōu)化繪制的結(jié)果usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;usingMnistModel;namespaceDrawDigit{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privateBitmapdigitImage;//用來保存手寫數(shù)字privatePointstartPoint;//用于繪制線段,作為線段的初始端點坐標privateMnistmodel;//用于識別手寫數(shù)字privateconstintMnistImageSize=28;//Mnist模型所需的輸入圖片大小privatevoidForm1_Load(objectsender,EventArgse){//當窗口加載時,繪制一個白色方框model=newMnist();digitImage=newBitmap(pictureBox1.Width,pictureBox1.Height);Graphicsg=Graphics.FromImage(digitImage);g.Clear(Color.White);pictureBox1.Image=digitImage;}privatevoidclean_click(objectsender,EventArgse){//當點擊清除時,重新繪制一個白色方框,同時清除label1顯示的文本digitImage=newBitmap(pictureBox1.Width,pictureBox1.Height);Graphicsg=Graphics.FromImage(digitImage);g.Clear(Color.White);pictureBox1.Image=digitImage;label1.Text="";}privatevoidpictureBox1_MouseDown(objectsender,MouseEventArgse){//當鼠標左鍵被按下時,記錄下需要繪制的線段的起始坐標startPoint=(e.Button==MouseButtons.Left)?e.Location:startPoint;}privatevoidpictureBox1_MouseMove(objectsender,MouseEventArgse){//當鼠標在移動,且當前處于繪制狀態(tài)時,根據(jù)鼠標的實時位置與記錄的起始坐標繪制線段,同時更新需要繪制的線段的起始坐標if(e.Button==MouseButtons.Left){Graphicsg=Graphics.FromImage(digitImage);PenmyPen=newPen(Color.Black,40);myPen.StartCap=LineCap.Round;myPen.EndCap=LineCap.Round;g.DrawLine(myPen,startPoint,e.Location);pictureBox1.Image=digitImage;g.Dispose();startPoint=e.Location;}}privatevoidpictureBox1_MouseUp(objectsender,MouseEventArgse){//當鼠標左鍵釋放時//同時開始處理圖片進行推理//暫時不處理這里的代碼}}}
步驟二:把模型包裝成一個類
將模型包裝成一個 C# 是整個過程中比較麻煩的一步。所幸的是,Tools for AI 對此提供了很好的支持。進一步了解,可以看這里(https://github.com/Microsoft/vs-tools-for-ai/blob/master/docs/zh-hans/docs/model-inference.md)。
首先,我們在解決方案 MnistForm 下點擊鼠標右鍵,選擇添加->新建項目,在彈出的窗口里選擇 AI Tools->Inference->模型推理類庫,名稱不妨叫做 MnistModel,點擊確定,于是我們又多了一個項目。
然后自己配置好這個項目的名稱、位置,點擊確定。
然后彈出一個模型推理類庫創(chuàng)建向?qū)В@個時候就需要我們選擇自己之前訓練好的模型了~
首先在模型路徑里選擇保存的模型文件的路徑。這里我們使用在AI應用開發(fā)實戰(zhàn) - 從零開始配置環(huán)境博客中訓練并導出的模型
note:模型可在 /samples-for-ai/examples/tensorflow/MNIST 目錄下找到,其中 output 文件夾保存了檢查點文件,export 文件夾保存了模型文件。
對于TensorFlow,我們可以選擇檢查點的 .meta 文件,或者是保存的模型的 .pb 文件
這里我們選擇在AI應用開發(fā)實戰(zhàn) - 從零開始配置環(huán)境這篇博客最后生成的 export 目錄下的檢查點的 SavedModel.pb 文件,這時程序?qū)⒆詣优渲煤门渲猛评斫涌冢娤聢D:
類名可以自己定義,因為我們用的是 MNIST,那么類名就叫 Mnist 好了,然后點擊確定。
這樣,在解決方案資源管理器里,在解決方案 MnistForm 下,就多了一個 MnistModel:
雙擊 Mnist.cs,我們可以看到項目自動把模型進行了封裝,生成了一個公開的 infer 函數(shù)。
然后我們在 MnistModel 上右擊,再選擇生成,等待一會,這個項目就可以使用了~
步驟三:連接兩個部分
這一步差不多就是這么個感覺:
I have an apple , I have a pen. AH~ , Applepen
首先,我們來給 DrawDigit 添加引用,讓它能使用 MnistModel。在 DrawDigit 項目的引用上點擊鼠標右鍵,點擊添加引用,在彈出的窗口中選擇 MnistModel,點擊確定。
然后,由于 MNIST 的模型的輸入是一個 28×28 的白字黑底的灰度圖,因此我們首先要對圖片進行一些處理。
首先將圖片轉(zhuǎn)為 28×28 的大小。
然后將 RGB 圖片轉(zhuǎn)化為灰階圖,將灰階標準化到 [-0.5,0.5] 區(qū)間內(nèi),轉(zhuǎn)換為黑底白字。
最后將圖片用 mnist 模型要求的格式包裝起來,并傳送給它進行推理。
于是,我們在 pictureBox1_MouseUp 中添加上這些代碼,并且在文件最初添加上 using MnistModel;:
privatevoidpictureBox1_MouseUp(objectsender,MouseEventArgse){//當鼠標左鍵釋放時//開始處理圖片進行推理if(e.Button==MouseButtons.Left){BitmapdigitTmp=(Bitmap)digitImage.Clone();//復制digitImage//調(diào)整圖片大小為Mnist模型可接收的大小:28×28using(Graphicsg=Graphics.FromImage(digitTmp)){g.InterpolationMode=InterpolationMode.HighQualityBicubic;g.DrawImage(digitTmp,0,0,MnistImageSize,MnistImageSize);}//將圖片轉(zhuǎn)為灰階圖,并將圖片的像素信息保存在list中varimage=newList
最后讓我們嘗試一下運行~
▌三.效果展示
現(xiàn)在我們就有了一個簡單的小程序,可以識別手寫的數(shù)字了。
趕緊試試效果怎么樣~
▌注意
1.路徑中不能有中文字符,否則可能找不到模型。
▌進階
那么,如果要識別多個連寫的數(shù)字,或支持字母該怎么做呢?大家多用用也會發(fā)現(xiàn),如果數(shù)字寫得很小,或者沒寫到正中,識別起來正確率也會不高。要解決這些問題,做成真正的產(chǎn)品,就不止這一個模型了。比如在多個數(shù)字識別中,可能要根據(jù)經(jīng)驗來切分圖,或者訓練另一個模型來檢測并分割數(shù)字。要支持字母,則需要重新訓練一個包含手寫字母的模型,并準備更多的字母的數(shù)據(jù)。要解決字太小的問題,還要檢測一下字的大小,做合適的放大等等。
我們可以看到,一個訓練出來的模型本身到一個實際的應用之間還有不少的功能要實現(xiàn)。希望我們這一系列的介紹,能夠幫助大家將機器學習的概念帶入到傳統(tǒng)的編程領(lǐng)域中,做出更聰明的產(chǎn)品。
-
WINDOWS
+關(guān)注
關(guān)注
4文章
3552瀏覽量
88824 -
AI
+關(guān)注
關(guān)注
87文章
31000瀏覽量
269333 -
機器學習
+關(guān)注
關(guān)注
66文章
8422瀏覽量
132743
原文標題:一邊吃瓜看球,一邊完成AI應用實踐——手寫體識別入門
文章出處:【微信號:AI_Thinker,微信公眾號:人工智能頭條】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論