1.作者介绍刘思佳女西安工程大学电子信息学院2025级研究生研究方向近红外光谱纤维鉴别电子邮件1335759643qq.com胥乾信西安工程大学电子信息学院2025级研究生张宏伟人工智能课题组研究方向机器视觉与人工智能电子邮件2692797728qq.com2基于Grounded-SAM-2的动态场景目标检测随着计算机视觉大模型的飞速发展将“自然语言理解”与“像素级视频分割”相结合成为了新的研究热点。本文将深入浅出地介绍目前前沿的 Grounded-SAM-2 联合架构并附上完整的动态场景目标追踪单目标锁定的实战代码。Grounded-SAM-2 并非一个单一的黑盒模型而是由两大顶级视觉基础大模型Foundation Models强强联合组成的端到端级联管线。其核心思想是前端负责“看懂语言并找位置”后端负责“精准抠图并跨帧追踪”。2.1 Grounded-SAM-2 整体框架模型Grounded-SAM-2 Grounding DINO SAM 2是一个串联式视频目标检测与跟踪流水线。完整工作流程•首帧输入文本提示•Grounding DINO 检测目标框•SAM 2 根据框生成掩码•SAM 2 在后续帧自动跟踪目标•输出带掩码的视频结果它的核心优势•文本驱动无需标注•零样本开箱即用•动态场景稳定跟踪•支持任意物体检测2.2 Grounding DINO开放词汇目标定位在传统的检测任务中如 YOLO 系列模型只能识别训练集内预设的类别。而 Grounding DINO 打破了这一限制实现了开放词汇Open-Vocabulary的零样本检测。•跨模态对齐DINO 内部包含提取图像特征的视觉骨干网络Swin Transformer和提取文本特征的语言模型BERT。通过特征增强器Feature Enhancer它能在数学空间上将“文本描述”与“图像像素”对应起来。•首帧感知在动态视频处理中Grounding DINO 仅在第一帧介入。用户输入文本提示词Prompt例如 “dog .”模型即可在首帧瞬间输出目标高精度的候选边界框Bounding Box。模型的框架图如下框架结构分为五层第1层输入与基础特征提取•模型的两个输入 文本和图像•文本骨干网络把文字转换成 “文本特征向量”让模型理解说的是什么物体。•图像骨干网络把图片转换成 “图像特征向量”提取画面里的视觉信息。第 2 层特征增强•对文本和图像特征进行增强处理让文字描述和图像内容的关联更紧密为后续的跨模态匹配做准备。 输出增强后的特征。第 3 层语言引导的查询选择•用文本特征从图像特征中筛选出和文字描述相关的视觉查询。 比如模型会根据 “dog” 这个词从画面里挑出 “看起来像狗的区域” 作为候选目标。第 4 层•跨模态解码器接收来自第 3 层的跨模态查询并结合文本和图像特征进行解码。 这些信息会被用来生成最终的目标检测结果。第 5 层输出与损失计算•模型的最终结果也就是需要的目标检测框Bounding Box。•训练时用的两种损失函数 •对比损失让模型学习 “文字和正确的物体特征更相似和错误的物体特征更不相似”。•定位损失让模型把检测框的位置和大小预测得更准确2.3 SAM 2时空记忆与视频分割SAM 2Segment Anything Model 2是 Meta 最新发布的统一图像与视频分割大模型。相比于第一代它最大的突破在于引入了动态视频流的处理能力。•接收 DINO 传来的边界框作为 Prompt在首帧将粗糙的矩形框转化为像素级的精准遮罩Mask。•时空记忆机制是连续追踪的核心。SAM 2 构建了一个记忆库Memory Bank用于存储目标在历史帧中的形状和特征。在处理后续帧时通过记忆注意力机制Memory Attention持续回看历史状态。正是依托这种时空记忆机制即使目标在视频中发生了剧烈形变或遭到短暂物理遮挡SAM 2 依然能够保持稳定的连续追踪不会丢失目标。•视频帧输入与图像编码image encoder对每一帧视频图像提取通用特征。把画面变成模型能理解的高维特征•“提示 - 掩码” 生成阶段首帧用prompt encoder接收用户给的 “提示” 把这些提示变成特征告诉模型 “我要分割的目标在哪”。 mask decoder结合图像特征和提示特征生成像素级的目标掩码。也就是把轮廓精确抠出来得到精细分割结果。•视频跟踪与记忆更新后续帧用memory encoder把上一帧生成的掩码和图像特征编码成“记忆特征”存起来。memory bank存储所有历史帧的记忆特征。模型靠这些记忆记住目标长什么样、怎么动。memory attention在下一帧处理时从 memory bank 里调取历史记忆和当前帧的图像特征做注意力计算从而知道 “这一帧里哪个是我之前跟踪的目标”。•整个流程不断循环每一帧的掩码都会被编码成记忆传给下一帧实现持续跟踪。3关于实验过程的介绍完整实验代码测试结果3.1实验数据集与环境依赖配置数据集介绍•模型预训练加载基于 SA-V5.1万视频与 COCO图文对训练的基础权重赋予模型零样本泛化能力。•本地测试视频一段 378 帧的生活场景自定义短视频test_video.mp4验证模型在未经微调情况下的工程鲁棒性。环境依赖与软件包本实验推荐在 Python 3.10 的环境下进行。核心依赖包如下•torch (建议 2.4 左右版本)•transformers4.35.0•groundingdino, sam2 (官方源码安装)•opencv-python (用于视频拆帧与最终 Alpha 混合渲染)•hydra-core (动态加载模型配置文件)3.2完整追踪与渲染代码实现以下为实现视频拆帧、首帧定位、时空扩散计算以及生成带遮罩视频的完整 Python 源码包含详细注释importos os.environ[CUDA_VISIBLE_DEVICES]importcv2importtorchimportnumpyasnpclassDummyDeviceProps:major0minor0torch.cuda.get_device_propertieslambdax:DummyDeviceProps()fromgroundingdino.util.inferenceimportload_model,load_image,predictimporthydrafromhydra.core.global_hydraimportGlobalHydrafromhydra.utilsimportinstantiate devicecpu# 1. 加载 DINO 模型dino_modelload_model(grounding_dino/groundingdino/config/GroundingDINO_SwinT_OGC.py,gdino_checkpoints/groundingdino_swint_ogc.pth,devicedevice)# 2. 强力加载 SAM 2GlobalHydra.instance().clear()config_diros.path.abspath(sam2_configs)ifnotos.path.exists(config_dir):config_diros.path.abspath(sam2/configs)withhydra.initialize_config_dir(config_dirconfig_dir,version_base1.2):my_overrides[model._target_sam2.sam2_video_predictor.SAM2VideoPredictor]try:cfghydra.compose(config_namesam2_hiera_b.yaml,overridesmy_overrides)exceptException:cfghydra.compose(config_namesam2/sam2_hiera_b.yaml,overridesmy_overrides)sam2_predictorinstantiate(cfg.model,_recursive_True)state_dicttorch.load(checkpoints/sam2_hiera_base_plus.pt,map_locationcpu)ifmodelinstate_dict:state_dictstate_dict[model]sam2_predictor.load_state_dict(state_dict,strictTrue)sam2_predictor.to(device)sam2_predictor.eval()# 3. 设置目标和视频VIDEO_PATHtest_video.mp4TEXT_PROMPTdog .OUTPUT_FRAMES_DIR./temp_framesos.makedirs(OUTPUT_FRAMES_DIR,exist_okTrue)# 核心修复每次运行自动清理历史图片残留forfinos.listdir(OUTPUT_FRAMES_DIR):iff.endswith(.jpg):os.remove(os.path.join(OUTPUT_FRAMES_DIR,f))# 4. 视频拆帧vidcapcv2.VideoCapture(VIDEO_PATH)fpsvidcap.get(cv2.CAP_PROP_FPS)success,imagevidcap.read()count0whilesuccess:cv2.imwrite(f{OUTPUT_FRAMES_DIR}/{count:05d}.jpg,image)success,imagevidcap.read()count1# 5. 首帧检测first_frame_pathf{OUTPUT_FRAMES_DIR}/00000.jpgimage_source,image_tensorload_image(first_frame_path)boxes,logits,phrasespredict(modeldino_model,imageimage_tensor,captionTEXT_PROMPT,box_threshold0.3,text_threshold0.25,devicedevice)# 6. 跨帧追踪inference_statesam2_predictor.init_state(video_pathOUTPUT_FRAMES_DIR)forboxinboxes:h,w,_image_source.shape boxbox*torch.Tensor([w,h,w,h])x1,y1,x2,y2box[0]-box[2]/2,box[1]-box[3]/2,box[0]box[2]/2,box[1]box[3]/2sam2_predictor.add_new_points_or_box(inference_stateinference_state,frame_idx0,obj_id1,boxtorch.tensor([x1,y1,x2,y2],devicedevice))video_segments{}forout_frame_idx,out_obj_ids,out_mask_logitsinsam2_predictor.propagate_in_video(inference_state):video_segments[out_frame_idx]{obj_id:(out_mask_logits[i]0.0).cpu().numpy()fori,obj_idinenumerate(out_obj_ids)}# 7. 渲染并导出视频OUTPUT_VIDEO_PATHoutput_result.mp4sample_imgcv2.imread(f{OUTPUT_FRAMES_DIR}/00000.jpg)height,width,_sample_img.shape fourcccv2.VideoWriter_fourcc(*mp4v)video_writercv2.VideoWriter(OUTPUT_VIDEO_PATH,fourcc,fps,(width,height))forframe_idxinrange(count):frame_pathf{OUTPUT_FRAMES_DIR}/{frame_idx:05d}.jpgframe_imgcv2.imread(frame_path)ifframe_idxinvideo_segments:forobj_id,maskinvideo_segments[frame_idx].items():maskmask.squeeze()green_masknp.zeros_like(frame_img,dtypenp.uint8)green_mask[mask][0,255,0]frame_imgcv2.addWeighted(frame_img,1.0,green_mask,0.4,0)video_writer.write(frame_img)video_writer.release()3.3测试结果分析代码执行完毕后系统将在根目录下生成 output_result.mp4 文件。从结果可以观测到系统仅通过首帧接收自然语言指令 “dog .”即可在后续的所有视频帧中生成半透明的绿色科幻遮罩。在狗发生奔跑转身、遭遇背景杂物局部遮挡时遮罩边缘依然能够平滑、紧凑地贴合目标实体完美验证SAM2时空特征记忆机制的鲁棒性。4. 参考链接•Grounded-SAM-2 官方开源仓库IDEA-Research/Grounded-SAM-2•SAM 2 论文及官方介绍Segment Anything Model 2 (Meta AI)•Grounding DINO 学术论文Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection
基于Grounded-SAM-2的动态场景目标检测
1.作者介绍刘思佳女西安工程大学电子信息学院2025级研究生研究方向近红外光谱纤维鉴别电子邮件1335759643qq.com胥乾信西安工程大学电子信息学院2025级研究生张宏伟人工智能课题组研究方向机器视觉与人工智能电子邮件2692797728qq.com2基于Grounded-SAM-2的动态场景目标检测随着计算机视觉大模型的飞速发展将“自然语言理解”与“像素级视频分割”相结合成为了新的研究热点。本文将深入浅出地介绍目前前沿的 Grounded-SAM-2 联合架构并附上完整的动态场景目标追踪单目标锁定的实战代码。Grounded-SAM-2 并非一个单一的黑盒模型而是由两大顶级视觉基础大模型Foundation Models强强联合组成的端到端级联管线。其核心思想是前端负责“看懂语言并找位置”后端负责“精准抠图并跨帧追踪”。2.1 Grounded-SAM-2 整体框架模型Grounded-SAM-2 Grounding DINO SAM 2是一个串联式视频目标检测与跟踪流水线。完整工作流程•首帧输入文本提示•Grounding DINO 检测目标框•SAM 2 根据框生成掩码•SAM 2 在后续帧自动跟踪目标•输出带掩码的视频结果它的核心优势•文本驱动无需标注•零样本开箱即用•动态场景稳定跟踪•支持任意物体检测2.2 Grounding DINO开放词汇目标定位在传统的检测任务中如 YOLO 系列模型只能识别训练集内预设的类别。而 Grounding DINO 打破了这一限制实现了开放词汇Open-Vocabulary的零样本检测。•跨模态对齐DINO 内部包含提取图像特征的视觉骨干网络Swin Transformer和提取文本特征的语言模型BERT。通过特征增强器Feature Enhancer它能在数学空间上将“文本描述”与“图像像素”对应起来。•首帧感知在动态视频处理中Grounding DINO 仅在第一帧介入。用户输入文本提示词Prompt例如 “dog .”模型即可在首帧瞬间输出目标高精度的候选边界框Bounding Box。模型的框架图如下框架结构分为五层第1层输入与基础特征提取•模型的两个输入 文本和图像•文本骨干网络把文字转换成 “文本特征向量”让模型理解说的是什么物体。•图像骨干网络把图片转换成 “图像特征向量”提取画面里的视觉信息。第 2 层特征增强•对文本和图像特征进行增强处理让文字描述和图像内容的关联更紧密为后续的跨模态匹配做准备。 输出增强后的特征。第 3 层语言引导的查询选择•用文本特征从图像特征中筛选出和文字描述相关的视觉查询。 比如模型会根据 “dog” 这个词从画面里挑出 “看起来像狗的区域” 作为候选目标。第 4 层•跨模态解码器接收来自第 3 层的跨模态查询并结合文本和图像特征进行解码。 这些信息会被用来生成最终的目标检测结果。第 5 层输出与损失计算•模型的最终结果也就是需要的目标检测框Bounding Box。•训练时用的两种损失函数 •对比损失让模型学习 “文字和正确的物体特征更相似和错误的物体特征更不相似”。•定位损失让模型把检测框的位置和大小预测得更准确2.3 SAM 2时空记忆与视频分割SAM 2Segment Anything Model 2是 Meta 最新发布的统一图像与视频分割大模型。相比于第一代它最大的突破在于引入了动态视频流的处理能力。•接收 DINO 传来的边界框作为 Prompt在首帧将粗糙的矩形框转化为像素级的精准遮罩Mask。•时空记忆机制是连续追踪的核心。SAM 2 构建了一个记忆库Memory Bank用于存储目标在历史帧中的形状和特征。在处理后续帧时通过记忆注意力机制Memory Attention持续回看历史状态。正是依托这种时空记忆机制即使目标在视频中发生了剧烈形变或遭到短暂物理遮挡SAM 2 依然能够保持稳定的连续追踪不会丢失目标。•视频帧输入与图像编码image encoder对每一帧视频图像提取通用特征。把画面变成模型能理解的高维特征•“提示 - 掩码” 生成阶段首帧用prompt encoder接收用户给的 “提示” 把这些提示变成特征告诉模型 “我要分割的目标在哪”。 mask decoder结合图像特征和提示特征生成像素级的目标掩码。也就是把轮廓精确抠出来得到精细分割结果。•视频跟踪与记忆更新后续帧用memory encoder把上一帧生成的掩码和图像特征编码成“记忆特征”存起来。memory bank存储所有历史帧的记忆特征。模型靠这些记忆记住目标长什么样、怎么动。memory attention在下一帧处理时从 memory bank 里调取历史记忆和当前帧的图像特征做注意力计算从而知道 “这一帧里哪个是我之前跟踪的目标”。•整个流程不断循环每一帧的掩码都会被编码成记忆传给下一帧实现持续跟踪。3关于实验过程的介绍完整实验代码测试结果3.1实验数据集与环境依赖配置数据集介绍•模型预训练加载基于 SA-V5.1万视频与 COCO图文对训练的基础权重赋予模型零样本泛化能力。•本地测试视频一段 378 帧的生活场景自定义短视频test_video.mp4验证模型在未经微调情况下的工程鲁棒性。环境依赖与软件包本实验推荐在 Python 3.10 的环境下进行。核心依赖包如下•torch (建议 2.4 左右版本)•transformers4.35.0•groundingdino, sam2 (官方源码安装)•opencv-python (用于视频拆帧与最终 Alpha 混合渲染)•hydra-core (动态加载模型配置文件)3.2完整追踪与渲染代码实现以下为实现视频拆帧、首帧定位、时空扩散计算以及生成带遮罩视频的完整 Python 源码包含详细注释importos os.environ[CUDA_VISIBLE_DEVICES]importcv2importtorchimportnumpyasnpclassDummyDeviceProps:major0minor0torch.cuda.get_device_propertieslambdax:DummyDeviceProps()fromgroundingdino.util.inferenceimportload_model,load_image,predictimporthydrafromhydra.core.global_hydraimportGlobalHydrafromhydra.utilsimportinstantiate devicecpu# 1. 加载 DINO 模型dino_modelload_model(grounding_dino/groundingdino/config/GroundingDINO_SwinT_OGC.py,gdino_checkpoints/groundingdino_swint_ogc.pth,devicedevice)# 2. 强力加载 SAM 2GlobalHydra.instance().clear()config_diros.path.abspath(sam2_configs)ifnotos.path.exists(config_dir):config_diros.path.abspath(sam2/configs)withhydra.initialize_config_dir(config_dirconfig_dir,version_base1.2):my_overrides[model._target_sam2.sam2_video_predictor.SAM2VideoPredictor]try:cfghydra.compose(config_namesam2_hiera_b.yaml,overridesmy_overrides)exceptException:cfghydra.compose(config_namesam2/sam2_hiera_b.yaml,overridesmy_overrides)sam2_predictorinstantiate(cfg.model,_recursive_True)state_dicttorch.load(checkpoints/sam2_hiera_base_plus.pt,map_locationcpu)ifmodelinstate_dict:state_dictstate_dict[model]sam2_predictor.load_state_dict(state_dict,strictTrue)sam2_predictor.to(device)sam2_predictor.eval()# 3. 设置目标和视频VIDEO_PATHtest_video.mp4TEXT_PROMPTdog .OUTPUT_FRAMES_DIR./temp_framesos.makedirs(OUTPUT_FRAMES_DIR,exist_okTrue)# 核心修复每次运行自动清理历史图片残留forfinos.listdir(OUTPUT_FRAMES_DIR):iff.endswith(.jpg):os.remove(os.path.join(OUTPUT_FRAMES_DIR,f))# 4. 视频拆帧vidcapcv2.VideoCapture(VIDEO_PATH)fpsvidcap.get(cv2.CAP_PROP_FPS)success,imagevidcap.read()count0whilesuccess:cv2.imwrite(f{OUTPUT_FRAMES_DIR}/{count:05d}.jpg,image)success,imagevidcap.read()count1# 5. 首帧检测first_frame_pathf{OUTPUT_FRAMES_DIR}/00000.jpgimage_source,image_tensorload_image(first_frame_path)boxes,logits,phrasespredict(modeldino_model,imageimage_tensor,captionTEXT_PROMPT,box_threshold0.3,text_threshold0.25,devicedevice)# 6. 跨帧追踪inference_statesam2_predictor.init_state(video_pathOUTPUT_FRAMES_DIR)forboxinboxes:h,w,_image_source.shape boxbox*torch.Tensor([w,h,w,h])x1,y1,x2,y2box[0]-box[2]/2,box[1]-box[3]/2,box[0]box[2]/2,box[1]box[3]/2sam2_predictor.add_new_points_or_box(inference_stateinference_state,frame_idx0,obj_id1,boxtorch.tensor([x1,y1,x2,y2],devicedevice))video_segments{}forout_frame_idx,out_obj_ids,out_mask_logitsinsam2_predictor.propagate_in_video(inference_state):video_segments[out_frame_idx]{obj_id:(out_mask_logits[i]0.0).cpu().numpy()fori,obj_idinenumerate(out_obj_ids)}# 7. 渲染并导出视频OUTPUT_VIDEO_PATHoutput_result.mp4sample_imgcv2.imread(f{OUTPUT_FRAMES_DIR}/00000.jpg)height,width,_sample_img.shape fourcccv2.VideoWriter_fourcc(*mp4v)video_writercv2.VideoWriter(OUTPUT_VIDEO_PATH,fourcc,fps,(width,height))forframe_idxinrange(count):frame_pathf{OUTPUT_FRAMES_DIR}/{frame_idx:05d}.jpgframe_imgcv2.imread(frame_path)ifframe_idxinvideo_segments:forobj_id,maskinvideo_segments[frame_idx].items():maskmask.squeeze()green_masknp.zeros_like(frame_img,dtypenp.uint8)green_mask[mask][0,255,0]frame_imgcv2.addWeighted(frame_img,1.0,green_mask,0.4,0)video_writer.write(frame_img)video_writer.release()3.3测试结果分析代码执行完毕后系统将在根目录下生成 output_result.mp4 文件。从结果可以观测到系统仅通过首帧接收自然语言指令 “dog .”即可在后续的所有视频帧中生成半透明的绿色科幻遮罩。在狗发生奔跑转身、遭遇背景杂物局部遮挡时遮罩边缘依然能够平滑、紧凑地贴合目标实体完美验证SAM2时空特征记忆机制的鲁棒性。4. 参考链接•Grounded-SAM-2 官方开源仓库IDEA-Research/Grounded-SAM-2•SAM 2 论文及官方介绍Segment Anything Model 2 (Meta AI)•Grounding DINO 学术论文Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection