3D物体分类---ModelNet .OFF格式生成多视角图像(Blender方法之第二步)
3D物体分类---ModelNet .OFF格式生成多视角图像(Blender方法之第二步)
强烈建议使用Blender方法!!!
说明
2 python调用Blender生成多视角图像
2.1 Blender准备工作
2.2 python代码实现.off文件读取和投影成像
2.3 python和blender联合使用生成多视角图像
2.3.1 单个.off文件生成多视角图像
2.3.2 数据集txt生成多视角图像
2.4 最想要的开箱即用代码
问题汇总:
1.blender版本问题
2. Import blender-off-addon failed
以上是邮件或公众号里问我的问题,遇到的频率还比较多,如果有其他问题我会后续更新,感谢拉坑出来的小伙伴们。
有问题关注公众号“pytorch理解与实战”,直接后台留言或评论即可,或发邮件zeaggler@gmail.com
邮件看的频次有点低,几天才会看一次,公众号后台提醒,我看到比较及时。我看到,肯定回复,尽量提供力所能及的帮助!
强烈建议使用Blender方法!!!
- 授人以鱼不如授人以渔 -
写文章的初衷是我在处理ModelNet的.OFF文件时遇到太多困难,只为后来的你减少不必要的麻烦,思路和代码都是我历经千辛万苦才摸索出来的,百度很难找到,代码现已全部上传至GitHub。需要特别说明的是,代码不是拿来即用的,你需要仔细按照你自己的路径修改
说明
回顾一下ModelNet10/40 .OFF文件生成多视角图像的方法,我找到的有两种方法,实际推荐Blender方法!!!
两种方法具体步骤:
Blender方法
首先要实现Blender对.OFF文件的读取与显示
https://blog.csdn.net/jorg_zhao/article/details/86309774
然后利用python调用Blender完成多视角数据集的生成
https://blog.csdn.net/jorg_zhao/article/details/88345324
Mat方法
首先将.OFF文件转为.MAT文件(可生成不同视角的.MAT)
https://blog.csdn.net/jorg_zhao/article/details/86647696
然后用python将不同视角的.MAT文件转为多视角图片
https://blog.csdn.net/jorg_zhao/article/details/88345366
2 python调用Blender生成多视角图像
2.1 Blender准备工作
为了能够利用python调用blender,我们需要首先在项目文件夹下用blender生成一个空的模型blend文件,在此空模型中,需要提前构造出背景、纹理和灯光等,为了方便,我为你们提供了一个空背景模型,灯光设置成了点光源,并分布于各个角落,这样可以防止读入模型时,造成模型表面光影变化太大,以免影响后续分类精度。
图1 为代码中附上的blender空背景图像,添加了8个角度上的点光源
图1文件名为phong.blend,此文件可用blender直接打开,除非你对blender很熟悉,不建议你修改此文件,实测生成的多视角图像还是很清晰的。
2.2 python代码实现.off文件读取和投影成像
python的代码直接放出来吧:
import bpy
import os.path
import math
import sysC = bpy.context
D = bpy.data
scene = D.scenes['Scene']# cameras: a list of camera positions
# a camera position is defined by two parameters: (theta, phi),
# where we fix the "r" of (r, theta, phi) in spherical coordinate system.# 5个固定视角:前 右 后 左 上
# cameras = [(60, 0), (60, 90), (60, 180), (60, 270),(0, 0)]# 连续视角:固定某一个角度,然后环视3D物体,环视角度间隔inter=30度
fixed_view = 60
inter = 30
cameras = [(fixed_view, i) for i in range(0, 360, inter)] # 这会生成360/30=12个视角图片
render_setting = scene.render# 输出图像大小 (W, H)
w = 224
h = 224
render_setting.resolution_x = w*2
render_setting.resolution_y = h*2'''****************************************************************'''
def main():argv = sys.argvargv = argv[argv.index('--') + 1:]if len(argv) != 2:print('phong.py args: <3d mesh path> <image dir>')exit(-1)model_path = argv[0] # 输入: 单个 .off 或 dataset.txtimage_dir = argv[1] # 输出: 保存多视角图像的路径# blender 对.off文件没有原生支持,需要安装插件install_off_addon()init_camera()fix_camera_to_origin()'''************* 自动判别输入的是单个off文件还是数据集txt文件 *****************'''if model_path.split('.')[-1] == 'off':print('model path is ********', model_path) # model_path:'./airplane.off'do_model(model_path, image_dir)elif model_path.split('.')[-1] == 'txt':with open(model_path) as f:models = f.read().splitlines()for model in models:one_model = model[:-2]print('model path is ********', one_model) # model_path:'F:\DATA3D\ModelNet10\monitor\train\monitor_0003.off'do_model(one_model, image_dir)else:print('......Please input correct parameters......')exit(-1)
'''****************************************************************'''def install_off_addon():try:bpy.ops.wm.addon_install(overwrite=False,filepath=os.path.dirname(__file__) +'/blender-off-addon/import_off.py')bpy.ops.wm.addon_enable(module='import_off')except Exception:print("""Import blender-off-addon failed.Did you pull the blender-off-addon submodule?$ git submodule update --recursive --remote""")exit(-1)def init_camera():cam = D.objects['Camera']# select the camera objectscene.objects.active = camcam.select = True# set the rendering mode to orthogonal and scaleC.object.data.type = 'ORTHO'C.object.data.ortho_scale = 2.def fix_camera_to_origin():origin_name = 'Origin'# create origintry:origin = D.objects[origin_name]except KeyError:bpy.ops.object.empty_add(type='SPHERE')D.objects['Empty'].name = origin_nameorigin = D.objects[origin_name]origin.location = (0, 0, 0)cam = D.objects['Camera']scene.objects.active = camcam.select = Trueif 'Track To' not in cam.constraints:bpy.ops.object.constraint_add(type='TRACK_TO')cam.constraints['Track To'].target = origincam.constraints['Track To'].track_axis = 'TRACK_NEGATIVE_Z'cam.constraints['Track To'].up_axis = 'UP_Y'def do_model(model_path, image_dir):# model_path= 'F:\\DATA3D\ModelNet10_MV\\bathtub\\train\\bathtub_0003.off'# image_dir = 'F:\\DATA3D\\ModelNet10_MV_32_train\\'name = load_model(model_path) # -> name = 'bathtub_0003'center_model(name)normalize_model(name)image_subdir = os.path.join(image_dir, name.split('_')[0], name) # path: image_dir\\bathtub\\bathtub_0003for i, c in enumerate(cameras):move_camera(c)render()save(image_subdir, '%s_%d' % (name, i))delete_model(name)def load_model(model_path):# single .off: model_path='./airplane.off'# dataset.txt: model_path= 'F:\\DATA3D\ModelNet10_MV\\bathtub\\train\\bathtub_0003.off'd = os.path.dirname(model_path) # invalide for .off fileext = model_path.split('.')[-1] # ext: 'off'# Attention! win10: ..path.split('\\') linux: ..path.split('/')_model_path_tmp = model_path.split('\\')[-1] # _model_path_tmp: 'bathtub_0003.off'name = os.path.basename(_model_path_tmp).split('.')[0] # bathtub_0003# handle weird object naming by Blender for stl filesif ext == 'stl':name = name.title().replace('_', ' ')if name not in D.objects:print('loading :' + name)if ext == 'stl':bpy.ops.import_mesh.stl(filepath=model_path, directory=d,filter_glob='*.stl')elif ext == 'off':bpy.ops.import_mesh.off(filepath=model_path, filter_glob='*.off')elif ext == 'obj':bpy.ops.import_scene.obj(filepath=model_path, filter_glob='*.obj')else:print('Currently .{} file type is not supported.'.format(ext))exit(-1)return name # name='airplane' -> 'bathtub_0003'def delete_model(name):for ob in scene.objects:if ob.type == 'MESH' and ob.name.startswith(name):ob.select = Trueelse:ob.select = Falsebpy.ops.object.delete()def center_model(name):bpy.ops.object.origin_set(type='GEOMETRY_ORIGIN')D.objects[name].location = (0, 0, 0)def normalize_model(name):obj = D.objects[name]dim = obj.dimensionsprint('original dim:' + str(dim))if max(dim) > 0:dim = dim / max(dim)obj.dimensions = dimprint('new dim:' + str(dim))def move_camera(coord):def deg2rad(deg):return deg * math.pi / 180.r = 3.theta, phi = deg2rad(coord[0]), deg2rad(coord[1])loc_x = r * math.sin(theta) * math.cos(phi)loc_y = r * math.sin(theta) * math.sin(phi)loc_z = r * math.cos(theta)D.objects['Camera'].location = (loc_x, loc_y, loc_z)def render():bpy.ops.render.render()def save(image_dir, name):path = os.path.join(image_dir, name + '.png')D.images['Render Result'].save_render(filepath=path)print('save to ' + path)if __name__ == '__main__':main()
代码需要你关注的地方 我都已经加了注释,其余部分基本不需要你修改,并且我直接加了对输入的判断,尽可能减少你们的工作量。
!!!!!!!!!!!!上述代码不能直接运行!!!!!!!!!!!!
2.3 python和blender联合使用生成多视角图像
我之前在写第一篇blender方法之第一步的时候,是在ubuntu系统上实现的,但是后续我就换到了win10上,所以第一篇我没有添加win10上的安装和设置步骤,一没时间二是步骤基本相同,但是接下来的步骤就要有所不同了,仔细听我慢慢道来。为了两个系统我是煞费苦心啊。。。。。
代码我整理合成了两种方法:
一种是输入单个off文件生成多视角图像,主要是为了让你方便调整参数,测试你想要的结果,这也是我最开始操作的方法;
一种是直接输入dataset.txt文件,代码会一次性把数据集全部生成多视角图像,为了保险起见,强烈建议您先使用单个off文件输入方法确定是您想要的结果,再对整个数据集进行处理。
命令行执行说明:
<blender安装路径> phong.blend --background --python phong.py -- <输入off路径> <输出保存多视角图像路径>
1
需要注意不同系统,第一个blender的差异,我最开始就蛋疼在这一步! 下面逐一说明具体使用方法。
2.3.1 单个.off文件生成多视角图像
ubuntu系统
blender phong.blend --background --python phong.py -- ./single_off_samples/airplane_0001.off ./single_samples_MV
win10系统
"C:\\Program Files\\Blender Foundation\\Blender\\blender.exe" phong.blend --background --python phong.py -- .\\single_off_samples\\airplane_0001.off .\\single_samples_MV
2.3.2 数据集txt生成多视角图像
ubuntu系统
blender phong.blend --background --python phong.py -- dataset.txt ./dataset_samples_MV
win10系统
"C:\\Program Files\\Blender Foundation\\Blender\\blender.exe" phong.blend --background --python phong.py -- dataset.txt .\\dataset_samples_MV
为了方便你们运行代码,我上传代码同时也上传了单个off文件,并且也制作了一个很小的数据集
2.4 最想要的开箱即用代码
代码全部上传至GitHub,包括开箱即用源码和数据集,代码可直接使用。
https://github.com/zeaggler/ModelNet_Blender_OFF2Multiview
使用步骤如下:
文件夹下打开命令行,方法有很多,我为了方便直接右键打开了以示说明
命令行中输入单个off文件命令
执行过程类似下图
生成的多视角图像如下,设置角度间隔为30,所以一共获取360/30=12个视角的图像
===========================我是一条分割线===========================
1
问题汇总:
1.blender版本问题
我在文中所用版本为blender v2.79b,其他版本并未测试,如果有网友看到,有用v2.8x版本成功的可以留言确认一下,谢谢了。
blender v2.79b版本下载地址:
https://download.blender.org/release/Blender2.79/blender-2.79b-windows64.zip
其余os地址可以在下面地址自己查找:
https://download.blender.org/release/Blender2.79/
2. Import blender-off-addon failed
这个问题暂时不知道是什么原因,在看我解决办法之前,一定要确保按照我的步骤全部走完了,不然您改了代码后,还会出现其他问题。
如果addon安装成功,仍然出现“did you pull the xxxx”,可以注释phong.py中的下图这行代码,跳过错误提示即可。
————————————————
版权声明:本文为CSDN博主「柚有所思」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jorg_zhao/article/details/88345324
3D物体分类---ModelNet .OFF格式生成多视角图像(Blender方法之第二步)相关推荐
- 3D物体分类---ModelNet .OFF格式生成多视角图像(Blender方法之第一步)
3D物体分类---ModelNet .OFF格式生成多视角图像(Blender方法之第一步) 强烈建议使用Blender方法!!! 说明 1. ModelNet .OFF格式生成多视角图像方法(Ble ...
- 基于pointnet的3D物体分类和分割检测(复现不出来你直接敲我家门)
录 前言 一.资料下载 1.代码下载 2.数据集下载 二.环境配置 1.本文采用设备配置说明 2.虚拟环境配置 三.训练部分 1.分类训练部分 2.分割的训练部分 四.预测部分 1.分类结果展示 2. ...
- 超分辨率重建生成低分辨率图像,生成降质图像公认方法代码
目录 1背景 2.BI 3.BD 4.DN 5总结 1背景 超分辨率重建中经典的生成降质图像通常使用MATLAB实现的,通常有四种方法: 类型 说明 BI bicubic-down BD blur-d ...
- 用PHP生成等比图像的方法
PHP代码 <?php /************************************************************************ * 函数名称:crea ...
- H5播放器标签video播放mp4格式有声音没有图像解决方法
在使用h5的video标签播放视频很方便,但是有时会出现有声音没有图像的情况,这个时候我们考虑一下视频编码的问题 下载转换工具,对视频进行格式的变化,视频编码选择AVC(H264)这样就可以直接播放了 ...
- 图像物体分类与检测算法综述
图像物体分类与检测算法综述 转自<计算机学报> 目录 图像物体分类与检测算法综述 目录 图像物体分类与检测概述 物体分类与检测的难点与挑战 物体分类与检测数据库 物体分类与检测发展历程 图 ...
- CVPR2021|基于分类深度分布网络的单目3D物体检测
1.要解决的问题 单目3D物体检测核心问题是如何准确估计物体的深度信息.已有方法尝试显式地或隐式地学习深度信息. 显式地学习存在的问题:1:深度估计的过度置信.一些方法[14,38,39,62]通过深 ...
- 【Unity3D】使用 FBX 格式的外部模型 ( 向 Unity 中添加 FBX 模型 | 向 Scene 场景中添加 FBX 模型 | 3D 物体渲染 | 3D 物体材质设置 )
文章目录 一.向 Unity 中添加 FBX 模型 二.向 Scene 场景中添加 FBX 模型 三.3D 物体渲染 四.3D 物体材质设置 一.向 Unity 中添加 FBX 模型 Unity 中使 ...
- 自动驾驶中的3D物体状态检测
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 摘要 3D物体检测是自动驾驶的一项重要技术,KITTI提供了一种用 ...
最新文章
- 常用的css3的新属性
- OpenCV Python教程(1、图像的载入、显示和保存)
- 柳昀哲课题组在Nature Reviews Neuroscience上发表长篇综述提出表征富集理论
- 优秀Java开发者的10条共性
- Potplayer使用必看
- metasploit终端命令大全 MSF
- 《树莓派渗透测试实战》——2.12 用例子总结以上步骤
- 记一次.NET 与R语言交互
- c语言连接mysql_聊聊数据库MySQL、SqlServer、Oracle的区别,哪个更适合你?
- JavaScript中的嵌套事件处理(在鼠标移动事件上)
- 手把手带你玩转Tensorflow 物体检测 API (1)——运行实例
- 设备管理器android感叹号,设备管理器其他设备感叹号
- Web前后端笔记-vue cli及java进行AES加解密
- 【Flink】Flink实验特性--reinterpretAsKeyedStream 将DataStream重新解释为KeyedStream
- 拉普拉斯定理_拉普拉斯妖:通晓宇宙一切,深知过去未来,最终被量子力学终结!...
- 给 Vuepress 和 ElementUI 添加夜间暗色模式
- 数据结构上机实验1——线性表——班级管理系统
- 岁月温柔-24 妈妈转到省医院第4天
- 3D游戏物理开发引擎Panda3D基础
- 面向单片机编程(三)- 数码管显示
热门文章
- 解决windows图片查看器背景色变成米黄色
- Android开发RSS阅读器
- Linux0.11中对文本文件进行修改的策略
- Android--判断发送短信后的状态/发送成功Or发送失败
- Mysql/Mairadb主从复制
- Qemu之Network Device全虚拟方案
- 回收站功能在 Linux 中的实现
- 阿里巴巴云舒:弹性计算的安全问题
- 快速整理excel_3小时整理了33个excel动图技巧,能快速提高工作效率,收藏备用吧...
- feignclient对象找不到_为什么我找不到对象呢,一个33岁大龄剩女的疑惑