Loading [MathJax]/jax/output/CommonHTML/jax.js

100일 챌린지/Houdini Masterclass

Day12 - Houdini에서 ML 사용하기

ksyke 2025. 4. 15. 22:25

본 글은 아래의 깃허브 페이지를 한글로 번역한 내용입니다. 

https://github.com/kiryha/Houdini/wiki/AI-For-Artists

 

AI For Artists

Houdini pipeline and learning database. Contribute to kiryha/Houdini development by creating an account on GitHub.

github.com

프로젝트에 사용된 코드는 저의 개발 환경인 Linux에 맞춰 변형되었으니, 원본 코드를 보고 싶으시면 링크를 참고하시기 바랍니다. 

1. 서론

인공지능이란 무엇일까? 아티스트들에게도 이것이 사용되어야 한다. 

 

본 글의 작성자는 AI의 일부인 Machine Learning을 공부하는 중이며, 그중 후디니에 AI 알고리즘을 적용하여 특정 문제를 해결하는 것에 집중하고 있다. 이 글에서는 이론과 설명을 통해 작성자가 발견한 내용을 공유하고자 한다. 

 

새로운 것을 배울 때 가장 흥미로운 것은 그 지식을 어떻게 응용할 수 있을지를 찾아내는 것이다. 관심 있는 분야에 적용이 가능하고, 관련성이 있으면서도 이해하기 쉽고 재생산과 수정이 가능한 방법을 찾는 것이 중요하다. Python을 배울 때를 생각해 보라. 장바구니 리스트 앱을 만드는 것보다 후디니 프로젝트에 적용하는것이 더 즐겁지 않았는가?

 

2. 이론적 회귀: 구체 혹은 정육각형인가?

눈앞에 3D 모델의 구체와 정육각형이 있다고 상상해 보아라. 이것이 프로그램적으로 구체 혹은 정육각형임을 나타낼 수 있는가?

 

프로그램적으로라는 것은, 어떠 코드가 입력으로 오브젝트를 받아들이고, 분류를 통해 "이것은 정육면체 입니다!" 라는 아웃풋을 제공할 수 있어야 한다는 의미이다. 

 

인간에게 있어 이것은 쉬운 문제일 것이다. 후디니의 뷰포트를 누군가에게 보여주며 무엇이 보이냐고 묻는다면 답을 얻을 수 있을 것이다. 그러나 컴퓨터에게는 이 문제가 조금 더 복잡하다.

 

이 튜토리얼에서는 문제를 더 잘 이해할 수 있도록, 고차원(high-level)에서 일어나는 일들을 개요로 먼저 설명하고, 이후에 그 사고 과정과 응용 방법에 대해 더 자세히 다루도록 하겠다. 

 

Machine Learning 파이프라인의 큰 그림은 아래와 같다:

  • 데이터를 얻고 생성한다.
  • 해당 데이터를 가지고 모델을 학습한다. 
  • 모델이 새로운 데이터를 가지고 예측을 할 수 있도록 사용한다. 

물체 분류 문제를 해결하기 위해서는 다음과 같은 단계가 주로 적용될 것이다.

물체 분류 과정

3. Geometry 형태를 나타내기

처음 해결해야 할 문제는 컴퓨터에 물체를 어떻게 "보여주는가" 이다. 예를 들자면, 프로그램의 입력은 무엇이 될 것인가?

 

가장 직관적인 방법으로는 뷰포트의 스크린샷이나 더 Karma 렌더와 같은 물체의 이미지를 제공하는 것이다. 이러한 방법으로 작동은 되겠지만, 모델을 학습시키기 위해서는 각기 다른 수백만개의 구체 이미지를 제공해야 할 것이다. Houdini는 수많은 구체를 procedural하게 생성할 수 있는 도구를 제공하지만, 더 간단하고 효율적인 방법도 있다.

 

