跳到主要內容

013互動

三分鐘打造迷你 Figure AI:只給它一顆相機、一隻手臂

Figure 的人形機器人只靠頭上的相機做事。這裡從零做一個最小的版本:一隻方塊畫成的手臂,靠一顆 48 × 48 的相機把方塊拿起來、放到你指定的地方。把相機撞歪它照樣放得好;縮小版你可以在瀏覽器裡花三分鐘自己練一個。

發布
閱讀時間
10 分鐘

Figure 的人形機器人在倉庫裡揀包裹,眼睛是頭上的相機。頭會轉、身體會晃,相機裝得再牢也不可能一整天都剛好在出廠校正的位置。那它憑什麼每次都抓得到?

下面是一個縮小到極點的版本:一隻手臂、一個紅色方塊、一塊綠色的目標墊,和一顆裝在「頭」上的相機,畫面只有 48 × 48 像素。手臂的工作是把方塊拿起來,放到目標墊上。

fig 01/head camera / pick and place

載入模型中…

頭部相機 48×48 · 每步重看
去拿方塊放好 0 次
撞歪頭部相機
弄髒畫面
拖紅色方塊和綠色目標墊(滑鼠移上去會出現光環和箭頭),再用滑桿把頭部相機撞歪。藍色的線是相機的視野,右上角是它看到的畫面。左上角換三個事先練好的模型:「看一眼」先拍一張照片、算出方塊和目標在哪,然後閉著眼睛做完,粉紅色虛線是它以為的位置。方塊只能放在紫色虛線框裡,原因在後面。

先讓它放好一次。然後把「下傾」拉到 10°,換一個擺法,三個模型各試一次。「看一眼」會很有把握地在空無一物的地方夾下去;「持續看」在方塊附近打轉;「持續看+晃過相機」歪著相機,照樣放好。手臂搬到一半時把目標墊拖走也可以試試。

這篇要講的就是這三者的差別。答案不是把相機校得更準,而是每一步都重新看,看的是手和目標之間差多少,而且要用對的方法訓練,網路才會真的這樣做。

先說這不是什麼。這不是 Figure:世界是方塊畫出來的,夾爪離方塊 3 公分內就夾得住,網路只有幾千個參數。它留下來的只有一件事:只靠頭上一顆相機,學示範的動作

看一眼:算出位置,然後閉著眼睛做

最直覺的做法是把問題拆成兩步。先從畫面算出方塊和目標在桌上的哪裡,再用手臂的關節把手送過去。第二步很準,因為手臂知道自己每個關節轉了幾度。

問題在第一步。從一個像素算回桌上的位置,要用到相機的位置和朝向。只要相機比你以為的往下多傾 5°,同一個像素對應到桌上的點就差了 8.8 公分,是方塊寬度的兩倍。

fig 02/head camera / one look
九個位置平均差
8.8cm

差 3 公分以上就碰不到方塊。這裡沒有任何學習,只有幾何:計算是完美的,錯的只是它以為相機還在原位。

從上往下看的工作台。紅色是方塊真正的位置,粉紅虛線是「從像素算回桌面」得到的位置。計算本身是完美的,錯的只是它以為相機還在原位。

差多少隨位置而變;再加一點左右轉,連差的方向都不一樣,所以沒辦法事後補一個固定的修正。

持續看:只管手和目標差多少

另一種做法完全不算東西在哪。它每一步都看一次畫面,找到手、找到目標,看兩者在畫面上差多少,往縮小差距的方向動一小步。

它的誤差有一個很好的性質:手真的在目標上的時候,兩者在畫面上的差距就是零,不管相機歪成什麼樣子。 相機歪了,每一步走的方向會有點偏,但下一步看到的是新的差距,偏了就修回來。這叫視覺伺服,是機器人學裡的老方法。在只要碰到方塊的縮小版上,用真正的像素位置、不經過任何學習去試:它在相機歪 20° 時還是每次都到;「算位置」的做法歪 2° 就只剩一成。

這篇剩下的部分要問的是:一個網路從示範裡學,會不會自己學成這樣?

學出來的「持續看」,一樣會被騙

我用一個腳本當老師:它知道方塊和目標在哪,每一步都說該往哪移、要不要下降、要不要夾。網路每一步只看 48 × 48 的畫面,外加手的高度和夾爪是開是合,學著說出同樣的話。訓練時相機固定不動。

