在Jetson上玩转大模型Day15:NanoLLM开发平台(4):视觉分析助手

科技   2024-11-27 08:30   江苏  











 在Jetson上玩转大模型:写在前面

在Jetson上玩转大模型Day2:环境搭建

在Jetson上玩转大模型Day3:TGW智能助手

在Jetson上玩转大模型Day4:SDW文生图

在Jetson上玩转大模型Day5:Ollama指令模式的智能助手

在Jetson上玩转大模型Day6:Ollama的Webui智能助手

在Jetson上玩转大模型Day7:執行RAG功能的Jetson Copilot

在Jetson上玩转大模型Day8:多模態搜圖的NanoDB

在Jetson上玩转大模型Day9:建立EffectiveViT测试环境

在Jetson上玩转大模型Day10:OWL-ViT应用

在Jetson上玩转大模型Day11:SAM2应用

在Jetson上玩转大模型Day12:NanoLLM開發平臺(1):Python API接口說明

在Jetson上玩转大模型Day12:NanoLLM开发平台(2):语音对话助手

在Jetson上玩转大模型Day14:NanoLLM开发平台(3):多模态语音助手


我们前面应用NanoLLM开发平台,已经很轻松地创造出语音对话助手、多模态识别等应用,本篇文章要更进一步调用NanoLLM的视频相关API,搭配合适的大语言模型,来对视频档或摄像头获取的内容进行动态分析功能。

这里我们将模型换成同样支持多模态的Efficient-Large-Model/VILA1.5-3b,并且前后使用3个API来进行测试,大家可以相互比较一下,并且后续自行调整出最适合应用场景的内容。

如果想用自己的USB摄像头进行测试,请在进入容器之前就先将摄像头插到设备上,然后再执行以下指令进入NanoLLM容器:

$ jetson-containers run $(autotag nano_llm)

进入容器之后,可以先执行以下指令去检查是否检测到摄像头:

$ ls /dev/video*

如果有看到反应,就表示在容器内已经找到摄像头了。

现在我们还是先从简单的nano_llm.chat聊天功能以及图片/视频内容识别开始。这些需要提供两个prompt给nano_llm.chat,系统会从第一个prompt去分析所需要识别的档路径,第二个提示词才是我们所要问的问题。现在我们先尝试用中文提示词:

$ python3 -m nano_llm.chat  --api=mlc \  --model Efficient-Large-Model/VILA1.5-3b \  --prompt '/data/images/path.jpg' \  --prompt '请问图中提供什么信息?'

下面是 /data/images/path.jpg 的内容:

系统最终所提供的回应(不一定完全一样):

这里可以看出,在终端模式下显示中文的能力不完整,因此会出现乱码。其次系统会识别我们prompt的语种,并用相同语种来做回应,还挺智能的。

现在我们将第二个promt改成“What information in the picture ?”,跑出来的结果如下截屏,回答的非常正确:“1.黄色标志,黑色字体,写着“禁止出口私家路”。图2:一条两边都是草的弯弯曲曲的路。”

如果我们要对视频进行分析的话,这里的底层会用到项目作者早期的jetson-utils里的videoSource与videoOutput两组库,输入视频支持H264/H265编码的MP4/MKV/AVI/ FLV等格式,输出部分还支持RTP/RTSP/WebRTC等网络视频协议,分别透过“--video-input”与“--video-output”两个参数进行传递。

在nano_llm.vision.video、nano_llm.agents.video_query这些工具里面,都调用了这些库。

现在使用nano_llm.vision.video这个工具,简单读入视频并根据提示词进行分析,再将分析结果并入视频中,然后输出到指定视频中,我们就可以在输出结果中查看结果。

请输入以下指令试试看:

$ python3 -m nano_llm.vision.video \    --model Efficient-Large-Model/VILA1.5-3b \    --max-images 8 \    --max-new-tokens 48 \    --video-input /data/sample_720p.mp4 \    --video-output /data/sample_output.mp4 \    --prompt 'What changes occurred in the video?'

输入的/data/sample_720p.mp4是一段在公路上拍摄的车流与行人视频,识别厚度视频存放在/data/sample_output.mp4。下图是截取其中一张在视频上嵌入“提示词回应”的截图:

现在我们可以将“--video-input”参数指向“/dev/video0”去调用摄像头,但是输出指向一个文件时,由于应用的结束得用“Ctrl-C”的去中断,导致视频储存不完整而无法打开,那我们就没办法去检查执行的结果了。

推荐的办法,就是查看摄像头结果时,将结果透过RTP协议输出到指定电脑中,然后在电脑里用gst-launch来接收结果。

现在我们在Jetson Orin的容器里面执行以下指令:

$ python3 -m nano_llm.vision.video \--model Efficient-Large-Model/VILA1.5-3b \--max-images 8 \--max-new-tokens 48 \--video-input /dev/video0 \--video-output rtp://<IP_OF_TARGET>:1234  \--prompt 'What are in his hand?'


开始执行之后,在目标的Linux电脑上执行以下指令:

$ gst-launch-1.0 udpsrc port=1234 \caps="application/x-rtp, media=(string)video, \clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" \! rtph264depay ! decodebin ! videoconvert ! autovideosink

然后就会在Linux电脑上看到以下的显示:

这样就能解决在摄像头里进行实时识别的问题。


GPUS开发者
在这里,你可以及时了解NVIDIA GPU的行业资讯、最新进展、应用场景和各项功能。还有一些工具、技巧和教程,帮助你利用GPU打造未来的科技。参与GPU世界举办的精彩活动,体验人工智能的未来生活。
 最新文章