Houdini에서 구체를 생성한다는 것은 구체의 렌더(render)가 가능하다는 뜻만 아니라, 구체의 위치(position), 크기(scale), 포인트의 수(number of points), 각 포인트의 월드 위치(world position of each points)와 같은 여러 가지 잡다한 정보들에 대한 접근이 가능하다는 뜻이다. 이러한 물체의 특징(features)은 모델의 학습을 위한 좋은 데이터가 될 수 있다. 

 

이제, 물제의 특징을 잘 추출하여 컴퓨터가 물체의 차이를 인식하고 올바른 결과를 낼 수 있도록 해야 한다.

 

물체의 크기(scale)을 특징으로 잡는다고 가정해 보자. 랜덤한 크기의 수백만 개의 구체와 정육면체를 생성하여, 그것들을 표로 기록할 수 있다. 그러면 각 구체와 정육면체에 대해 "크기"열을 가진 2백만 개의 실수 값이 포함된 표를 만들 수 있을 것이다. 이러한 표는 ML 모델에 적용하기 쉬운 입력 데이터가 될 것이다. 하지만 크기가 물체의 형태를 잘 설명하는 유효한 특징일까? 크기는 단순히 토폴로지(topology)의 설명적 속성(descriiptive property)일 뿐이지, 물체 형태를 구분짓는 중요한 특성이 아닐 수 있다.

 

따라서, 물체의 형태를 설명할 수 있는 더 나은 특징을 찾아야 하며, 다양한 형태의 변형을 생성하고 이를 모델에 공급할 수 있도록 데이터를 준비해야 한다. 

 

이제부터 데이터를 만들기 위한 Houdini 프로젝트를 만들어 보자. 

 

4. 합성 데이터 생성하기

 코드를 작성하기 전에 준비 단계가 필요하다. 준비 단계에 대한 내용은 섹션0. 환경설정을 참고해 주기 바란다. 

 

다음의 링크에서 프로젝트 파일을 다운받아 진행하면 된다: 후디니 파일 다운로드

 

Geometry를 생성하기 위해 SOP 노드에서 "Sphere"와 "Box"를 사용할 것이고, 해당 노드에서 관련된 속성을 읽어볼 수 있으며, 데이터를 엑셀 표 형태로 저장할 수 있다. 끝으로, "Python" 노드를 사용하여 프로그램을 만들어 "Sphere"와 "Cube" SOP 노드를 연결해 이 노드들을 인풋으로 받을 것이다. 이 프로그램은 연결된 노드가 어떤 것인지 구분할 수 있도록 할 것이다. 

 

모델을 학습하기 위해서는 많은 데이터가 필요하다. 특히 다양한 구체와 정육면체 데이터를 많이 생성해야 한다. 이는 Machine Learning에서의 핵심인 특징(feature) 추출과 관련이 있다.우리가 크기를 사용하여 물체를 분류하는 이유를 위헤서 알아봤지만, 이제 더 중요한 특징이 필요하다. 가장 쉽게 조작하기 쉬운 특징은 행과 열에 대한 것들이다. 

 

"For-Each Number" 루프를 만들어서 "Sphere" SOP를 넣고, "iteration"을 250로 설정해 sphere를 250개를 생성한다. 이렇게 생성된 250개의 sphere는 학습 데이터로 유용하게 사용될 것이다. 

sphere와 cube를 loop를 이용해 생성

 

왜 250인가? 이는 학습에 적당한 수이며, 성능에 큰 영향을 미치지 않을 만큼의 수치이다. ML 알고리즘은 가능한 많은 데이터를 필요로 하며, 대체로 수백만 개의 데이터 포인트가 필요된다. 처음엔 250개의 구체로 시작하여, 컴퓨터의 성능을 시험해보는 것도 좋다. 

 

이제, 생성된 250개의 구체의 필요한 특징을 기록하는 프로그램이 필요하다. "Python" SOP를 루프의 끝에 생성해 아래의 코드를 추가한다. 이 파이썬 프로그램에서는 각 primitive에서 특징 값을 추출하여 CSV로 저장한다:

