๊ธ/๋ชจ์
๐งญ 3D ์ ๊ตฐ์ผ๋ก ๊ณต๊ฐ AI์ฉ ์ฌ ๊ทธ๋ํ ๊ตฌ์ถํ๊ธฐ
octo54
2025. 6. 30. 16:29
๋ฐ์ํ
๐งญ 3D ์ ๊ตฐ์ผ๋ก ๊ณต๊ฐ AI์ฉ ์ฌ ๊ทธ๋ํ ๊ตฌ์ถํ๊ธฐ
Python์ผ๋ก Spatial AI ์์คํ ์ ์ค๊ณํ๋ ์ค์ ํํ ๋ฆฌ์ผ
โจ ๊ฐ์
์ด ๊ธ์์๋ 3D ์ ๊ตฐ(Point Cloud)์ ๊ธฐ๋ฐ์ผ๋ก **LLM์ด ์ดํดํ ์ ์๋ ๊ณต๊ฐ ๊ทธ๋ํ(Scene Graph)**๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ์๊ฐํฉ๋๋ค. ๋จ์ํ ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋์ด, "์ด ๋ฌผ์ฒด๋ ์ด๋์ ์๋๊ฐ", "๋ฌด์๊ณผ ๊ด๋ จ๋์ด ์๋๊ฐ"๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ํํํ ์ ์์ต๋๋ค.
๐ ์ฃผ์ ๊ตฌํ ํ๋ฆ
- Open3D๋ฅผ ํตํ ์ ๊ตฐ ๋ก๋ฉ ๋ฐ ์๊ฐํ
- DBSCAN ๊ตฐ์งํ๋ก ๊ฐ์ฒด ๋จ์ ๋ถ๋ฆฌ
- ๊ฐ ๊ฐ์ฒด์ ์ค์ฌ์ ๊ณ์ฐ
- NetworkX๋ก ๊ฐ์ฒด ๊ฐ ๊ทธ๋ํ ์์ฑ
- ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ ๊ณต๊ฐ ๊ด๊ณ ๋ถ์ (‘๊ฐ๊น์’, ‘์์ ์์’ ๋ฑ)
- LLM์ด ์ฒ๋ฆฌ ๊ฐ๋ฅํ JSON ๊ตฌ์กฐ๋ก ๋ณํ
- ์ง๋ฌธ-์๋ตํ Spatial AI ์์คํ ์ผ๋ก ํ์ฅ
๐ ์์ ์ฝ๋ ์์ฝ
import open3d as o3d
import numpy as np
import networkx as nx
from itertools import combinations
# ์ ๊ตฐ ๋ก๋ฉ
pcd = o3d.io.read_point_cloud("scene.pcd")
labels = np.array(pcd.cluster_dbscan(eps=0.05, min_points=10))
# ๊ทธ๋ํ ์ด๊ธฐํ
G = nx.Graph()
# ๋
ธ๋ ์ถ๊ฐ
for label in np.unique(labels):
points = np.asarray(pcd.points)[labels == label]
centroid = points.mean(axis=0)
G.add_node(label, label="object", centroid=centroid)
# ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ ์ฃ์ง ์ถ๊ฐ
for i, j in combinations(G.nodes, 2):
c1, c2 = G.nodes[i]["centroid"], G.nodes[j]["centroid"]
distance = np.linalg.norm(c1 - c2)
if distance < 1.0:
G.add_edge(i, j, relation="near")
๐ฌ ๋์ ์๊ฐ
๋ฐ์ํ
- ์ ์ค์ํ๊ฐ?
๊ณต๊ฐ์ ํด์ํ๋ AI๋ ๋จ์ํ ์ด๋ฏธ์ง๋ ์ขํ๋ฅผ ๋์ด์, ๊ตฌ์กฐํ๋ ์๋ฏธ ๊ด๊ณ๋ฅผ ์ดํดํ ์ ์์ด์ผ ํฉ๋๋ค.
์ด ํํ ๋ฆฌ์ผ์ ๊ทธ ๊ธฐ์ด ๋จ๊ณ๋ฅผ ๋งค์ฐ ์ค์ฉ์ ์ผ๋ก ๋ณด์ฌ์ค๋๋ค. - ์ด๋์ ์ธ ์ ์๋?
- ์ค๋ด ๋ก๋ด ๋ด๋น๊ฒ์ด์
- AR/VR ๊ฐ์ฒด ํ์ง
- ์์จ์ฃผํ์ฐจ ๋ด ๊ณต๊ฐ ๊ตฌ์ฑ ๋ถ์
- LLM ๊ธฐ๋ฐ ์ฌ ํด์ ๋ฐ ๋ช ๋ น ์ํ
- ๋ ๋์๊ฐ๋ฉด?
๊ด๊ณ๋ฅผ ๋จ์ ๊ฑฐ๋ฆฌ๋ก ๊ณ์ฐํ๋ ๋์ , GNN ๊ธฐ๋ฐ ๊ด๊ณ ์์ธก ๋ชจ๋ธ์ ๋ถ์ฌ๋ ์ข์ต๋๋ค.
์: SGAligner, Open3DSG, Hydra, SceneFormer ๋ฑ.
3D ์ฌ ๊ทธ๋ํ,Spatial AI ํํ ๋ฆฌ์ผ,Python ์ ๊ตฐ ๋ถ์,Open3D ์ค์ต,NetworkX ๊ทธ๋ํ ๊ตฌ์ถ,๊ณต๊ฐ ๊ด๊ณ ์ถ๋ก ,LLM ๊ทธ๋ํ ํตํฉ,AR VR 3D ํด์,DBSCAN ๊ฐ์ฒด ๋ถ๋ฅ,AI ๋ก๋ด ์๊ฐ์ง๋ฅ