在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 '请问图中提供什么信息?'
$ 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?'
$ python3 -m nano_llm.vision.video \
--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?'
--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
$ 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电脑上看到以下的显示:
这样就能解决在摄像头里进行实时识别的问题。