国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MMDet3D——數(shù)據(jù)增強(qiáng)Pipline‘GlobalRotScaleTrans‘和‘RandomFlip3D‘的Pytorch逆變換實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了MMDet3D——數(shù)據(jù)增強(qiáng)Pipline‘GlobalRotScaleTrans‘和‘RandomFlip3D‘的Pytorch逆變換實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

在點(diǎn)云的3D感知算法中,常用RandomFlip3DGlobalRotScaleTrans的數(shù)據(jù)增強(qiáng)方式,這兩個(gè)可以有效地增強(qiáng)模型的魯棒性,提升模型的性能。

		transforms=[
            dict(
                type='RandomFlip3D',
                sync_2d=False,
                flip_ratio_bev_horizontal=0.5,
                flip_ratio_bev_vertical=0.5),
            dict(
                type='GlobalRotScaleTrans',
                rot_range=[-0.78539816, 0.78539816],
                scale_ratio_range=[0.95, 1.05]),

而本文的出發(fā)點(diǎn)在于當(dāng)我們同時(shí)對(duì)相同的data使用了多種不同的隨機(jī)增強(qiáng)方式時(shí),當(dāng)我們需要在模型中將不同增強(qiáng)方法下的Feature map或者GT 3D Box進(jìn)行對(duì)齊時(shí),就需要涉及到逆變換。
尤其適用于半監(jiān)督等同時(shí)有l(wèi)abel和unlabel data的代碼。

簡(jiǎn)單粗暴,我們直接上代碼,注釋直接寫在代碼中:(代碼可以直接copy使用)

	def align_aug_dataV2(self, pts_feats, # 可以是feature map, shape為 [B,C,H,W]
                         gt_bboxes_3d,# Nuscenes默認(rèn)的LidarBox格式, shape為 [B,N,x], x=7或9,有無(wú)速度的區(qū)別
                         img_metas,
                         return_tensor=True,			# 如果想返回的pts_feats是tensor形式,默認(rèn)True
                         interploate_mode='bilinear'):	# grid_sample的插值方式,如果是feat map,建議bilinear
        '''
        目前的box.tensor的格式為[x, y, z, x_size, y_size, z_size, yaw, vx, vy],shape為[N, 9]
        所以對(duì)gt_box做flip需要分別處理x,y,yaw和vx,vy
        '''
        # feature_map: [B,C,H,W]
        def horizontal_flip(feature_map):# 水平翻轉(zhuǎn)
            return torch.flip(feature_map, [2])
        def vertical_flip(feature_map):# 垂直翻轉(zhuǎn)
            return torch.flip(feature_map, [1])
        def box_flip(boxes, bev_direction='horizontal'):
            assert bev_direction in ('horizontal', 'vertical')
            if bev_direction == 'horizontal':
                boxes.tensor[:, 1] = -boxes.tensor[:, 1]    # y
                boxes.tensor[:, 6] = -boxes.tensor[:, 6] + np.pi 
                boxes.tensor[:, 7] = boxes.tensor[:, 7]    # vx
                boxes.tensor[:, 8] = -boxes.tensor[:, 8]    # vy
            elif bev_direction == 'vertical':
                boxes.tensor[:, 0] = -boxes.tensor[:, 0]    # x
                boxes.tensor[:, 6] = -boxes.tensor[:, 6]
                boxes.tensor[:, 7] = -boxes.tensor[:, 7]    # vx
                boxes.tensor[:, 8] = boxes.tensor[:, 8]    # vy
            return boxes
        aligned_pts_feats = []
        aligned_gt_bboxes_3d = deepcopy(gt_bboxes_3d)
        for idx, (pts_feat, boxes_3d, img_meta) in enumerate(
            zip(pts_feats, aligned_gt_bboxes_3d, img_metas)):
            # 數(shù)據(jù)增強(qiáng)Pipline處理時(shí)aug順序: RandomFlip3D, GlobalRotScaleTrans(rot, scale, trans)
            # 逆變換align順序需要倒過來(lái)
            # ----------------------------------------------------
            pts_feat = pts_feat.unsqueeze(0)
            tgt_size = pts_feat.shape
            dev = pts_feat.device
            # GlobalRotScaleTrans
            if 'pcd_trans' in img_meta:
                if not (img_meta['pcd_trans'] == 0.).all():
                	# assert (img_meta['pcd_trans'] == 0.).all(), \
                #     "Translation is not allowed in `GlobalRotScaleTrans`, [0.,0.,0.] only."
                if not (img_meta['pcd_trans'] == 0.).all():
                    # 1. feat map
                    Trans = torch.zeros_like(img_meta['pcd_rotation'].T)    # [3,3]
                    Trans[0,0], Trans[1,1] = 1, 1
                    # 需要?dú)w一化`pcd_trans`,默認(rèn)的`pcd_trans`為pc_range范圍的參數(shù)
                    w, h = self.bbox_coder.pc_range
                    w, h = abs(w*2), abs(h*2)
                    Trans[0,2], Trans[1,2] = img_meta['pcd_trans'][0]/w, \
                                             img_meta['pcd_trans'][1]/h
                    
                    Trans = Trans[:2,:].unsqueeze(0)        # [B,2,3]
                    grid = F.affine_grid(Trans, tgt_size).to(dev)   # # 仿射變換矩陣
                    pts_feat = F.grid_sample(pts_feat, # 輸入tensor,shape為[B,C,W,H]
                                        grid, # 上一步輸出的gird,shape為[B,C,W,H]
                                        mode=interploate_mode)
                    # 2. gt_boxes
                    boxes_3d.translate(-img_meta['pcd_trans'])
            
            if 'pcd_scale_factor' in img_meta:
                if img_meta['pcd_scale_factor'] != 1.:
                    # 1. feat map
                    Scl = torch.zeros_like(img_meta['pcd_rotation'].T)    # [3,3]
                    Scl[0,0], Scl[1,1] = 1/img_meta['pcd_scale_factor'], 1/img_meta['pcd_scale_factor']
                    Scl = Scl[:2,:].unsqueeze(0)        # [B,2,3]
                    grid = F.affine_grid(Scl, tgt_size).to(dev)   # # 仿射變換矩陣
                    pts_feat = F.grid_sample(pts_feat, # 輸入tensor,shape為[B,C,W,H]
                                        grid, # 上一步輸出的gird,shape為[B,C,W,H]
                                        mode=interploate_mode)
                    # 2. gt_boxes
                    boxes_3d.scale(1/img_meta['pcd_scale_factor'])
                    
            if 'pcd_rotation' in img_meta:
                if img_meta['pcd_rotation'][0,0] != 1.:
                    # 1. feat map
                    Rot = img_meta['pcd_rotation'].T    # [3,3]
                    Rot = Rot[:2,:].unsqueeze(0)        # [B,2,3]
                    grid = F.affine_grid(Rot, tgt_size).to(dev)   # # 仿射變換矩陣
                    pts_feat = F.grid_sample(pts_feat, # 輸入tensor,shape為[B,C,W,H]
                                        grid, # 上一步輸出的gird,shape為[B,C,W,H]
                                        mode=interploate_mode)
                    # 2. gt_boxes
                    boxes_3d.rotate(img_meta['pcd_rotation'].T)
            pts_feat = pts_feat[0]
            
            # ----------------------------------------------------
            # RandomFlip3D
            if 'pcd_vertical_flip' in img_meta:
                if img_meta['pcd_vertical_flip']:
                    # 1. feat map
                    pts_feat = vertical_flip(pts_feat)
                    # 2. gt_boxes
                    boxes_3d = box_flip(boxes_3d, bev_direction='vertical')

            if 'pcd_horizontal_flip' in img_meta:
                if img_meta['pcd_horizontal_flip']:
                    # 1. feat map
                    pts_feat = horizontal_flip(pts_feat)
                    # 2. gt_boxes
                    # boxes_3d.flip(bev_direction='horizontal')
                    boxes_3d = box_flip(boxes_3d, bev_direction='horizontal')
                    
            aligned_pts_feats.append(pts_feat)
            aligned_gt_bboxes_3d[idx] = boxes_3d
        if return_tensor:
            aligned_pts_feats = torch.stack(aligned_pts_feats)

        return aligned_pts_feats, aligned_gt_bboxes_3d

有幾點(diǎn)需要注意:

  • feat map在經(jīng)過Flip之后也不全是一一對(duì)應(yīng),因?yàn)樵诰矸e過程中,翻轉(zhuǎn)后對(duì)應(yīng)的位置不同,所以feat在經(jīng)過翻轉(zhuǎn)變換之后略有不同是正?,F(xiàn)象;
  • yaw角差360°(2*3.14)是正常情況,因?yàn)檗D(zhuǎn)換成cos和sin后數(shù)值相同。

