<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 五、語義分割 在本章中,我們將學習各種語義分割技術并為其訓練模型。 分割是逐像素分類任務。 解決分割問題的思想是對對象檢測問題的擴展。 分割在醫學和衛星圖像理解等應用中非常有用。 本章將涵蓋以下主題: * 學習語義分割和實例分割之間的區別 * 分割數據集和指標 * 語義分割算法 * 分割在醫學和衛星圖像中的應用 * 實例分割算法 # 預測像素 圖像分類是預測標簽或類別的任務。 對象檢測是預測幾種基于深度學習的算法及其相應邊界框的列表的任務。 邊界框可能在其中包含除檢測到的對象以外的其他對象。 在某些應用中,將每個像素標記到標簽很重要,而不是可能包含多個對象的邊框。 “語義分割”是預測逐像素標簽的任務。 這是圖像及其對應的語義分割的示例: ![](https://img.kancloud.cn/56/2c/562c6ae9463ab9e9d36e9f894f46ad0d_566x377.jpeg) ![](https://img.kancloud.cn/32/ca/32ca1be91907cb42ee8885f707afb955_566x377.jpg) 如圖中所示,使用每個像素的標簽預測輸入圖像。 標簽可以是天空,樹木,人,山和橋。 標簽不是分配給整個圖像,而是分配給每個像素。 語義分割獨立標記像素。 您會注意到每個人都沒有區別。 圖像中的所有人員均以相同的方式標記。 這是區分相同標簽的每個實例的示例: ![](https://img.kancloud.cn/cb/c1/cbc144aad49898a57ab23e30c6fc21e8_566x377.jpg) 用像素標記分割每個實例的任務稱為**實例分割**。 實例分割可以被認為是具有像素級標簽的對象檢測的擴展。 語義分段和實例分段的應用非常廣泛,下一部分將提供一些應用。 # 診斷醫學圖像 可以使用分割技術來診斷醫學圖像。 現代醫學成像技術,例如**磁共振成像**(**MRI**),**計算機斷層掃描**(**CT**)和**視網膜病變**創建高質量的圖像。 可以將通過這種技術生成的圖像劃分為多個區域,以檢測來自腦部掃描的腫瘤或來自視網膜掃描的斑點。 一些設備提供體積圖像,這些圖像也可以通過分段進行分析。 分割視頻以進行機器人手術,使醫生能夠在機器人協助的手術中仔細查看區域。 在本章的后面,我們將看到如何分割醫學圖像。 # 通過衛星圖像了解地球 衛星圖像最近變得越來越豐富。 衛星捕獲的圖像提供了地球整個表面的高分辨率視圖。 通過分析衛星圖像,我們可以了解有關地球的幾件事,例如: * 衡量與經濟增長相關的國家的架構率 * 測量油箱 * 規劃和組織交通 * 計算森林砍伐及其影響 * 通過對動物進行計數并跟蹤其運動來幫助保護野生動植物 * 發現考古遺址 * 繪制自然災害造成的損壞區域 衛星圖像還有更多的應用可能。 對于上述大多數問題,解決方案始于衛星圖像的分割。 在本章的后面,我們將看到如何分割衛星圖像。 # 使機器人擁有視覺 分割場景對于機器人看清周圍世界并與之互動至關重要。 工業和家用機器人必須處理這些對象。 一旦根據對象跨越了機器人的視野,就可以進行處理。 還有更多值得一提的應用: * 對缺陷進行分割的工業檢查工具 * 時裝行業的色彩診斷; 可以將圖像與各種時尚對象進行分割并將其用于顏色解析 * 區分背景與前景來應用人像效果 在下一部分中,我們將學習一些用于評估分割算法的公共數據集。 # 數據集 第 4 章,“對象檢測”中提到的`PASCAL`和`COCO`數據集也可以用于分割任務。 標注是不同的,因為它們是按像素標記的。 新算法通常以`COCO`數據集為基準。 `COCO`還具有諸如草,墻和天空之類的東西數據集。 像素精度屬性可用作評估計法的指標。 除了上面提到的那些以外,在醫學影像和衛星影像領域還有其他幾個數據集。 這里提供了指向其中一些鏈接的供您參考: * <http://www.cs.bu.edu/~betke/BiomedicalImageSegmentation/> * <https://www.kaggle.com/c/intel-mobileodt-cervical-cancer-screening/data> * <https://www.kaggle.com/c/diabetic-retinopathy-detection> * <https://grand-challenge.org/all_challenges/> * <http://www.via.cornell.edu/databases/> * <https://www.kaggle.com/c/dstl-satellite-imagery-feature-detection> * <https://aws.amazon.com/public-datasets/spacenet/> * <https://www.iarpa.gov/challenges/fmow.html> * <https://www.kaggle.com/c/planet-understanding-the-amazon-from-space> 為分割任務創建訓練數據非常昂貴。 有在線工具可用于標注數據集。 麻省理工學院(**MIT**)提供的 **LabelMe** 移動應用非常適合標注,可以從[這里](http://labelme.csail.mit.edu/Release3.0)下載。 # 語義分割算法 提出了幾種基于深度學習的算法來解決圖像分割任務。 可以在像素級別應用滑動窗口方法進行分割。 滑動窗口方法會拍攝圖像并將圖像分成較小的作物。 圖像的每種裁剪都被分類為標簽。 這種方法昂貴且效率低下,因為它不會重用重疊補丁之間的共享特征。 在以下各節中,我們將討論一些可以克服此問題的算法。 # 全卷積網絡 **全卷積網絡**(**FCN**)引入了端到端卷積網絡的思想。 通過刪除全連接層,可以將任何標準的 CNN 架構用于 FCN,其實現在第 4 章,“對象檢測”中進行了顯示。 全連接層被卷積層代替。 最終層的深度較高,尺寸較小。 因此,可以執行一維卷積以達到所需的標簽數量。 但是對于分割,必須保留空間尺寸。 因此,構建完整的卷積網絡時沒有最大池,如下所示: ![](https://img.kancloud.cn/3c/d7/3cd7537fda8041e9f05706c5fe6e7a1f_566x138.png) 該網絡的損耗是通過平均每個像素和小批量的交叉熵損耗來計算的。 最后一層的深度等于類數。 FCN 與對象檢測相似,只是保留了空間尺寸。 由于某些像素可能會被錯誤預測,因此該架構產生的輸出將很粗糙。 計算量很大,在下一節中,我們將看到如何解決此問題。 # SegNet 架構 **SegNet** 具有編碼器和解碼器方法。 編碼器具有各種卷積層,而解碼器具有各種解卷積層。 SegNet 改進了 FCN 產生的粗略輸出。 因此,它的內存占用較少。 當特征尺寸減小時,通過反卷積將其再次上采樣至圖像大小,從而反轉了卷積效果。 反卷積學習用于上采樣的參數。 由于池層中的信息丟失,這種架構的輸出將很粗糙。 ![](https://img.kancloud.cn/00/79/007910d4c2f2b5332a30755df7f6bdff_566x167.png) 現在,讓我們學習幾個新概念,這些概念稱為上采樣,無規則卷積和轉置卷積,它們將幫助我們更好地理解該網絡。 # 通過池化對層進行上采樣 在第 1 章“入門”中,我們討論了最大池化。 最大池化是一種從窗口中選取最大值的采樣策略。 對于上采樣,可以相反。 每個值都可以用零包圍,以對該層進行上采樣,如下所示: ![](https://img.kancloud.cn/2b/5d/2b5d468f72f3cb916b432b8e0c62ca99_566x278.png) 將零添加到與上采樣數字相同的位置。 通過記住下采樣的位置并將其用于上采樣,可以改善反池化,如下所示: ![](https://img.kancloud.cn/2e/2c/2e2ccecef501f8f0481c9c41c2673fda_566x284.png) 從索引角度來看,上采樣比附加零產生更好的結果。 這種通過池對層進行上采樣的方法是無法學到的,并且可以按原樣工作。 接下來,我們將看到如何使用可學習的參數進行上采樣和下采樣。 # 通過卷積對層進行采樣 可以使用卷積直接對層進行升采樣或降采樣。 可以增加用于卷積的步幅以引起下采樣,如下所示: ![](https://img.kancloud.cn/44/83/4483e10e7b708bca38f0b556a34d3b6a_566x290.png) 通過卷積的下采樣被稱為**無孔卷積**或**擴張卷積**或**大卷積**。 類似地,可以通過學習內核將其反轉為升采樣,如下所示: ![](https://img.kancloud.cn/40/4e/404ebdb0c89f7143f9d338be251d22bf_566x283.png) 直接使用卷積的上采樣可以稱為**轉置卷積**。 其他一些同義詞是**反卷積**或**分數步卷積**或**上卷積**。 現在,了解了升采樣的過程。 這是描述先前算法的代碼片段: ```py input_height = 360 input_width = 480 kernel = 3 filter_size = 64 pad = 1 pool_size = 2 ``` 輸入之后,它遵循大小逐漸減小的通常的卷積神經網絡,可以稱為編碼器。 以下代碼可用于定義編碼器: ```py model = tf.keras.models.Sequential() model.add(tf.keras.layers.Layer(input_shape=(3, input_height, input_width))) # encoder model.add(tf.keras.layers.ZeroPadding2D(padding=(pad, pad))) model.add(tf.keras.layers.Conv2D(filter_size, kernel, kernel, border_mode='valid')) model.add(tf.keras.layers.BatchNormalization()) model.add(tf.keras.layers.Activation('relu')) model.add(tf.keras.layers.MaxPooling2D(pool_size=(pool_size, pool_size))) model.add(tf.keras.layers.ZeroPadding2D(padding=(pad, pad))) model.add(tf.keras.layers.Conv2D(128, kernel, kernel, border_mode='valid')) model.add(tf.keras.layers.BatchNormalization()) model.add(tf.keras.layers.Activation('relu')) model.add(tf.keras.layers.MaxPooling2D(pool_size=(pool_size, pool_size))) model.add(tf.keras.layers.ZeroPadding2D(padding=(pad, pad))) model.add(tf.keras.layers.Conv2D(256, kernel, kernel, border_mode='valid')) model.add(tf.keras.layers.BatchNormalization()) model.add(tf.keras.layers.Activation('relu')) model.add(tf.keras.layers.MaxPooling2D(pool_size=(pool_size, pool_size))) model.add(tf.keras.layers.ZeroPadding2D(padding=(pad, pad))) model.add(tf.keras.layers.Conv2D(512, kernel, kernel, border_mode='valid')) model.add(tf.keras.layers.BatchNormalization()) model.add(tf.keras.layers.Activation('relu')) ``` 可以使用以下代碼將編碼器的輸出以增大的尺寸饋入解碼器: ```py # decoder model.add(tf.keras.layers.ZeroPadding2D(padding=(pad, pad))) model.add(tf.keras.layers.Conv2D(512, kernel, kernel, border_mode='valid')) model.add(tf.keras.layers.BatchNormalization()) model.add(tf.keras.layers.UpSampling2D(size=(pool_size, pool_size))) model.add(tf.keras.layers.ZeroPadding2D(padding=(pad, pad))) model.add(tf.keras.layers.Conv2D(256, kernel, kernel, border_mode='valid')) model.add(tf.keras.layers.BatchNormalization()) model.add(tf.keras.layers.UpSampling2D(size=(pool_size, pool_size))) model.add(tf.keras.layers.ZeroPadding2D(padding=(pad, pad))) model.add(tf.keras.layers.Conv2D(128, kernel, kernel, border_mode='valid')) model.add(tf.keras.layers.BatchNormalization()) model.add(tf.keras.layers.UpSampling2D(size=(pool_size, pool_size))) model.add(tf.keras.layers.ZeroPadding2D(padding=(pad, pad))) model.add(tf.keras.layers.Conv2D(filter_size, kernel, kernel, border_mode='valid')) model.add(tf.keras.layers.BatchNormalization()) model.add(tf.keras.layers.Conv2D(nClasses, 1, 1, border_mode='valid', )) ``` 解碼圖像的大小與輸入的大小相同,并且可以使用以下代碼來訓練整個模型: ```py model.outputHeight = model.output_shape[-2] model.outputWidth = model.output_shape[-1] model.add(tf.keras.layers.Reshape((nClasses, model.output_shape[-2] * model.output_shape[-1]), input_shape=(nClasses, model.output_shape[-2], model.output_shape[-1]))) model.add(tf.keras.layers.Permute((2, 1))) model.add(tf.keras.layers.Activation('softmax')) model.compile(loss="categorical_crossentropy", optimizer=tf.keras.optimizers.Adam, metrics=['accuracy']) ``` 這種對圖像進行編碼和解碼的方式克服了基于 FCN 的模型的缺點。 接下來,我們將看到具有膨脹卷積的不同概念。 # 用于更好訓練的跳躍連接 分割輸出的粗糙程度可以通過跳過架構來限制,并且可以獲得更高的分辨率。 另一種替代方法是按比例放大最后三層并將其平均,如下所示: ![](https://img.kancloud.cn/d4/14/d4147903e746e2a02fbe9f9ffae5b471_566x400.png) 此算法將在后面的部分中用作衛星圖像的示例。 # 膨脹卷積 逐像素分類和圖像分類在結構上不同。 因此,減少信息的池化層將產生粗略的分段。 但是請記住,池化對于擁有更廣闊的視野并允許采樣至關重要。 引入了一種名為**擴張卷積**的新想法,以解決該問題,從而在進行更廣闊視野的同時減少損耗。 擴大的卷積本質上是通過跳過窗口中的每個像素來進行卷積,如下所示: ![](https://img.kancloud.cn/46/6c/466cefade9ad863b94832d3adebc3f64_566x564.png) 膨脹距離隨層而變化。 這樣的分割結果的輸出被放大以得到更精細的分辨率。 訓練了一個單獨的網絡以進行多尺度聚合。 # DeepLab Chen 等人提出的 [DeepLab](https://arxiv.org/pdf/1606.00915.pdf) 在多個尺度上執行卷積,并使用來自各種尺度的特征獲得分數圖。 然后對得分圖進行插值,并通過**條件隨機場**(**CRF**)進行最終分割。 圖像的這種比例處理可以通過使用其自己的 CNN 處理各種大小的圖像,或者通過具有不同水平的卷積卷積的并行卷積來執行。 ![](https://img.kancloud.cn/ed/78/ed7874e097427a0d2e65a0fd5cd990ed_566x267.png) 經 Chen 等人許可復制。 # RefiNet 膨脹卷積需要更大的輸入,因此占用大量內存。 使用高分辨率圖片時,這會帶來計算問題。 [里德等人](https://arxiv.org/pdf/1611.06612.pdf)提出了一種稱為 RefiNet 的方法來克服此問題,如下所示: ![](https://img.kancloud.cn/7b/3d/7b3d937dec7d428dc9e269228f983fe4_566x256.png) 經 Reid 等人許可復制。 RefiNet 使用編碼器,然后使用解碼器。 CNN 的編碼器輸出。 解碼器連接各種大小的特征: ![](https://img.kancloud.cn/5d/43/5d43451ef4cbaf0f67c25b1bd49d6421_566x317.png) 經 Reid 等人許可復制。 連接完成后會放大低維特征。 # PSPnet [Zhoa 等人介紹的 PSPnet 中使用了全局內容](https://arxiv.org/pdf/1612.01105.pdf)。 方法是增加池化層的內核大小。 池化以金字塔的方式進行。 金字塔同時覆蓋圖像的各個部分和大小。 架構之間存在損失,因此無法進行適當的監管。 ![](https://img.kancloud.cn/f0/e4/f0e4c77971b2e93ba18da26bbaf462e1_566x151.png) 經 Zhao 等人許可復制。 # 大內核很重要 [Peng 等人](https://arxiv.org/pdf/1703.02719.pdf)展示了大內核的重要性。 大內核比小內核具有更大的接受范圍。 這些大內核的計算復雜度可用于以較小的內核來克服。 最后有一個邊界優化網絡。 ![](https://img.kancloud.cn/66/1b/661b98d046fa23f75d0a42f0998dd73b_566x301.png) 經 Peng 等人許可復制。 # DeepLab v3 [Chen 等人在論文中使用批量歸一化](https://arxiv.org/pdf/1706.05587.pdf)以提高表現。 特征的多尺度以級聯方式編碼,以提高表現: ![](https://img.kancloud.cn/ba/a5/baa53dad113707468ab008264eb843b3_566x142.png) 經 Chen 等人許可復制。 ![](https://img.kancloud.cn/77/36/77362da69b4bb2d26b1b467c127e3321_566x149.png) 經 Chen 等人許可復制。 我們已經看到了幾種架構可以使用深度學習提高圖像分割的準確率。 接下來,我們將看到在醫學成像中的應用。 # 超神經分割 Kaggler 是一個組織進行預測建模和分析競賽的組織。 Kagglers 曾經受到挑戰,要從頸部超聲圖像中分割神經結構。 可以從[這里](https://www.kaggle.com/c/ultrasound-nerve-segmentation)下載有關該數據的數據。 Ronneberger 等人提出的 [UNET 模型](https://arxiv.org/pdf/1505.04597.pdf)類似于自編碼器,但具有卷積而不是全連接層。 這里有一個編碼部分,其卷積減小,而解碼器部分的卷積增大,如下所示: ![](https://img.kancloud.cn/e0/19/e019b8c4810e88fa999368cf02e78ee3_467x311.png) 該圖說明了 UNET 模型的架構[經 Ronneberger 等人許可復制] 相似大小的編碼器和解碼器部分的卷積通過跳過連接來學習。 模型的輸出是一個介于 0 到 1 之間的掩碼。讓我們從導入函數開始,借助以下代碼: ```py import os from skimage.transform import resize from skimage.io import imsave import numpy as np from data import load_train_data, load_test_data ``` 在所有導入之后,我們現在將使用以下代碼定義大小: ```py image_height, image_width = 96, 96 smoothness = 1.0 work_dir = '' ``` 現在我們將定義`dice_coefficient`及其損失函數。 在這種情況下,`dice_coefficient`也是度量標準: ```py def dice_coefficient(y1, y2): y1 = tf.flatten(y1) y2 = tf.flatten(y2) return (2\. * tf.sum(y1 * y2) + smoothness) / (tf.sum(y1) + tf.sum(y2) + smoothness) def dice_coefficient_loss(y1, y2): return -dice_coefficient(y1, y2) ``` UNET 模型可以定義如下: ```py def preprocess(imgs): imgs_p = np.ndarray((imgs.shape[0], image_height, image_width), dtype=np.uint8) for i in range(imgs.shape[0]): imgs_p[i] = resize(imgs[i], (image_width, image_height), preserve_range=True) imgs_p = imgs_p[..., np.newaxis] return imgs_p def covolution_layer(filters, kernel=(3,3), activation='relu', input_shape=None): if input_shape is None: return tf.keras.layers.Conv2D( filters=filters, kernel=kernel, activation=activation) else: return tf.keras.layers.Conv2D( filters=filters, kernel=kernel, activation=activation, input_shape=input_shape) def concatenated_de_convolution_layer(filters): return tf.keras.layers.concatenate([ tf.keras.layers.Conv2DTranspose( filters=filters, kernel=(2, 2), strides=(2, 2), padding='same' )], axis=3 ) ``` 所有層都已連接并使用,如以下代碼所示: ```py unet = tf.keras.models.Sequential() inputs = tf.keras.layers.Input((image_height, image_width, 1)) input_shape = (image_height, image_width, 1) unet.add(covolution_layer(32, input_shape=input_shape)) unet.add(covolution_layer(32)) unet.add(pooling_layer()) unet.add(covolution_layer(64)) unet.add(covolution_layer(64)) unet.add(pooling_layer()) unet.add(covolution_layer(128)) unet.add(covolution_layer(128)) unet.add(pooling_layer()) unet.add(covolution_layer(256)) unet.add(covolution_layer(256)) unet.add(pooling_layer()) unet.add(covolution_layer(512)) unet.add(covolution_layer(512)) ``` 這些層是連接在一起的,并使用了反卷積層: ```py unet.add(concatenated_de_convolution_layer(256)) unet.add(covolution_layer(256)) unet.add(covolution_layer(256)) unet.add(concatenated_de_convolution_layer(128)) unet.add(covolution_layer(128)) unet.add(covolution_layer(128)) unet.add(concatenated_de_convolution_layer(64)) unet.add(covolution_layer(64)) unet.add(covolution_layer(64)) unet.add(concatenated_de_convolution_layer(32)) unet.add(covolution_layer(32)) unet.add(covolution_layer(32)) unet.add(covolution_layer(1, kernel=(1, 1), activation='sigmoid')) unet.compile(optimizer=tf.keras.optimizers.Adam(lr=1e-5), loss=dice_coefficient_loss, metrics=[dice_coefficient]) ``` 接下來,可以通過使用以下代碼對模型進行圖像訓練: ```py x_train, y_train_mask = load_train_data() x_train = preprocess(x_train) y_train_mask = preprocess(y_train_mask) x_train = x_train.astype('float32') mean = np.mean(x_train) std = np.std(x_train) x_train -= mean x_train /= std y_train_mask = y_train_mask.astype('float32') y_train_mask /= 255. unet.fit(x_train, y_train_mask, batch_size=32, epochs=20, verbose=1, shuffle=True, validation_split=0.2) x_test, y_test_mask = load_test_data() x_test = preprocess(x_test) x_test = x_test.astype('float32') x_test -= mean x_test /= std y_test_pred = unet.predict(x_test, verbose=1) for image, image_id in zip(y_test_pred, y_test_mask): image = (image[:, :, 0] * 255.).astype(np.uint8) imsave(os.path.join(work_dir, str(image_id) + '.png'), image) ``` 圖像可以進行預處理和使用。 現在可以進行圖像的訓練和測試了。 訓練模型后,分割會產生良好的結果,如下所示: ![](https://img.kancloud.cn/84/55/8455f77747a0f1c3b0dac858b09874b5_96x96.png) 我們已經訓練了可以分割醫學圖像的模型。 該算法可以在幾種用例中使用。 在下一節中,我們將看到如何分割衛星圖像。 # 分割衛星圖像 在本節中,我們將使用**國際攝影測量與遙感學會**(**ISPRS**)提供的數據集。 數據集包含 5 毫米分辨率的德國波茨坦的衛星圖像。 這些圖像帶有紅外和圖像高度輪廓的附加數據。 與圖像相關聯的六個標簽是: * 架構 * 植被 * 樹木 * 巢穴 * 雜物 * 硬質 總共提供了 8,000 x 6,000 色塊的 38 張圖像。 請轉到[頁面](http://www2.isprs.org/commissions/comm3/wg4/data-request-form2.html)并填寫表格。 之后,在表單上選擇以下選項: ![](https://img.kancloud.cn/10/a5/10a5ea4bb459f9ca165c1173787492d0_566x219.png) 發布表格后,將向您發送電子郵件,從中可以下載數據。 # 為分割建模 FCN 導入庫并獲得輸入的形狀。 標簽數定義為`6`: ```py from .resnet50 import ResNet50 nb_labels = 6 img_height, img_width, _ = input_shape input_tensor = tf.keras.layers.Input(shape=input_shape) weights = 'imagenet' ``` 在 ImageNet 上預先訓練的`ResNet`模型將用作基本模型。 以下代碼可用于使用`ResNet`定義基本模型: ```py resnet50_model = ResNet50( include_top=False, weights='imagenet', input_tensor=input_tensor) ``` 現在,我們將使用以下代碼從`ResNet`中獲取最后三層: ```py final_32 = resnet50_model.get_layer('final_32').output final_16 = resnet50_model.get_layer('final_16').output final_x8 = resnet50_model.get_layer('final_x8').output ``` 必須壓縮每個跳過連接以匹配等于標簽數的通道: ```py c32 = tf.keras.layers.Conv2D(nb_labels, (1, 1))(final_32) c16 = tf.keras.layers.Conv2D(nb_labels, (1, 1))(final_16) c8 = tf.keras.layers.Conv2D(nb_labels, (1, 1))(final_x8) ``` 可以使用雙線性插值來調整壓縮跳過連接的輸出大小。 可以通過使用可以計算 TensorFlow 操作的`Lambda`層來實現插值。 以下代碼段可用于使用 lambda 層進行插值: ```py def resize_bilinear(images): return tf.image.resize_bilinear(images, [img_height, img_width]) r32 = tf.keras.layers.Lambda(resize_bilinear)(c32) r16 = tf.keras.layers.Lambda(resize_bilinear)(c16) r8 = tf.keras.layers.Lambda(resize_bilinear)(c8) ``` 使用以下代碼,可以通過添加三個值來合并我們定義的三層: ```py m = tf.keras.layers.Add()([r32, r16, r8]) ``` 可以使用 softmax 激活來應用模型的概率。 在應用 softmax 之前和之后調整模型大小: ```py x = tf.keras.ayers.Reshape((img_height * img_width, nb_labels))(m) x = tf.keras.layers.Activation('img_height')(x) x = tf.keras.layers.Reshape((img_height, img_width, nb_labels))(x) fcn_model = tf.keras.models.Model(input=input_tensor, output=x) ``` 已經定義了一個簡單的 FCN 層,經過訓練后,它會產生以下結果: ![](https://img.kancloud.cn/a1/29/a1294ea5630bc702ef5327750b49b356_566x175.png) 您會看到六個標簽的預測是合理的。 接下來,我們將學習分割實例。 # 分割實例 在分析圖像時,我們的興趣只會吸引到圖像中的某些實例。 因此,它不得不從圖像的其余部分中分割這些實例。 從其余信息中分離所需信息的過程被廣泛稱為**分割實例**。 在此過程中,首先拍攝輸入圖像,然后將邊界框與對象一起定位,最后,將為每個類別預測逐像素掩碼。 對于每個對象,都將計算像素級精度。 有幾種用于分割實例的算法。 最近的算法之一是 He 等人提出的 [**Mask RCNN** 算法](https://arxiv.org/pdf/1703.06870.pdf)。 下圖描繪了 Mask R-CNN 的架構: ![](https://img.kancloud.cn/ea/b8/eab80cc6eee56e08db4e76f8a2f7a4cf_566x238.png) 經 He 等人許可復制。 該架構看起來與 R-CNN 類似,但增加了分段。 這是一個具有端到端訓練的多階段網絡。 學習了區域提案。 該網絡分為兩個部分,一個用于檢測,另一個用于分類評分。 結果非常好,如下所示: ![](https://img.kancloud.cn/88/c3/88c3730d9e0b7dee2e6549b336d247b6_558x422.png) 該圖說明了分割實例的過程,請注意,準確地檢測了對象并進行了相應的分割。 同一網絡還可以預測人的姿勢。 分割和檢測這兩個任務是并行處理的。 # 總結 在本章中,我們學習了各種分割算法。 我們還看到了用于基準測試的數據集和指標。 我們將學到的技術應用于衛星和醫學圖像的分割。 最后,我們談到了 Mask R-CNN 算法的實例分割。 在下一章中,我們將學習相似性學習。 相似性學習模型學習兩個圖像之間的比較機制。 對于人臉識別等多種應用很有用。 我們將學習幾種可用于相似性學習的模型架構。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看