import hou
import pandas as pd

current_node = hou.pwd()
geo = current_node.geometry()

data = []
csv_path = f'$HIP/models/$HIPNAME/data/train_data_sphere.csv'

for primitive in geo.prims():
	features = {}
    data.append(features)
    
data_frame = pd.DataFrame(data)
data_frame.to_csv(csv_path)

 

여기서 특징 데이터를 저장하기 위해 Pandas를 사용하였다. 필요한 테이터를 Pandas의 기본 "CSV" 라이브러리를 사용해 기록하는 것이 좀 복잡해 보일 수 있지만, 학습과 예측을 위한 모델 사용 단계를 보면 더 이해가 갈 것이다. 

 

이제 각 물체의 행과 열의 수를 램덤화해야 된다. 아래의 코드에서는 "Row"와 "Column" 파라미터에 코드를 활용하여 랜덤화하였고, 정육면체는 "Axis Division"을 통하였다:

import random

counter = hou.node('../foreach_count1')
seed = counter.geometry().attribValue("iteration") + 128
random.seed(seed)
value = random.randint(3,120)

return value

모든 파라미터에 'Ctrl + E'를 하여 파라미터 윈도우를 띄울 수 있다. 이 윈도우에서 "Hscript Expression"에서 "Python Expression"으로 변경하여 코드를 삽입한다. 

이 시점에서, 두 가지의 주요 포인트에 주목할 수 있다. 첫번째로, 특징 값은 primitive의 attribute로 기록되어야 읽는것이 가능해 지고, dictionary로 저장이 가능하게 된다. 

 

두번째로, 표에서 250개의 행이 필요한데, 각각의 행은 하나의 고유한 구체 변화값을 가지고 있다. 표의 열은 특징이 될 것이고, 그러므로 각각의 셀은 특별한 구체 사례에 대한 특징 값을 가질 것이다. 아직은 특징으로 어떤 것을 선택할지 정하지 않고 표의 행과 열만 지정하였는데, 이것은 나중에 다시 살펴볼 것이다. 모든 primitive를 루프로 통과하였을 때, 각각의 물체는 여러개의 primitive를 가지고 있기 때문에 물체의 수 보다 많은 값의 행을 가지게 될 것이다. 그러므로 각 물체 당 한 번만 primitive 데이터를 기록해야 한다. 이것은 "For-Each Loop"의 "Iterations" 파라미터에 의존하면 가능해지는데, 이전의 진행된 물체에 대한 primitive 데이터의 기록을 스킵하며 기록할 수 있다. 

import hou
import pandas as pd

current_node = hou.pwd()
geo = current_node.geometry()

processed_objects = []
data = []
csv_path = f'$HIP/models/$HIPNAME/data/train_data_sphere.csv'

for primitive in geo.prims():
	object_index = primitive.attribValue('object_index')
    
    if object_index not in processed_objects:
    	processed_objects.append(object_index)
        
        features = {}
        data.append(features)
        
data_frame = pd.DataFrame(data)
data_frame.to_csv(csv_path)

 

이것이 작동하기 위해서는 "For-Each Loop"의 "iteration"이 "objecy_index" primitive attribute로 저장되어 있어야 한다.

// attribute wrangle node

int switch = chi('../object_switch/input');
int object_index = chi('iteration');

int num_primitives = nprimitives(0);
for (int primnum = 0; primnum < num_primitives; primnum++) {
    setprimattrib(0, "object_index", primnum, object_index, "set");
    }

 

이 시점에서 우리는 데이터 생성의 척추(backbone)를 완성했다고 볼 수 있다. Houdini를 활용해 구체와 정육면체, 두 가지의 3d 물체의 토폴로지를 나타내는 합성 데이터 세트를 생성할 수 있게 된다. 여기서 합성(synthetic)이란 ML 학습을 위해 procedural(혹은 프로그램적) 하게 생성된 데이터라는 뜻이 된다. 그렇지 않다면, 250개의 각기 다른  구체와 정육면체를 다른 곳에서 다운받아 각각의 파라미터를 기록해야 했을 것이다. 

 

