Trouble/Vision

pymeshlab decimation 안되는 버그

침닦는수건 2024. 9. 11. 10:11
반응형

데이터 처리하다가 우연히 발견한 버그인데, pymeshlab의 decimation 기능이 제대로 동작 안할 때가 있다.

 

import pymeshlab as ml
ms = ml.MeshSet()
ms.load_new_mesh(ply_path)

m = ms.current_mesh()
num_verts = m.vertex_number()
num_faces = m.face_number()

simp_ratio = 0.1

ms.meshing_decimation_quadric_edge_collapse_with_texture(targetperc=simp_ratio)
ms.save_current_mesh(obj_path, save_textures=True, save_vertex_normal=False)

 

뭐 이런 식으로 pymeshlab으로 mesh 불러와서 vertex, face 수 줄이기 위해서 decimation을 시도했다.

 

대부분 정상적으로 동작해서 파일 크기가 큰 폭으로 줄어들었는데, 특정 횟수 이상 가면 decimation을 안하고 바로 저장한다. 

 

다행인 건 vertex, face를 제멋대로 바꾸지는 않고 정말 decimation이 동작 안해서 그대로 저장한다. 

 

원인을 알아내려고 좀 디버깅을 해봤는데 정말 원인이 없다. 일단 reproduce부터가 안됨.

 

경험적으로 200~300MB 쯤되는 500~600 개 정도 처리하는 시점에서 동작을 멈춘다. 용량이 작은 파일 처리할 때는 신기하게도 발생하지 않았다. 거의 9000개 넘는 개수를 처리할 때까지 정상 동작했음.

 

한 번 실패하기 시작하면 이후 loop도 모두 실패한다. 메모리 문제인가 싶은데 메모리 사용량을 보면 딱히 올라가지도 않는다. 

 

정말 원인 모르겠음... 실패한 샘플도 다시 돌리면 정상적으로 된다.

 

 ply_size = os.path.getsize(ply_path)
 obj_size = os.path.getsize(obj_path)

 

그냥 이처럼 decimation 전후로 파일 사이즈 체크해서 실패했을 경우, 멈추도록 (건너뛰어봤자 그 다음도 실패하니까) 설정해두는게 안전할 것 같다. 

 

Note

reproduce가 안돼서 확인은 못했지만 혹시 모르니 MeshSet하고 Mesh 메모리 해제를 강제로 해주는 것이 도움이 될지도...

del m, ms
반응형