2025/12/29 21:38:29
网站建设
项目流程
vk汉化网站谁做的,wordpress更换链接自动跳转,昆明网络哪家好,百度网站app《博主简介》 小伙伴们好#xff0c;我是阿旭。 专注于计算机视觉领域#xff0c;包括目标检测、图像分类、图像分割和目标跟踪等项目开发#xff0c;提供模型对比实验、答疑辅导等。 《------往期经典推荐------》
一、AI应用软件开发实战专栏【链接】
项目名称项目名称1…《博主简介》小伙伴们好我是阿旭。专注于计算机视觉领域包括目标检测、图像分类、图像分割和目标跟踪等项目开发提供模型对比实验、答疑辅导等。《------往期经典推荐------》一、AI应用软件开发实战专栏【链接】项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【YOLOv8多目标识别与自动标注软件开发】8.【基于深度学习的行人跌倒检测系统】9.【基于深度学习的PCB板缺陷检测系统】10.【基于深度学习的生活垃圾分类目标检测系统】11.【基于深度学习的安全帽目标检测系统】12.【基于深度学习的120种犬类检测与识别系统】13.【基于深度学习的路面坑洞检测系统】14.【基于深度学习的火焰烟雾检测系统】15.【基于深度学习的钢材表面缺陷检测系统】16.【基于深度学习的舰船目标分类检测系统】17.【基于深度学习的西红柿成熟度检测系统】18.【基于深度学习的血细胞检测与计数系统】19.【基于深度学习的吸烟/抽烟行为检测系统】20.【基于深度学习的水稻害虫检测与识别系统】21.【基于深度学习的高精度车辆行人检测与计数系统】22.【基于深度学习的路面标志线检测与识别系统】23.【基于深度学习的智能小麦害虫检测识别系统】24.【基于深度学习的智能玉米害虫检测识别系统】25.【基于深度学习的200种鸟类智能检测与识别系统】26.【基于深度学习的45种交通标志智能检测与识别系统】27.【基于深度学习的人脸面部表情识别系统】28.【基于深度学习的苹果叶片病害智能诊断系统】29.【基于深度学习的智能肺炎诊断系统】30.【基于深度学习的葡萄簇目标检测系统】31.【基于深度学习的100种中草药智能识别系统】32.【基于深度学习的102种花卉智能识别系统】33.【基于深度学习的100种蝴蝶智能识别系统】34.【基于深度学习的水稻叶片病害智能诊断系统】35.【基于与ByteTrack的车辆行人多目标检测与追踪系统】36.【基于深度学习的智能草莓病害检测与分割系统】37.【基于深度学习的复杂场景下船舶目标检测系统】38.【基于深度学习的农作物幼苗与杂草检测系统】39.【基于深度学习的智能道路裂缝检测与分析系统】40.【基于深度学习的葡萄病害智能诊断与防治系统】41.【基于深度学习的遥感地理空间物体检测系统】42.【基于深度学习的无人机视角地面物体检测系统】43.【基于深度学习的木薯病害智能诊断与防治系统】44.【基于深度学习的野外火焰烟雾检测系统】45.【基于深度学习的脑肿瘤智能检测系统】46.【基于深度学习的玉米叶片病害智能诊断与防治系统】47.【基于深度学习的橙子病害智能诊断与防治系统】48.【基于深度学习的车辆检测追踪与流量计数系统】49.【基于深度学习的行人检测追踪与双向流量计数系统】50.【基于深度学习的反光衣检测与预警系统】51.【基于深度学习的危险区域人员闯入检测与报警系统】52.【基于深度学习的高密度人脸智能检测与统计系统】53.【基于深度学习的CT扫描图像肾结石智能检测系统】54.【基于深度学习的水果智能检测系统】55.【基于深度学习的水果质量好坏智能检测系统】56.【基于深度学习的蔬菜目标检测与识别系统】57.【基于深度学习的非机动车驾驶员头盔检测系统】58.【太基于深度学习的阳能电池板检测与分析系统】59.【基于深度学习的工业螺栓螺母检测】60.【基于深度学习的金属焊缝缺陷检测系统】61.【基于深度学习的链条缺陷检测与识别系统】62.【基于深度学习的交通信号灯检测识别】63.【基于深度学习的草莓成熟度检测与识别系统】64.【基于深度学习的水下海生物检测识别系统】65.【基于深度学习的道路交通事故检测识别系统】66.【基于深度学习的安检X光危险品检测与识别系统】67.【基于深度学习的农作物类别检测与识别系统】68.【基于深度学习的危险驾驶行为检测识别系统】69.【基于深度学习的维修工具检测识别系统】70.【基于深度学习的维修工具检测识别系统】71.【基于深度学习的建筑墙面损伤检测系统】72.【基于深度学习的煤矿传送带异物检测系统】73.【基于深度学习的老鼠智能检测系统】74.【基于深度学习的水面垃圾智能检测识别系统】75.【基于深度学习的遥感视角船只智能检测系统】76.【基于深度学习的胃肠道息肉智能检测分割与诊断系统】77.【基于深度学习的心脏超声图像间隔壁检测分割与分析系统】78.【基于深度学习的心脏超声图像间隔壁检测分割与分析系统】79.【基于深度学习的果园苹果检测与计数系统】80.【基于深度学习的半导体芯片缺陷检测系统】81.【基于深度学习的糖尿病视网膜病变检测与诊断系统】82.【基于深度学习的运动鞋品牌检测与识别系统】83.【基于深度学习的苹果叶片病害检测识别系统】84.【基于深度学习的医学X光骨折检测与语音提示系统】85.【基于深度学习的遥感视角农田检测与分割系统】86.【基于深度学习的运动品牌LOGO检测与识别系统】87.【基于深度学习的电瓶车进电梯检测与语音提示系统】88.【基于深度学习的遥感视角地面房屋建筑检测分割与分析系统】89.【基于深度学习的医学CT图像肺结节智能检测与语音提示系统】90.【基于深度学习的舌苔舌象检测识别与诊断系统】91.【基于深度学习的蛀牙智能检测与语音提示系统】92.【基于深度学习的皮肤癌智能检测与语音提示系统】93.【基于深度学习的工业压力表智能检测与读数系统】94.【基于深度学习的CT扫描图像肝脏肿瘤智能检测与分析系统】95.【基于深度学习的CT扫描图像脑肿瘤智能检测与分析系统】96.【基于深度学习的甲状腺结节智能检测分割与诊断系统】二、机器学习实战专栏【链接】已更新31期欢迎关注持续更新中~~三、深度学习【Pytorch】专栏【链接】四、【Stable Diffusion绘画系列】专栏【链接】五、YOLOv8改进专栏【链接】持续更新中~~六、YOLO性能对比专栏【链接】持续更新中~《------正文------》目录引言什么是SAM3视频分割实战步骤使用SAM3分割视频目标1. 环境准备与库导入2. 定义辅助函数3. 加载SAM3模型4. 视频预处理转为视频帧5. 读取视频帧6. 初始化视频处理会话7. 方法一使用文本提示分割目标8. 在整个视频中跟踪分割目标9. 移除指定目标10. 方法二使用点提示添加指定目标11. 方法三使用正负样本点精细分割总结引言在计算机视觉领域视频目标分割一直是备受关注的任务。SAM3Segment Anything Model 3作为新一代分割模型凭借其强大的提示交互能力让视频目标分割变得前所未有的简单。之前的4篇文章已经介绍了许多关于SAM3分割图像与视频案例【SAM3教程-1】SAM3 使用文本提示进行图像分割详细步骤与示例【附源码】【SAM3教程-2】使用正负样本提示框一键分割图片中的相似目标详细步骤与示例【SAM3教程-3】使用提示点 提示框精准 “圈” 出指定目标正负样本搭配更高效【附源码】【SAM3教程-4】使用文本精准分割视频里的目标附完整代码教程本文将详细介绍如何使用SAM3通过文本和点提示来实现视频中指定目标的精准分割与跟踪。包括以下内容使用文本提示分割并跟踪视频指定类别目标通过ID移除指定目标通过提示点添加指定目标通过正负样本提示点精细分割出指定目标SAM3分割小男孩全身以及小女孩的衣服区域效果如下【注示例中没有对小女孩进行完整分割主要是用于演示SAM3的精细区域分割】什么是SAM3视频分割SAM3是Meta推出的第三代万物分割模型相比前代它在视频处理方面进行了专门优化支持多种提示方式文本、点、框等与视频目标的交互能够通过文本描述直接分割视频中的目标利用点提示精确指定需要分割的区域对分割目标进行跨帧跟踪支持目标的添加与移除操作实战步骤使用SAM3分割视频目标1. 环境准备与库导入首先需要导入必要的库包括视频处理、深度学习框架和SAM3相关工具importcv2importtorchimportnumpyasnpimportsupervisionassvfrompathlibimportPathfromPILimportImagefromtypingimportOptionalfromIPython.displayimportVideofromsam3.model_builderimportbuild_sam3_video_predictorimportosimportglobimportmatplotlib.pyplotaspltfromsam3.visualization_utilsimport(load_frame,prepare_masks_for_visualization,visualize_formatted_frame_output,)2. 定义辅助函数为了方便后续处理我们定义两个实用函数# 设置图片标题与坐标字体大小plt.rcParams[axes.titlesize]12plt.rcParams[figure.titlesize]12# 从0到最后一帧传播需要分割的目标defpropagate_in_video(predictor,session_id):# 从第0帧传播到视频结束outputs_per_frame{}forresponseinpredictor.handle_stream_request(requestdict(typepropagate_in_video,session_idsession_id,)):outputs_per_frame[response[frame_index]]response[outputs]returnoutputs_per_frame# 将绝对坐标转换为相对坐标0-1范围defabs_to_rel_coords(coords,IMG_WIDTH,IMG_HEIGHT,coord_typepoint):ifcoord_typepoint:return[[x/IMG_WIDTH,y/IMG_HEIGHT]forx,yincoords]elifcoord_typebox:return[[x/IMG_WIDTH,y/IMG_HEIGHT,w/IMG_WIDTH,h/IMG_HEIGHT]forx,y,w,hincoords]else:raiseValueError(fUnknown coord_type:{coord_type})3. 加载SAM3模型加载预训练的SAM3模型需要指定模型权重文件和BPE字节对编码文件路径# 使用GPU加速DEVICES[torch.cuda.current_device()]# 初始化模型并加载预训练权重checkpoint_pathmodels/sam3.pt# 模型文件路径bpe_pathassets/bpe_simple_vocab_16e6.txt.gz# BPE文件路径predictorbuild_sam3_video_predictor(checkpoint_pathcheckpoint_path,bpe_pathstr(bpe_path),gpus_to_useDEVICES)4. 视频预处理转为视频帧原视频为使用ffmpeg工具将视频转换为一系列图片帧方便按索引访问# 视频路径SOURCE_VIDEOassets/videos/bedroom.mp4# 视频帧输出目录output_diroutput2ifnotos.path.exists(output_dir):os.makedirs(output_dir)# 使用ffmpeg分割视频为帧!ffmpeg-i{SOURCE_VIDEO}-q:v2-start_number0output2/%05d.jpg5. 读取视频帧将分割好的视频帧读取到内存中用于后续处理和可视化# 设置视频帧目录video_pathfoutput2# 加载视频帧用于可视化ifisinstance(video_path,str)andvideo_path.endswith(.mp4):capcv2.VideoCapture(video_path)video_frames_for_vis[]whileTrue:ret,framecap.read()ifnotret:breakvideo_frames_for_vis.append(cv2.cvtColor(frame,cv2.COLOR_BGR2RGB))cap.release()else:video_frames_for_visglob.glob(os.path.join(video_path,*.jpg))# 按帧索引排序try:video_frames_for_vis.sort(keylambdap:int(os.path.splitext(os.path.basename(p))[0]))exceptValueError:print(falling back to lexicographic sort.)video_frames_for_vis.sort()6. 初始化视频处理会话创建一个视频处理会话让模型加载并准备处理视频responsepredictor.handle_request(requestdict(typestart_session,resource_pathSOURCE_VIDEO,))session_idresponse[session_id]# 会话ID用于后续操作会话ID是后续所有操作的标识如果需要重新开始可以使用下面reset_session重置会话【否则可能会出现推理不准确】_predictor.handle_request(requestdict(typereset_session,session_idsession_id,))7. 方法一使用文本提示分割目标只需输入文本描述SAM3就能自动识别并分割视频中对应的目标# 设置要分割的目标文本描述prompt_text_strperson# 这里以人为例frame_idx0# 在第0帧添加文本提示# 发送文本提示请求responsepredictor.handle_request(requestdict(typeadd_prompt,session_idsession_id,frame_indexframe_idx,textprompt_text_str,))outresponse[outputs]# 获取分割结果可视化第一帧的分割结果plt.close(all)visualize_formatted_frame_output(frame_idx,video_frames_for_vis,outputs_list[prepare_masks_for_visualization({frame_idx:out})],titles[SAM 3 Dense Tracking outputs],figsize(6,4),)8. 在整个视频中跟踪分割目标基于第一帧的分割结果让模型在整个视频中跟踪并分割目标# 从第0帧传播到视频结束并收集所有输出outputs_per_framepropagate_in_video(predictor,session_id)# 格式化输出以实现可视化outputs_per_frameprepare_masks_for_visualization(outputs_per_frame)# 每60帧可视化一次结果vis_frame_stride60plt.close(all)forframe_idxinrange(0,len(outputs_per_frame),vis_frame_stride):visualize_formatted_frame_output(frame_idx,video_frames_for_vis,outputs_list[outputs_per_frame],titles[SAM 3 Dense Tracking outputs],figsize(6,4),)9. 移除指定目标如果需要移除某个已分割的目标可以通过目标ID进行操作下面我们以移除上面画面中ID为1的小女孩为例obj_id1# 指定需要移除的目标IDresponsepredictor.handle_request(requestdict(typeremove_object,session_idsession_id,obj_idobj_id,))# 重新传播并可视化结果验证是否已移除outputs_per_framepropagate_in_video(predictor,session_id)outputs_per_frameprepare_masks_for_visualization(outputs_per_frame)每隔60帧显示一次推理结果我们可以发现之前ID1的小女孩已经没有被进行分割。10. 方法二使用点提示添加指定目标除了文本还可以通过点提示来指定需要分割的目标适合更精确的控制下面我们再将上面移除的ID为1的目标通过添加点提示的方式再重新添加回来。# 获取图像尺寸sample_imgImage.fromarray(load_frame(video_frames_for_vis[0]))IMG_WIDTH,IMG_HEIGHTsample_img.size# 设置点提示参数frame_idx0obj_id1# 要添加的目标IDpoints_absnp.array([[406,170]])# 正样本点需要分割的区域labelsnp.array([1])# 1表示正样本点0表示负样本点# 转换为相对坐标并发送请求points_tensortorch.tensor(abs_to_rel_coords(points_abs,IMG_WIDTH,IMG_HEIGHT,coord_typepoint),dtypetorch.float32,)points_labels_tensortorch.tensor(labels,dtypetorch.int32)responsepredictor.handle_request(requestdict(typeadd_prompt,session_idsession_id,frame_indexframe_idx,pointspoints_tensor,point_labelspoints_labels_tensor,obj_idobj_id,))11. 方法三使用正负样本点精细分割SAM3可以通过结合正负样本点可以实现更精细的目标分割下面我们重新修正一下上述ID1的目标。我们不对整个人进行区域分割只分割出衣服区域。# 设置多个样本点结合正负样本frame_idx0obj_id1points_absnp.array([[421,155],# 正样本点目标区域[420,202],# 负样本点非目标区域[400,107],# 负样本点非目标区域])labelsnp.array([1,0,0])# 1:正样本0:负样本# 转换坐标并发送请求points_tensortorch.tensor(abs_to_rel_coords(points_abs,IMG_WIDTH,IMG_HEIGHT,coord_typepoint),dtypetorch.float32,)points_labels_tensortorch.tensor(labels,dtypetorch.int32)responsepredictor.handle_request(requestdict(typeadd_prompt,session_idsession_id,frame_indexframe_idx,pointspoints_tensor,point_labelspoints_labels_tensor,obj_idobj_id,))每隔60帧显示一次推理结果我们可以发现ID1的目标已经被设置为仅分割衣服没有对整个人进行区域分割。总结SAM3通过灵活的提示机制极大简化了视频目标分割的流程。无论是使用文本描述快速定位目标还是通过点提示进行精细分割都能获得出色的效果。这种交互方式使得即使是非专业用户也能轻松实现复杂的视频分割任务为视频编辑、目标跟踪等应用场景提供了强大的技术支持。通过本文介绍的方法你可以快速上手SAM3的视频分割功能根据实际需求选择合适的提示方式实现精准的视频目标分割与跟踪。好了这篇文章就介绍到这里喜欢的小伙伴感谢给点个赞和关注更多精彩内容持续更新~~关于本篇文章大家有任何建议或意见欢迎在评论区留言交流