정육면체의 데이터를 저장하기 위해 정육면체를 추가해야 한다. 이후에, 모델을 학습시키고, 두 개의 파일을 하나의 sphere-cube 데이터 셋을 합칠 것이다. 

 

이제 가장 특징을 정해야 하는 가장 흥미로운 단계이다. Geometry 형태를 구분짓기 위해 어떠한 정보가 사용될까?

 

Houdini는 많은 양의 geometry 속성에 접근하기 쉽다. 접근이 가능한 속성 중에는 표면적(surface area)이나, 부피(volume), 곡률(curvature), 점의 개수(number of points), 행의 개수, 열의 개수 등등이 있다. 초반에는 위에 언급된 모든 특징을 사용해 모델을 훈련시켜 보았으나, 실험을 통해 두 가지의 특징이 가장 관련성이 높다는 것을 알아냈다: 포인트의 수와 면적(face)의 수.

features = {'points': primitive.attribValue('points'),
			'faces': primitive.attribValue('faces'),
			'object_type': 'sphere'}
data.append(features)

 

"object_switch"를 사용해 구체와 정육면체 사이를 왔다갔다 할 수 있고, 아래의 완성된 코드를 이용해 구체와 정육면체의 데이터를 각각 기록 할 수 있다. 각각의 파일에는 250개의 행과 ''points", "faces", 그리고 "object_type"라는 열이 있을 것이다. 

5. 모델 학습시키기

구체와 정육면체를 구분시킬 때, 우리는 바이너리 데이터를 사용한다. 예를 들자면, 어떤 것이 사실인지, 아니면 거짓인지를 확인한다(이것은 구체인가?). 그리고 이러한 문제의 경우, 논리 회귀 모델이 가장 적합한 모델이다. 

 

논리 회귀 모델은 물체가 가진 point와 face의 수에 의존해 입력 물체가 구체일 확률을 알려준다. 다른 말로, 논리 회귀 모델은 물체 분류 결정을 할 수 있도록 한다. 예를 들자면, 우리가 입력 물체를 구체 혹은 정육면체로 분류하는 것처럼 말이다. 이 물체는 point와 face의 개수로 구체임이 예측될 수 있다. 

 

Collab을 사용해 모델을 학습시켜 보자. Collab에 새로운 노트북을 만들고 적당한 제목을 부여한다. Collab은 클라우드에서 실행되는 기본 파이썬 IDE라고 생각하면 된다. Collab 노트북에서는 chanks를 이용해 코드를 실행시킬 수 있다. Collab Cells에는 코드를 chanks로 적을 수 있다. 새로운 셀을 만들기 위해서는 "+ Code"를 누르고, 셀에서 코드를 실행시키기 위해서는 "Run Cell"(까만 원에 하얀색 화살표 버튼)을 누르면 된다. 

셀에서 코드를 실생시킨 후에, 모든 데이터는 메모리에 남아있게 된다. 예를 들자면, 모듈의 import를 한 번만 하면 언제든지 해당 모듈을 사용할 수 있게 된다. 

 

구체와 정육면체 데이터를 Google Drive에 업로드 한다. 이 프로젝트에서는 'PROJECTS/sphere_cube' 폴더에 저장하였다. 

이제 Collab Notebook에서 해당 데이터를 import하고, 마법을 부릴 수 있다:

import pickle
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

# Read sphere cube data
df_sphere = pd.read_csv('/content/drive/MyDrive/PROJECTS/sphere_cube/train_data_sphere.csv')
df_cube = pd.read_csv('/content/drive/MyDrive/PROJECTS/sphere_cube/train_data_cube.csv')

처음 CSV를 불러오는 코드를 실행시킬 때에는 에러 메시지를 받을 수 있다. 이럴 때는 Collab에 Google Drive를 연결해 줘야 한다. 왼쪽의 메뉴에 파일 아이콘을 누르고 "드라이브 마운트"를 누르면 CSV 파일을 읽을 수 있을 것이다. 

