基於LLM打造沉浸式3D世界

阿里妹導讀
阿里雲資料視覺化產品DataV團隊一直在三維互動領域進行前沿探索,為了解決LLMs與3D結合的問題,近期在虛幻引擎內結合通義千問大模型家族打造了一套基於LLM的即時可互動3D世界方案,透過自然語言來與引擎內的3D世界進行互動。
背景介紹
大型語言模型(Large Language Models, LLMs)的出現標誌著自然語言處理領域的一個變革時代,使機器能夠以前所未有的方式理解、生成和互動人類語言。然而,物理世界本質上是三維的,理解空間3D環境對於涉及感知、導航和互動的許多現實應用至關重要。
將LLMs與3D資料融合,提供了一個獨特的機會,可以增強計算模型對物理世界的理解和互動,從而在多個領域引領創新,包括自主系統、增強現實、機器人導航和機器人操作。近期的研究表明,整合LLMs與3D資料可以透過利用LLMs的固有優勢,如零樣本學習、先進推理和廣泛知識,在複雜的3D環境中進行解釋、推理和互動。
然而,LLMs與3D資料的整合並非易事。3D資料表示、模型可擴充套件性和計算效率等問題仍是重大障礙。此外,確保模型能夠在現實世界環境中執行,需要克服與資料多樣性和環境複雜性相關的挑戰。解決這些問題對於充分實現LLMs在3D應用中的潛力,創造動態和情境感知的人工智慧系統至關重要。
阿里雲資料視覺化產品DataV團隊一直在三維互動領域進行前沿探索,為了解決上述LLMs與3D結合的問題,近期我們在虛幻引擎內結合通義千問大模型家族打造了一套基於LLM的即時可互動3D世界方案,透過自然語言來與引擎內的3D世界進行互動,包括:
  1. 模型搜尋與建立:根據使用者自然語言描述從三維模型庫中搜索與之匹配的模型,並建立物件。例如,您可以要求在場景中生成一張現代風格的雙人床。
  2. 3D物件操作:與場景中的物體進行物理互動,這可以包括拾取和移動物體,甚至是更復雜的動作序列以及多物體的聯合操作,如:更改場景中咖啡桌和杯子的相對位置。
  3. 場景理解與編輯:在執行時以創造性或有用的方式修改現有場景,例如進行房間佈局或者更改各種物體的顏色以適應色盲人士等。
【影片:LLM驅動的三維場景互動預覽】
一、三維世界的元資料生成與表達
模型資訊的收集
組成3D世界最基本的單位就是一個一個的3D模型,如何讓LLMs接收3D資訊成為首要關注點。常見的3D模型表示如下:
  1. 多邊形網格 由頂點和表面組成,以緊湊的方式描述複雜的3D形狀。然而,其非結構化和不可微分的性質在將其與神經網路整合以實現端到端可微管道時提出了挑戰。為解決這一問題,一些基於梯度近似的方法只能使用手工計算的梯度,其他解決方案如可微光柵化器可能導致渲染結果不精確,如內容模糊。
  2. 點雲 透過空間中的一組資料點表示3D形狀,儲存每個點在3D笛卡爾座標系中的位置。除了儲存位置外,還可以儲存其他資訊(例如顏色、法線)。基於點雲的方法以其低儲存佔用而聞名,但缺乏表面拓撲資訊。獲取點雲的典型來源包括LiDAR感測器、結構光掃描器、飛行時間相機、立體檢視和攝影測量等。
  3. 體素網格 由3D空間中的單元立方體組成,類似於2D中的畫素表示。每個體素至少編碼佔用資訊(以二進位制或機率形式),但也可以編碼到表面的距離,例如簽名距離函式(SDF)或截斷簽名距離函式(TSDF)。然而,當需要高解析度細節時,記憶體佔用可能會變得過高。
  4. 神經場 在3D研究社群中逐漸受到關注,與依賴幾何原語的傳統表示形式不同。神經場是一種從空間座標到場景屬性(如佔用、顏色、輻射等)的對映,與體素網格中從離散單元到該體素值的對映不同,神經場的對映是一個學習函式,通常是多層感知機(MLP)。這種方式使神經場能夠隱式地學習緊湊、連續和可微的3D形狀和場景表示。
  5. 混合表示 嘗試將NeRF技術與傳統的體積基礎方法結合,促進高質量、即時渲染。例如,將體素網格或多解析度雜湊網格與神經網路結合,大大減少了NeRF的訓練和推理時間。
  6. 3D高斯濺射 是點雲的一種變體,每個點包含代表該點周圍空間區域發出的輻射的額外資訊,作為各向異性3D高斯“斑點”。這些3D高斯通常從SfM點雲初始化,並使用可微渲染進行最佳化。3D高斯濺射透過利用高效的光柵化而非光線追蹤,實現了比NeRF計算量小得多的狀態-of-the-art新檢視合成。
