1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        實踐教程|CV語義分割標簽之間的相互轉(zhuǎn)換

        共 5777字,需瀏覽 12分鐘

         ·

        2021-12-09 20:46

        ↑ 點擊藍字?關(guān)注極市平臺

        作者丨游璐穎
        來源丨Datawhale
        編輯丨極市平臺

        極市導讀

        ?

        本文以語義分割任務(wù)為例,介紹了標簽的不同表達形式。并介紹了不同表達形式之間應(yīng)該如何相互轉(zhuǎn)換,附相關(guān)代碼。?>>加入極市CV技術(shù)交流群,走在計算機視覺的最前沿

        圖像分割是計算機視覺中除了分類和檢測外的另一項基本任務(wù),它意味著要將圖片根據(jù)內(nèi)容分割成不同的塊。相比圖像分類和檢測,分割是一項更精細的工作,因為需要對每個像素點分類。如下圖的街景分割,由于對每個像素點都分類,物體的輪廓是精準勾勒的,而不是像檢測那樣給出邊界框。

        圖像分割可以分為以下三個子領(lǐng)域:語義分割、實例分割、全景分割。

        由對比圖可發(fā)現(xiàn),語義分割是從像素層次來識別圖像,為圖像中的每個像素制定類別標記,目前廣泛應(yīng)用于醫(yī)學圖像和無人駕駛等;實例分割相對更具有挑戰(zhàn)性,不僅需要正確檢測圖像中的目標,同時還要精確的分割每個實例;全景分割綜合了兩個任務(wù),要求圖像中的每個像素點都必須被分配給一個語義標簽和一個實例id。

        01 語義分割中的關(guān)鍵步驟

        在進行網(wǎng)絡(luò)訓練時,時常需要對語義標簽圖或是實例分割圖進行預處理。如對于一張彩色的標簽圖,通過顏色映射表得到每種顏色所代表的類別,再將其轉(zhuǎn)換成相應(yīng)的掩膜或Onehot編碼完成訓練。這里將會對于其中的關(guān)鍵步驟進行講解。首先,以語義分割任務(wù)為例,介紹標簽的不同表達形式。

        1.1 語義標簽圖

        語義分割數(shù)據(jù)集中包括原圖和語義標簽圖,兩者的尺寸大小相同,均為RGB圖像。在標簽圖像中,白色和黑色分別代表邊框和背景,而其他不同顏色代表不同的類別:

        1.2 單通道掩膜

        每個標簽的RGB值與各自的標注類別對應(yīng),則可以很容易地查找標簽中每個像素的類別索引,生成單通道掩膜Mask。如下面這種圖,標注類別包括:Person、Purse、Plants、Sidewalk、Building。將語義標簽圖轉(zhuǎn)換為單通道掩膜后為右圖所示,尺寸大小不變,但通道數(shù)由3變?yōu)?。

        每個像素點位置一一對應(yīng)。

        1.3 Onehot編碼

        Onehot作為一種編碼方式,可以對每一個單通道掩膜進行編碼。比如對于上述掩膜圖Mask,圖像尺寸為,標簽類別共有5類,我們需要將這個Mask變?yōu)橐粋€5個通道的Onehot輸出,尺寸為,也就是將掩膜中值全為1的像素點抽取出生成一個圖,相應(yīng)位置置為1,其余為0。再將全為2的抽取出再生成一個圖,相應(yīng)位置置為1,其余為0,以此類推。

        02 語義分割實踐

        接下來以Pascal VOC 2012語義分割數(shù)據(jù)集為例,介紹不同表達形式之間應(yīng)該如何相互轉(zhuǎn)換。實踐采用的是Pascal VOC 2012語義分割數(shù)據(jù)集,它是語義分割任務(wù)中十分重要的數(shù)據(jù)集,有 20 類目標,這些目標包括人類、機動車類以及其他類,可用于目標類別或背景的分割。數(shù)據(jù)集開源地址:https://gas.graviti.cn/dataset/yluy/VOC2012Segmentation

        2.1 數(shù)據(jù)集讀取

        在使用之前先進行一些必要的準備工作:

        • Fork數(shù)據(jù)集:如果需要使用公開數(shù)據(jù)集,則需要將其先fork到自己的賬戶。
        • 獲取AccessKey:獲取使用SDK與格物鈦數(shù)據(jù)平臺交互所需的密鑰,鏈接為https://gas.graviti.cn/tensorbay/developer
        • 理解Segment:數(shù)據(jù)集的進一步劃分,如VOC數(shù)據(jù)集分成了“train”和“test”兩個部分。
        import?os??
        from?tensorbay?import?GAS??
        from?tensorbay.dataset?import?Data,?Dataset??
        from?tensorbay.label?import?InstanceMask,?SemanticMask??
        from?PIL?import?Image??
        import?numpy?as?np??
        import?torchvision??
        import?matplotlib.pyplot?as?plt??

        ACCESS_KEY?=?""??
        gas?=?GAS(ACCESS_KEY)??


        def?read_voc_images(is_train=True,?index=0):??
        ????"""??
        ????read?voc?image?using?tensorbay??
        ????"
        ""??
        ????dataset?=?Dataset("VOC2012Segmentation",?gas)??
        ????if?is_train:??
        ????????segment?=?dataset["train"]??
        ????else:??
        ????????segment?=?dataset["test"]??

        ????data?=?segment[index]??
        ????feature?=?Image.open(data.open()).convert("RGB")??
        ????label?=?Image.open(data.label.semantic_mask.open()).convert("RGB")??
        ????visualize(feature,?label)??
        ??????
        ????return?feature,?label??#?PIL?Image??

        ??

        def?visualize(feature,?label):??
        ????"""??
        ????visualize?feature?and?label??
        ????"
        ""??
        ????fig?=?plt.figure()??
        ????ax?=?fig.add_subplot(121)??#?第一個子圖??
        ????ax.imshow(feature)??
        ????ax2?=?fig.add_subplot(122)??#?第二個子圖??
        ????ax2.imshow(label)??
        ????plt.show()??

        train_feature,?train_label?=?read_voc_images(is_train=True,?index=10)??
        train_label?=?np.array(train_label)?#?(375,?500,?3)??

        2.2 顏色映射表

        在得到彩色語義標簽圖后,則可以構(gòu)建一個顏色表映射,列出標簽中每個RGB顏色的值及其標注的類別。

        def?colormap_voc():??
        ????"""??
        ????create?a?colormap??
        ????"
        ""??
        ????colormap?=?[[0,?0,?0],?[128,?0,?0],?[0,?128,?0],?[128,?128,?0],??
        ????????????????????[0,?0,?128],?[128,?0,?128],?[0,?128,?128],?[128,?128,?128],??
        ????????????????????[64,?0,?0],?[192,?0,?0],?[64,?128,?0],?[192,?128,?0],??
        ????????????????????[64,?0,?128],?[192,?0,?128],?[64,?128,?128],?[192,?128,?128],??
        ????????????????????[0,?64,?0],?[128,?64,?0],?[0,?192,?0],?[128,?192,?0],??
        ????????????????????[0,?64,?128]]??

        ????classes?=?['background',?'aeroplane',?'bicycle',?'bird',?'boat',??
        ???????????????????'bottle',?'bus',?'car',?'cat',?'chair',?'cow',??
        ???????????????????'diningtable',?'dog',?'horse',?'motorbike',?'person',??
        ???????????????????'potted?plant',?'sheep',?'sofa',?'train',?'tv/monitor']??
        ??????
        ????return?colormap,?classes??

        2.3 Label與Onehot轉(zhuǎn)換

        根據(jù)映射表,實現(xiàn)語義標簽圖與Onehot編碼的相互轉(zhuǎn)換:

        def?label_to_onehot(label,?colormap):??
        ????"""??
        ????Converts?a?segmentation?label?(H,?W,?C)?to?(H,?W,?K)?where?the?last?dim?is?a?one??
        ????hot?encoding?vector,?C?is?usually?1?or?3,?and?K?is?the?number?of?class.??
        ????"
        ""??
        ????semantic_map?=?[]??
        ????for?colour?in?colormap:??
        ????????equality?=?np.equal(label,?colour)??
        ????????class_map?=?np.all(equality,?axis=-1)??
        ????????semantic_map.append(class_map)??
        ????semantic_map?=?np.stack(semantic_map,?axis=-1).astype(np.float32)??
        ????return?semantic_map??

        def?onehot_to_label(semantic_map,?colormap):??
        ????"""??
        ????Converts?a?mask?(H,?W,?K)?to?(H,?W,?C)??
        ????"
        ""??
        ????x?=?np.argmax(semantic_map,?axis=-1)??
        ????colour_codes?=?np.array(colormap)??
        ????label?=?np.uint8(colour_codes[x.astype(np.uint8)])??
        ????return?label??

        colormap,?classes?=?colormap_voc()??
        semantic_map?=?mask_to_onehot(train_label,?colormap)??
        print(semantic_map.shape)??#?[H,?W,?K]?=?[375,?500,?21]?包括背景共21個類別??

        label?=?onehot_to_label(semantic_map,?colormap)??
        print(label.shape)?#?[H,?W,?K]?=?[375,?500,?3]??

        2.4 Onehot與Mask轉(zhuǎn)換

        同樣,借助映射表,實現(xiàn)單通道掩膜Mask與Onehot編碼的相互轉(zhuǎn)換:

        def?onehot2mask(semantic_map):??
        ????"""??
        ????Converts?a?mask?(K,?H,?W)?to?(H,W)??
        ????"
        ""??
        ????_mask?=?np.argmax(semantic_map,?axis=0).astype(np.uint8)??
        ????return?_mask??


        def?mask2onehot(mask,?num_classes):??
        ????"""??
        ????Converts?a?segmentation?mask?(H,W)?to?(K,H,W)?where?the?last?dim?is?a?one??
        ????hot?encoding?vector??

        ????"
        ""??
        ????semantic_map?=?[mask?==?i?for?i?in?range(num_classes)]??
        ????return?np.array(semantic_map).astype(np.uint8)??

        mask?=?onehot2mask(semantic_map.transpose(2,0,1))??
        print(np.unique(mask))?#?[?0??1?15]?索引相對應(yīng)的是背景、飛機、人??
        print(mask.shape)?#?(375,?500)??

        semantic_map?=?mask2onehot(mask,?len(colormap))??
        print(semantic_map.shape)?#?(21,?375,?500)


        如果覺得有用,就請分享到朋友圈吧!

        △點擊卡片關(guān)注極市平臺,獲取最新CV干貨

        公眾號后臺回復“transformer”獲取最新Transformer綜述論文下載~


        極市干貨
        課程/比賽:珠港澳人工智能算法大賽保姆級零基礎(chǔ)人工智能教程
        算法trick目標檢測比賽中的tricks集錦從39個kaggle競賽中總結(jié)出來的圖像分割的Tips和Tricks
        技術(shù)綜述:一文弄懂各種loss function工業(yè)圖像異常檢測最新研究總結(jié)(2019-2020)


        #?CV技術(shù)社群邀請函?#

        △長按添加極市小助手
        添加極市小助手微信(ID : cvmart4)

        備注:姓名-學校/公司-研究方向-城市(如:小極-北大-目標檢測-深圳)


        即可申請加入極市目標檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計/ReID/GAN/圖像增強/OCR/視頻理解等技術(shù)交流群


        每月大咖直播分享、真實項目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與?10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~



        覺得有用麻煩給個在看啦~??
        瀏覽 674
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            一区二区综合 | 免费国产91视频 | 性欧美18—19sex性高清 | 香港三级韩国三级日本三级 | 性生活电影网 | 中国一级黄色片子 | 美女高潮喷水网站 | 欧美极品jizzhd欧美仙踪林 | 国产熟女久久 | 精品一区二区三区免费观看 |