电子说
1. 介绍
承续上篇 Isaac Sim 的介绍, 读者对于如何执行 Isaac Sim 以及它最基本的环境已经有了一些初步的了解了,接下来我们就要来玩一下能不能在模拟环境上部署深度学习模型来让 Jetbot 机器人从无到有自己学会道路驾驶,例如下面的范例影片,透过仿真的 Jetbot 镜头看出去,我们可以看到机器人确实有沿着道路在行走!
本篇文章是参考 Nvidia 官方的范例教学做成的, 想要进一步了解的读者可以去参考看看哦。
2. 准备道路模型
要让机器人学会道路驾驶,最基本的就是要先有个道路可以让机器人去跑,我们在这边使用乐高的道路平板来拼凑出基本的道路,好让机器人可以学习如直走跟转弯。
2.1. LeoCAD
1.首先,我们必须去下载LeoCAD, 一款专门用来画乐高模型的绘图软件,请点选下方的链接来下载并安装。
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 档,准备做进一步的转档处理。
2.2. Blender
前面提过我们拿到了道路的 COLLADA 檔,这是一种用来在多个3D软件交换用的格式。但是我们还得要用 Blender 再进行一次转档,才能转成可以在 Isaac Sim 渲染的图档。
1.下载并安装 Blender
2.将刚刚输出的 COLLADA 档汇到 Blender 中
汇入后应该可以看到道路的图文件显示如下
3.接下来我们将每一块零件的偏移量归零,因为等会要丢到 Isaac Sim 时,会用程序组装出各种可能的道路,所以我们必须确保零件的原点都是一致的。
4.从新命名每一个零件,方便我们待会汇入到Isaac Sim 时比较好辨认。
5.最后输出图档成 Isaac Sim 可以吃的 fbx 檔。
记得要在 Transform 那边选择 Z Up, X Forward。
输出完成后,我们就会拿到下面四个图档。
•p44336p01.fbx
•p44342p01.fbx
•p44341p01.fbx
•p44343p01.fbx
2.3. 将图档汇入 Issac sim
接下来我们回到 Isaac Sim 中,我们要把前面的图档汇入到模拟环境中。首先,开启 Isaac Sim 并在左下角的 Content 中建立一个 Omniverse/localhost/Library/Props/Road_Tiles/Parts 的文件夹, 然后在右边的空白字段点右键,选择Import and Convert 来汇入 fbx 档案。
假设我们前面的 fbx 档案是存在 Download 这个文件夹,我们就可以将他们全选并上传到 Nucleus 服务器,记得在上传的时候要勾选下面三个选项:
•Import Materials
•Import As Single USD
•Generate Smooth Normals
汇入后如下图
最后检查一下是否我们要的四块道路图档都有被正确汇入了。
3. 开始训练深度学习的模型
接下来的操作需要使用者有事先汇入 Isaac Sim 的 Asset 套件包,里面有机器学习的范例文件(如果不知道怎么汇入的读者可以去参考我们的上一篇文章: Isaac Sim 的介绍)。
有别于之前的操作都是直接使用 Isaac Sim 的图形化界面, 这次我们启动训练模型的程序方法是必须从终端机开始。首先, 在计算机上打开一个终端机,并输入下面的指令:
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 的记忆题足够训练模型
笔者的开发环境所用的笔电有的显卡是RTX 3070,但即便是拥有8G的内存还是无法负荷默认的模型训练参数,所以我们会做以下的调整,缩小模型训练时的吞吐量,虽然会模型学习的会比较慢,但至少确保能够正常运作。
我们修改“python_samples/jetbot/jetbot_train.py” , 这只程序是我们用来训练的主程序。 里面有一个地方是可以设定batch size 的大小,这个会决定模型每次训练的吞吐量,以笔者的8G显卡为例,可以设定的最大 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,
)
另外,在开始训练前,建议关掉所有的 Isaac Sim 的软件,因为那都会重复占用到 GPU 的内存,我们只要保留由终端机执行训练程序所叫起的 Isaac Sim 就好。
一切准备就绪后我们就可以执行下面的指令来开始训练了。
./python.shpython_samples/jetbot/jetbot_train.py
上面的指令会自动叫出仿真的图形化界面,如果读者觉得暂时不需要花费算力去画出模拟的3D图,可以在后面加上 headless 来关闭图形化界面,等训练完一段时间后,再开启图形化界面确认模型的训练的效果也是可以的。
./python.shpython_samples/jetbot/jetbot_train.py --headless
4. 强化学习的训练机制
熟悉深度学习的读者一定知道在让模型去做学习的时候,能否给模型一个好的回馈是学习成败的关键,例如以宠物分类问题来说,我们会给模型看到哪些图片是猫,哪些图片是狗,藉此来让模型去学习。但是对于学习自动驾驶来说,机器人可以做到决策其实复杂度更高,比如说 Jetbot 可以随着时间变化行走的方向跟速度,至于要怎么判断机器人走得好不好,也许我们可以透过机器人的中心点到道路中间的距离来判断,另外,机器人的行走速度可能也是一个我们希望优化的量,好比说我们会希望机器人过弯的时候会懂得抄近路,而不是一味地死守道路中线。
当我们搞定好模型在学习这个问题的回馈之后,我们就可以来看一下具体模型的学习策略。对于强化学习的问题而言,我们没有办法马上知道模型此刻学的行为好或不好,比如说 Jetbot 可能在直线上可以走得很顺,但是一直到转弯处直接跑出界才发现其实它不会转弯。在这个范例程序中,我们主要会用以下的技术来帮助模型的学习:
1.使用 Open AI 所提出的 ProximalPolicy Optimization (PPO) 技术来做有效的强化学习,简单说就是在每一次的训练回合中,都会先生成一个固定模型参数的代打,下去我们的模拟环境跑各种的测试,然后我们再利用这些测试所搜集的数据来生成一个数据集,回过头更新我们之前的模型。其中的精妙之处在于我们不会轻易的将我们正在学的模型一直丢到测试环境中去验证,因为这样会导致模型在学习上很不稳定,同时也没有效率,变成说每次刚更新完的模型走一步测试后,这个资料就只用那么一次而已。
2.使用 Issac Sim 的 DomainRandomization 机制来加强模型的韧性。如果读者仔细观察机器人在学习的过程中其实场景是一直在变化的,我们的环境仿真程序不只会将我们前面的道路图块随机拼凑成不同的环形道路外,道路周遭的背景跟物品也都会随机生成,为的就是尽可能的让机器人适应不同点情况,达到我们真正想要它学习的任务。
5. 检视模型训练的结果
以笔者的经验,模型都需要经过两万多次以上的回合后,Jetbot 在道路上的行为才会收敛到我们所想象的自动驾驶,像是笔者的计算机(Intel i7 CPU + RTX 3070 GPU)大概会需要模型跑个一天的训练才能达到 一个可以接受的表现。
那如果是想要看看我们模型的表现如何,可以先停掉训练的程序,释放出可用的 GPU ,然后执行下面的程序
./python.shpython_samples/jetbot/jetbot_train.py --eval
程序会自动挑选目前为止训练最好的模型参数,然后套用在 Jetbot 跑道路模型的仿真上,如下,读者是否都能够看到自己训练的 Jetbot 都能够沿着道路跑一遍自动驾驶呢?
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !