系统最终所提供的回应(不一定完全一样):
这里可以看出,在终端模式下显示中文的能力不完整,因此会出现乱码。其次系统会识别我们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电脑上看到以下的显示:
这样就能解决在摄像头里进行实时识别的问题。