英特尔“oneAPI人工智能黑客松”大赛——图像三维重建
文章目录前言一、三维重建是什么?二、3D-R2N2模型三、PyTorch和Intel拓展四、算法学习1.模型定义2.环境搭建:2.图像转换:总结前言如果要评选2023年到目前为止最热门的话题榜,相信AI人工智能一定榜上有名。从文字、图片、甚至视频,AI都能快速生成足以以假乱真的内容,也引发了越来越多人的关注和讨论。
从网上各种声音的变化可以明显看出,大家的心态也从一开始的好奇和好玩,逐渐变成了对AI生成内容真实度的感叹,陆续也开始有了担心被AI替代的焦虑。学无止境,言归正传。本次我计划借助英特尔黑客松大赛,学习一下关于图像的相关算法。
因为平时工作使用3dmax比较多,这次想用intel工具实现图像的三维重建。
一、三维重建是什么?三维重建是指用相机等传感器拍摄真实世界的物体、场景,并通过计算机视觉技术进行处理,从而得到物体的三维模型。涉及的主要技术有:多视图立体几何、深度图估计、点云处理、网格重建和优化、纹理贴图、马尔科夫随机场、图割等。三维重建是增强现实(AR)、混合现实(MR)、机器人导航、自动驾驶等领域的核心技术之一。
二、3D-R2N2模型3D-R2N2模型是一种新颖的循环神经网络体系结构,用于实现鲁棒的三维重建。该模型建立在标准LSTM和GR|U的基础上,并由三个部分组成:二维卷积神经网络(2D-CNN)、新型结构3D卷积LSTM(3D-LSTM)和三维反卷积神经网络(3D-DCNN)。3D-R2N2模型的目标是同时执行单视图和多视图3D重建,其主要思想是利用LSTM的能力来保留先前的观测值,并随着更多观测值的增加而逐渐细化输出重建。
三、PyTorch和Intel拓展PyTorch是一个基于Python的开源机器学习库,用于自然语言处理等应用程序。它主要由Facebook的人工智能小组开发,不仅能够实现强大的GPU加速,同时还支持动态神经网络。PyTorch提供了两个高级功能:具有强大的GPU加速的张量计算(如Numpy)和包含自动求导系统的深度神经网络。
IntelPyTorch是一个基于PyTorch的扩展库,用于在Intel处理器上加速机器学习任务。通过使用IntelPyTorch,可以充分利用Intel处理器的并行处理能力和优化指令,从而提高机器学习模型的训练和推理速度。此外,IntelPyTorch还提供了一些高级功能,如混合精度训练和自动微分,以帮助用户更快速地训练大型模型并获得更好的性能。
四、算法学习1.模型定义定义3D-R2N2模型。模型的定义比较复杂,因此在这里我们实现一个简化的版本:
importtorchimporttorch.nnasnnclassSimple3DR2N2(nn.Module):def__init__(self):super(Simple3DR2N2,self).__init__()self.conv1=nn.Conv2d(3,64,kernel_size=7,stride=2,padding=3)self.pool1=nn.MaxPool2d(kernel_size=2,stride=2)self.conv2=nn.Conv2d(64,128,kernel_size=5,stride=2,padding=2)self.pool2=nn.MaxPool2d(kernel_size=2,stride=2)self.fc1=nn.Linear(128*7*7,1024)self.fc2=nn.Linear(1024,4096)self.fc3=nn.Linear(4096,32768)#输出一个16x16x16的体素网格defforward(self,x):x=self.pool1(F.relu(self.conv1(x)))x=self.pool2(F.relu(self.conv2(x)))x=x.view(-1,128*7*7)x=F.relu(self.fc1(x))x=F.relu(self.fc2(x))x=torch.sigmoid(self.fc3(x))returnx.view(-1,16,16,16)2.环境搭建:实际使用我们还是下载一个预训练的3D-R2N2,首先先下载代码
gitclonehttps://github.com/chrischoy/3D-R2N2.git然后说要安装anaconda,百度上安装anaconda教程很多就不展开讲解了。
cd3D-R2N2condacreate-npy3-theanopython=3.6sourceactivatepy3-theanocondainstallpygpupipinstall-rrequirements.txt运行官方代码
pythondemo.pyprediction.obj修改demo,思路过程:
1、附加参数初始化,
2、train_net()
3、train_net()中的main()
4、train_net()中的train_net(),读取网络类型参数值为cfg.CONST.NETWORK_CLASS,通过函数make_data_processes读取测试数据,调用solver中的train函数
使用intel拓展pytorch,记得切到自己的conda环境。
pipinstalltorchtorchvisionpipinstallintel_pytorch_extension2.图像转换:下面是部分代码
importintel_pytorch_extensionasipex#启用Intel®ExtensionforPyTorchtorch.backends.quantized.engine="qnnpack"#加载预训练的3D-R2N2模型model=Simple3DR2N2()model.load_state_dict(torch.load("3dr2n2model.pth"))model=model.to(ipex.DEVICE)#定义图像预处理transform=transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225]),])#2D图像转3D模型defimage_to_3d(image_path):img=Image.open(image_path)img_t=transform(img)batch_t=torch.unsqueeze(img_t,0).to(ipex.DEVICE)model.eval()withtorch.no_grad():voxel_grid=model(batch_t)returnvoxel_grid.cpu().numpy()3D-R2N2模型通过结合CNN和RNN,能够实现对多个点云数据进行三维重建,具有较好的效果和泛化性能。这个过程中:首先,通过一个三维卷积神经网络(CNN)对输入的多个三维点云数据进行特征提取,得到每个点云数据的特征向量。然后,将这些特征向量作为输入,递归地传递到一个递归神经网络(RNN)中。在RNN中,每个点云数据的特点会被逐步地聚合到一起,形成越来越完整的三维模型。最后,通过一个反卷积层(transposeconvolutionallayer),将RNN输出的特征图转换为三维网格模型。
总结本文设计了一个3D神经网络架构以深度学习为思想实现了物体的三维重建。该模型可以在图片特征点过少或图片视角数量不足的情况下进行三维重建。其缺点在于重建后的模型精度低,无法完成精细的三维重建任务。整体的体验,跟着网上的资料跑了跑,我是用window环境,配置起来一直遇到各种问题,官方还是推荐linux环境,应该能容易很多。