結果不是視覺伺服。圖 1 裡的「持續看」就是這樣練出來的:相機沒動時它幾乎每次都放好,下傾 5° 剩一半,下傾 10° 是 1%

訓練時相機從來沒動過,「方塊在畫面的哪裡」和「手離方塊多遠」永遠一起變,兩個都能完美解釋老師的每一句話。網路沒有理由偏好後者;相機一歪,它依賴的前者就錯了。

解法:訓練時把相機晃一晃

那就讓前者在訓練時就行不通。每一張訓練畫面都用一個隨機歪掉的相機拍:上下左右各 ±10°,位置 ±3 公分。這樣「東西在畫面的哪裡」不再能預測該怎麼走,只剩「手和目標差多少」還可靠。

四種做法,各五個隨機種子的平均:

沒動下傾 10°轉 10°方塊被移走目標被移走
看一眼66%0%0%18%12%
看一眼+晃相機51%53%46%16%11%
持續看96%1%9%94%96%
持續看+晃相機95%93%92%95%96%

橫著看:沒晃過相機的兩列,一歪就幾乎是零;晃過的兩列,歪不歪幾乎一樣。直著看:東西中途被移走,「看一眼」跟不上,「持續看」不受影響,因為它本來就每一步都重新看。

後兩列都練了 60 000 步,相機沒動時一樣好(96% 和 95%),差別只在相機歪掉之後。最後一列五個種子都在 92% 以上,這個數字得來不易:只練 20 000 步時,五個種子是 100、97、59、37 和 2.5。差的不是方法,是學得快慢,同樣的種子多練兩倍就全部到位。

拿起來,比碰到難在哪

這個任務我失敗了三次才練起來。

老師的話要平滑。 第一版老師是「先升高、再平移、再下降」。「現在該不該平移」取決於高度過了門檻沒有,小網路學不會這種開關,手懸在半空一動不動。改成「永遠朝目標走,高度隨距離平滑下降」才學得起來。

稀有的動作要多練。 「夾」只在手又低、又在方塊正上方時才出現,隨機抽的訓練畫面裡不到 1%。網路學到的是「幾乎永遠不要夾」。把五分之一的訓練畫面改成抽在這個區域,它才敢夾。

手會擋住方塊。 手降到方塊正上方時,從頭上看下去,手把方塊蓋住了,最後兩公分沒有東西可以對準。所以這裡的夾爪容許 3 公分的誤差。同一件事還有一個更大的版本,就是圖 1 的虛線框為什麼沒有涵蓋整張桌面:框外那一側離相機最遠,手伸過去時,手掌和前臂剛好夾在相機和方塊之間,手還離 8 公分,方塊在畫面裡就一個像素都不剩了。網路沒有記憶,看不到就不知道往哪走。我把工作台每 2 公分量了一遍:框裡的每一格,20 次至少放好 19 次;框外有一大片一次都放不好,所以頁面不讓方塊出去。目標墊又大又平,放哪裡都沒問題。

Figure 03 在手掌上加了相機,官方的理由是「主相機被擋住的時候」要有近距離的畫面。這裡看得到為什麼。

解析度也是這裡才變成問題的。32 × 32 時一個像素是桌面上 1 到 2 公分,這個任務要對準兩次、各 3 公分:練到四萬步停在七成上下;換成 48 × 48,兩萬步就到九成(各兩個種子)。

自己練一個

拿起放下的模型要練幾十分鐘,不適合放在網頁裡。但同一個故事有一個三分鐘的版本:任務縮小成「把手移到方塊上」,畫面 32 × 32,網路 2 138 個參數。配方和圖 1 的第一個模型一樣:持續看、晃相機,外加後面兩節會講的兩樣東西。16 萬張畫面,全部在你的瀏覽器裡用 JavaScript 跑,不用 GPU。

fig 03/head camera / train

固定的一張畫面:看 8 個關鍵點怎麼慢慢找到手和方塊

在你的瀏覽器裡、用 JavaScript 從零訓練。訓練期間可以繼續往下讀。
步數
0
已經過
0
大約還要

動作的誤差

10 000 步,每步 16 張隨機畫面,每張的相機、雜訊和亮度都不一樣。左邊是一張固定的畫面,彩色點是網路此刻的 8 個關鍵點。練完會在 100 個隨機位置上測驗,然後換你:左邊的畫面會開始一回合一回合地跑你練的模型,用滑桿把它的相機弄歪。

