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>

        實(shí)操教程|用CNN實(shí)現(xiàn)全景圖像語(yǔ)義分割!

        共 9447字,需瀏覽 19分鐘

         ·

        2021-09-27 18:12

        ↑ 點(diǎn)擊藍(lán)字 關(guān)注極市平臺(tái)

        作者 | 張強(qiáng) 
        來(lái)源 | Datawhale
        編輯 | 極市平臺(tái)

        極市導(dǎo)讀

         

        本文手把手帶你實(shí)踐一個(gè)有趣的應(yīng)用——全景圖像語(yǔ)義分割,使用多種傳統(tǒng)CNN方法和球面CNN方法進(jìn)行對(duì)比。如下圖所示,全景圖分割實(shí)例像素級(jí)別分類(lèi),每種實(shí)例對(duì)應(yīng)一個(gè)標(biāo)簽。完成本教程后,你將能夠做一個(gè)圖中所示的全景圖小應(yīng)用。 >>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺(jué)的最前沿

        相信許多讀者體驗(yàn)過(guò)b站上的全景視頻,如果還沒(méi)有,快來(lái)體驗(yàn)一下吧[1]!只需鼠標(biāo)點(diǎn)擊并移動(dòng),便可360度無(wú)死角的瀏覽全景視頻,讓人如同身臨其境。全景圖像,又稱(chēng)360°全景圖,其數(shù)據(jù)分布在球面空間上。但是,當(dāng)我們將全景圖像展開(kāi)時(shí),會(huì)造成畸變。

        怎么處理?直接將傳統(tǒng)二維平面圖像處理方法應(yīng)用到球面數(shù)據(jù)上,其效果則會(huì)大大降低。而要解決分布在球面空間上的數(shù)據(jù),需要特定的方法,比如球面卷積網(wǎng)絡(luò)。本文手把手帶你實(shí)踐一個(gè)有趣的應(yīng)用——全景圖像語(yǔ)義分割,使用多種傳統(tǒng)CNN方法和球面CNN方法進(jìn)行對(duì)比。如下圖所示,全景圖分割實(shí)例像素級(jí)別分類(lèi),每種實(shí)例對(duì)應(yīng)一個(gè)標(biāo)簽。完成本教程后,你將能夠做一個(gè)圖中所示的全景圖小應(yīng)用。

        文章數(shù)據(jù)集獲取與代碼地址見(jiàn)文末。

        1. 環(huán)境構(gòu)建

        基于深度學(xué)習(xí)的編程環(huán)境往往有各種復(fù)雜的環(huán)境依賴(lài),而各種安裝報(bào)錯(cuò)總是消磨我們的時(shí)間,其實(shí)之一過(guò)程可以大大縮短。我們所需要的也就是通過(guò)一個(gè)命令安裝所有的依賴(lài)并打開(kāi)環(huán)境

        make up #等價(jià)于 docker-compose up -d

        再通過(guò)一個(gè)命令

        make in

        來(lái)進(jìn)入我們需要的環(huán)境,然后運(yùn)行程序。為實(shí)現(xiàn)構(gòu)建這一過(guò)程,基于dockerdocker-composemake來(lái)搭建我們的環(huán)境,其原理如下圖所示:

        dockerdocker-composemake三個(gè)工具對(duì)應(yīng)三個(gè)配置文件,都在項(xiàng)目根目錄進(jìn)行了聲明:

        Dockerfiledocker-compose.ymlMakefile

        其中

        • Dockerfile 定義了實(shí)驗(yàn)所需要的所有環(huán)境,依據(jù)此文件可以編譯成docker鏡像,其中包含我們需要的庫(kù)
        • docker-compose.yml定義了鏡像的啟動(dòng)方式,在本文中,我們定義兩個(gè)服務(wù),一個(gè)作為終端來(lái)運(yùn)行命令,一個(gè)作為jupyter lab供調(diào)試
        • Makefile定義了啟動(dòng)環(huán)境的方式

        本文實(shí)驗(yàn)環(huán)境:Ubuntu20.04,CUDA11.0,Pytorch1.7

        Docker安裝

        # 1.安裝dockersudo apt install -y docker docker.io# 2.安裝英偉達(dá)dockerdistribution=$(. /etc/os-release;echo $ID$VERSION_ID) \&& curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \&& curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.listsudo apt-get updatesudo apt-get install -y nvidia-docker2# 3.安裝docker-compose(apt常常不能安裝最新版本的docker-compose)pip install docker-compose# 4.解決linux下docker的權(quán)限問(wèn)題,將用戶(hù)放在docker組里GROUPNAME=dockergetent group $GROUPNAME 2>&1 >/dev/null || groupadd $GROUPNAMEsudo usermod -aG docker $(whoami)# 5.重啟sudo systemctl daemon-reloadsudo systemctl restart docker

        使用Docker鏡像

        Docker鏡像構(gòu)建好之后,可以直接運(yùn)行docker命令啟動(dòng)鏡像,但是這樣不是最方便的。使用docker-compose搭配Makefile,具體操作如下:首先寫(xiě)好docker-compose.yml啟動(dòng)文件,可參考本項(xiàng)目對(duì)應(yīng)的docker-compose.yml,接著,在Makefile里寫(xiě)常見(jiàn)docker相關(guān)命令,我們將應(yīng)用分為啟動(dòng)(up)、關(guān)閉(down)、進(jìn)入容器環(huán)境(in)三個(gè)需求,Makefile如下:

        up: docker-compose up -ddown: docker-compose downin: docker-compose exec spherical-env bash

        本項(xiàng)目鏡像已上傳dockerhub,可以直接使用下列命令下載

        docker pull qiangzibro/spherical_image_segmentation# 或者使用下面命令自己編譯make build

        接著,一鍵完成編譯、啟動(dòng)

        make up #等價(jià)于 docker-compose up -d

        再通過(guò)下列命令便可以進(jìn)入終端

        make in

        使用docker-compose logs可以看到notebook對(duì)應(yīng)的網(wǎng)址

        2. 數(shù)據(jù)獲取

        使用2D-3D-S 數(shù)據(jù)集進(jìn)行本實(shí)驗(yàn),該數(shù)據(jù)集提供了來(lái)自 2D、2.5D 和 3D 域的各種相互注冊(cè)的數(shù)據(jù),以及實(shí)例級(jí)語(yǔ)義和幾何注釋。它收集在來(lái)自 3 座不同建筑的 6 個(gè)大型室內(nèi)區(qū)域。它包含超過(guò) 70,000 張 RGB 圖像,以及相應(yīng)的深度、表面法線、語(yǔ)義注釋、全局 XYZ 圖像(均以常規(guī)和 360° 等距柱狀圖圖像的形式)以及相機(jī)信息。它還包括注冊(cè)的原始和語(yǔ)義注釋 3D 網(wǎng)格和點(diǎn)云。

        數(shù)據(jù)集從開(kāi)源數(shù)據(jù)集網(wǎng)站格物鈦獲取,這個(gè)網(wǎng)站匯總了AI開(kāi)發(fā)者常見(jiàn)的公開(kāi)數(shù)據(jù)集,用戶(hù)可以對(duì)數(shù)據(jù)集進(jìn)行可視化預(yù)覽、在線使用和下載等操作。

        這里我們不用下載,可以直接通過(guò)SDK讀取數(shù)據(jù)集,操作步驟如下:a. 打開(kāi)本文對(duì)應(yīng)數(shù)據(jù)集鏈接 https://gas.graviti.cn/dataset/qiangzibro/spherical_segmentationb. 右上角注冊(cè)登錄

        c. fork數(shù)據(jù)集

        d. 點(diǎn)擊網(wǎng)頁(yè)上方開(kāi)發(fā)者工具,獲取使用SDK所需的AccessKey,獲取到 AccessKey 后,將其存在項(xiàng)目根目錄的gas_key.py里。

        KEY = "<Your-Key>"

        然后即可以通過(guò)AccessKey可以上傳數(shù)據(jù)、讀取數(shù)據(jù)、使用數(shù)據(jù),靈活對(duì)接模型開(kāi)發(fā)和訓(xùn)練,與數(shù)據(jù)pipeline快速集成。

        e. AccessKey寫(xiě)入后就可以寫(xiě)代碼讀取數(shù)據(jù)了。

        from PIL import Imagedataset = Dataset("DatasetName", gas)segment = dataset[0]for data in segment:   with data.open() as fp:       image = Image.open(fp)       width, height = image.size       image.show()

        3. 方法

        使用多種二維CNN方法和球面卷積方法UGSCNN。其中,二維CNN有三種:UNet、ResNet和FCN;UGSCNN[3]參考自論文《Spherical CNNs on Unstructured Grids》,下面著重看一下UGSCNN的方法。MeshConv對(duì)卷積算子進(jìn)行定義:

        class MeshConv(_MeshConv):    def __init__(self, in_channels, out_channels, mesh_file, stride=1, bias=True):        super(MeshConv, self).__init__(in_channels, out_channels, mesh_file, stride, bias)        pkl = self.pkl        if stride == 2:            self.nv_prev = pkl['nv_prev']            L = sparse2tensor(pkl['L'].tocsr()[:self.nv_prev].tocoo()) # laplacian matrix V->V            F2V = sparse2tensor(pkl['F2V'].tocsr()[:self.nv_prev].tocoo())  # F->V, #V x #F        else: # stride == 1            self.nv_prev = pkl['V'].shape[0]            L = sparse2tensor(pkl['L'].tocoo())            F2V = sparse2tensor(pkl['F2V'].tocoo())        self.register_buffer("L", L)        self.register_buffer("F2V", F2V)            def forward(self, input):        # compute gradient        grad_face = spmatmul(input, self.G)        grad_face = grad_face.view(*(input.size()[:2]), 3, -1).permute(0, 1, 3, 2) # gradient, 3 component per face        laplacian = spmatmul(input, self.L)        identity = input[..., :self.nv_prev]        grad_face_ew = torch.sum(torch.mul(grad_face, self.EW), keepdim=False, dim=-1)        grad_face_ns = torch.sum(torch.mul(grad_face, self.NS), keepdim=False, dim=-1)        grad_vert_ew = spmatmul(grad_face_ew, self.F2V)        grad_vert_ns = spmatmul(grad_face_ns, self.F2V)        feat = [identity, laplacian, grad_vert_ew, grad_vert_ns]        out = torch.stack(feat, dim=-1)        out = torch.sum(torch.sum(torch.mul(out.unsqueeze(1), self.coeffs.unsqueeze(2)), dim=2), dim=-1)        out += self.bias.unsqueeze(-1)        return out

        分割網(wǎng)絡(luò)基于MeshConv算子構(gòu)建了一個(gè)Unet網(wǎng)絡(luò):

        4. 訓(xùn)練

        環(huán)境構(gòu)建好后只需簡(jiǎn)單的幾個(gè)命令便可以運(yùn)行起來(lái)

        再使用make in成功進(jìn)入到容器終端

        • 基于CNN對(duì)網(wǎng)格進(jìn)行分割
        cd cnns# 基于./run.sh UNet# 基于FCN./run.sh FCN8s# 基于ResNetDUCHDC./run.sh ResNetDUCHDC

        腳本run.sh解釋

        # Model choice# ResNetDUCHDC,FCN8s,UNet# Run example# 1) ./run.sh# 2) ./run.sh FCN8s# 3) ./run.sh ResNetDUCHDCmodel="${1:-UNet}"MESHFILES=../data/mesh_filesDATADIR=../data/2d3ds_pano_small/# create log directorymkdir -p logspython train.py \--batch-size 16 \ # 訓(xùn)練批量大小--test-batch-size 16 \ #測(cè)試批量大小--epochs 200 \ # 訓(xùn)練epoch數(shù)量--data_folder $DATADIR \--mesh_folder $MESHFILES \ # 正二十面體網(wǎng)格文件位置--fold 3 \ # K-fold交叉驗(yàn)證,k=3。將原始數(shù)據(jù)分成K組(K-Fold),將每個(gè)子集數(shù)據(jù)分別做一次驗(yàn)證集,其余的K-1組子集數(shù)據(jù)作為訓(xùn)練集,這樣會(huì)得到K個(gè)模型。這K個(gè)模型分別在驗(yàn)證集中評(píng)估結(jié)果,最后的誤差MSE(Mean Squared Error)加和平均就得到交叉驗(yàn)證誤差。交叉驗(yàn)證有效利用了有限的數(shù)據(jù),并且評(píng)估結(jié)果能夠盡可能接近模型在測(cè)試集上的表現(xiàn),可以做為模型優(yōu)化的指標(biāo)使用。--log_dir logs/log_${model}_f16_cv3_rgbd \ # 日志目錄--decay \ # 學(xué)習(xí)率衰減--train_stats_freq 5 \--model ${model} \ #模型選擇--in_ch rgbd \ # 輸入數(shù)據(jù)通道--lr 1e-3 \ # 學(xué)習(xí)路--feat 16 #特征層的數(shù)量

        基于UGSCNN對(duì)球面數(shù)據(jù)進(jìn)行分割

        cd ugscnn./run.sh

        訓(xùn)練200個(gè)epoch后,可得如下結(jié)果:

        5. 測(cè)試

        使用提供的測(cè)試腳本test.sh即可進(jìn)行測(cè)試

        # 基于UNet./test.sh UNet# 基于FCN./test.sh FCN8s# 基于ResNetDUCHDC./test.sh ResNetDUCHDC

        測(cè)試結(jié)果保存在當(dāng)前目錄下,命名格式為模型名+.npz,將其打開(kāi)進(jìn)行結(jié)果分析,如下所示。全景圖實(shí)例:

        結(jié)果:

        總結(jié)

        本文介紹了docker作為環(huán)境構(gòu)建的知識(shí),介紹幾種基于傳統(tǒng)CNN方法和一種基于球面CNN的方法,并將上述方法在全景數(shù)據(jù)集上完成了分割任務(wù)。數(shù)據(jù)集地址(代碼上傳在數(shù)據(jù)集討論區(qū)):https://gas.graviti.cn/dataset/datawhale/SphericalSegmentation

        參考資料

        [ 1 ] : https://www.bilibili.com/video/BV1NT4y1w7cy?from=search&seid=10079355191633664125
        [ 2 ] : https://mp.weixin.qq.com/s/RZqa9aNgK--7pnkJHV1cAw
        [ 3 ] : https://www.graviti.cn/
        [ 4 ] : https://github.com/maxjiang93/ugscnn/

        如果覺(jué)得有用,就請(qǐng)分享到朋友圈吧!

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

        公眾號(hào)后臺(tái)回復(fù)“CVPR21檢測(cè)”獲取CVPR2021目標(biāo)檢測(cè)論文下載~


        極市干貨
        神經(jīng)網(wǎng)絡(luò):視覺(jué)神經(jīng)網(wǎng)絡(luò)模型優(yōu)秀開(kāi)源工作:timm庫(kù)使用方法和最新代碼解讀
        技術(shù)綜述:綜述:神經(jīng)網(wǎng)絡(luò)中 Normalization 的發(fā)展歷程CNN輕量化模型及其設(shè)計(jì)原則綜述
        算法技巧(trick):8點(diǎn)PyTorch提速技巧匯總圖像分類(lèi)算法優(yōu)化技巧


        CV技術(shù)社群邀請(qǐng)函 #

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

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


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


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



        覺(jué)得有用麻煩給個(gè)在看啦~  


        瀏覽 85
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        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>
            不卡中文字幕 | 日韩一级无码毛片 | 日韩中文字幕网站 | 国产黄a三级三级三级 | A日本免费 | 老师张开让我了一夜av | AV午夜剧场 | 成人黄色电影在线观看 | 97青娱乐 | 操巨乳 |