Utils 的 videoSource 工具

前两篇已经用 10 行 Python 代码展现了 Hello AI World 强大而且简便的物件检测识别能力,虽然大部分的人都将目光集中在了深度学习的三大推理识别(图像分类、物件检测、语义分割),但是在整个项目中,其实还有两个非常重要的功臣功能,那就是 videoSource() 与 videoOutput() 这两个专司输入与输出的接口。

如果你认为这两个功能只是简单地负责数据接收与显示的话,这就大大浪费了项目作者的心血结晶,因此我们在进入本项目另外两个深度学习推理应用之前,先要把这两个幕后功臣的内涵展现出来,因为这与后面的应用息息相关。本文先就 videoSource() 这个功能进行说明。

有经验的开发人员都清楚,输入源的种类十分多样,并且格式非常繁琐,其中还包括图像的颜色空间(color space)变化,要全部集成在一个函数中去调用,已经是非常高难度的事情了,如果这个函数还能为我们集成 Jetson 的编解码芯片的调用,以及将许多非常图像处理的计算交由 CUDA 核去计算,这就是一个值得我们为之欢呼的功能了。

videoSource() 功能是项目作者一个集大成的作品,具备以下特点:

1.支持 7 种输入源方式 
A. CSI 摄像头:”csi://0”
B. USB 摄像头:”/dev/video<N>”,其中 <N> 置换成指定的 USB 摄像头编号
C. RTP 视频流:“rtp://<remote_ip>:1234”
D. RTSP 视频流:“rtsp://username:password@<remote-host>:1234”
E. 视频文件:“完整文件名”,例如 “input.mp4”
F. 图像文件:“完整文件名”,例如 “room_0.jpg”
G. 文件夹:如果识别 “完整文件名” 是个文件夹时, 就会把目录下文件整批作为输入

2.支持 7 种视频格式 :H.264、 H.265、VP8、 VP9、 MPEG-2、MPEG-4 以及 MJPEG
3.支持 9 种图像格式 :JPG、 PNG、TGA、BMP、GIF、PSD、 HDR、 PIC 以及 PNMs
4.自动根据数据源,调用合适的 NVDEC 解码功能 
5.将数据计算紧密结合 CUDA 计算核 

这样一列出来,是否已经感受到了这一功能的强大呢?由于集成这么多特点,可以使代码的调用变得异常简单,而且完全发挥 Jetson Nano 2GB 的硬件计算资源,兼具 “易用” 与 “高效” 两个极端的特色。接下来我们就用几个简单的代码,带着大家体验一下这个工具的用法。
现在请大家先回忆一下用 openCV 建立 CSI 摄像头对象的代码,如下:

这种调用是非常艰涩而且容易出错的,对大部分初学者来说的确比较痛苦,导致很多人一开始都不愿意使用性能较好、功耗较低的 CSI 摄像头。但是在 videoSource() 这里,只需要简单填入 “csi://0” 就能创建。

在前面 “10lines.py” 代码中,已经提供了 CSI 摄像头、USB 摄像头,以及视频文件的调用方式,事实上类似的方法也适用于 RTP/RTSP 视频流以及图像文件作为输入源。

然而这里面增加一个对 “文件夹” 的支持,更是一个非常实用的功能,不过在 “图像分类”、“物件识别” 与 “语义分割” 的应用中,都有很大部分的使用场景是针对“众多独立图像”的推理,如果每次都只能一张一张的读入然后识别,就会显得十分没效率。

下面将 “10lines.py” 做简单的修改,以 etson-inferencet 提供的图像文件为例,让大家体验一下这个功能的好处:

上面代码中,将输入源与输出标的设为两个不同的目录,执行之前先将这个代码复制到 ~/jetson-inference/data/images/ 去,并且为 source 目录添加一些图片。完整的执行指令如下:

这样就会开始从 source 目录读入图像文件,执行物件识别推理后,将结果输出到 detection 目录中(如下图)。

这里之所以不选择输出到显示器,是因为显示的过程太快,没法在显示器上暂留,所以输出到另一个目录存成图片,会是比较合适的方法。
执行完成后,进入 detection 目录中,可以浏览到如下图的输出结果。

最后还有一个重点,就是调用 NVDEC 硬解码器的时机,前面提到 videoSourec() 会自动根据输入源的类型,去调用合适的解码器,不过这部分细节在作者的使用文档中并没有讲解,只能靠不断地尝试。

要检查解码器的启动与否,我们可以使用一开始教大家的 jetson-stats 检测工具,打开之后关注左下角 “NVDEC” 的变化,大部分时候都是处于 [OFF],但当我们的输入源是视频文件、RTP/RTSP 这三种类型时,“NVDEC” 后面会出现主频的变化(如下图),表示这时候已经被启动。

本文有条理地将 videoSource() 的重要特色进行了说明,就是为了后面执行其他推理识别应用时会使用到,也希望能让读者学会更多的用法。

 


评论:
相关文章
用乐高打造太空电梯

用乐高积木打造太空电梯,重现科幻电影中的经典场景,感受宇宙探索的无限魅力。


App Inventor 编程实例及指南-第6章 巴黎地图旅游

本章将创建一个“向导”应用,带给你一次巴黎的梦幻之旅。


乐高WEDO打印机搭建分享

本文为一个乐高WEDO打印机的教学课件,供各位参考。


机器人技术七八级考试说明及知识框架

青少年机器人技术七级、八级着重于机器人智能处理能力的学习,基本编程语言为Python,采用RDK X3作为主控。


新加坡STEM课程概述——以STEM应用学习计划为例

新加坡教育部通过一系列举措来发展本国的STEM教育。文章以新加坡 STEM应用学习计划为例,介绍其产生的背景和具体的课程设计,分析其课程设计特点,为我国中小学STEM教育的实施提供参考。


LVGL简介

LVGL(Light and Versatile Graphics Library,轻巧而多功能的图形库)是一个免费的开放源代码图形库,它提供创建具有易于使用的图形元素,精美的视觉效果和低内存占用的嵌入式GUI所需的一切。


Emo:基于树莓派 4B DIY 能笑会动的桌面机器人

Emo 是一款个人伴侣机器人,集时尚与创新于一身。他的诞生离不开最新的树莓派 4 技术和先进的设计。他不仅仅是一款机器人,更是一个活生生的存在。


旅行者一号永不回航,致敬:64亿公里处的最后一次回眸

1990年2月14日,情人节,‘旅行者一号’正式与地球道别,转身拍下了太阳系的全家福,那最后一次回眸,留下了对‘家乡地球’所有的留恋与不舍,从此,今生今世,永不相见。


2024年青少年STEAM教育研究报告

报告由艾瑞咨询发布,对全球及中国STEAM教育发展进行了全面剖析。


STEM课程学习路径指南

新课标在秋季即将开始执行,其中信息科技课程与STEM教育是紧密相关的,如何更好的展开STEM学习,以培养孩子们的STEM思维呢?本文总结了一个STEM课程的学习路径,供家长参考。

Jetson Nano 基础教程

作者:英伟达小助理   共52讲

Jetson Nano 推出 2GB 内存版本,不仅承袭了 Jetson Nano 所有 AI 开发环境与 IOT 控制功能,也能学习或开发 Python、OpenCV 与 AI 深度学习、ROS 自动控制等应用。

课程