背景
数据样本是深度学习的基础,尤其是针对几何类的深度学习问题。目前网上已经有许许多多的数据集,其中尤其多的是用Blender得到的,例如BlendedMVS。
在本博客中,只是简单的尝试一下用Blender渲染一下模型,然后导出影像和深度图和法向图。
值得注意的是,本博主充分发挥了“能用就行”的原则,对细节几乎都不求甚解。
参考资料
https://blenderartists.org/t/render-settings-for-depth-normal-albedo-in-2-80/1199454
https://github.com/panmari/stanford-shapenet-renderer/blob/master/render_blender.py
结果
由于最终结果均匀exr文件,需要使用RenderDoc查看。
深度图
法向图
影像图
流程
1. 导入obj模型
首先第一步必然是导入obj模型,代码如下,仅仅需要指定obj文件所在文件夹即可。
import bpy
import os
# folder path for importing data files
in_dir_ply = r"C:\Users\Kevin\Desktop\5a3cb4e4270f0e3f14d12f43\textured_mesh"
lst_ply = os.listdir(in_dir_ply)
# Filter file list by valid file types.
file = []
for item in lst_ply:
fileName, fileExtension = os.path.splitext(item)
if fileExtension == ".obj":
file.append(item)
# To import mesh.ply in batches
for i in range(len(file)):
bpy.ops.import_scene.obj(filepath=os.path.join(in_dir_ply,file[i]))
以下就是BlendedMVS的一个模型的导入结果,如左上图所示
2. 设置相机位置和姿态
当然这里可能还需要设置一下灯啊啥的,我就不写了。
import bpy
tx = 0.0
ty = 0.0
tz = -5.0
rx = 180.0
ry = 0.0
rz = 0.0
pi = 3.14159265
camera = bpy.data.objects['Camera']
# Set camera rotation in euler angles
camera.rotation_mode = 'XYZ'
camera.rotation_euler[0] = rx*(pi/180.0)
camera.rotation_euler[1] = ry*(pi/180.0)
camera.rotation_euler[2] = rz*(pi/180.0)
# Set camera translation
camera.location.x = tx
camera.location.y = ty
camera.location.z = tz
3. 导出渲染结果
# Set up rendering of depth map.
import bpy
bpy.context.scene.use_nodes = True
tree = bpy.context.scene.node_tree
links = tree.links
bpy.context.scene.render.image_settings.color_depth = '32'
bpy.context.scene.render.image_settings.color_mode = 'RGB'
# 必须设置,否则无法输出深度
bpy.context.scene.render.image_settings.file_format = "OPEN_EXR"
# 必须设置,否则无法输出法向
bpy.context.view_layer.use_pass_normal = True
# Clear default nodes
for n in tree.nodes:
tree.nodes.remove(n)
# Create input render layer node.
render_layers = tree.nodes.new('CompositorNodeRLayers')
depth_file_output = tree.nodes.new(type="CompositorNodeOutputFile")
depth_file_output.label = 'Depth Output'
links.new(render_layers.outputs['Depth'], depth_file_output.inputs[0])
scale_normal = tree.nodes.new(type="CompositorNodeMixRGB")
scale_normal.blend_type = 'MULTIPLY'
scale_normal.inputs[2].default_value = (0.5, 0.5, 0.5, 1)
links.new(render_layers.outputs['Normal'], scale_normal.inputs[1])
bias_normal = tree.nodes.new(type="CompositorNodeMixRGB")
bias_normal.blend_type = 'ADD'
bias_normal.inputs[2].default_value = (0.5, 0.5, 0.5, 0)
links.new(scale_normal.outputs[0], bias_normal.inputs[1])
normal_file_output = tree.nodes.new(type="CompositorNodeOutputFile")
normal_file_output.label = 'Normal Output'
links.new(bias_normal.outputs[0], normal_file_output.inputs[0])
image_file_output = tree.nodes.new(type="CompositorNodeOutputFile")
image_file_output.label = 'Image'
links.new(render_layers.outputs['Image'], image_file_output.inputs[0])
scene = bpy.context.scene
# 设置输出分辨率,可以自行修改
scene.render.resolution_x = 300
scene.render.resolution_y = 200
scene.render.resolution_percentage = 100
cam = scene.objects['Camera']
# fov
cam.data.angle = 10*(3.1415926/180.0)
for output_node in [depth_file_output, normal_file_output, image_file_output]:
output_node.base_path = ''
# 输出路径
scene.render.filepath = r'C:\Users\Kevin\Desktop\5a3cb4e4270f0e3f14d12f43\\'
depth_file_output.file_slots[0].path = scene.render.filepath + 'depth_'
normal_file_output.file_slots[0].path = scene.render.filepath + 'normal_'
image_file_output.file_slots[0].path = scene.render.filepath + 'image_'
bpy.ops.render.render()
总结
总的来说,第一次用Blender,感觉还有诸多不懂,先记一下代码。