博客專欄

        EEPW首頁 > 博客 > Siamese-pytorch孿生網絡實現評價圖像相似度

        Siamese-pytorch孿生網絡實現評價圖像相似度

        發布人:數據派THU 時間:2021-12-18 來源:工程師 發布文章

        來源:機器學習AI算法工程 

        什么是孿生神經網絡

        簡單來說,孿生神經網絡(Siamese network)就是“連體的神經網絡”,神經網絡的“連體”是通過共享權值來實現的,如下圖所示。

        1.png

        所謂權值共享就是當神經網絡有兩個輸入的時候,這兩個輸入使用的神經網絡的權值是共享的(可以理解為使用了同一個神經網絡)。

        很多時候,我們需要去評判兩張圖片的相似性,比如比較兩張人臉的相似性,我們可以很自然的想到去提取這個圖片的特征再進行比較,自然而然的,我們又可以想到利用神經網絡進行特征提取。

        如果使用兩個神經網絡分別對圖片進行特征提取,提取到的特征很有可能不在一個域中,此時我們可以考慮使用一個神經網絡進行特征提取再進行比較。這個時候我們就可以理解孿生神經網絡為什么要進行權值共享了。

        孿生神經網絡有兩個輸入(Input1 and Input2),利用神經網絡將輸入映射到新的空間,形成輸入在新的空間中的表示。通過Loss的計算,評價兩個輸入的相似度。

        孿生神經網絡的實現思路

        一、預測部分

        1、主干網絡介紹

        2.png

        孿生神經網絡的主干特征提取網絡的功能是進行特征提取,各種神經網絡都可以適用,本文使用的神經網絡是VGG16

        3.png

        這是一個VGG被用到爛的圖,但確實很好的反應了VGG的結構:

        1、一張原始圖片被resize到指定大小,本文使用105x105。

        2、conv1包括兩次[3,3]卷積網絡,一次2X2最大池化,輸出的特征層為64通道。

        3、conv2包括兩次[3,3]卷積網絡,一次2X2最大池化,輸出的特征層為128通道。

        4、conv3包括三次[3,3]卷積網絡,一次2X2最大池化,輸出的特征層為256通道。

        5、conv4包括三次[3,3]卷積網絡,一次2X2最大池化,輸出的特征層為512通道。

        6、conv5包括三次[3,3]卷積網絡,一次2X2最大池化,輸出的特征層為512通道。

        2、比較網絡

        4.png

        在獲得主干特征提取網絡之后,我們可以獲取到一個多維特征,我們可以使用flatten的方式將其平鋪到一維上,這個時候我們就可以獲得兩個輸入的一維向量了。

        將這兩個一維向量進行相減,再進行絕對值求和,相當于求取了兩個特征向量插值的L1范數。也就相當于求取了兩個一維向量的距離。

        然后對這個距離再進行兩次全連接,第二次全連接到一個神經元上,對這個神經元的結果取sigmoid,使其值在0-1之間,代表兩個輸入圖片的相似程度。

        實現代碼如下:

        5.png6.png

        二、訓練部分

        1、數據集的格式

        本文所使用的數據集為Omniglot數據集。

        其包含來自 50不同字母(語言)的1623 個不同手寫字符。每一個字符都是由 20個不同的人通過亞馬遜的 Mechanical Turk 在線繪制的。

        相當于每一個字符有20張圖片,然后存在1623個不同的手寫字符,我們需要利用神經網絡進行學習,去區分這1623個不同的手寫字符,比較輸入進來的字符的相似性。

        7.png

        最后一級的文件夾用于分辨不同的字體,同一個文件夾里面的圖片屬于同一文字。在不同文件夾里面存放的圖片屬于不同文字。

        8.png

        上兩個圖為

        .\images_background\Alphabet_of_the_Magi\character01里的兩幅圖。它們兩個屬于同一個字。

        9.png

        上一個圖為

        .\images_background\Alphabet_of_the_Magi\character02里的一幅圖。它和上面另兩幅圖不屬于同一個字。

        2、Loss計算

        對于孿生神經網絡而言,其具有兩個輸入。

        當兩個輸入指向同一個類型的圖片時,此時標簽為1。

        當兩個輸入指向不同類型的圖片時,此時標簽為0。

        然后將網絡的輸出結果和真實標簽進行交叉熵運算,就可以作為最終的loss了。

        本文所使用的Loss為binary_crossentropy。

        當我們輸入如下兩個字體的時候,我們希望網絡的輸出為1。

        10.png

        我們會將預測結果和1求交叉熵。

        當我們輸入如下兩個字體的時候,我們希望網絡的輸出為0。

        11.png

        我們會將預測結果和0求交叉熵。

        訓練自己的孿生神經網絡

        1、訓練本文所使用的Omniglot例子

        12.png

        下載數據集,放在根目錄下的dataset文件夾下。

        13.png

        運行train.py開始訓練。

        14.png

        2、訓練自己相似性比較的模型

        如果大家想要訓練自己的數據集,可以將數據集按照如下格式進行擺放。

        15.png

        每一個chapter里面放同類型的圖片。

        之后將train.py當中的train_own_data設置成True,即可開始訓練。

        16.png

        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: AI

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 隆林| 灵武市| 灵丘县| 玉山县| 定陶县| 双柏县| 吴江市| 景德镇市| SHOW| 云和县| 桂东县| 龙陵县| 延川县| 博兴县| 襄樊市| 胶南市| 常州市| 吕梁市| 佳木斯市| 阜宁县| 通许县| 辽中县| 启东市| 凯里市| 衡南县| 宝清县| 图片| 合江县| 刚察县| 兴化市| 镇原县| 图们市| 台东县| 兴山县| 景洪市| 叶城县| 阿拉善右旗| 岢岚县| 上栗县| 化州市| 桂阳县|