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