熱線電話:0755-23712116
郵箱:contact@shuangyi-tech.com
地址:深圳市寶安區(qū)沙井街道后亭茅洲山工業(yè)園工業(yè)大廈全至科技創(chuàng)新園科創(chuàng)大廈2層2A
最近,我對(duì)圖像核和卷積運(yùn)算在圖像處理中的應(yīng)用產(chǎn)生了興趣。誠(chéng)然,這是因?yàn)樗谏缃幻襟w網(wǎng)站和Snapchat和Instagram等應(yīng)用程序上很受歡迎。在一些應(yīng)用程序上的許多照片都使用了特效,這些特效是通過(guò)改變圖片像素的值和操作來(lái)實(shí)現(xiàn)對(duì)圖像的修改。
圖像處理有許多不同的應(yīng)用,包括AR、文本分類、目標(biāo)檢測(cè)等。圖像處理應(yīng)用的數(shù)量激增的原因與深度學(xué)習(xí)領(lǐng)域的研究人員最近的發(fā)展有關(guān)。神經(jīng)網(wǎng)絡(luò)能夠處理各種各樣的輸入,并在一系列計(jì)算的基礎(chǔ)上提出預(yù)測(cè)。
什么是卷積運(yùn)算?
在討論卷積運(yùn)算之前,必須提到仿射變換,因?yàn)樗鼈優(yōu)榫矸e運(yùn)算提供了基礎(chǔ)(Dumoulin, 2018)。仿射變換用于通過(guò)一個(gè)稱為核的矩陣來(lái)改變向量的值,核的值集可以是預(yù)先確定的,也可以是導(dǎo)出的。當(dāng)改變向量的方向或位置時(shí),這些轉(zhuǎn)換是有用的。然而,仿射變換的局限性在于它們沒(méi)有利用輸入中的核可用的某些屬性,如顏色或方向通道。通過(guò)利用前面提到的特性,操作可以減少必要的處理量,從而幫助更有效地解決任務(wù)。
這就是卷積運(yùn)算發(fā)揮作用的地方。卷積運(yùn)算采用仿射變換,允許它們有效地應(yīng)用于具有高度維數(shù)或大量可變性(如圖像、視頻和聲音字節(jié))的輸入。如圖2所示,為了簡(jiǎn)化大數(shù)據(jù)集,使用卷積運(yùn)算通過(guò)一系列的運(yùn)算(一系列的乘法和加法)壓縮輸入。與仿射變換一樣,卷積運(yùn)算使用核函數(shù)來(lái)改變輸入。這是通過(guò)將輸入值與核值相乘來(lái)實(shí)現(xiàn)的??倲?shù)是通過(guò)在操作的第一步中添加一系列乘法的值獲得的。在一系列的過(guò)程中,這些計(jì)算結(jié)果是一組小的值,這些值都在一個(gè)壓縮的集合中保存了輸入值。
卷積神經(jīng)網(wǎng)絡(luò)(CNN)和卷積運(yùn)算是否相關(guān)?
在討論卷積運(yùn)算時(shí),不得不提CNN。CNN在90年代早期被用于識(shí)別手寫(xiě)字符。一組研究人員通過(guò)最初分離然后標(biāo)記它們來(lái)訓(xùn)練神經(jīng)網(wǎng)絡(luò)來(lái)識(shí)別手寫(xiě)字符(Le Cun,1995)。當(dāng)CNN用于在比賽中擊敗ImageNet分類系統(tǒng)時(shí),神經(jīng)網(wǎng)絡(luò)的潛力急劇擴(kuò)大(Krizhevzky,2014)。CNN之所以成為機(jī)器學(xué)習(xí)實(shí)踐者最希望利用的網(wǎng)絡(luò)之一,是因?yàn)樗膲嚎s作用是通過(guò)一系列卷積運(yùn)算來(lái)完成的。這允許模型基于壓縮的輸入進(jìn)行預(yù)測(cè)。由于輸入已經(jīng)被簡(jiǎn)化或壓縮,因此在訓(xùn)練模型上花費(fèi)的時(shí)間更少。
圖3顯示了CNN背后的典型設(shè)計(jì)。首先,可以使用具有多個(gè)維度的圖像或音頻文件作為輸入(黃色圓圈)。然后將執(zhí)行一系列卷積運(yùn)算,以便在多個(gè)層(粉色圓圈)上簡(jiǎn)化或“卷積”輸入,并將一系列卷積運(yùn)算的輸出饋送到神經(jīng)網(wǎng)絡(luò)中。根據(jù)Van Veen(綠色圓圈),分析卷積輸出的神經(jīng)網(wǎng)絡(luò)通常是前饋神經(jīng)網(wǎng)絡(luò)。
你如何評(píng)估CNN的表現(xiàn)?
神經(jīng)網(wǎng)絡(luò)模型建立后,利用大量的數(shù)據(jù)集進(jìn)行正向和反向傳播,改變網(wǎng)絡(luò)各節(jié)點(diǎn)之間的連接,以達(dá)到盡可能高的精度。如何評(píng)估模型準(zhǔn)確預(yù)測(cè)是通過(guò)一種名為混淆矩陣的方法。
混淆矩陣的四個(gè)部分:
混淆矩陣是一個(gè)2×2矩陣,用來(lái)計(jì)算模型的預(yù)測(cè)精度。矩陣的四個(gè)部分是真陽(yáng)性、假陽(yáng)性和真陰性、假陰性。從這四個(gè)值; 可以返回準(zhǔn)確性,精確度以及正面和負(fù)面情況的覆蓋范圍。通過(guò)從矩陣中獲取值并使用公式獲得這些值。
如何訓(xùn)練模型:
輸入數(shù)據(jù)分為兩組,即測(cè)試組和訓(xùn)練組??梢允褂萌魏伪嚷蕘?lái)訓(xùn)練模型,但使用80%的數(shù)據(jù)集作為訓(xùn)練集是最流行的方法。這可以使用Python的sklearn庫(kù)中的train_test_split()API調(diào)用來(lái)執(zhí)行。通過(guò)拆分?jǐn)?shù)據(jù)集,這允許網(wǎng)絡(luò)使用先前未見(jiàn)過(guò)的數(shù)據(jù)來(lái)提高其預(yù)測(cè)的準(zhǔn)確性并防止過(guò)度擬合。過(guò)度擬合是由具有相同數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò)內(nèi)的訓(xùn)練節(jié)點(diǎn)引起的問(wèn)題,一旦出現(xiàn)不熟悉的問(wèn)題,將導(dǎo)致精度損失。
如何進(jìn)一步提高網(wǎng)絡(luò)的準(zhǔn)確性:
這可以通過(guò)交叉驗(yàn)證來(lái)完成,交叉驗(yàn)證是一種拆分?jǐn)?shù)據(jù)集的方法,以便在整個(gè)集合中進(jìn)行訓(xùn)練和測(cè)試。該方法允許將所有數(shù)據(jù)用作訓(xùn)練集和測(cè)試集,這將提高模型對(duì)未知或未見(jiàn)數(shù)據(jù)的預(yù)測(cè)的準(zhǔn)確性。交叉驗(yàn)證的兩種方法是leave p-labels out和k-fold測(cè)試。
Leave p-labels out:
為了實(shí)現(xiàn)更高的精度,測(cè)試可以用來(lái)忘記p為了測(cè)試,以“訓(xùn)練過(guò)度”偏愛(ài)的標(biāo)簽中的標(biāo)簽的數(shù)量。在測(cè)試期間,“遺漏”的標(biāo)簽被帶回并使用。
k-fold測(cè)試:
這是最常用的交叉驗(yàn)證類型。這包括獲取測(cè)試集并在整個(gè)數(shù)據(jù)集中“移動(dòng)”該區(qū)域以確保所有數(shù)據(jù)都已用于測(cè)試。
關(guān)于Kernel
上面顯示的圖像是3 x 3矩陣,核也可以是任何大小。核的大小由輸入大小決定。考慮到這一點(diǎn),核大小應(yīng)足夠大,以便在其計(jì)算中包含足夠的數(shù)據(jù),但也應(yīng)該足夠小,可以防止處理的信息重疊。此外,核保存常量,然后在一系列卷積運(yùn)算中使用這些常量。有許多不同類型的自定義效果可以通過(guò)操縱核中保存的值來(lái)實(shí)現(xiàn)。例如,恒等核通過(guò)將nxn核的中心設(shè)置為1,將周圍的單元格設(shè)置為0來(lái)保持圖像的原樣。這將保留想要的像素,同時(shí)在卷積運(yùn)算的乘法運(yùn)算中“忘記”其他不需要的值。通過(guò)這種方法,很容易假設(shè)以0作為核中的值的網(wǎng)格將被“遺忘”,或者在卷積操作中不會(huì)被計(jì)算,而1將保持像素不變。通過(guò)增加輸入的大小(核值大于1),可以執(zhí)行模糊操作,通過(guò)縮小大小可以執(zhí)行完全相反的效果(銳化)。
圖像處理還有其他部分嗎?
圖像核不是圖像處理的唯一關(guān)鍵部分。如果我們參考圖2,核似乎會(huì)在輸入中移動(dòng)。移動(dòng)的程度稱為步幅,可以自定義,以增加核跳過(guò)的像素?cái)?shù)量。步幅的增加確保了圖像核所研究的區(qū)域不重疊。
當(dāng)核開(kāi)始沿輸入邊緣移動(dòng)時(shí),Padding是圖像處理的另一個(gè)重要部分。根據(jù)輸入和核的大小,可以定制n個(gè)層。圖4顯示了一個(gè)卷積操作。
不同類型的Padding
圖5.The zeroes around the input helps the kernel process the image more accurately
雖然上面的圖中顯示的值是0,但是使用的值可以是任何數(shù)字。還可以使用其他類型的填充,例如reflective padding,但是為了簡(jiǎn)單起見(jiàn),圖4中所示的零填充將是討論的重點(diǎn)。
No padding:
這需要核處理沒(méi)有零層的輸入的每個(gè)像素。這會(huì)導(dǎo)致輸入的邊緣不被整個(gè)核完全處理,如圖1所示。
Half padding:
Half padding用于保持輸入的大小。當(dāng)在網(wǎng)絡(luò)中涉及多層padding時(shí),這可能是期望的。卷積運(yùn)算減小了輸入的大小,如圖4所示。Half padding的名稱來(lái)自用于執(zhí)行它的公式。將內(nèi)核大小分成兩半,然后將劃分的下部加倍,然后添加一個(gè)小于核大小的值。
Full padding:
這允許輸入的大小增加,這可能對(duì)具有大量卷積的神經(jīng)網(wǎng)絡(luò)有用。這可以恢復(fù)被卷積操作刪除的層。
卷積運(yùn)算有哪些種類?
處理輸入時(shí)可以使用兩種主要的卷積運(yùn)算。通過(guò)更改前面提到的屬性,可以根據(jù)自己的喜好自定義操作的詳細(xì)信息,以增加每個(gè)卷積操作中表示的信息量。通過(guò)更改padding,您可以使核能夠處理輸入的邊緣并保留或增加大小。
不同類型的卷積運(yùn)算
No zero padding with non-unit strides:
這將產(chǎn)生一個(gè)輸出,它等于步數(shù)加1,包括核的初始位置,這是由核所采取的。Non-unit strides可以用來(lái)限制分析區(qū)域的重疊量。
Zero padding with non-unit strides:
通過(guò)對(duì)輸入進(jìn)行padding并將核設(shè)置為non-unit strides,可以完成另一個(gè)卷積操作來(lái)處理輸入,并能夠包含輸入的邊緣情況。
轉(zhuǎn)置卷積運(yùn)算
轉(zhuǎn)置卷積運(yùn)算意味著切換卷積的方向。這意味著當(dāng)核用于更改值并處理輸入時(shí),將交換forward 和 back swapping。步幅和padding用于實(shí)現(xiàn)類似的目標(biāo),即允許更好地處理數(shù)據(jù)。然而,由于前面提到的操作現(xiàn)在在相反的方向上工作,所以步幅和padding的結(jié)果與在標(biāo)準(zhǔn)卷積操作期間如何使用它們不完全相同。
圖5所示是轉(zhuǎn)置卷積運(yùn)算。通過(guò)向輸入添加padding,可以考慮每個(gè)感興趣的區(qū)域,并且與只允許核研究四個(gè)陰影區(qū)域相比,輸出可以包含更完整的數(shù)據(jù)。轉(zhuǎn)置卷積運(yùn)算通常用于提高圖像分辨率。這方面的應(yīng)用是無(wú)止境的,包括改善從商業(yè)中獲取的顆粒狀CCTV鏡頭或完成可能模糊或覆蓋的面部或鏡頭。
如前所述,當(dāng)使用圖像核對(duì)圖像(如模糊,旋轉(zhuǎn)和裁剪)執(zhí)行某些效果時(shí),我們可以使用許多不同的設(shè)置進(jìn)行自定義。因此,通過(guò)使用http://setosa.io/ev/image-kernels/上提供的圖像自 定義程序,可以創(chuàng)建自定義核(如圖7所示),我們可以將核應(yīng)用于圖像。
自定義Filters的實(shí)現(xiàn)可以在GitHub和GitLab等網(wǎng)站上在線找到,Python是最受歡迎的語(yǔ)言之一。我并不是說(shuō)Python將為您的任務(wù)提供最好的性能,但是該語(yǔ)言中有許多庫(kù)可以用于此目的,以及可供參考的文檔。
更早些時(shí)候,在2004年,Apple提供了這部分代碼,可用于自定義圖像效果。可以改變向量和浮點(diǎn)數(shù)的值以實(shí)現(xiàn)所需的任何效果。
以上代碼可以作為Java、Python、c++ /C甚至Matlab實(shí)現(xiàn)的起點(diǎn)!
卷積運(yùn)算已經(jīng)成為一種非常有用的工具,目前有許多不同的應(yīng)用。您可以改變圖像,簡(jiǎn)化圖像來(lái)解決圖像分類內(nèi)的問(wèn)題,并定制效果上傳到任何社交媒體網(wǎng)站。