熱線(xian)電話:0755-23712116
郵箱:contact@legoupos.cn
地址:深圳市寶安區沙井(jing)街(jie)道后(hou)亭(ting)茅洲山工(gong)業(ye)園工(gong)業(ye)大廈全至科技(ji)創新園科創大廈2層2A
圖1.使用在線(xian)提供的默(mo)認(ren)圖像(xiang)過(guo)濾器
最近(jin),我對圖像核和(he)(he)卷積運算(suan)在圖像處理中的(de)應(ying)(ying)用產(chan)生(sheng)了興趣(qu)。誠然,這是(shi)因為它在社交媒體網站(zhan)和(he)(he)Snapchat和(he)(he)Instagram等應(ying)(ying)用程序上很受歡(huan)迎。在一些應(ying)(ying)用程序上的(de)許(xu)多照片(pian)都使(shi)用了特效,這些特效是(shi)通過改(gai)(gai)變圖片(pian)像素的(de)值(zhi)和(he)(he)操作來實現對圖像的(de)修改(gai)(gai)。
圖像處理(li)有許多不同的(de)(de)應用(yong),包括(kuo)AR、文本分類(lei)、目標檢測(ce)等。圖像處理(li)應用(yong)的(de)(de)數量(liang)激增(zeng)的(de)(de)原(yuan)因與(yu)深度學習領域的(de)(de)研(yan)究人員最(zui)近的(de)(de)發展有關。神經網絡能夠處理(li)各種(zhong)各樣的(de)(de)輸入,并在一系列計算(suan)的(de)(de)基(ji)礎上提出預測(ce)。
什么是卷積運算?
圖2.卷積運算的一個(ge)例子(zi)
在討論卷(juan)積運(yun)算之前,必(bi)(bi)須(xu)提到仿射(she)變(bian)換(huan),因(yin)為它們為卷(juan)積運(yun)算提供(gong)了基礎(Dumoulin, 2018)。仿射(she)變(bian)換(huan)用于(yu)通(tong)過一個稱為核的(de)矩陣(zhen)來改變(bian)向(xiang)量的(de)值,核的(de)值集可(ke)以(yi)是(shi)(shi)預先確定(ding)的(de),也可(ke)以(yi)是(shi)(shi)導出的(de)。當改變(bian)向(xiang)量的(de)方(fang)向(xiang)或位置時,這些轉換(huan)是(shi)(shi)有(you)(you)用的(de)。然而(er),仿射(she)變(bian)換(huan)的(de)局限(xian)性(xing)在于(yu)它們沒有(you)(you)利(li)用輸入中(zhong)的(de)核可(ke)用的(de)某(mou)些屬性(xing),如顏(yan)色或方(fang)向(xiang)通(tong)道。通(tong)過利(li)用前面提到的(de)特性(xing),操作可(ke)以(yi)減少必(bi)(bi)要的(de)處理量,從而(er)幫助更有(you)(you)效地解決任務。
這就(jiu)是(shi)卷(juan)(juan)(juan)積(ji)運(yun)(yun)算(suan)(suan)發揮作(zuo)用的(de)(de)地方。卷(juan)(juan)(juan)積(ji)運(yun)(yun)算(suan)(suan)采用仿(fang)射變(bian)換,允許它們有效(xiao)地應用于(yu)具有高度維(wei)數或大量可變(bian)性(如圖(tu)像、視頻(pin)和聲音字(zi)節)的(de)(de)輸入(ru)。如圖(tu)2所示,為了(le)簡(jian)化大數據集,使(shi)用卷(juan)(juan)(juan)積(ji)運(yun)(yun)算(suan)(suan)通過(guo)一(yi)(yi)系(xi)(xi)列(lie)的(de)(de)運(yun)(yun)算(suan)(suan)(一(yi)(yi)系(xi)(xi)列(lie)的(de)(de)乘(cheng)(cheng)法(fa)和加(jia)法(fa))壓(ya)縮(suo)輸入(ru)。與仿(fang)射變(bian)換一(yi)(yi)樣,卷(juan)(juan)(juan)積(ji)運(yun)(yun)算(suan)(suan)使(shi)用核函(han)數來改(gai)變(bian)輸入(ru)。這是(shi)通過(guo)將輸入(ru)值與核值相乘(cheng)(cheng)來實(shi)現(xian)的(de)(de)。總數是(shi)通過(guo)在操作(zuo)的(de)(de)第(di)一(yi)(yi)步中(zhong)添加(jia)一(yi)(yi)系(xi)(xi)列(lie)乘(cheng)(cheng)法(fa)的(de)(de)值獲得的(de)(de)。在一(yi)(yi)系(xi)(xi)列(lie)的(de)(de)過(guo)程中(zhong),這些(xie)計(ji)算(suan)(suan)結果是(shi)一(yi)(yi)組小的(de)(de)值,這些(xie)值都在一(yi)(yi)個壓(ya)縮(suo)的(de)(de)集合中(zhong)保存了(le)輸入(ru)值。
卷積神經網絡(CNN)和卷積運算是否相關?
圖3.Fjor Van Veen的卷積神經網絡(luo)
在討論卷積運算時,不(bu)得(de)不(bu)提CNN。CNN在90年代早(zao)期被(bei)用(yong)于識(shi)別手(shou)寫(xie)字符。一(yi)組研究人員通過最(zui)初(chu)分(fen)離(li)然后標記它(ta)們(men)來(lai)訓(xun)練神經(jing)網(wang)絡(luo)來(lai)識(shi)別手(shou)寫(xie)字符(Le Cun,1995)。當CNN用(yong)于在比(bi)賽中擊敗ImageNet分(fen)類系統時,神經(jing)網(wang)絡(luo)的潛力(li)急劇擴(kuo)大(da)(Krizhevzky,2014)。CNN之(zhi)所以成(cheng)為機(ji)器學(xue)習實(shi)踐者最(zui)希(xi)望利用(yong)的網(wang)絡(luo)之(zhi)一(yi),是因為它(ta)的壓縮(suo)作用(yong)是通過一(yi)系列卷積運算來(lai)完成(cheng)的。這允許模型(xing)(xing)基于壓縮(suo)的輸入(ru)進行預測。由于輸入(ru)已(yi)經(jing)被(bei)簡化或壓縮(suo),因此在訓(xun)練模型(xing)(xing)上花費的時間更(geng)少。
圖3顯示了CNN背后的典型設計。首先,可(ke)以使(shi)用(yong)具有多個維度的圖像(xiang)或(huo)音頻(pin)文件作為輸(shu)入(ru)(黃色圓圈)。然后將執行(xing)一系列(lie)卷積(ji)運算(suan),以便在多個層(粉(fen)色圓圈)上簡化(hua)或(huo)“卷積(ji)”輸(shu)入(ru),并將一系列(lie)卷積(ji)運算(suan)的輸(shu)出饋(kui)送(song)到神經網(wang)(wang)絡(luo)中(zhong)。根據(ju)Van Veen(綠色圓圈),分(fen)析卷積(ji)輸(shu)出的神經網(wang)(wang)絡(luo)通常是前饋(kui)神經網(wang)(wang)絡(luo)。
你如何評估CNN的表現?
神經網(wang)絡模型(xing)建(jian)立后,利用大量的數據集進行正向和反向傳播(bo),改變網(wang)絡各節(jie)點之間的連接,以達(da)到盡可能高的精度。如何評估模型(xing)準確預測是通過(guo)一種名為混淆矩陣的方法。
混淆矩陣的四個(ge)部(bu)分:
混淆矩(ju)(ju)陣(zhen)是一個2×2矩(ju)(ju)陣(zhen),用來(lai)計算模型(xing)的預測精度。矩(ju)(ju)陣(zhen)的四(si)(si)個部分是真(zhen)陽(yang)性(xing)(xing)、假陽(yang)性(xing)(xing)和(he)真(zhen)陰(yin)性(xing)(xing)、假陰(yin)性(xing)(xing)。從這四(si)(si)個值; 可(ke)以返回準確(que)性(xing)(xing),精確(que)度以及正面和(he)負面情(qing)況的覆蓋范(fan)圍(wei)。通過從矩(ju)(ju)陣(zhen)中(zhong)獲(huo)取值并(bing)使用公式獲(huo)得這些值。
如何訓(xun)練模型:
輸入數(shu)據分為(wei)兩組(zu),即測試(shi)組(zu)和(he)訓練(lian)組(zu)。可(ke)以使(shi)用(yong)任何比率來(lai)(lai)訓練(lian)模型(xing),但使(shi)用(yong)80%的(de)數(shu)據集作為(wei)訓練(lian)集是最(zui)流行的(de)方法。這(zhe)可(ke)以使(shi)用(yong)Python的(de)sklearn庫中的(de)train_test_split()API調(diao)用(yong)來(lai)(lai)執(zhi)行。通(tong)過拆分數(shu)據集,這(zhe)允(yun)許(xu)網(wang)絡使(shi)用(yong)先前未見過的(de)數(shu)據來(lai)(lai)提高其預測的(de)準確性(xing)并防止過度(du)(du)擬合(he)。過度(du)(du)擬合(he)是由具(ju)有相同數(shu)據的(de)神經網(wang)絡內的(de)訓練(lian)節點(dian)引起的(de)問題(ti),一旦(dan)出現不熟悉的(de)問題(ti),將導(dao)致精度(du)(du)損(sun)失。
如何(he)進一步提高網絡的準確性:
這可以(yi)(yi)通(tong)過交(jiao)叉(cha)驗證(zheng)(zheng)來完成,交(jiao)叉(cha)驗證(zheng)(zheng)是(shi)(shi)一種拆分數據(ju)集(ji)的(de)方法(fa),以(yi)(yi)便在整個集(ji)合(he)中進行訓(xun)練和測試(shi)。該方法(fa)允許將所(suo)有(you)數據(ju)用作訓(xun)練集(ji)和測試(shi)集(ji),這將提高模型對未(wei)知或未(wei)見數據(ju)的(de)預測的(de)準確性(xing)。交(jiao)叉(cha)驗證(zheng)(zheng)的(de)兩(liang)種方法(fa)是(shi)(shi)leave p-labels out和k-fold測試(shi)。
Leave p-labels out:
為了(le)實現(xian)更高的精度(du)(du),測(ce)試可以用來忘記p為了(le)測(ce)試,以“訓(xun)練過度(du)(du)”偏(pian)愛的標(biao)簽(qian)中的標(biao)簽(qian)的數量(liang)。在測(ce)試期(qi)間,“遺(yi)漏”的標(biao)簽(qian)被帶回并使用。
k-fold測試:
這(zhe)是最常用的交(jiao)叉驗證類型。這(zhe)包括獲取測試集并(bing)在整個數(shu)據集中“移動(dong)”該區域以確保所(suo)有(you)數(shu)據都已用于(yu)測試。
關于Kernel
圖4.此圖像核(he)保存模糊值(zhi)
上面顯示的(de)(de)(de)(de)圖(tu)像是(shi)3 x 3矩陣,核(he)(he)也(ye)(ye)可以(yi)(yi)(yi)是(shi)任何大(da)(da)小(xiao)(xiao)。核(he)(he)的(de)(de)(de)(de)大(da)(da)小(xiao)(xiao)由輸入(ru)大(da)(da)小(xiao)(xiao)決定。考慮到這一點,核(he)(he)大(da)(da)小(xiao)(xiao)應(ying)足夠大(da)(da),以(yi)(yi)(yi)便在(zai)其(qi)計(ji)(ji)算(suan)(suan)中(zhong)(zhong)包含足夠的(de)(de)(de)(de)數據,但也(ye)(ye)應(ying)該足夠小(xiao)(xiao),可以(yi)(yi)(yi)防止(zhi)處理的(de)(de)(de)(de)信(xin)息(xi)重疊。此外(wai),核(he)(he)保(bao)存(cun)常(chang)量,然后在(zai)一系列卷(juan)積運(yun)算(suan)(suan)中(zhong)(zhong)使用(yong)這些常(chang)量。有(you)許多不(bu)(bu)(bu)同類型的(de)(de)(de)(de)自定義效果可以(yi)(yi)(yi)通過(guo)(guo)(guo)操縱核(he)(he)中(zhong)(zhong)保(bao)存(cun)的(de)(de)(de)(de)值(zhi)來(lai)實現。例如,恒等核(he)(he)通過(guo)(guo)(guo)將nxn核(he)(he)的(de)(de)(de)(de)中(zhong)(zhong)心設(she)置為1,將周圍的(de)(de)(de)(de)單元格(ge)設(she)置為0來(lai)保(bao)持圖(tu)像的(de)(de)(de)(de)原(yuan)樣。這將保(bao)留想要的(de)(de)(de)(de)像素,同時在(zai)卷(juan)積運(yun)算(suan)(suan)的(de)(de)(de)(de)乘法(fa)運(yun)算(suan)(suan)中(zhong)(zhong)“忘記”其(qi)他(ta)不(bu)(bu)(bu)需要的(de)(de)(de)(de)值(zhi)。通過(guo)(guo)(guo)這種(zhong)方法(fa),很容(rong)易假設(she)以(yi)(yi)(yi)0作(zuo)為核(he)(he)中(zhong)(zhong)的(de)(de)(de)(de)值(zhi)的(de)(de)(de)(de)網格(ge)將被(bei)“遺(yi)忘”,或者(zhe)在(zai)卷(juan)積操作(zuo)中(zhong)(zhong)不(bu)(bu)(bu)會(hui)被(bei)計(ji)(ji)算(suan)(suan),而1將保(bao)持像素不(bu)(bu)(bu)變。通過(guo)(guo)(guo)增加輸入(ru)的(de)(de)(de)(de)大(da)(da)小(xiao)(xiao)(核(he)(he)值(zhi)大(da)(da)于1),可以(yi)(yi)(yi)執行(xing)模糊操作(zuo),通過(guo)(guo)(guo)縮(suo)小(xiao)(xiao)大(da)(da)小(xiao)(xiao)可以(yi)(yi)(yi)執行(xing)完(wan)全(quan)相反的(de)(de)(de)(de)效果(銳化)。
圖像處理還有其他部分嗎?
圖(tu)(tu)像核(he)(he)不是圖(tu)(tu)像處理的唯一關鍵部分(fen)。如(ru)果我們(men)參(can)考圖(tu)(tu)2,核(he)(he)似乎會在輸入中移動(dong)。移動(dong)的程度稱為步(bu)幅(fu)(fu),可以自定義,以增加(jia)核(he)(he)跳過的像素數量。步(bu)幅(fu)(fu)的增加(jia)確(que)保了圖(tu)(tu)像核(he)(he)所研究的區域不重疊。
當(dang)核開始沿輸入邊緣移(yi)動時,Padding是圖像處理(li)的另(ling)一個(ge)重要部(bu)分。根據輸入和核的大(da)小,可以定(ding)制n個(ge)層。圖4顯示了一個(ge)卷積操作。
不同類型的Padding
圖5.The zeroes around the input helps the kernel process the image more accurately
雖然(ran)上(shang)面的(de)圖(tu)中顯示的(de)值(zhi)是(shi)(shi)0,但是(shi)(shi)使用的(de)值(zhi)可以是(shi)(shi)任何數字。還可以使用其(qi)他(ta)類(lei)型的(de)填充,例如reflective padding,但是(shi)(shi)為了簡單起見,圖(tu)4中所示的(de)零填充將是(shi)(shi)討論的(de)重點。
No padding:
這(zhe)需要(yao)核(he)處(chu)理(li)(li)沒有零層的(de)輸入(ru)的(de)每個像素。這(zhe)會(hui)導(dao)致輸入(ru)的(de)邊緣不(bu)被整個核(he)完全處(chu)理(li)(li),如圖1所示。
Half padding:
Half padding用(yong)于(yu)保持輸入(ru)的(de)大小。當在網(wang)絡中涉及多(duo)層padding時(shi),這(zhe)可能是期望的(de)。卷積(ji)運(yun)算減小了輸入(ru)的(de)大小,如圖4所示。Half padding的(de)名稱(cheng)來自用(yong)于(yu)執行它的(de)公式。將(jiang)內核大小分成兩(liang)半,然后(hou)將(jiang)劃(hua)分的(de)下部(bu)加(jia)倍,然后(hou)添(tian)加(jia)一(yi)個小于(yu)核大小的(de)值。
Full padding:
這允許輸(shu)入的大小增加,這可能(neng)對具有(you)大量卷積(ji)的神經網絡有(you)用。這可以恢(hui)復被卷積(ji)操作刪除(chu)的層。
卷積運算有哪些種類?
處理輸入(ru)時(shi)可以(yi)使用(yong)兩(liang)種主要的(de)(de)(de)卷積運算。通(tong)過更改前面提(ti)到的(de)(de)(de)屬性(xing),可以(yi)根據(ju)自己的(de)(de)(de)喜好自定義操作(zuo)的(de)(de)(de)詳細信(xin)息,以(yi)增加每個卷積操作(zuo)中表示的(de)(de)(de)信(xin)息量。通(tong)過更改padding,您可以(yi)使核能夠(gou)處理輸入(ru)的(de)(de)(de)邊緣并保留或增加大小(xiao)。
不同類型的卷積運算
No zero padding with non-unit strides:
這(zhe)將產(chan)生一個輸出(chu),它等于步數加1,包括核的初(chu)始位置(zhi),這(zhe)是由(you)核所采取的。Non-unit strides可以用來限(xian)制分析區域的重疊量。
Zero padding with non-unit strides:
通過對輸(shu)(shu)入進行padding并將(jiang)核設置(zhi)為non-unit strides,可以(yi)完(wan)成另一個(ge)卷(juan)積操(cao)作來處(chu)理輸(shu)(shu)入,并能夠(gou)包(bao)含輸(shu)(shu)入的邊緣情況。
轉置卷積運算
轉(zhuan)置(zhi)卷積運(yun)算意味著切換(huan)卷積的(de)方向。這意味著當(dang)核用(yong)于更(geng)改值并處理輸入(ru)時,將交換(huan)forward 和 back swapping。步幅(fu)和padding用(yong)于實現類似的(de)目標,即(ji)允許更(geng)好地處理數據。然而,由于前面提到的(de)操(cao)作現在(zai)在(zai)相反的(de)方向上工作,所以步幅(fu)和padding的(de)結果(guo)與在(zai)標準卷積操(cao)作期間如何使用(yong)它們(men)不完全相同。
圖5所示是(shi)轉置(zhi)卷(juan)積運算。通(tong)過向輸(shu)入添加padding,可以考慮每個感興趣的(de)區(qu)域,并且與只允許核研究四個陰影區(qu)域相比,輸(shu)出(chu)可以包含更完(wan)整的(de)數(shu)據。轉置(zhi)卷(juan)積運算通(tong)常(chang)用于提高(gao)圖像分辨率。這方面的(de)應用是(shi)無止境的(de),包括改善從商業中(zhong)獲取(qu)的(de)顆粒狀CCTV鏡頭(tou)或完(wan)成可能模糊或覆蓋的(de)面部或鏡頭(tou)。
圖6.使用單(dan)位步幅和零padding的轉置卷(juan)積
自定義圖像效果
如(ru)(ru)前所述,當使用(yong)圖(tu)像核(he)對圖(tu)像(如(ru)(ru)模糊,旋(xuan)轉(zhuan)和(he)裁剪)執行某些效果時,我們(men)可以(yi)使用(yong)許多(duo)不(bu)同的設置進行自(zi)定(ding)(ding)義(yi)(yi)。因此,通(tong)過(guo)使用(yong)//setosa.io/ev/image-kernels/上提供的圖(tu)像自(zi) 定(ding)(ding)義(yi)(yi)程序,可以(yi)創建自(zi)定(ding)(ding)義(yi)(yi)核(he)(如(ru)(ru)圖(tu)7所示),我們(men)可以(yi)將核(he)應(ying)用(yong)于圖(tu)像。
圖7.這(zhe)是我們將用(yong)于應用(yong)模糊的(de)核。
(上)圖(tu)8.應用(yong)轉換前的(de)圖(tu)像(下)圖(tu)9.應用(yong)了自定義核模糊(hu)后的(de)圖(tu)像
自定義Filters的實現
自定義Filters的(de)(de)(de)實現可以在GitHub和(he)GitLab等網站上在線找到,Python是(shi)最(zui)(zui)受歡迎(ying)的(de)(de)(de)語言(yan)之一。我并不是(shi)說Python將為您(nin)的(de)(de)(de)任務(wu)提供(gong)最(zui)(zui)好的(de)(de)(de)性能,但是(shi)該語言(yan)中有許多庫可以用于此目的(de)(de)(de),以及(ji)可供(gong)參(can)考的(de)(de)(de)文(wen)檔。
更早些時(shi)候,在2004年,Apple提供了這部(bu)分(fen)代碼,可用(yong)于自定義圖(tu)像效(xiao)(xiao)果。可以改變向量(liang)和浮(fu)點數的(de)值以實現所需的(de)任何效(xiao)(xiao)果。
圖10. Apple的(de)自定義核實現
以上(shang)代碼可以作為Java、Python、c++ /C甚至Matlab實現的起點!
卷積運算(suan)已經(jing)成為一種非常(chang)有用的工具,目前有許多不同的應用。您可以(yi)改變圖像,簡化圖像來解(jie)決圖像分類內的問題,并定制(zhi)效果上傳到(dao)任何社(she)交媒體網(wang)站。