3D物体分类

您所在的位置:网站首页 blender模型图片 3D物体分类

3D物体分类

2023-11-28 10:29| 来源: 网络整理| 查看: 265

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理解与实战”,直接后台留言或评论即可,或发邮件[email protected]邮件看的频次有点低,几天才会看一次,公众号后台提醒,我看到比较及时。我看到,肯定回复,尽量提供力所能及的帮助!

强烈建议使用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文件 图1文件名为phong.blend,此文件可用blender直接打开,除非你对blender很熟悉,不建议你修改此文件,实测生成的多视角图像还是很清晰的。

2.2 python代码实现.off文件读取和投影成像

python的代码直接放出来吧:

import bpy import os.path import math import sys C = 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.argv argv = argv[argv.index('--') + 1:] if len(argv) != 2: print('phong.py args: ') exit(-1) model_path = argv[0] # 输入: 单个 .off 或 dataset.txt image_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 object scene.objects.active = cam cam.select = True # set the rendering mode to orthogonal and scale C.object.data.type = 'ORTHO' C.object.data.ortho_scale = 2. def fix_camera_to_origin(): origin_name = 'Origin' # create origin try: origin = D.objects[origin_name] except KeyError: bpy.ops.object.empty_add(type='SPHERE') D.objects['Empty'].name = origin_name origin = D.objects[origin_name] origin.location = (0, 0, 0) cam = D.objects['Camera'] scene.objects.active = cam cam.select = True if 'Track To' not in cam.constraints: bpy.ops.object.constraint_add(type='TRACK_TO') cam.constraints['Track To'].target = origin cam.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_0003 for 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 file ext = 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 files if 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 = True else: ob.select = False bpy.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.dimensions print('original dim:' + str(dim)) if max(dim) > 0: dim = dim / max(dim) obj.dimensions = dim print('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文件输入方法确定是您想要的结果,再对整个数据集进行处理。命令行执行说明: phong.blend --background --python phong.py --

需要注意不同系统,第一个blender的差异,我最开始就蛋疼在这一步! 下面逐一说明具体使用方法。

2.3.1 单个.off文件生成多视角图像 ubuntu系统blender phong.blend --background --python phong.py -- ./single_off_samples/airplane_0001.off ./single_samples_MVwin10系统"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_MVwin10系统"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.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中的下图这行代码,跳过错误提示即可。 在这里插入图片描述

以上是邮件或公众号里问我的问题,遇到的频率还比较多,如果有其他问题我会后续更新,感谢拉坑出来的小伙伴们。 有问题关注公众号“pytorch理解与实战”,直接后台留言或评论即可,或发邮件[email protected] 邮件看的频次有点低,几天才会看一次,公众号后台提醒,我看到比较及时。我看到,肯定回复,尽量提供力所能及的帮助!


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3