Nanbeige 4.1-3B 计算机视觉联动:YOLOv11检测结果的自然语言描述生成

张开发
2026/6/5 3:54:48 15 分钟阅读
Nanbeige 4.1-3B 计算机视觉联动:YOLOv11检测结果的自然语言描述生成
Nanbeige 4.1-3B 计算机视觉联动YOLOv11检测结果的自然语言描述生成你有没有想过让AI不仅能“看见”图片里的东西还能像人一样把看到的东西“说”出来比如给它一张街景照片它就能告诉你“照片中央有一辆红色的汽车正在行驶旁边的人行道上一位穿着蓝色外套的行人正在过马路。”这听起来像是科幻电影里的场景但现在我们完全可以用开源技术把它变成现实。今天要聊的就是如何把两个强大的开源模型“撮合”在一起一个是计算机视觉领域的“火眼金睛”YOLOv11负责从图片里找出物体另一个是语言模型界的“新秀”Nanbeige 4.1-3B负责把找到的物体信息组织成一段通顺、自然的描述。这种“视觉检测语言生成”的组合能用在很多地方。比如为视障人士开发图片描述工具自动生成电商商品图的文案或者为监控视频生成智能摘要。接下来我就带你一步步搭建这个有趣的多模态应用看看开源模型协同工作的潜力有多大。1. 场景与价值为什么需要“图生文”在深入技术细节之前我们先想想这个组合拳到底能解决什么实际问题。单纯的目标检测模型比如YOLOv11输出结果通常是冷冰冰的坐标框和类别标签像这样[‘person’ x120 y80 width60 height180] [‘car’ x300 y200 width150 height80]。对于机器来说这很清晰但对于普通人尤其是需要理解图片内容的应用如内容审核、辅助工具来说这并不友好。而大语言模型擅长理解和生成自然语言但它“看不见”图片。如果我们把YOLOv11的“眼睛”和Nanbeige的“嘴巴”连接起来就能让AI具备“看图说话”的能力。这个过程的价值在于信息可读性将结构化的检测数据转化为人人都能理解的句子。场景理解通过语言模型的推理能力可以基于检测到的物体关系位置、大小等生成更具上下文和逻辑的描述而不仅仅是罗列物体。自动化与效率替代人工为海量图片撰写描述大幅提升内容生产或处理的效率。这个方案的核心思路很直接让专业的模型做专业的事。YOLOv11专注精准定位Nanbeige 4.1-3B专注流畅表达两者结合实现112的效果。2. 技术方案与整体流程我们的目标是构建一个管道Pipeline让图片数据能自动流经两个模型并最终输出文字描述。整个流程可以分为三个清晰的阶段2.1 第一阶段视觉感知YOLOv11这是流程的起点。我们选择YOLOv11因为它平衡了速度和精度部署也相对简单。它的任务是对输入的图片进行推理识别出其中有哪些物体以及它们的具体位置用边界框表示。我们会从它的输出中提取关键信息主要是物体类别Class比如“人”、“车”、“狗”。边界框坐标Bounding Box通常以[x_center y_center width height]或[x1 y1 x2 y2]的格式表示物体在图片中的位置。置信度Confidence模型对这个检测结果的把握有多大。这些信息构成了我们对这张图片的“结构化理解”。2.2 第二阶段信息转换与提示词构建这是承上启下的关键一步。我们不能直接把YOLOv11的原始输出扔给语言模型。我们需要将这些数据“翻译”成语言模型能理解的“提示词”Prompt。一个简单的转换方法是将检测结果整理成一段清晰的文本。例如图片中检测到以下物体 1. 一个‘人’位于图片左侧坐标约[120 80]置信度0.95。 2. 一辆‘汽车’位于图片中央偏右坐标约[300 200]置信度0.88。 请根据以上信息生成一段流畅的自然语言描述这幅图片。更高级的构建方式可以包含物体间的相对位置如“A在B的左边”、大小关系甚至预先定义好描述的风格如“简洁的”、“生动的”、“用于视障辅助的”。这一步的设计好坏直接决定了最终描述的质量。2.3 第三阶段语言生成Nanbeige 4.1-3B最后将构建好的提示词输入给Nanbeige 4.1-3B模型。这个拥有30亿参数的语言模型会根据我们提供的物体信息运用它的语言知识和上下文理解能力生成一段连贯、合乎逻辑的句子或段落来描述图片。整个流程就像一个流水线图片进YOLOv11分析中间程序整理信息Nanbeige组织语言文字描述出。3. 动手实现代码实战演示理论讲完了我们来看看具体怎么用代码把这条路跑通。这里假设你已经有了基本的Python环境并且能访问GPU资源CPU也可以但速度会慢一些。3.1 环境准备与模型部署首先安装必要的库。我们主要需要ultralytics用于YOLOv11和transformers用于加载Nanbeige。pip install ultralytics transformers torch接下来分别准备两个模型。加载YOLOv11模型Ultralytics的库让加载YOLO模型变得非常简单。它会自动下载预训练的权重。from ultralytics import YOLO # 加载预训练的YOLOv11模型例如yolo11n.pt 代表nano版本体积小速度快 detection_model YOLO(‘yolo11n.pt’) # 你也可以使用 ‘yolo11s.pt’ ‘yolo11m.pt’ 等更大模型加载Nanbeige 4.1-3B模型我们可以通过Hugging Face的transformers库来加载Nanbeige模型。这里以加载到GPU为例。from transformers import AutoTokenizer AutoModelForCausalLM import torch model_name “Nanbeige/Nanbeige-4.1-3B-Instruct” # 模型在Hugging Face上的名称 tokenizer AutoTokenizer.from_pretrained(model_name trust_remote_codeTrue) language_model AutoModelForCausalLM.from_pretrained(model_name trust_remote_codeTrue torch_dtypetorch.float16 # 使用半精度节省显存 device_map“auto”) # 自动分配到可用设备 language_model.eval() # 设置为评估模式3.2 核心管道搭建现在我们来编写连接两个模型的核心函数。def generate_image_caption(image_path): “”” 输入图片路径返回自然语言描述。 1. 用YOLOv11检测物体。 2. 格式化检测结果为提示词。 3. 用Nanbeige生成描述。 “”” # 第一步使用YOLOv11进行目标检测 results detection_model(image_path) result results[0] # 取第一张图片的结果我们只处理单张图片 # 提取检测信息 detections [] for box in result.boxes: # 获取类别索引和名称 class_id int(box.cls) class_name result.names[class_id] # 获取边界框坐标 (xyxy格式) bbox box.xyxy[0].tolist() # 获取置信度 conf float(box.conf) detections.append({ ‘class’: class_name ‘bbox’: bbox ‘confidence’: conf }) # 第二步构建给语言模型的提示词 prompt “图片中检测到以下物体\n” for i det in enumerate(detections 1): # 简单格式化类别 大致位置 置信度 x_center (det[‘bbox’][0] det[‘bbox’][2]) / 2 position “左侧” if x_center result.orig_shape[1] / 3 else (“右侧” if x_center 2 * result.orig_shape[1] / 3 else “中央”) prompt f“{i}. 一个‘{det[‘class’]}’ 位于图片{position}置信度{det[‘confidence’]:.2f}。\n” prompt “\n请根据以上信息生成一段简洁、流畅的自然语言描述这幅图片的内容。” # 第三步使用Nanbeige生成描述 inputs tokenizer(prompt return_tensors“pt”).to(language_model.device) with torch.no_grad(): # 关闭梯度计算加快推理速度 outputs language_model.generate(**inputs max_new_tokens150 # 控制生成文本的最大长度 do_sampleTrue # 使用采样使生成结果更多样 temperature0.7 # 控制随机性 top_p0.9) # 核采样参数 generated_text tokenizer.decode(outputs[0] skip_special_tokensTrue) # 生成的文本包含了我们的提示词我们需要提取提示词之后的部分作为描述 # 简单的方法找到提示词末尾然后取后面的内容 desc_start generated_text.find(prompt) len(prompt) description generated_text[desc_start:].strip() return detections prompt description3.3 运行与效果展示写一个简单的主程序来测试我们的管道。if __name__ “__main__”: # 替换成你的图片路径 test_image_path “./example_street.jpg” try: detections used_prompt final_description generate_image_caption(test_image_path) print(“ 检测结果 ) for det in detections: print(f“类别: {det[‘class’]} 置信度: {det[‘confidence’]:.2f}”) print(“\n 发送给语言模型的提示词 ) print(used_prompt) print(“\n 生成的图片描述 ) print(final_description) except Exception as e: print(f“处理过程中出现错误: {e}”)运行这段代码你可能会得到类似下面的输出具体结果取决于你的图片 检测结果 类别: person 置信度: 0.96 类别: car 置信度: 0.89 类别: traffic light 置信度: 0.78 发送给语言模型的提示词 图片中检测到以下物体 1. 一个‘person’ 位于图片中央置信度0.96。 2. 一个‘car’ 位于图片左侧置信度0.89。 3. 一个‘traffic light’ 位于图片右侧置信度0.78。 请根据以上信息生成一段简洁、流畅的自然语言描述这幅图片的内容。 生成的图片描述 这张图片展现了一个常见的城市街景。画面中央有一位行人左侧停放着一辆汽车右侧则可以看见一个交通信号灯。整体场景看起来像是在一个十字路口或街道旁。看AI成功地将检测到的“人”、“车”、“交通灯”组织成了一段通顺的场景描述。虽然还比较简单但整个流程已经跑通了。4. 优化方向与实践建议上面的例子是一个最基础的演示。要想在实际应用中做得更好可以从以下几个方面入手提示词工程这是提升描述质量最关键的一环。你可以设计更详细的提示词比如要求模型描述物体的颜色如果原图是彩色、物体之间的互动“人正在走向汽车”、或者场景的整体氛围。后处理与过滤可以设置一个置信度阈值如0.5只将高置信度的检测结果传给语言模型避免噪声干扰。也可以对生成文本进行后处理比如纠正明显的错误或调整句式。处理复杂场景当图片中物体很多时生成的提示词会很长。可能需要优化提示词结构或者先让语言模型总结主要物体再展开描述。性能考量两个模型依次运行会有延迟。对于实时性要求高的场景可以探索异步管道或使用更轻量的模型如YOLOv11n 更小参数的语言模型。错误处理增加健壮性代码处理图片加载失败、模型推理失败、网络问题等异常情况。实际用下来这套方案的门槛并不高核心代码百来行就能跑起来效果却挺有意思。它清晰地展示了如何将不同领域的AI模型像乐高积木一样组合起来解决更复杂的任务。你可以基于这个框架尝试更换不同的视觉模型如DETR、GLIP或不同的语言模型甚至加入图像描述Captioning模型来提供更丰富的上下文创造出属于你自己的多模态应用。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章