반응형
위 head model은 얼굴 다루면 반드시 만나는 FLAME 모델. 2017년 논문이다 보니 모델 구축이나 파라미터 최적화 같은 작업들에 필요한 auto-diff 기능들이 필요했을 때 torch보단 chumpy 라는 라이브러리를 사용했다.
이 chumpy는 python 2.0에서 만들어진 것으로 비교적 옛 버전들의 3rd party들과 dependency를 갖고 있고, 요즘 python3에서도 사용 가능하더라도 FLAME 모델 외에는 사용할 일이 pytorch 때문에 전혀 없으므로 굳이 사용할 필요가 없다.
설치조차 이제는 굳이 할 필요가 없는 옛 라이브러리가 되어버렸다.
근데 FLAME 모델 제공되는 pkl을 디코딩해보면, chumpy array로 저장된 값들이 많아 chumpy 설치를 강제하고 있다.
생각보니 어차피 pkl은 binary 파일이고, 타입만 변경해주면 굳이 chumpy를 설치하고 dependency 맞출 일이 없을 것이란 생각이 들더라.
그래서 내부 값들을 전부 numpy array로 그냥 변환한 형태로 새로 저장했다. 타입만 다르고 모든 값과 이름이 갖기 때문에 그냥 pkl 파일을 교체해주기만 하면 기존 pkl 파일이 사용되던 코드에서 문제없이 동작한다.
def to_np(array, dtype=np.float32):
if 'scipy.sparse' in str(type(array)):
array = array.todense()
return np.array(array, dtype=dtype)
class Struct(object):
def __init__(self, **kwargs):
for key, val in kwargs.items():
setattr(self, key, val)
with open(ORIGINAL_FLAME_MODEL_PKL_PATH, 'rb') as f:
ss = pickle.load(f, encoding='latin1')
flame_model = Struct(**ss)
flame_model_np = {}
flame_model_np["J"] = np.asarray(flame_model.J).tolist()
flame_model_np["J_regressor"] = to_np(flame_model.J_regressor).tolist()
flame_model_np["f"] = to_np(flame_model.f).tolist()
flame_model_np["kintree_table"] = to_np(flame_model.kintree_table).tolist()
flame_model_np["posedirs"] = to_np(flame_model.posedirs).tolist()
flame_model_np["shapedirs"] = to_np(flame_model.shapedirs).tolist()
flame_model_np["v_template"] = to_np(flame_model.v_template).tolist()
flame_model_np["weights"] = to_np(flame_model.weights).tolist()
with open(config.flame_model_path[:-5]+"_np.pkl", 'wb') as handle:
pickle.dump(flame_model_np, handle, protocol=pickle.HIGHEST_PROTOCOL)
그냥 진짜 단순하게 위와 같이 다시 저장만 해도 된다.
반응형
'Knowhow > Vision' 카테고리의 다른 글
BFM face model 파라미터로 변형하기 (cropped BFM 2009 버전 예시) (0) | 2024.07.30 |
---|---|
Open3d mesh uv coordinate (0) | 2024.07.30 |
Ultralytics YOLOv8 NMS 포함해서 onnx로 변환하기 (0) | 2024.07.17 |
Open3d ray casting 쉽게 하기, 2d point to mesh intersection 찾기 (0) | 2024.07.16 |
Trimesh to Open3d TriangleMesh (0) | 2024.07.12 |