測(cè)試效果

測(cè)試一下把有aug的feat map和GT都 對(duì)齊到?jīng)]有aug的情況下:

# 測(cè)試代碼: (1-3應(yīng)當(dāng)相同)
# 1.aligned_aug     aligned_gt_bboxes_3d[0].tensor[0]
# 2.aligned_aug     aligned_gt_bboxes_3d[4].tensor[0]
# 3.無(wú)aug           gt_bboxes_3d[4].tensor[0]
# 4.有aug           gt_bboxes_3d[0].tensor[0]
  • 加上RandomFlip3D:(標(biāo)紅的為有aug的原始值
    MMDet3D——數(shù)據(jù)增強(qiáng)Pipline‘GlobalRotScaleTrans‘和‘RandomFlip3D‘的Pytorch逆變換實(shí)現(xiàn)

  • 加上RandomFlip3DScale
    MMDet3D——數(shù)據(jù)增強(qiáng)Pipline‘GlobalRotScaleTrans‘和‘RandomFlip3D‘的Pytorch逆變換實(shí)現(xiàn)

  • 加上RandomFlip3DRotate
    MMDet3D——數(shù)據(jù)增強(qiáng)Pipline‘GlobalRotScaleTrans‘和‘RandomFlip3D‘的Pytorch逆變換實(shí)現(xiàn)

  • 只有Translation的結(jié)果:
    MMDet3D——數(shù)據(jù)增強(qiáng)Pipline‘GlobalRotScaleTrans‘和‘RandomFlip3D‘的Pytorch逆變換實(shí)現(xiàn)

  • 加上RandomFlip3DGlobalRotScaleTrans所有aug的對(duì)齊結(jié)果:
    MMDet3D——數(shù)據(jù)增強(qiáng)Pipline‘GlobalRotScaleTrans‘和‘RandomFlip3D‘的Pytorch逆變換實(shí)現(xiàn)

參考文章:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-472501.html

  • Pytorch——實(shí)現(xiàn)Tensor矩陣的任意角度旋轉(zhuǎn)、平移操作
  • Pytorch中實(shí)現(xiàn)矩陣的的仿射變換,平移、旋轉(zhuǎn)、放縮(affine_grid)

到了這里,關(guān)于MMDet3D——數(shù)據(jù)增強(qiáng)Pipline‘GlobalRotScaleTrans‘和‘RandomFlip3D‘的Pytorch逆變換實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • mmdet.structures.DetDataSample 數(shù)據(jù)結(jié)構(gòu)解析

    mmdet.structures.DetDataSample 數(shù)據(jù)結(jié)構(gòu)解析

    官方文檔??https://mmdetection.readthedocs.io/zh-cn/latest/api.html#mmdet-structures ``gt_instances``(InstanceData): Ground truth of instance annotations. 標(biāo)注的數(shù)據(jù) ``pred_instances``(InstanceData): Instances of detection predictions. 預(yù)測(cè)的數(shù)據(jù) ``ignored_instances``(InstanceData): Instances to be ignored during?training/testing. 訓(xùn)練或測(cè)試

    2024年01月20日
    瀏覽(35)
  • Blender增強(qiáng)現(xiàn)實(shí)3D模型制作指南【AR】

    Blender增強(qiáng)現(xiàn)實(shí)3D模型制作指南【AR】

    推薦:用 NSDT編輯器 快速搭建可編程3D場(chǎng)景 將靜態(tài)和動(dòng)畫 3D 內(nèi)容集成到移動(dòng)增強(qiáng)現(xiàn)實(shí) (AR) 體驗(yàn)中是增強(qiáng)用戶沉浸感和參與度的高效方法。 然而,為 AR 創(chuàng)建 3D 對(duì)象可能相當(dāng)艱巨,尤其是對(duì)于那些缺乏 3D 建模經(jīng)驗(yàn)的人來(lái)說(shuō)。 與添加視頻或照片 AR 圖層不同,生成 3D 對(duì)象需要技

    2024年02月12日
    瀏覽(18)
  • 電商增強(qiáng)現(xiàn)實(shí)3D模型優(yōu)化需要關(guān)注的4個(gè)方面

    電商增強(qiáng)現(xiàn)實(shí)3D模型優(yōu)化需要關(guān)注的4個(gè)方面

    到目前為止,AR技術(shù)已經(jīng)發(fā)展到足以在更廣泛的范圍內(nèi)實(shí)施。 在電子商務(wù)中,這項(xiàng)技術(shù)有望提供更令人興奮的購(gòu)物體驗(yàn)。 為了實(shí)現(xiàn)這一目標(biāo),在這篇博客中,我將介紹如何針對(duì)電子商務(wù)中的 AR 優(yōu)化 3D 模型。 推薦:用 NSDT編輯器 快速搭建可編程3D場(chǎng)景。 未來(lái)是高度未知的,部

    2024年02月12日
    瀏覽(21)
  • 線上3d黨史展覽館增強(qiáng)了觀眾的民族自信力

    線上3d黨史展覽館增強(qiáng)了觀眾的民族自信力

    民族的歷史文化是增強(qiáng)民族自信的重要基礎(chǔ),美術(shù)展覽館自然成為第一批文化溯源的基礎(chǔ),web3d開發(fā)公司利用數(shù)字化web3d開發(fā)技術(shù),制作了3D虛擬美術(shù)展覽館,為藝術(shù)家和觀眾創(chuàng)造更逼真、沉浸式的藝術(shù)體驗(yàn),成為一座連接藝術(shù)家和觀眾的橋梁,推動(dòng)藝術(shù)的交流和互動(dòng)、傳承與

    2024年02月03日
    瀏覽(13)
  • 基于深度學(xué)習(xí)的3D城市模型增強(qiáng)【Mask R-CNN】

    基于深度學(xué)習(xí)的3D城市模型增強(qiáng)【Mask R-CNN】

    在這篇文章中,我們描述了一個(gè)為阿姆斯特丹 3D 城市模型自動(dòng)添加門窗的系統(tǒng)(可以在這里訪問)。 計(jì)算機(jī)視覺用于從城市全景圖像中提取有關(guān)門窗位置的信息。 由于這種類型的街道級(jí)圖像廣泛可用,因此該方法可用于較大的地理區(qū)域。 推薦:用 NSDT編輯器 快速搭建可編程

    2024年02月13日
    瀏覽(19)
  • 51-32 CVPR’24 | 3DSFLabelling,通過偽自動(dòng)標(biāo)注增強(qiáng) 3D 場(chǎng)景流估計(jì)

    24 年 2 月,鑒智機(jī)器人、劍橋大學(xué)和上海交通大學(xué)聯(lián)合發(fā)布CVPR\\\'24工作,3DSFLabelling: Boosting 3D Scene Flow Estimation by Pseudo Auto-labelling。 提出?3D 場(chǎng)景自動(dòng)標(biāo)注新框架,將 3D 點(diǎn)云打包成具有不同運(yùn)動(dòng)屬性的 Boxes,通過優(yōu)化每個(gè) Box 運(yùn)動(dòng)參數(shù)并將源點(diǎn)云 Warp 扭曲到目標(biāo)點(diǎn)云中,創(chuàng)建了

    2024年04月09日
    瀏覽(23)
  • 【Unity 3D】使用EasyAR實(shí)現(xiàn)單圖識(shí)別的AR增強(qiáng)現(xiàn)實(shí)功能(附實(shí)現(xiàn)步驟)

    【Unity 3D】使用EasyAR實(shí)現(xiàn)單圖識(shí)別的AR增強(qiáng)現(xiàn)實(shí)功能(附實(shí)現(xiàn)步驟)

    接下來(lái)使用AR插件制作案例 EasyAR是免費(fèi) 好用的全平臺(tái)AR引擎,支持使用平面目標(biāo)的AR 支持1000以上本地目標(biāo)的流暢加載和識(shí)別,支持基于硬解碼的視頻的播放,支持二維碼識(shí)別、支持多目標(biāo)同時(shí)跟蹤,支持PC和移動(dòng)設(shè)備等多個(gè)平臺(tái),EasyAR不會(huì)現(xiàn)實(shí)水印,也沒有識(shí)別次數(shù)限制 在拿

    2024年02月06日
    瀏覽(23)
  • Jenkins-Pipline實(shí)現(xiàn)原理

    本文僅探討jenkins pipline 的原理,是流水線的一個(gè)demo版本實(shí)現(xiàn),不能代表Jenkins pipline的具體實(shí)現(xiàn),僅供參考。 Jenkinsfile流水線是Jenkins CI/CD工具中用來(lái)定義、構(gòu)建和管理軟件交付流程的一種聲明式文件。 它允許將整個(gè)軟件交付流程以代碼的形式進(jìn)行描述,從而實(shí)現(xiàn)對(duì)軟件交付過

    2024年02月15日
    瀏覽(17)
  • jenkins pipline 拉取git歷史版本

    jenkins pipline 拉取git歷史版本

    我的理解是:我們每次提交git的時(shí)候,除了保存我們修改的代碼外,也緩存了之前提交的代碼,可以用于我們查看更新的內(nèi)容,而Commit ID 就是為了識(shí)別這些歷史的提交版本 我這里只展示了一個(gè)關(guān)于 git 版本的字符信息,也是本文最重要的一個(gè),其他都不是必要的 其他的我設(shè)

    2024年02月06日
    瀏覽(22)
  • jenkins構(gòu)建pipline無(wú)法執(zhí)行shell命令原因

    jenkins構(gòu)建pipline無(wú)法執(zhí)行shell命令原因

    新的服務(wù)器上,新安裝的jenkins,在上面創(chuàng)建了一個(gè)pipline項(xiàng)目,腳本里有shell命令,但是jenkins每次執(zhí)行都卡住,經(jīng)過嘗試, 無(wú)論多簡(jiǎn)單的命令都執(zhí)行不了 ,cp,mv等都不行,只有echo能執(zhí)行。 以為是服務(wù)器問題,于是刪除該虛擬機(jī)重裝。 重新把環(huán)境安裝好,再把一模一樣的p

    2024年02月16日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包