基于NVIDIA NIM平台实现盲人过马路的demo(一)
前言:利用NVIDIA NIM平台提供的大模型进行编辑,通过llama-3.2-90b-vision-instruct模型进行初步的图片检测
在该系统的设计中,通过利用 NVIDIA 的 NIM 平台提供的大模型支持,我们使用了 llama-3.2-90b-vision-instruct 模型来进行图片检测和识别。在初步的测试中,图像通过摄像头捕获后,转换为 Base64 格式并传输给大模型进行分析,模型会返回对图片内容的描述。以下是具体步骤和细节说明:
为了实现图像数据的传输和处理,系统首先加载了基础库(如 os、requests、base64 和 cv2)以及日期和时间模块,用于图像编码、网络请求和时间戳记录。
step1:
部署大模型到本地,引用所需要的库
import os
import requests
import base64
import cv2
import time
from datetime import datetime
step2:
观看官方使用文档按照官方的指导文档,通过将图片编码成 Base64 后,构建请求负载传递给模型。需要注意的是,图片大小需控制在 180KB 以下,否则会影响传输效率。:
import requests, base64
invoke_url = ""
stream = True
with open("image.png", "rb") as f:
image_b64 = base64.b64encode(f.read()).decode()
assert len(image_b64) < 180_000, \
"To upload larger images, use the assets API (see docs)"
headers = {
"Authorization": "",
"Accept": "text/event-stream" if stream else "application/json"
}
payload = {
"model": 'meta/llama-3.2-90b-vision-instruct',
"messages": [
{
"role": "user",
"content": f'What is in this image? <img src="data:image/png;base64,{image_b64}" />'
}
],
"max_tokens": 512,
"temperature": 1.00,
"top_p": 1.00,
"stream": stream
}
response = requests.post(invoke_url, headers=headers, json=payload)
if stream:
for line in response.iter_lines():
if line:
print(line.decode("utf-8"))
else:
print(response.json())
其原理为将图片转换为base64后传入大模型进行识别,以及一系列参数
step3:
引入摄像头模块,并且时时进行推理,将模型的初步推理结果传入文本中,为后期的朗读进行预警为了达到实时检测的效果,系统引入了摄像头模块,将视频流中的每一帧传递给模型。通过 OpenCV 捕获图像,并以 PNG 格式编码。随后将编码后的图像传输给大模型处理并获得结果,将模型的初步推理结果记录在文本文件中,为后续语音朗读预留空间。
# 创建摄像头对象
cap = cv2.VideoCapture(0) # 0 是默认摄像头索引
# 输出文件路径
output_file_path = "output.txt"
def save_text_to_file(text):
with open(output_file_path, "a", encoding="utf-8") as f: # 以追加模式打开文件
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 获取当前时间戳
f.write(f"[{timestamp}] {text}\n") # 写入时间戳和文本,换行
while True:
ret, frame = cap.read()
if not ret:
print("无法获取图像")
break
# 将图像编码为 PNG 格式并转换为 Base64
_, buffer = cv2.imencode('.png', frame)
image_b64 = base64.b64encode(buffer).decode()
# 构建请求负载,确保输入中文
payload = {
"model": 'meta/llama-3.2-90b-vision-instruct',
"messages": [
{
"role": 'user',
"content": f'请告诉我这张图片中有什么内容。<img src="data:image/png;base64,{image_b64}" />'
}
],
"max_tokens": 512,
"temperature": 1.00,
"top_p": 1.00,
"stream": stream
}
# 发送请求
response = requests.post(invoke_url, headers=headers, json=payload)
if response.status_code == 200:
result = response.json()
# 根据返回的结果处理输出
print(result) # 可以进一步提取所需的信息
# 获取结果中的文本内容
if 'choices' in result and len(result['choices']) > 0:
description = result['choices'][0]['message']['content']
print(description) # 打印描述
# 保存文本到文件
save_text_to_file(description)
else:
print(f"请求失败,状态码:{response.status_code}")
time.sleep(3) # 每秒捕获一帧
# 释放摄像头
cap.release()
cv2.destroyAllWindows()
系统通过循环捕获图像帧,并进行推理处理,将结果逐行存储到文本文件 output.txt 中。此过程每 3 秒循环一次,以确保系统资源占用不超载,并在文件中按时间戳记录推理结果。
原理十分简单,在使用摄像头扫描我自己后
让我们来看一下初步的结果:
在我加入翻译模块后,发现其输出结果:
'id': 'chat-51e2e604fd944de393136f7433919ad5', 'object': 'chat.completion', 'created': 1730471625, 'model': 'meta/llama-3.2-90b-vision-instruct', 'choices': [{'index': 0, 'message': {'role': 'assistant', 'content': '这里有一张中年亚洲男性 frontal director 照片。照片截图自远程视频会议ूच意识。\n\n/ Ψ οδ HistogramDescriptionBlack / 97% Colorsunnedove Gray66BetaBLUE209peach29dark brown अपन Nogran8023825444098364103281213183791565308314594581053713508413533mntileyelo \n\n.', 'tool_calls': []}, 'logprobs': None, 'finish_reason': 'stop', 'stop_reason': None}], 'usage': {'prompt_tokens': 20, 'total_tokens': 99, 'completion_tokens': 79}, 'prompt_logprobs': None}
这里有一张中年亚洲男性 frontal director 照片。照片截图自远程视频会议ूच意识。
存在乱码的情况,后续我将进行优化,加入其他大模型进行处理,并且在考虑时时状态下进行最优化解决.
此问题可能源于模型在处理多语言字符集时的兼容性不足。为了解决此问题,后续计划结合其他大模型进行多语言支持优化,通过检测模型输出的质量,以达到更高的识别准确率和完整性。
后续改进方向
模型输出的优化:尝试使用其他支持多语言的大模型,或对文本结果进行后处理,去除乱码。
系统实时性增强:调试模型的响应速度,通过减少请求负载和调节图像分辨率,提升系统的实时推理能力。
数据增强与日志记录:扩展文本存储功能,提供更详细的日志记录和分类,以便于后续的分析和调优。
本项目通过图像捕获、预处理、实时推理及结果记录等一系列步骤,为智能检测和信息反馈系统的实现打下了基础。后续将持续优化模型效果,并将推理结果集成到其他模块以提供进一步的用户体验。
原文地址:https://blog.csdn.net/baidu_33751906/article/details/143442288
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!