然而傳統LLMs僅限於文字作為輸入和輸出,缺乏對外部世界或即時環境的理解。它們只依賴於所接受的訓練文字,無法直接接收上述的3D表示形式。為了能夠讓LLMs感知到3D資訊,總體思路是將3D物體或場景資訊對映到語言空間,建立語言空間的3D模型表示,從而使LLMs能夠理解和處理這些3D輸入。
為了描述一個模型,我們可以建立如下的模型描述檔案,包括模型的資產資訊、語義描述、幾何資訊、材質資訊、等:
{//1. 資產資訊"ReferencePath":"/Game/ArchVizInteriorVol3/Meshes/SM_Bed.SM_Bed",//資產引用路徑"Name":"SM_Bed",//資產名字//2. 語義描述"Description":"這是一張床",// 語音描述//3. 幾何資訊"Pivot":"物體中心",//物體錨點"GeometryInfo":{"vertices":59997,//頂點數"Triangles":"114502",//三角形數"xxx":""  },"BoundingBox":{"center":[xx,xx],"extend":[xx,xx]  },//包圍盒資訊//4. 基本材質資訊"Materials":[    {"MI_Bed_Fabric_1":["BaseColor":xxx,"BaseFallof":xxx    ]}  ]}
其中的大部分資訊,我們可以在Unreal引擎中透過對模型資產基本資訊的解析進行填充:
  1. 資產基本資訊:如ReferencePath,這是模型在引擎中的索引路徑,可以根據索引路徑載入對應的模型
  2. 材質資訊:主要的可以動態修改的材質引數
  3. 幾何資訊:頂點數、UV資訊等
但是隻靠UE資產的資訊解析顯然是不夠的,其中缺少關鍵的語義描述資訊“Description。傳統的方法是基於人工打標的方式給3D模型進行打標,這些標籤便成為模型在語言空間的表示,並透過這些標籤在模型庫中進行搜尋。這種方法不但費時費力,並且,如果想全面的描述一個模型,可能需要大量的tag進行標記:
我想要一張床 || 我想要一張雙人床 || 我想要一張現代風格的雙人床 || 我想要一個頂點數小一些的雙人床 || 我想要一個紅色的雙人床 || 我想要一張床上有個黑色小熊的紅色雙人床
為了能夠填充一個合適的語義描述資訊,我們使用視覺-語言模型(Vision-Language Models, VLMs)進行描述資訊的填充, 這種任務型別通常被稱為物體級標註:
物體級標註 要求模型生成單個3D物體的簡短自然語言描述。此描述應關注物體的關鍵特徵,包括其形狀和語義特徵。
在Unreal引擎中利用VLMs進行物體級標註,比如對於這樣一張床,讓通義千問VL-Max幫我們形成其描述資訊,可以看到是非常準確的,大模型不僅幫我們總結了三維模型的主體構成部分,甚至連光影效果、設計風格等細節部分都進行了整理。
當把標註好的資訊填充到模型描述檔案的“Description”欄位後,我們就完成了對一個三維模型的自然語言級別的表示。對所有的模型進行這個編碼後,我們便可以獲得一個自然語言空間下的三維模型庫,並透過“ReferencePath”這個欄位與實體的三維模型進行關聯,核心步驟如下:
  1. 對於每個模型:
  1. 根據UE資產生成基本資訊
  2. 生成大小為640×640的縮圖
  3. options:生成多視角縮圖
  4. 向大模型發起請求:Message{1. 這是一個三維模型的截圖,請幫我詳細描述這個三維模型的資訊 2 Image[縮圖]}
  5. 獲取大模型的返回,填充到Description欄位
  6. 將模型描述資訊填充到DataTable,並匯出.csv檔案
由此,藉助VLMs,我們建立了每個模型在自然語言空間的表示。
收集所有的模型,即可建立一個自然語言空間下的三維模型庫。如下圖所示,並透過“ReferencePath”這個欄位與實體的三維模型進行關聯。
模型搜尋
至此能夠被大模型理解的模型的資訊庫已經全部生成,下一步就是大模型如何利用這個資訊庫,輔助我們進行模型的搜尋,最終實現能夠根據使用者自然語言的輸入,輸出模型在引擎中的描述路徑“ReferencePath”,從而找到對應的三維模型實體。
我想要一張床 || 我想要一張雙人床 || 我想要一張現代風格的雙人床 || 我想要一個頂點數小一些的雙人床 || 我想要一個紅色的雙人床 || 我想要一張床上有個黑色小熊的紅色雙人床
為了能夠讓大模型感知到這個模型資訊庫,我們使用大模型的知識檢索增強(RAG)能力,這裡以阿里雲百鍊平臺+通義千問-max模型為例,結合我們3D模型表示過程中建立的三維模型庫的知識庫展示搭建一個智慧體應用的過程,專門用於三維模型的搜尋。
Assistant API 支援知識檢索增強(RAG)工具,讓智慧體能夠根據您的需求獲取外部知識,例如私有產品知識或客戶的偏好資訊。本文介紹了一個簡單的“手機導購”示例,幫助您快速上手RAG工具的基本使用方法。
步驟一:在“資料管理”-“結構化資料”下匯入三維模型庫資訊
步驟二:在“知識索引”-"建立知識庫"下匯入上一步的知識,建立知識庫
步驟三:在“我的應用”-“新增應用”-“建立RAG應用”下,建立RAG應用,並配置剛剛建立好的知識庫,然後可以進行一些搜尋的驗證。
步驟四:智慧體應用呼叫,可以在Unreal引擎中透過HTTP的介面呼叫百鍊的應用
至此,我們便透過VLMs建立了每個三維模型的自然語言空間的表示,並藉助大模型的RAG能力可以快速的找到符合我們自然語言描述的模型,大大的提高搜尋效率。
【模型搜尋和建立】
二、基於大模型的3D場景理解
在有了3D模型的表示後,下一步就是形成場景級別的表示,被稱為3D場景理解,也被稱為場景級標註:
場景級標註 是為整個3D場景生成簡短自然語言描述。此類描述通常關注全域性場景資訊(如房間型別和風格)、場景中的關鍵物體及其關係。並建立與場景中的實體的一一對映關係,也即為每個場景中的實體增加語義標籤。
為了獲取場景級標註中的全域性場景資訊,以及關鍵物體及其關係,我們可以將不同視角下的場景截圖直接餵給VLMs,可以看到大模型不但給出了物體資訊、佈局資訊、空間資訊,而且就很多細節以及場景的特點都給出了準確的描述。然而這其中有個關鍵的Mapping問題:因為VLMs只提供了3D場景的抽象文字描述,未能建立描述與Unreal引擎場景內實體的對應關係。在Unreal引擎中的場景描述是一個一個的Actor,我們只知道其中有兩個大型吊燈,卻不知道哪個Actor是大型吊燈,從而接下來的三維場景互動也就無從說起。因此場景理解的關鍵點就是建立抽象文字描述與場景內的一一對映關係。
為了解決這個問題,我們有多種策略,本質上就是解決多對多的Mapping問題。
策略一:
核心思路:控制出現在場景截圖中的物體數量
核心步驟:
  1. 收集場景中的所有模型
  2. 隱藏所有模型
  3. 【for迴圈】對於每個模型
  1. 設定其可見性為true
  2. 根據BoundingBox計算相機位置,並移動相機到正確的位置
  3. 生成640×640的縮圖
  4. options:生成多視角縮圖
  5. 向大模型發起請求:Message {1. 這是一個三維模型的截圖,請幫我詳細描述這個三維模型的資訊 2 Image}
  6. 獲取大模型的返回,根據3D模型的UUID,填充到對應物體的Description欄位上

優勢:準確

劣勢:

  1. 在場景元素眾多的情況下,這個for 迴圈可能非常大
  2. 隱藏場景後,丟失場景輔助資訊,可能識別不準,比如同樣是一個杯子,如果在咖啡廳環境下,可能被認為是一個咖啡杯,如果是在酒吧環境中,可能被認為是一個酒杯。
策略二:
核心思路:保留全部物體,使用實體的唯一識別符號標記要重點識別的物體
核心步驟:
  1. 收集場景中的所有模型
  2. 隱藏所有模型
  3. 【for迴圈】對於每個模型
  1. 設定其可見性為true
  2. 根據BoundingBox計算相機位置,並移動相機到正確的位置
  3. 設定該模型為選中態,為該模型生成outline
  4. 生成640×640的縮圖
  5. 向大模型發起請求:Message{1. 這是一個三維場景的截圖,其中關鍵物體已經被黃色框選中,請幫我詳細描述這個被黃色框選中物體的資訊 2. Image}
  6. 獲取大模型的返回,獲取3D模型的UUID,根據UUID填充到對應物體的Description欄位上
輸入:【高腳椅被選中】
輸出:

優勢:

  1. 準確
  2. 有場景輔助資訊,增強場景整體邏輯的描述

劣勢: 

  1. 在場景元素眾多的情況下,這個for 迴圈可能非常大
策略三:
核心思路:保留場景輔助資訊的同時,在一個請求的情況下,使用實體UUID儘可能多的標記物體
核心步驟:
  1. 收集場景中的所有模型
  2. 【for迴圈】對於每個關鍵視角
  1. 視口內的Actor(實體模型)計算其螢幕空間的mask,並在該mask上新增該Actor的唯一識別符號
  2. 生成640×640的縮圖
  3. options:生成多視角縮圖
  4. 向大模型發起請求:Message{1. 這是一個三維場景的截圖,我使用紅色框圈了一些主要物體,請給出這些方框分別描述了什麼物體,以及對該物體進行描述,注意,如果方框記憶體在多個物體,返回的物體應該滿足以下要求:在所有存在方框內的物體,方框圈住該物體的比例佔該物體全部範圍最大。以json格式輸出其物品型別以及描述。2 Image}
  5. 獲取大模型的返回,根據Key找到對應的Actor,然後將Value填充到Description欄位
  6. 重複
輸入:【手動框選幾個主要物體,並標註】
輸出:

優勢:

  1. 準確
  2. 有場景輔助資訊,增強場景整體邏輯的描述
  3. 同一張圖批次獲取模型資訊,減少大模型呼叫次數

劣勢: 

  1. 多物體可能存在遮擋情況,致使大模型判別不準
綜合使用如上幾種策略後,我們一方面可以獲取場景的全域性場景資訊(如房間型別和風格)、場景中的關鍵物體及其關係,也建立與場景中的實體的一一對映關係,同時我們也可以根據實體的唯一識別符號收集一些引擎內的資訊,如位置、錨點、空間關係等。綜合上述所有資訊,可以形成這樣一份場景描述檔案,這個場景描述檔案+當前場景的截圖構成了大模型與3D場景之間相互握手的橋樑,輔助大模型認識、感知和理解3D場景。舉例:大模型透過圖片識別到場景中有幾把椅子,並透過場景描述檔案,將圖片中的椅子與3D場景中的椅子建立了對映。
{"name": "StaticMeshActor_1","uUId": "7D70F97241D37F14A1C649860C7FE24D","Description": "一張雙人床","transform":      {"rotation":        {"x": 0,"y": 0,"z": 0,"w": 1        },"translation":        {"x": 0,"y": 0,"z": 0        },"scale3D":        {"x": 1,"y": 1,"z": 1        }      },"boundingBoxCenter":      {"x": 21.368782043457031,"y": 1.3006591796875,"z": 49.454704284667969      },"boundingBoxExtent":      {"x": 118.88101959228516,"y": 112.37855529785156,"z": 49.406597137451172      }    },    {"name": "StaticMeshActor_2","uUId": "453F4F714546496132DA4EA97D22A636","Description": "一個書架","transform":      {"rotation":        {"x": -1.2325951644078309e-32,"y": -0.70710678118654746,"z": 6.1629758220391547e-33,"w": 0.70710678118654735        },"translation":        {"x": 1.5,"y": 0.5,"z": 0        },"scale3D":        {"x": 1,"y": 1,"z": 1        }      },"boundingBoxCenter":      {"x": -24.001873016357415,"y": 1.0605430603027344,"z": -0.34783363342284446      },"boundingBoxExtent":      {"x": 25.503879547119134,"y": 19.990333557128906,"z": 19.498573303222656      }    }
三、對話式的3D世界互動
3D世界互動操作指的是自然語言與Unreal引擎內物體物理互動的能力,從移動物體到複雜的操作序列,如組裝零件或開門或者調整天氣等。在建立好三維模型表示以及能夠對場景進行理解後,使LLMs能夠執行操作任務的核心思想在於將動作序列標記化。為了讓LLMs輸出特定動作,然後Unreal引擎執行對應的動作,首先需要FunctionCall,使LLMs能夠根據任務和3D場景上下文生成這些FunctionCall。
舉例:
user: 我想要在場景中的桌子上放置一個杯子
大模型接收到這個邏輯後,會先去收集場景資訊,確定桌子的位置資訊等等,然後去三維模型庫去找杯子的ReferencePath,然後嘗試生成這個杯子到桌子上去,邏輯是這個邏輯,但是我們非常清楚,標紅的四個行為都是要對應一個函式呼叫的,要不然只能存在在語言層面,不會產生實際的行為。透過對對應Unreal引擎API的描述,讓大模型知道在放置對應模型時應該呼叫哪個Unreal函式以及提供什麼引數
Function Calling(函式呼叫)使開發人員能夠描述函式(也稱為工具,您可以將其視為模型要執行的操作,例如執行計算或下訂單),並讓模型智慧地選擇輸出包含引數的 JSON 物件來呼叫這些函式。
在上述例子中我們至少要新增如下幾個FunctionCall:
  1. GatherSceneInfo:負責發起場景理解,形成場景描述檔案
  2. GetObjectReferencePath:負責根據使用者的描述,去RAG應用裡搜尋三維模型庫,然後返回ReferencePath等以及其他重要資訊
  3. SpawnObject:根據Referencepath生成Actor
  4. MoveObject:根據輸入的Transform調整Actor的Transform
本例中我們以SpawnObjec為例,說明Function Call的流程:
  1. 在Unreal引擎內新增SpawnObject的函式,並實現生成物體的邏輯
  2. 描述Function
  1. 描述函式的名字、函式的描述、主要引數、主要引數的描述。
{"type": "function","function":            {"description": "在場景中生成或者放置一個物體",//描述函式的主要作用"parameters":                {"type": "object","properties"://描述函式的引數                    {"ReferencePath":                        {"type": "string",//描述函式的引數的型別"description": "要生成物體的ReferencePath"//描述函式的引數的含義                        },"description":                        {"type": "string","description": "要生成物體的描述"                        },"pos_x":                        {"type": "number","description": "物體在x軸上的位置"                        },"pos_y":                        {"type": "number","description": "物體在y軸上的位置"                        },"pos_z":                        {"type": "number","description": "物體在z軸上的位置"                        },"rot_x":                        {"type": "number","description": "物體繞x軸的旋轉角度"                        },"rot_y":                        {"type": "number","description": "物體繞y軸的旋轉角度"                        },"rot_z":                        {"type": "number","description": "物體繞z軸的旋轉角度"                        },"scale_x":                        {"type": "number","description": "物體在x軸上的縮放係數,預設為1.0"                        },"scale_y":                        {"type": "number","description": "物體在y軸上的縮放係數,預設為1.0"                        },"scale_z":                        {"type": "number","description": "物體在z軸上的縮放係數,預設為1.0"                        }                    },"required": [//描述呼叫該函式需要哪些引數"ReferencePath","description","pos_x","pos_y","pos_z","rot_x","rot_y","rot_z","scale_x","scale_y","scale_z"                    ]                },"name": "spawn_object"            }        }
  1. 將該FunctionCall註冊到大模型。
  2. 模型發現需要呼叫該函式時會返回如下,解析這個命令,根據FunctionCall即可呼叫真正的Unreal函式來實現對應的功能。
 LogChatGPT: Display: [CityV]: OpenAI call the function: [spawn_object] with args: {"ReferencePath": "/Game/ArchVizInteriorVol3/Meshes/SM_Bed", "description": "一張雙人床", "pos_x": 0, "pos_y": 0, "pos_z": 0, "rot_x": 0, "rot_y": 0, "rot_z": 0, "scale_x": 1.0, "scale_y": 1.0, "scale_z": 1.0}
當輸入為:“把杯子移動到咖啡桌的頂部中心位置”時,大模型會根據場景資訊找到對應的杯子和咖啡桌,並計算移動的位置,然後發起FunctionCall,呼叫MoveObject方法,真正的在Unreal引擎中移動杯子到指定的位置。
【輸入:把杯子移動到咖啡桌的頂部中心位置】
總結
至此我們介紹了基於LLM打造即時可互動3D世界的要的三個核心模組:
  1. 3D模型表示:告訴大模型如何“認識”3D模型
  2. 3D場景理解:告訴大模型如何“理解”3D場景
  3. 3D世界互動:透過FunctionCall的形式將LLM轉為Unreal引擎中實際可操作的函式。
總的來說,藉助Unreal引擎和通義千問家族大模型,我們探索了LLMs與3D結合,在理解和與複雜3D世界互動方面的能力。
展望
大型語言模型(LLMs)的獨特優勢,如上下文學習、逐步推理、開放詞彙能力和廣泛的世界知識,它們在提升空間理解和互動方面的巨大潛力。將LLMs與3D資料融合,提供了一個獨特的機會,可以增強計算模型對物理世界的理解和互動,從而在多個領域引領創新,包括自動駕駛、具身智慧、3D生成等。
自動駕駛領域:大模型在自動駕駛的資料標註、模擬和感知環節應用潛力十足。資料標註方面, 技術從人工標註轉為 AI 主導人工輔助。一方面,視覺大模型知識完備性好、精度高、泛化能力強;另一方面,自動駕駛資料積累和標註複雜度提高使資料標註工作量快速增加,AI 大模型的應用有助於加速資料標註並大幅降低資料生產成本。
具身智慧領域:LLMs的規劃、工具使用和決策能力可以用於建立3D具身智慧體。這些能力使LLMs能夠在3D環境中進行導航,與物體互動,並選擇適當的工具來執行特定任務。
3D生成領域:LLMs與3D結合可以改善傳統建模複雜且耗時的情況,根據語言可以生成情景化的物件或者場景。
總的來說,LLMs在處理、理解和生成3D資料的方法、應用展現了新興能力和強大的變革潛力,為空間智慧的進一步發展鋪平道路。
從 HTTP 到 HTTPS 讓網站更安全
本方案介紹如何在ECS上搭建Web應用以及在Nginx伺服器上部署SSL證書開啟HTTPS安全訪問。    
點選閱讀原文檢視詳情。

相關文章