다음으로, sphere와 cube 데이터를 하나의 데이터셋으로 합쳐야 한다. 또한 필요하지 않은 첫번째 열을 지운다:

# Combine data and delete redundant column
df = pd.concat([df_sphere, df_cube],ignore_index=True)
df.drop(['Unnamed: 0'], axis=1, inplace=True)

 

데이터 프레임의 내용을 확인해보고 싶다면, 해당 데이터 프레임 object에 "head" 메쏘드를 실행시켜 초반의 몇 줄을 읽을 수 있다:

위에서 볼 수 있듯이, "object_type" 열은 string 데이터 형태를 갖추고 있다. 논리 회귀 모델을 학습시키기 위해선 Boolean 데이터가 필요하다. 새로운 열 "cube"를 생성해서 cube일 경우에는 True로 설정, sphere일 경우 False를 설정하고 기존의 "object_type"은 삭제하도록 하겠다. 

# Transform "object_type" column from string to boolean (1=cube, 0=sphere)
df['cube'] = df['object_type'].apply(lambda x: True if x == 'cube' else False)
df.drop(['object_type'], axis=1, inplace=True)

데이터를 모델 학습을 위해 활용하다 보면, 보편적인 작업 방식은 데이터를 학습과 테스트 두 개의 세트로 나누게 될 것이다. 학습 세트는 모델 학습을 위해 사용되고, 테스트 세트는 모델이 얼마나 예측을 잘 하는지 평가하는 데 사용될 것이다. 이 방법으로 모델을 테스트하면, 모델이 이전에 본 적이 없는 데이터를 제공함으로써 평가의 신뢰성을 높일 수 있다. 

# Define features and split data into train/test sets
x = df.drop('cube', axis=1) # Features without target variable (predictors)
y = df['cube'] # Target variable
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)

여기서, 입력 값인 "x"는 특징 행렬(feature matrix)이다. 소스 데이터 세트에서 "cube" 행을 잘라냄으로서 얻을 수 있다. 

 

그리고, "y"는 모델로 예측하려고 하는 target vector(output variable)이다. 

 

테스트 사이즈는 0.2로 설정되었는데, 이것은 소스 데이터의 20%를 사용해 테스트를 진행하고 나머지 80%는 학습에 사용된다는 뜻이다. 

 

또한 random_state=42는 프로그램이 소스 데이터의 열을 랜덤하게 섞어서 학습을 진행시키라는 것이다. 42는 랜덤값의 시드 넘버이다. 시드 넘버를 설정해 두면 나중에 코드를 실행시켜도 같은 값을 얻을 수 있다. 

 

이 함수는 다음의 값을 리턴한다:

  • x_train: 특징을 위한 학습 세트
  • x_test: 특징을 위한 테스트 세트
  • y_train: 타겟값을 위한 학습 세트
  • y_test: 타겟 값을 위한 테스트 세트

이제 모델 학습을 진행할 수 있다:

# Train model
logmodel = LogisticRegression(max_iter=600000)
logmodel.fit(x_train,y_train)

 

학습된 모델을 파일로 내보내기 전에, 학습의 결과에 대해 파악해둬야 할 필요가 있다:

# Evaluate model
y_pred = logmodel.predict(x_test)
print(classification_report(y_test, y_pred))

해당 결과에서 나오는 "1.0"은 아주 올바른 값이다. 이건 모델의 성능이 완벽하다는것을 알려준다. 아마도 합성 데이터를 사용하였고 특정 문제만으로 사용하였기 때문에 이런 완벽한 값이 나왔을 것이다. 이것은 많은 정보를 알려주지만, 가장 중요한 값은 "Accuracy"이다. 그리고 모델은 테스트 데이터 셋을 사용한 예측에서 100%의 올바른 값을 나타내었다. 

 

