日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

MinkowskiEngine demo ModelNet40分类

發(fā)布時(shí)間:2023/11/28 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MinkowskiEngine demo ModelNet40分类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

MinkowskiEngine demo ModelNet40分類
本文將看一個(gè)簡單的演示示例,該示例訓(xùn)練用于分類的3D卷積神經(jīng)網(wǎng)絡(luò)。輸入是稀疏張量,卷積也定義在稀疏張量上。該網(wǎng)絡(luò)是以下體系結(jié)構(gòu)的擴(kuò)展,但具有剩余的塊和更多的層。

創(chuàng)建ModelNet40數(shù)據(jù)加載器
首先,需要創(chuàng)建一個(gè)數(shù)據(jù)加載器,以返回網(wǎng)格的稀疏張量表示。如果僅使用頂點(diǎn),則3D模型的網(wǎng)格表示可能會稀疏。
首先以相同的密度采樣點(diǎn)。
def resample_mesh(mesh_cad, density=1):
‘’’
https://chrischoy.github.io/research/barycentric-coordinate-for-mesh-sampling/
Samples point cloud on the surface of the model defined as vectices and
faces. This function uses vectorized operations so fast at the cost of some
memory.

param mesh_cad: low-polygon triangle mesh in o3d.geometry.TriangleMesh
param density: density of the point cloud per unit area
param return_numpy: return numpy format or open3d pointcloud format
return resampled point cloudReference :[1] Barycentric coordinate system\begin{align}P = (1 - \sqrt{r_1})A + \sqrt{r_1} (1 - r_2) B + \sqrt{r_1} r_2 C\end{align}
'''
faces = np.array(mesh_cad.triangles).astype(int)
vertices = np.array(mesh_cad.vertices)vec_cross = np.cross(vertices[faces[:, 0], :] - vertices[faces[:, 2], :],vertices[faces[:, 1], :] - vertices[faces[:, 2], :])
face_areas = np.sqrt(np.sum(vec_cross**2, 1))n_samples = (np.sum(face_areas) * density).astype(int)n_samples_per_face = np.ceil(density * face_areas).astype(int)
floor_num = np.sum(n_samples_per_face) - n_samples
if floor_num > 0:indices = np.where(n_samples_per_face > 0)[0]floor_indices = np.random.choice(indices, floor_num, replace=True)n_samples_per_face[floor_indices] -= 1n_samples = np.sum(n_samples_per_face)# Create a vector that contains the face indices
sample_face_idx = np.zeros((n_samples,), dtype=int)
acc = 0
for face_idx, _n_sample in enumerate(n_samples_per_face):sample_face_idx[acc:acc + _n_sample] = face_idxacc += _n_sampler = np.random.rand(n_samples, 2)
A = vertices[faces[sample_face_idx, 0], :]
B = vertices[faces[sample_face_idx, 1], :]
C = vertices[faces[sample_face_idx, 2], :]P = (1 - np.sqrt(r[:, 0:1])) * A + \np.sqrt(r[:, 0:1]) * (1 - r[:, 1:]) * B + \np.sqrt(r[:, 0:1]) * r[:, 1:] * Creturn P

上面的函數(shù)將以相同的密度對網(wǎng)格上的點(diǎn)進(jìn)行采樣。接下來,在量化步驟之前經(jīng)歷了一系列數(shù)據(jù)擴(kuò)充步驟。
數(shù)據(jù)擴(kuò)充
稀疏張量由兩個(gè)部分組成:1)坐標(biāo)和2)與這些坐標(biāo)關(guān)聯(lián)的特征。必須對這兩個(gè)組件都應(yīng)用數(shù)據(jù)增強(qiáng),以最大化固定數(shù)據(jù)集的效用,并使網(wǎng)絡(luò)對噪聲具有魯棒性。
這在圖像數(shù)據(jù)增強(qiáng)中并不是什么新鮮事。對圖像應(yīng)用隨機(jī)平移,剪切,縮放,所有這些都是坐標(biāo)數(shù)據(jù)擴(kuò)充。顏色失真(例如色平移,顏色通道上的高斯噪聲,色相飽和度增強(qiáng))都具有數(shù)據(jù)增強(qiáng)功能。
由于在ModelNet40數(shù)據(jù)集中只有坐標(biāo)作為數(shù)據(jù),將僅應(yīng)用坐標(biāo)數(shù)據(jù)增強(qiáng)。
class RandomRotation:

def _M(self, axis, theta):return expm(np.cross(np.eye(3), axis / norm(axis) * theta))def __call__(self, coords, feats):R = self._M(np.random.rand(3) - 0.5, 2 * np.pi * (np.random.rand(1) - 0.5))return coords @ R, feats

class RandomScale:

def __init__(self, min, max):self.scale = max - minself.bias = mindef __call__(self, coords, feats):s = self.scale * np.random.rand(1) + self.biasreturn coords * s, feats

class RandomShear:

def __call__(self, coords, feats):T = np.eye(3) + np.random.randn(3, 3)return coords @ T, feats

class RandomTranslation:

def __call__(self, coords, feats):trans = 0.05 * np.random.randn(1, 3)return coords + trans, feats

訓(xùn)練ResNet進(jìn)行ModelNet40分類
主要訓(xùn)練功能很簡單。沒有使用基于時(shí)間的訓(xùn)練,而是使用了基于迭代的訓(xùn)練。與基于時(shí)間的訓(xùn)練相比,基于迭代的訓(xùn)練的一個(gè)優(yōu)勢在于,訓(xùn)練邏輯獨(dú)立于批處理大小。
def train(net, device, config):
optimizer = optim.SGD(
net.parameters(),
lr=config.lr,
momentum=config.momentum,
weight_decay=config.weight_decay)
scheduler = optim.lr_scheduler.ExponentialLR(optimizer, 0.95)

crit = torch.nn.CrossEntropyLoss()

net.train()
train_iter = iter(train_dataloader)
val_iter = iter(val_dataloader)
logging.info(f'LR: {scheduler.get_lr()}')
for i in range(curr_iter, config.max_iter):s = time()data_dict = train_iter.next()d = time() - soptimizer.zero_grad()sin = ME.SparseTensor(data_dict['feats'],data_dict['coords'].int()).to(device)sout = net(sin)loss = crit(sout.F, data_dict['labels'].to(device))loss.backward()optimizer.step()t = time() - s...

運(yùn)行示例
集成所有代碼塊時(shí),可以運(yùn)行自主ModelNet40分類網(wǎng)絡(luò)。
python -m examples.modelnet40 --batch_size 128 --stat_freq 100
完整的代碼可以在example / modelnet40.py找到。
https://github.com/NVIDIA/MinkowskiEngine/blob/master/examples/modelnet40.py
警告
ModelNet40數(shù)據(jù)加載和體素化是訓(xùn)練中最耗時(shí)的部分。因此,該示例將所有ModelNet40數(shù)據(jù)緩存到內(nèi)存中,這將占用大約10G的內(nèi)存。

總結(jié)

以上是生活随笔為你收集整理的MinkowskiEngine demo ModelNet40分类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。