避撞功能是Jetbot一开始最令人瞩目的功能,因为这是所有小车都必须具备的最基本“自我保护”的能力,而Jetbot没有任何距离传感,只凭着一个CSI摄像头就能完成这项任务,对很多人来说是一件蛮神奇的事情,Jetbot是如何识别与周边物体的距离,来决定是继续前进还是得转向?
这里请大家先沉淀一下来思考,人脑是如何学习判断前方的路是可以继续前进?或是有障碍物、坑洞必须转向?请先忘记您的成年人身份,试着模拟刚学会爬行的小婴儿,如何逐步学习并建立这方面的“认知系统”呢?小婴儿对前方的信息来源,有以下三个特点:
在没有其他干预的状况下,小婴儿必定得经过不断的碰撞与摔倒之后,自身防御系统会逐步学习并修正决策机制,这是动物界最原始的学习机制。小婴儿在这个过程所接收的信息,就是没有距离、没有物件类别的最基本“图像”而已。
到目前为止,Jetbot的运作逻辑是最接近人类行进思维的一套智能无人车,因为我们并不需要去判断与障碍物(或坑洞)之间的确实距离是多近,也不需要分辨前面障碍物是什么东西,就能下达“前进”或“转向”的决策。
当我们安装好Jetbot智能车与系统软件之后,接下去就是为每个特定功能添加“深度学习”的智能识别技术进去。例如这个避障的应用就只使用到最基础的“图像识别”能力,将CSI镜头的每帧画面识别出“无阻碍(free)”与“有阻碍(blocked)”两种状态,然后发出对应指令去驱动电机执行运动。
任何要添加深度学习的智能识别功能,都必须执行以下三个步骤:
这个避障功能的实验代码在Jetbot的notebooks/collision_avoidance下,里面有8个.ipynb文件,包括1个data_collecton.ipynb、3个train_modelxxx.ipynb与4个live_demoxxx.ipynb,分别对应上面所说的三个步骤。不过这些实验代码不需要全都用上,这里以data_collecton.ipynb、train_model.ipynb与live_demo.ipynb这三个最基本的代码来做说明。
碍于篇幅问题,本文先带着大家运行live_demo.ipynb代码,去体验一下Jetbot的避障功能,毕竟前面花了这么多时间与精力所组装的系统,先跑起来能获得一些成就感之后,在下一篇文章里再说明比较枯燥的“数据收集与整理”、“模型训练”两大步骤,这样才算完成整个流程。
为了让大家能够先行体验,这里提供原创团队预训练的best_model.pth模型的链接,模型的训练方式会在下一篇文章里面说明,这里只管下载到collision_avoidance目录下使用就行。文件链接如下:https://drive.google.com/file/d/1UsRax8bR3R-e-0-80KfH2zAt-IyRPtnW/view
由于我们未得到原创团队的授权,不能擅自下载这个存放在Google网盘上的文件,再分享给读者下载,请大家能够理解,这需要读者请自行设法下载!
接下来开启notebooks/collision_avoidance/live_demo.ipynb工作脚本,逐步执行就能让Jetbot小车执行避障的功能。这里面主要分为以下三大部分:
这里关于深度学习的部分,全部使用PyTorch这个轻量级的框架,对于不熟悉的读者来说,一开始的两行代码可能就已经会产生不小的困扰,现在就简单地逐行说明:
|
model = torchvision.models.alexnet(pretrained=False) |
|
model.classifier[6] = torch.nn.Linear(model.classifier[6].in_features, 2) |
|
Sequential( (0): Dropout(p=0.5, inplace=False) (1): Linear(in_features=9216, out_features=4096, bias=True) (2): ReLU(inplace=True) (3): Dropout(p=0.5, inplace=False) (4): Linear(in_features=4096, out_features=4096, bias=True) (5): ReLU(inplace=True) (6): Linear(in_features=4096, out_features=1000, bias=True) ) |
这是torchvision里为AlexNet神经网络所预先定义的图像分类功能的结构,其中classifier[6].out_features是模型最终的输出数量,也就是分类数量。
注意:每种神经网络的处理方式是不同的,必须根据PyTorch的定义进行调整。
接下去三行代码就是将模型文件加载进来,然后存到CUDA设备去,相对直观:
|
model.load_state_dict(torch.load('best_model.pth')) device = torch.device('cuda') model = model.to(device) |
这几乎是所有视觉类深度学习应用中不可或缺的步骤,比较繁琐的部分是不同神经网络存在细节上的差异,不过总的来说都脱离不了以下及部分:
|
x = cv2.cvtColor(x, cv2.COLOR_BGR2RGB) |
|
x = x.transpose((2, 0, 1)) |
|
mean = 255.0 * np.array([0.485, 0.456, 0.406]) stdev = 255.0 * np.array([0.229, 0.224, 0.225]) |
以上就是针对读入图像与模型之间对应的一些转换与计算的过程。
这里使用的traitlets、IPython.display、ipwidgets.wiegets与jetbot的Camera库,在前面的文章里都说明过,比较重要的代码如下:
|
blocked_slider = widgets.FloatSlider(description='blocked', min=0.0, max=1.0, orientation='vertical') |
|
speed_slider = widgets.FloatSlider(description='speed', min=0.0, max=0.5, value=0.0, step=0.01, orientation='horizontal') |
|
camera_link = traitlets.dlink((camera, 'value'), (image, 'value'), transform=bgr8_to_jpeg) |
执行这个阶段代码之后,下面应该会出现如下图左方的显示框,试着在镜头前晃动手,看看画面内容十分产生变化?显示框右边与下方分别出现 ”blocked” 与 ”speed” 两个滑块,就是前面代码所建立的小工具。
由于后面会使用到这个 “speed” 滑块对Jetbot进行速度调整,并且我们也希望能实时观察到摄像头的画面,因此建议用鼠标在画面上点击右键,点选上图右方 ”Create New View for Output” 去创建另一个独立输出框,然后进行位置调整如下图,这样就方便后续的操作。
这是整个应用中最核心的整合与计算过程,虽然代码量不多,但信息量却非常大,现在将这部分切割成几个小块来进行说明。
|
def update(change): x = change['new'] x = preprocess(x) y = model(x) 。。。 update({'new': camera.value}) |
|
y = F.softmax(y, dim=1) prob_blocked = float(y.flatten()[0]) blocked_slider.value = prob_blocked |
|
if prob_blocked < 0.5: robot.forward(speed_slider.value) else: robot.left(speed_slider.value) |
执行到这里的时候,正常状况应该如下:
现在可以将Jetbot小车放到您安排的执行场地上,在执行下一个步骤之前,建议透过”speed”滑块将速度控制在0.25以下,避免启动后造成Jetbot小车爆冲。
这里其实就只有下面这一道指令:
|
camera.observe(update, names='value') |
这是由jetbot所提供的函数,将camera.value与前面定义的update(change)进行动态连接上,现在Jetbot小车就应该开始行动了,摄像头里的画面也在不停更新,右方 ”blocked” 滑块的值也在不断跳动(更新),现在试着调整 ”speed” 滑块,是不是就能改变行进的速度了!
好了,现在就可以看看您Jetbot小车的避障功能执行的如何?如果想停止工作的话,就继续往下执行暂停的指令就可以。
最后需要说明的,假如您的避障功能执行的不是太好,例如无法顺利识别一些障碍物或坑洞的话,通常是因为您的测试场所或者使用的摄像头规格(广角),与原厂提供的模型数据有比较大的差异,甚至场地明暗度也会有影响,如果测试效果不如预期的话,就得自己重头收集数据并重新训练模型,这才是解决问题的根本之道。[完]
好文章,需要你的鼓励
这项研究介绍了VisCoder,一个经过专门微调的大语言模型,用于生成可执行的Python可视化代码。研究团队创建了包含20万样本的VisCode-200K数据集,结合了可执行代码示例和多轮修正对话。在PandasPlotBench基准测试中,VisCoder显著优于同等规模的开源模型,甚至在某些方面超越了GPT-4o-mini。研究还引入了自我调试评估模式,证明了反馈驱动学习对提高代码可执行性和视觉准确性的重要性。
这项研究提出了"适应再连续学习"(ACL)框架,一种创新的方法解决预训练模型在连续学习中的稳定性-可塑性困境。通过在学习新任务前先对模型进行适应性调整,ACL使模型既能更好地学习新知识(提高可塑性),又能保留已有知识(维持稳定性)。实验证明,该框架能显著提升各种连续学习方法的性能,为解决人工智能系统中的"灾难性遗忘"问题提供了有效途径。
这篇研究首次关注了CLIP模型文本编码器的对抗鲁棒性问题,提出了LEAF方法(Levenshtein高效对抗性微调)来增强文本编码器的稳健性。实验表明,LEAF显著提高了模型在面对文本扰动时的性能,在AG-News数据集上将对抗准确率从44.5%提升至63.3%。当集成到Stable Diffusion等文本到图像生成模型中时,LEAF显著提高了对抗噪声下的生成质量;在多模态检索任务中,它平均提高了10个百分点的召回率。此外,LEAF还增强了模型的可解释性,使文本嵌入的反演更加准确。
BenchHub是由韩国KAIST和Yonsei大学研究团队开发的统一评估平台,整合了38个基准中的30万个问题,按技能、学科和目标类型进行精细分类。研究显示现有评估基准存在领域分布偏差,而BenchHub通过自动分类系统和用户友好界面,让用户能根据特定需求筛选评估数据。实验证明模型在不同领域的排名差异巨大,强调了定制化评估的重要性。该平台支持多语言扩展和领域特化,为研究人员和开发者提供了灵活评估大语言模型的强大工具。