이제 학습된 모델을 파일로 내보내는 과정이다:

# Save model
model_path = '/content/drive/MyDrive/PROJECTS/sphere_cube_model.sav'
pickle.dump(logmodel, open(model_path, 'wb'))

 

Google Drive에서 모델 파일을 다운로드하면, 이제 Houdini에서 예측 프로그램을 만들 준비가 다 되었다. 

6. Houdini에서 Sphere 예측하기

이제 만들어진 모델의 성능이 얼마나 좋은지 확인해 보자.

 

셋업은 무지 간단할 것이다. Sphere와 Cube SOP 노드를 만들고, switch에 연결한 후, Python SOP 노드에 연결한다. 

 

Python 프로그램은 연결된 입력의 노드가 어떤것인지 구분할 수 있을 것이다. 이를 작동시키기 위해선 학습을 위한 데이터를 생성할 때와 같은 방식으로 입력 객체에 대한 정보를 읽어야 한다(특징의 수와 이름이 동일해야 함). 그러고 나서 이 데이터를 학습된 모델에 입력하고(logmodel.predict(data_frame)), 그에 따른 예측을 얻는다(True or False).

import hou
import pickle
import pandas as pd

# Load model
model_path = '$HIP/models/$HIPNAME/data/sphere_cube_model_01.sav'
logmodel = pickle.load(open(model_path, 'rb'))

# Get test object data
current_node = hou.pwd()
geo = current_node.geometry()
test_primitive = geo.prims()[0]

# Get data for current object
data = []
data.append({
			"points": len(geo.points()),
			"faces": len(geo.prims())})
            
data_frame = pd.DataFrame(data)

# Determine if it's a Cube
prediction = logmodel.predict(data_frame)[0]

print(f">> This is a Cube: {prediction}")

보다시피, 입력된 물체가 cube인지 아닌지 알 수 있다. 우리는 cube를 타겟 값으로 설정했던 것을 기억하라. 

 

Switch 노드를 조작해서 입력을 바꿔도 예측이 맞는지 확인해 보아라. 

 

이 경우, Houdini의 procedural한 primitive를 분류할 수 있을 뿐만 아니라, Maya에서 cube나 sphere를 만들어서 OBJ로 내보낸 후, Houdini에 File SOP으로 불러온 후 예측을 해도 값이 잘 나오는지 살펴봐라.

 

7. 더 실험해 보기

이 셋업을 재생산해 볼 수 있고 위에서 적힌 대로 작동시킬 수 있다면, 자신만의 연구와 실험을 할 수 있을 것이다. 

 

이 글은 작성자의 탐구의 마지막 결과이다. 다른 논리 회귀 튜토리얼을 따라하기 시작했다가 그곳에서 개념의 결함을 발견하였다. 그리고 나서 나만의 논리 회귀 관련 문제를 풀어내었다. 처음엔 많은 특징들을 가지고 모델을 학습시켜 보았다(곡선률, 크기, 표면적, 그리고 부피와 같은). 하지만 결과적으로 최소한의 특징만 사용하게 되었다. 결론적으로, 면의 개수와 결합된 점의 개수를 이용한다면 굉장히 안정적인 모델을 만들 수 있다는걸 알게 되었다. 

 

7-1. 모델을 부수어 보고 고치려고 해 보아라!

Sphere와 cube의 열이나 행의 수, 크기, 회전 등을 변경해서 모델이 예측을 실패하는 값을 찾아 보아라. 그다음에 새로운 특징을 추가하는 등으로 모델을 고쳐 보아라.

 

작성자는 다른 물체를 실험하는것 외에 다른 방법으로 모델의 결점을 찾지 못하였다. 십이면체(Platonic Solids SOP)을 입력하면 cube로 예측이 된다! 이걸 어떻게 고칠 수 있을까?

 

적은 수의 데이터 샘플을 처음에 사용해보아라. 현재 이 프로젝트에서는 250개의 cube와 sphere가 사용되었다. 하지만 100개의 물체로도 학습이 가능할까? 작성자는 50개의 물체로도 학습을 해 보았지만 모델은 여전히 잘 작동하였다. 조금 의문스러운 부분이다. 어쩌면 10개의 샘플로도 가능할까?

 

Cube와 Sphere 말고 Torus로 학습을 한다면 어떻게 될까?

 

0. 환경 설정

컴퓨터를 가르치는 마법에 빠지기 전에, 다른 부가적인 것들을 설치하고 활용해야 한다. 

0-1. Google Colab

Python 프로그램은 개인 컴퓨터에서도 사용할 수 있다. 이 튜토리얼에서는 적은 양의 데이터 셋을 사용하기 때문에 별로 차이가 없을 것이다. 

 

하지만, 현실적인 시나리오에서는, 계산 리소스가 빠르게 병목 현상이 올 수 있다. 여기서 새로운 것을 배울 수 있는데, Machine Learning을 Google Colab이나 Jupiter Notebook과 같은 클라우드에서 실행시키는것은 아주 보편적인 작업 방식이다. 

 

Google Colab은 접근하거나 사용하기 아주 쉽고, 계산 리소스를 (어느 정도는)무료로 사용이 가능하다. 또한 필요한 라이브러리가 이미 Colab에 설치되어 있어 아주 간편하다. 

0-2. Python

Python을 설치하라. Houdini에 이미 Python이 있으면서 왜 운영체제에 Python이 필요한가? 그건 Houdini와 같이 설치되지 않은 Python 라이브러리가 필요하기 때문이다. 그리고 이것을 설치하기 위해선 시스템에 Python이 설치되어있는것이 더 간편하다. 

 

문제를 피하기 위해, Houdini의 major와 minor Python 버전과 운영체제의 Python 버전이 같아야 한다. Houdini에서 "Python Shell"을 열면, Houdini가 어떤 Python을 사용하고 있는지 알 수 있다. 운영체제에 알맞는 minor 버전의 Python3를 다운받아라.

 

설치를 완료했다면, Window에서 Python이 설치된 위치는 다음과 같다:

C:/Users/<user name>/AppData/Local/Programs/Python/Python310

0-3. Pandas

이 튜토리얼은 Pandas를 사용한다. 데이터를 분석하고 정리, 탐색, 조작하는데 매우 효율적인 라이브러리이다. 

 

명령 프롬프트를 실행하고 πpstallpandas를 적어 설치를 실행하라. Python이 제대로 설치되었다면 다음의 경로에 Pandas가 설치되었을 것이다:

C:/Users/<user name>/AppData/Local/Programs/Python/Python310/Lib/site-packages/pandas

 

이제 Houdini Python에 어디서 Pandas를 찾는지를 알려주면 된다. 아래의 코드를 houdi.env 파일에 추가하라. 

PYTHONPATH = "C:/Users/<user name>/AppData/Local/Programs/Python/Python310/Lib/site-packages;$PYTHONPATH"

0-4. Sklearn

이 프로젝트에서는 Colab을 이용하여 sklearn 모듈을 사용해 모델을 학습할 것이다. 하지만 모델을 Houdini에서 언팩할것이기 때문에, 로컬에서도 해당 라이브러리가 설치되어 있어야 한다. Collab에서 다음과 같이 버전을 확인하라:

import sklearn
print(sklearn.__version__)
>> 1.3.2

πpstallscikit-arn==1.3.2를 이용하여 운영체제에 알맞은 버전을 설치하라. 

'100일 챌린지 > Houdini Masterclass' 카테고리의 다른 글

Day10 - Houdini HDA 사용하기  (0) 2025.01.21
Day 09 - Karma 사용하기  (0) 2025.01.20
Day 08 - curve를 이용한 FLIP fluid 제어하기  (0) 2025.01.20
Day 07 - Bubble pop  (0) 2025.01.15
Day 03 - Solaris, Karma  (0) 2024.07.17