在我的電腦上(M4 Pro,Chromium)要 190 秒。種子是隨機的,所以每次結果不同:我用同樣的配方練了五次,相機沒動時是 88% 到 98.5%。

它在看哪裡

網路的最後一層卷積,會把畫面壓成 8 個點的座標,就是圖上的彩色點。網路後面的部分只拿得到這 16 個數字,所以這 8 個點就是它「看」的東西。

fig 04/head camera / keypoints
訓練時相機沒動過
訓練時相機被晃過
同一張畫面,兩個縮小版的網路各自的 8 個關鍵點。左邊訓練時相機從沒動過,右邊被晃過(圖 3 的配方)。多換幾個場景,看哪些顏色的點跟著紅色方塊走、哪些跟著青色的手走。

右邊的黃點和洋紅點跟著方塊,藍點跟著手;左邊只有黑點跟著手,沒有任何一個點跟著方塊。

這不是每次都這麼整齊。沒晃過相機的模型,五個種子裡只有一個長出專門跟著方塊的點;晃過的,五個裡有三個,沒長出來的兩個照樣有 91% 和 92.5%。所以一個點落在方塊上,是它在看方塊的明顯證據,不是必要條件。

配方裡多的第一樣東西,和這件事有關。訓練時網路除了說「往哪走」,還要用這 8 個點說出「手和方塊在畫面的哪裡」。這一題只在訓練時出現,練完就丟掉,但在縮小版上,它把 5 000 步時最差的種子從 43% 拉到 70%。Figure 有一個叫 visual proprioception 的做法,只靠機器人自己的相機估計自己的手在哪裡,這一題是它的迷你版。

它會怎麼壞

圖 1 的三個模型,遇到訓練時沒見過的光線和雜訊(各 200 個擺法)。圖 1 的滑桿可以試同一件事,右上角的小畫面就是模型實際看到的。

正常光 80%光 70%光 50%雜訊 0.05雜訊 0.15
看一眼71%72%58%11%15%0%
持續看99.5%79%34%0%0%0%
+晃相機、雜訊、亮度100%100%100%97%96.5%44.5%

中間那一列,光線暗三成就只剩三分之一,加一點點雜訊直接變成 0%。它訓練時每個像素的值從來沒變過,所以可以放心依賴精確的顏色。這和相機固定時是同一課:訓練時沒變動過的東西,網路就會依賴它。 所以配方裡多的第二樣東西,就是每張訓練畫面也隨機加雜訊(最多 0.1)、改亮度(60% 到 120%)。最後一列在這個範圍內幾乎不受影響,超出範圍的雜訊 0.15 還是會壞。

和 Figure 真正的差別

  • 規模:35 個關節、每秒 200 次輸出、八千萬參數的動作網路,上面還有一個七十億參數的語言模型負責理解指令;這裡是四個數字、幾千個參數,沒有語言。
  • 相機:Figure 後來改成雙眼,並在手掌上加了相機。這篇遇到的兩個死角,一個是手蓋住方塊,一個是手臂擋住遠側,都是只有一顆頭部相機的代價。
  • 語言:Helix 聽得懂一句話。我在縮小版上試過用一個詞指定紅色或黃色方塊:讓指令去調整卷積通道(FiLM,RT-1 的做法)練兩萬步有 75%,還沒練夠,所以沒有放進這一頁。
  • 頭會動:Helix 的輸出裡有頭的朝向,機器人自己決定往哪看。這裡的頭只會被撞歪,不會自己轉。

但核心是同一件事:不要先把世界算成一張精確的地圖再閉著眼睛做,而是每一步都看,看手和目標差多少,然後讓訓練資料裡的相機、光線、雜訊都亂一點,逼網路只能用這個。

數字怎麼來的

圖 2 和圖 3 在你的瀏覽器裡現場算,其他數字都是在我的電腦上離線量的。拿起放下的表:每一格是五個訓練種子的平均,每個種子 200 個擺法,方塊只放在圖 1 允許的範圍裡,90 步內把方塊放到目標 3 公分內才算成功;縮小版的數字每個條件 200 到 300 回合。頁面上每一個模型都有測試,保證和實驗腳本算出一模一樣的結果。腳本、每個種子的紀錄、失敗的那三次,和所有沒放進文章的實驗,都在 docs/research/head-camera/

來源