1. 介紹
承續(xù)上篇 Isaac Sim 的介紹, 讀者對于如何執(zhí)行 Isaac Sim 以及它最基本的環(huán)境已經(jīng)有了一些初步的了解了,接下來我們就要來玩一下能不能在模擬環(huán)境上部署深度學(xué)習(xí)模型來讓 Jetbot 機(jī)器人從無到有自己學(xué)會道路駕駛,例如下面的范例影片,透過仿真的 Jetbot 鏡頭看出去,我們可以看到機(jī)器人確實(shí)有沿著道路在行走!
本篇文章是參考 Nvidia 官方的范例教學(xué)做成的, 想要進(jìn)一步了解的讀者可以去參考看看哦。
2. 準(zhǔn)備道路模型
要讓機(jī)器人學(xué)會道路駕駛,最基本的就是要先有個道路可以讓機(jī)器人去跑,我們在這邊使用樂高的道路平板來拼湊出基本的道路,好讓機(jī)器人可以學(xué)習(xí)如直走跟轉(zhuǎn)彎。
2.1. LeoCAD
1.首先,我們必須去下載LeoCAD, 一款專門用來畫樂高模型的繪圖軟件,請點(diǎn)選下方的鏈接來下載并安裝。
2.安裝完成后,啟動 LeoCAD,在右邊的零件表搜尋一下四種道路平板,
?44336p01 Baseplate 32×32 Road 6-Stud Straight
?44342p01 Baseplate 32×32 Road 6-Stud Curve
?44341p01 Baseplate 32×32 Road 6-Stud T-Junction
?44343p01 Baseplate 32×32 Road 6-Stud Crossroad
3.可以試著把四片平板組合起來,看看是不是可以拼成以下的道路圖。
4.那么最后就是把這幾件平板輸出成COLLADA 檔,準(zhǔn)備做進(jìn)一步的轉(zhuǎn)檔處理。
2.2. Blender
前面提過我們拿到了道路的 COLLADA 檔,這是一種用來在多個3D軟件交換用的格式。但是我們還得要用 Blender 再進(jìn)行一次轉(zhuǎn)檔,才能轉(zhuǎn)成可以在 Isaac Sim 渲染的圖檔。
1.下載并安裝 Blender
2.將剛剛輸出的 COLLADA 檔匯到 Blender 中
匯入后應(yīng)該可以看到道路的圖文件顯示如下
3.接下來我們將每一塊零件的偏移量歸零,因?yàn)榈葧獊G到 Isaac Sim 時,會用程序組裝出各種可能的道路,所以我們必須確保零件的原點(diǎn)都是一致的。
4.從新命名每一個零件,方便我們待會匯入到Isaac Sim 時比較好辨認(rèn)。
5.最后輸出圖檔成 Isaac Sim 可以吃的 fbx 檔。
記得要在 Transform 那邊選擇 Z Up, X Forward。
輸出完成后,我們就會拿到下面四個圖檔。
?p44336p01.fbx
?p44342p01.fbx
?p44341p01.fbx
?p44343p01.fbx
2.3. 將圖檔匯入 Issac sim
接下來我們回到 Isaac Sim 中,我們要把前面的圖檔匯入到模擬環(huán)境中。首先,開啟 Isaac Sim 并在左下角的 Content 中建立一個 Omniverse/localhost/Library/Props/Road_Tiles/Parts 的文件夾, 然后在右邊的空白字段點(diǎn)右鍵,選擇Import and Convert 來匯入 fbx 檔案。
假設(shè)我們前面的 fbx 檔案是存在 Download 這個文件夾,我們就可以將他們?nèi)x并上傳到 Nucleus 服務(wù)器,記得在上傳的時候要勾選下面三個選項(xiàng):
?Import Materials
?Import As Single USD
?Generate Smooth Normals
匯入后如下圖
最后檢查一下是否我們要的四塊道路圖檔都有被正確匯入了。
3. 開始訓(xùn)練深度學(xué)習(xí)的模型
接下來的操作需要使用者有事先匯入 Isaac Sim 的 Asset 套件包,里面有機(jī)器學(xué)習(xí)的范例文件(如果不知道怎么匯入的讀者可以去參考我們的上一篇文章: Isaac Sim 的介紹)。
有別于之前的操作都是直接使用 Isaac Sim 的圖形化界面, 這次我們啟動訓(xùn)練模型的程序方法是必須從終端機(jī)開始。首先, 在計算機(jī)上打開一個終端機(jī),并輸入下面的指令:
cd~/.local/share/ov/pkg/isaac_sim-2021.1.1/
這個的意思是切換目錄到前面提到的 Isaac Sim 的 Asset 套件包的安裝位置。
然后修改“python_samples/jetbot/road_environment.py” 這只程序,將道路圖塊的路徑 改到我們剛剛放的地方,如下
# 1=I2=L 3=T, 4=X
self.tile_usd= {
0: None,
1: {"asset": nucleus_server +"/Library/Props/Road_Tiles/Parts/p44336p01/p44336p01.usd","offset": 180},
2: {"asset": nucleus_server +"/Library/Props/Road_Tiles/Parts/p44342p01/p44342p01.usd","offset": 180},
3: {"asset": nucleus_server +"/Library/Props/Road_Tiles/Parts/p44341p01/p44341p01.usd","offset": 180},
4: {"asset": nucleus_server +"/Library/Props/Road_Tiles/Parts/p44343p01/p44343p01.usd","offset": 180},
} # list of tiles that can be spawned
3.1. 確保 GPU 的記憶題足夠訓(xùn)練模型
筆者的開發(fā)環(huán)境所用的筆電有的顯卡是RTX 3070,但即便是擁有8G的內(nèi)存還是無法負(fù)荷默認(rèn)的模型訓(xùn)練參數(shù),所以我們會做以下的調(diào)整,縮小模型訓(xùn)練時的吞吐量,雖然會模型學(xué)習(xí)的會比較慢,但至少確保能夠正常運(yùn)作。
我們修改“python_samples/jetbot/jetbot_train.py” , 這只程序是我們用來訓(xùn)練的主程序。 里面有一個地方是可以設(shè)定batch size 的大小,這個會決定模型每次訓(xùn)練的吞吐量,以筆者的8G顯卡為例,可以設(shè)定的最大 batch size 大概是1024。修改如下:
ifargs.loaded_checkpoint == "":
model = PPO(
"CnnPolicy",
env,
verbose=1,
tensorboard_log=args.tensorboard_dir,
policy_kwargs=policy_kwargs,
device="cuda",
n_steps=args.step_freq,
batch_size=1024,
n_epochs=50,
learning_rate=0.0001,
)
另外,在開始訓(xùn)練前,建議關(guān)掉所有的 Isaac Sim 的軟件,因?yàn)槟嵌紩貜?fù)占用到 GPU 的內(nèi)存,我們只要保留由終端機(jī)執(zhí)行訓(xùn)練程序所叫起的 Isaac Sim 就好。
一切準(zhǔn)備就緒后我們就可以執(zhí)行下面的指令來開始訓(xùn)練了。
./python.shpython_samples/jetbot/jetbot_train.py
上面的指令會自動叫出仿真的圖形化界面,如果讀者覺得暫時不需要花費(fèi)算力去畫出模擬的3D圖,可以在后面加上 headless 來關(guān)閉圖形化界面,等訓(xùn)練完一段時間后,再開啟圖形化界面確認(rèn)模型的訓(xùn)練的效果也是可以的。
./python.shpython_samples/jetbot/jetbot_train.py --headless
4. 強(qiáng)化學(xué)習(xí)的訓(xùn)練機(jī)制
熟悉深度學(xué)習(xí)的讀者一定知道在讓模型去做學(xué)習(xí)的時候,能否給模型一個好的回饋是學(xué)習(xí)成敗的關(guān)鍵,例如以寵物分類問題來說,我們會給模型看到哪些圖片是貓,哪些圖片是狗,藉此來讓模型去學(xué)習(xí)。但是對于學(xué)習(xí)自動駕駛來說,機(jī)器人可以做到?jīng)Q策其實(shí)復(fù)雜度更高,比如說 Jetbot 可以隨著時間變化行走的方向跟速度,至于要怎么判斷機(jī)器人走得好不好,也許我們可以透過機(jī)器人的中心點(diǎn)到道路中間的距離來判斷,另外,機(jī)器人的行走速度可能也是一個我們希望優(yōu)化的量,好比說我們會希望機(jī)器人過彎的時候會懂得抄近路,而不是一味地死守道路中線。
當(dāng)我們搞定好模型在學(xué)習(xí)這個問題的回饋之后,我們就可以來看一下具體模型的學(xué)習(xí)策略。對于強(qiáng)化學(xué)習(xí)的問題而言,我們沒有辦法馬上知道模型此刻學(xué)的行為好或不好,比如說 Jetbot 可能在直線上可以走得很順,但是一直到轉(zhuǎn)彎處直接跑出界才發(fā)現(xiàn)其實(shí)它不會轉(zhuǎn)彎。在這個范例程序中,我們主要會用以下的技術(shù)來幫助模型的學(xué)習(xí):
1.使用 Open AI 所提出的 ProximalPolicy Optimization (PPO) 技術(shù)來做有效的強(qiáng)化學(xué)習(xí),簡單說就是在每一次的訓(xùn)練回合中,都會先生成一個固定模型參數(shù)的代打,下去我們的模擬環(huán)境跑各種的測試,然后我們再利用這些測試所搜集的數(shù)據(jù)來生成一個數(shù)據(jù)集,回過頭更新我們之前的模型。其中的精妙之處在于我們不會輕易的將我們正在學(xué)的模型一直丟到測試環(huán)境中去驗(yàn)證,因?yàn)檫@樣會導(dǎo)致模型在學(xué)習(xí)上很不穩(wěn)定,同時也沒有效率,變成說每次剛更新完的模型走一步測試后,這個資料就只用那么一次而已。
2.使用 Issac Sim 的 DomainRandomization 機(jī)制來加強(qiáng)模型的韌性。如果讀者仔細(xì)觀察機(jī)器人在學(xué)習(xí)的過程中其實(shí)場景是一直在變化的,我們的環(huán)境仿真程序不只會將我們前面的道路圖塊隨機(jī)拼湊成不同的環(huán)形道路外,道路周遭的背景跟物品也都會隨機(jī)生成,為的就是盡可能的讓機(jī)器人適應(yīng)不同點(diǎn)情況,達(dá)到我們真正想要它學(xué)習(xí)的任務(wù)。
5. 檢視模型訓(xùn)練的結(jié)果
以筆者的經(jīng)驗(yàn),模型都需要經(jīng)過兩萬多次以上的回合后,Jetbot 在道路上的行為才會收斂到我們所想象的自動駕駛,像是筆者的計算機(jī)(Intel i7 CPU + RTX 3070 GPU)大概會需要模型跑個一天的訓(xùn)練才能達(dá)到 一個可以接受的表現(xiàn)。
那如果是想要看看我們模型的表現(xiàn)如何,可以先停掉訓(xùn)練的程序,釋放出可用的 GPU ,然后執(zhí)行下面的程序
./python.shpython_samples/jetbot/jetbot_train.py --eval
程序會自動挑選目前為止訓(xùn)練最好的模型參數(shù),然后套用在 Jetbot 跑道路模型的仿真上,如下,讀者是否都能夠看到自己訓(xùn)練的 Jetbot 都能夠沿著道路跑一遍自動駕駛呢?
審核編輯:湯梓紅
-
機(jī)器人
+關(guān)注
關(guān)注
213文章
29726瀏覽量
212800 -
NVIDIA
+關(guān)注
關(guān)注
14文章
5308瀏覽量
106342 -
Sim
+關(guān)注
關(guān)注
2文章
253瀏覽量
40881 -
python
+關(guān)注
關(guān)注
56文章
4827瀏覽量
86695
原文標(biāo)題:NVIDIA Isaac Sim 強(qiáng)化學(xué)習(xí)實(shí)作 – 讓 Jetbot 自己學(xué)會道路駕駛!
文章出處:【微信號:易心Microbit編程,微信公眾號:易心Microbit編程】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
NVIDIA Isaac Lab可用環(huán)境與強(qiáng)化學(xué)習(xí)腳本使用指南

深度強(qiáng)化學(xué)習(xí)實(shí)戰(zhàn)
人工智能機(jī)器學(xué)習(xí)之強(qiáng)化學(xué)習(xí)
強(qiáng)化學(xué)習(xí)在自動駕駛的應(yīng)用

基于Omniverse的NVIDIA Isaac Sim現(xiàn)已發(fā)布公測版

評論