Skip to content

Commit 89229a4

Browse files
fix(paint3d): soft bake erosion, boundary smoothing and wider angle threshold
Replace hard binary erosion with soft gradient (kernel normalized conv2d instead of threshold). Fix boundary_map tensor shape (was 1D, now 3D matching cos_map). Add Gaussian-blur boundary weight softening in bake_from_multiview. Raise bake_angle_thres from 75 to 85 degrees for wider view coverage. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
1 parent b4d1066 commit 89229a4

2 files changed

Lines changed: 22 additions & 7 deletions

File tree

Paint3D/src/paint3d/hy3dpaint/DifferentiableRenderer/MeshRender.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ def __init__(
376376
self.use_antialias = use_antialias
377377
self.max_mip_level = max_mip_level
378378
self.filter_mode = filter_mode
379-
self.bake_angle_thres = 75
379+
self.bake_angle_thres = 85
380380
self.set_boundary_unreliable_scale(2)
381381
self.bake_mode = bake_mode
382382
self.shader_type = shader_type
@@ -1226,19 +1226,21 @@ def back_project(self, image, elev, azim, camera_distance=None, center=None, met
12261226
if self.bake_unreliable_kernel_size > 0:
12271227
kernel_size = self.bake_unreliable_kernel_size * 2 + 1
12281228
kernel = torch.ones((1, 1, kernel_size, kernel_size), dtype=torch.float32).to(sketch_image.device)
1229+
kernel_norm = kernel / kernel.sum()
12291230

12301231
visible_mask = visible_mask.permute(2, 0, 1).unsqueeze(0).float()
1231-
visible_mask = F.conv2d(1.0 - visible_mask, kernel, padding=kernel_size // 2)
1232-
visible_mask = 1.0 - (visible_mask > 0).float() # 二值化
1232+
outside_proximity = F.conv2d(1.0 - visible_mask, kernel_norm, padding=kernel_size // 2)
1233+
visible_mask = (1.0 - outside_proximity).clamp(0, 1)
12331234
visible_mask = visible_mask.squeeze(0).permute(1, 2, 0)
12341235

12351236
sketch_image = sketch_image.permute(2, 0, 1).unsqueeze(0)
1236-
sketch_image = F.conv2d(sketch_image, kernel, padding=kernel_size // 2)
1237-
sketch_image = (sketch_image > 0).float() # 二值化
1237+
edge_proximity = F.conv2d(sketch_image, kernel_norm, padding=kernel_size // 2)
1238+
sketch_image = (1.0 - edge_proximity).clamp(0, 1)
12381239
sketch_image = sketch_image.squeeze(0).permute(1, 2, 0)
1239-
visible_mask = visible_mask * (sketch_image < 0.5)
12401240

1241-
cos_image[visible_mask == 0] = 0
1241+
visible_mask = visible_mask * sketch_image
1242+
1243+
cos_image = cos_image * visible_mask
12421244

12431245
method = self.bake_mode if method is None else method
12441246

@@ -1337,6 +1339,7 @@ def back_project(self, image, elev, azim, camera_distance=None, center=None, met
13371339

13381340
texture = texture.view(self.texture_size[0], self.texture_size[1], channel)
13391341
cos_map = cos_map.view(self.texture_size[0], self.texture_size[1], 1)
1342+
boundary_map = boundary_map.view(self.texture_size[0], self.texture_size[1], 1)
13401343
# texture = torch.clamp(texture,0,1)
13411344

13421345
else:

Paint3D/src/paint3d/hy3dpaint/utils/pipeline_utils.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,25 @@ def bake_from_multiview(self, views, camera_elevs, camera_azims, view_weights):
111111
project_textures, project_weighted_cos_maps = [], []
112112
project_boundary_maps = []
113113

114+
blur_radius = 5
115+
_blur_k = torch.ones(1, 1, blur_radius, blur_radius, device="cuda") / (blur_radius * blur_radius)
116+
114117
for view, camera_elev, camera_azim, weight in zip(
115118
views, camera_elevs, camera_azims, view_weights, strict=False
116119
):
117120
project_texture, project_cos_map, project_boundary_map = self.render.back_project(
118121
view, camera_elev, camera_azim
119122
)
120123
project_cos_map = weight * (project_cos_map**self.config.bake_exp)
124+
125+
bm_blurred = torch.nn.functional.conv2d(
126+
project_boundary_map.permute(2, 0, 1).unsqueeze(0),
127+
_blur_k.to(project_boundary_map.device),
128+
padding=blur_radius // 2,
129+
).squeeze(0).permute(1, 2, 0)
130+
soft_factor = (1.0 - 0.5 * bm_blurred.clamp(0, 1)).clamp(min=0.0)
131+
project_cos_map = project_cos_map * soft_factor
132+
121133
project_textures.append(project_texture)
122134
project_weighted_cos_maps.append(project_cos_map)
123135
project_boundary_maps.append(project_boundary_map)

0 commit comments

Comments
 (0)