本文將展示如何通過(guò)圖像處理和深度學(xué)習(xí)來(lái)自動(dòng)解算數(shù)獨(dú)謎題:
圖中的紅色數(shù)字均由算法生成。接下來(lái)我們將介紹如何創(chuàng)建該算法,并說(shuō)明為何深度學(xué)習(xí)和圖像處理對(duì)于對(duì)象檢測(cè)和圖像分類(lèi)同樣十分有用。
圖像處理與深度學(xué)習(xí)
我們重點(diǎn)介紹兩種技術(shù):
圖像處理
按像素級(jí)別變換或者修改圖像。比如,過(guò)濾、模糊、去模糊和邊緣檢測(cè)等;
深度學(xué)習(xí)
通過(guò)學(xué)習(xí)樣本圖像自動(dòng)識(shí)別圖像特點(diǎn)。近幾年,深度學(xué)習(xí)已經(jīng)徹底改變了圖像處理領(lǐng)域。
我們來(lái)探討下這兩種技術(shù)之間的關(guān)聯(lián)性。這里有兩種常見(jiàn)的觀點(diǎn):
“深度學(xué)習(xí)已經(jīng)淘汰了‘傳統(tǒng)’的圖像處理方式。”
“深度學(xué)習(xí)需要數(shù)以百萬(wàn)的學(xué)習(xí)樣本,而且只能用于貓咪圖片識(shí)別這類(lèi)任務(wù)?!?/p>
但事實(shí)是:
深度學(xué)習(xí)和圖像處理都是非常有效的工具,可以解決各種難題,這些任務(wù)通常非常復(fù)雜,只有使用正確的工具才能解決問(wèn)題。
數(shù)獨(dú)解謎
解算數(shù)獨(dú)(如下圖所示)的規(guī)則是:需確保每一行、每一列,以及所有 3x3 宮格都只包含 1 到 9 這九個(gè)數(shù)字,并且不能有任何重復(fù),只有這樣才算完成。
數(shù)獨(dú)在開(kāi)始時(shí)會(huì)提供一些數(shù)字。填入數(shù)字的大小和數(shù)量將決定解謎的難度。
我們希望算法能夠識(shí)別出宮格,并填入答案。但如果只是這樣,未免太簡(jiǎn)單了點(diǎn)。我們還希望無(wú)論數(shù)獨(dú)位于圖片中的哪個(gè)位置,算法都能給出答案。這里有張照片,形象地展示了算法在解謎時(shí)可能需識(shí)別何種圖像:
為此,我們需要設(shè)計(jì)相應(yīng)的步驟來(lái)處理任務(wù)。這就意味著我們可以把解謎分成若干步驟:
找到數(shù)獨(dú)——在圖像中定位數(shù)獨(dú)
找到宮格——在 9x9 的盤(pán)面中確定所有宮格
識(shí)別數(shù)字——必須能夠識(shí)別手寫(xiě)或打印數(shù)字
解算數(shù)獨(dú)
以上所有步驟均可用深度學(xué)習(xí)或圖像處理中的一種方法來(lái)實(shí)現(xiàn)。那么,哪些步驟應(yīng)該用深度學(xué)習(xí)實(shí)現(xiàn),哪些步驟應(yīng)該用圖像處理來(lái)實(shí)現(xiàn)呢?
步驟1. 找到數(shù)獨(dú)
我們無(wú)法預(yù)計(jì)圖像、圖像背景和對(duì)象大小的情況。不同圖像的拍攝角度也可能大不相同。更不用說(shuō)光照、相機(jī)拍攝條件等其它因素??勺円蛩貙?shí)在是太多了。
適用方法:深度學(xué)習(xí)
讓我們?cè)囋嚹芊裼谜Z(yǔ)義分割為數(shù)獨(dú)圖片中的像素分類(lèi)。為此,我們需要標(biāo)記訓(xùn)練數(shù)據(jù)。在 MATLAB 中使用 Image Labeler 標(biāo)記需要的數(shù)據(jù)。這是標(biāo)記完成后的最終輸入數(shù)據(jù):
https://www.mathworks.cn/help/vision/examples/semantic-segmentation-using-deep-learning.html
有一點(diǎn)值得注意,那就是數(shù)據(jù)集非常小——只有一百幅左右的圖像。讓我們?cè)囍?xùn)練語(yǔ)義分割網(wǎng)絡(luò),看看數(shù)據(jù)是否充分。
設(shè)置圖像數(shù)據(jù)倉(cāng)庫(kù),以便儲(chǔ)存用于語(yǔ)義分割網(wǎng)絡(luò)的像素信息。
然后我們要設(shè)置網(wǎng)絡(luò)層。這里要注意,我們創(chuàng)建了一個(gè)能夠借助分類(lèi)權(quán)重使各個(gè)分類(lèi)抵消的函數(shù)。
設(shè)置網(wǎng)絡(luò):
這是訓(xùn)練選項(xiàng):
最后訓(xùn)練網(wǎng)絡(luò):
net = trainNetwork(train, layers, opts);
在這個(gè)階段中,大約需要 20 分鐘才能跑完 40 次樣本訓(xùn)練。具體耗時(shí)可能因電腦硬件/GPU 性能不同而有所差異。網(wǎng)絡(luò)經(jīng)過(guò)訓(xùn)練后,我們又換了一幅測(cè)試圖像,得出下述的結(jié)果:
結(jié)果很不錯(cuò)!盡管圖片中的其它格狀圖形對(duì)算法產(chǎn)生了干擾,但影響十分有限??稍谙聜€(gè)步驟去除這些小范圍噪點(diǎn)。
步驟2. 找到宮格
現(xiàn)在,我們需要在數(shù)獨(dú)盤(pán)面中識(shí)別出所有小宮格。這些宮格有著很明確的界定:筆直的邊線、總是深色的墨跡,以及大小一致的方形網(wǎng)格。在此提醒,我們?cè)诓襟E 1 中已經(jīng)確定了數(shù)獨(dú)盤(pán)面的大致區(qū)域。我們可以將該區(qū)域以外的圖像全部涂黑,確保算法集中處理該區(qū)域。
適用方法:圖像處理
我們?cè)啻翁接憟D像處理,如果你不是圖像處理領(lǐng)域的專(zhuān)家,你只要記住——這并不會(huì)妨礙你!MATLAB提供了各種應(yīng)用,能讓處理過(guò)程十分輕松。試試 Image Segmenter (https://www.mathworks.cn/help/images/ref/imagesegmenter-app.html),嘗試用它來(lái)檢測(cè)圖像中的宮格。下面這段代碼由該應(yīng)用自動(dòng)生成,可用于檢測(cè)圖像中的所有宮格。
首先需清理圖像,確保消除所有噪點(diǎn)。
BW_out = bwpropfilt(networkMask, 'Area', [100000 + eps(100000), Inf]);
然后要縮放遮罩,確保它覆蓋住整個(gè)盤(pán)面。
maskDilated = imdilate(BW_out, strel('disk', 120));
由于只需注意盤(pán)面所在區(qū)域,所以將其它區(qū)域全部涂黑。
grayIm = rgb2gray(im); grayIm(~maskDilated) = 0;
然后在圖像中精準(zhǔn)摳取盤(pán)面。
可以看到執(zhí)行的結(jié)果非常準(zhǔn)確,而且能夠經(jīng)受住各種干擾!
步驟3. 識(shí)別數(shù)字
有很多種方法可以識(shí)別手寫(xiě)數(shù)字和打印數(shù)字。這個(gè)問(wèn)題的難點(diǎn)在于,我們必須考慮到各種字號(hào)和字體。好在辦法也不少:
光學(xué)字符識(shí)別(OCR)是一種常見(jiàn)方法
結(jié)合了機(jī)器學(xué)習(xí)分類(lèi)器的方向梯度直方圖(HOG)是另一種方法點(diǎn)擊此處查看MATLAB示例
好在手寫(xiě)識(shí)別同樣是一個(gè)被廣泛研究的機(jī)器學(xué)習(xí)分類(lèi)問(wèn)題(請(qǐng)查看本示例,了解如何使用常見(jiàn)的MINST數(shù)據(jù)集來(lái)解決該問(wèn)題;我寫(xiě)過(guò)一篇類(lèi)似文章,請(qǐng)點(diǎn)擊此處閱讀)。
適用方法:深度學(xué)習(xí)
該環(huán)節(jié)旨在識(shí)別打印數(shù)字或手寫(xiě)數(shù)字,然后通過(guò)深度學(xué)習(xí)將其數(shù)字化(如下圖所示)。
為此,我們需要海量訓(xùn)練數(shù)據(jù)來(lái)幫助算法理解字符之間的差異??紤]到訓(xùn)練數(shù)據(jù)的海量程度,我們不可能手寫(xiě)出所有訓(xùn)練樣本,這太費(fèi)時(shí)間了。
這時(shí)即可借助 MATLAB 生成合成數(shù)據(jù)。就手寫(xiě)數(shù)字而言,這一步很簡(jiǎn)單——只需從MNIST數(shù)據(jù)集中提取現(xiàn)成數(shù)據(jù),然后與下圖中的背景圖像合成。在合成各類(lèi)打印數(shù)字時(shí),我們希望數(shù)字看上去盡可能不同,以便確保它們無(wú)論采用何種字體(新羅馬、維丹娜等),都能被算法識(shí)別。
在合成以上兩類(lèi)數(shù)字時(shí),我們會(huì)盡可能確保數(shù)字的大小和位置每次都不盡相同。因?yàn)檫@樣我們就能盡可能多地生成數(shù)據(jù)!
合成圖像:手寫(xiě)類(lèi)型/打印類(lèi)型
注:宮格的方框厚度同樣會(huì)隨機(jī)變厚或變薄,從而確保宮格各不相同。限于篇幅限制,本文對(duì)于合成數(shù)據(jù)的介紹十分有限。今后我會(huì)推出更多有關(guān)該主題的文章,請(qǐng)持續(xù)關(guān)注!
現(xiàn)在我們可以訓(xùn)練網(wǎng)絡(luò)了。設(shè)置訓(xùn)練選項(xiàng),創(chuàng)建層,然后像之前那樣訓(xùn)練網(wǎng)絡(luò)。
結(jié)果顯示,該網(wǎng)絡(luò)的準(zhǔn)確度約為97.8%。就數(shù)獨(dú)解算而言,這個(gè)結(jié)果已經(jīng)足夠精確了。
步驟4. 解算數(shù)獨(dú)
我們已經(jīng)識(shí)別了宮格和數(shù)字?,F(xiàn)在輪到填寫(xiě)答案了。
適用方法:都不需要!這是一個(gè)優(yōu)化問(wèn)題
整合各個(gè)步驟
現(xiàn)在我們已經(jīng)完成了所有四個(gè)步驟,借助深度學(xué)習(xí)和圖像處理創(chuàng)建了一個(gè)能夠?qū)ふ易顑?yōu)解的數(shù)獨(dú)解算器。
當(dāng)您在處理和圖像或視頻有關(guān)的任務(wù)時(shí),請(qǐng)務(wù)必牢記以下兩點(diǎn)重要提示:
深度學(xué)習(xí)適合解決某些問(wèn)題,但并非所有問(wèn)題都適合用深度學(xué)習(xí)解決。
圖像處理和深度學(xué)習(xí)都是十分有用的工具,可以將它們組合使用以便尋求最優(yōu)方案。
-
圖像處理
+關(guān)注
關(guān)注
27文章
1329瀏覽量
58039 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5561瀏覽量
122789
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論