【python】OpenCV—Tracking(10.3)—GOTURN
文章目录
- 1、功能描述
- 2、模型介绍
- 3、代码实现
- 4、完整代码
- 5、结果展示
- 6、优缺点分析
- 7、参考
1、功能描述
基于 Generic Object Tracking using Regression Networks 方法,实现单目标跟踪
2、模型介绍
(1)发表来自
Held D, Thrun S, Savarese S. Learning to track at 100 fps with deep regression networks[C]//Computer Vision–ECCV 2016: 14th European Conference, Amsterdam, The Netherlands, October 11–14, 2016, Proceedings, Part I 14. Springer International Publishing, 2016: 749-765.
(2)基本原理
(3)模型大小
(4)模型结构
3、代码实现
# Import modules
import cv2, sys, osnum = 0if not (os.path.isfile('goturn.caffemodel') and os.path.isfile('goturn.prototxt')):errorMsg = '''Could not find GOTURN model in current directory.Please ensure goturn.caffemodel and goturn.prototxt are in the current directory'''print(errorMsg)sys.exit()
导入必要的库函数,判断 caffe 模型文件是否存在,模型下载地址见本博客最后的参考
# Create tracker
tracker = cv2.TrackerGOTURN_create()# Read video
video = cv2.VideoCapture("tracking2.mkv")# Exit if video not opened
if not video.isOpened():print("Could not open video")sys.exit()# Read first frame
ok, frame = video.read()
# cv2.imwrite("first.jpg", frame)
# ok = Falseif not ok:print("Cannot read video file")sys.exit()
创建跟踪器,读取视频第一帧
# Define a bounding box
# bbox = (25, 65, 35, 90) # 左上坐标宽高
bbox = (90, 85, 50, 105) # 左上坐标宽高# Uncomment the line below to select a different bounding box
# bbox = cv2.selectROI(frame, False)# Initialize tracker with first frame and bounding box
ok = tracker.init(frame, bbox)
用第一帧初始化跟踪器,作为待跟踪的模板,bbox 配置是目标左上角的横纵坐标,以及目标的宽和高
while True:num += 1# Read a new frameok, frame = video.read()if not ok:break# Start timertimer = cv2.getTickCount()# Update trackerok, bbox = tracker.update(frame)# Calculate Frames per second (FPS)fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);# Draw bounding boxif ok:# Tracking successp1 = (int(bbox[0]), int(bbox[1]))p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))cv2.rectangle(frame, p1, p2, (0, 0, 255), 2, 1)else:# Tracking failurecv2.putText(frame, "Tracking failure detected", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)# Display tracker type on framecv2.putText(frame, "GOTURN Tracker", (100, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50, 170, 50), 2);# Display FPS on framecv2.putText(frame, "FPS : " + str(int(fps)), (100, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50, 170, 50), 2);# Display resultcv2.imshow("Tracking", frame)cv2.imwrite(f"{str(num).zfill(3)}.jpg", frame)# Exit if ESC pressedk = cv2.waitKey(1) & 0xffif k == 27:break
遍历视频中的图片,ok, bbox = tracker.update(frame)
跟踪,绘制帧率、跟踪器,保存、显示每一帧结果,ESC
键退出
4、完整代码
# Import modules
import cv2, sys, osnum = 0if not (os.path.isfile('goturn.caffemodel') and os.path.isfile('goturn.prototxt')):errorMsg = '''Could not find GOTURN model in current directory.Please ensure goturn.caffemodel and goturn.prototxt are in the current directory'''print(errorMsg)sys.exit()# Create tracker
tracker = cv2.TrackerGOTURN_create()# Read video
video = cv2.VideoCapture("tracking2.mkv")# Exit if video not opened
if not video.isOpened():print("Could not open video")sys.exit()# Read first frame
ok, frame = video.read()
# cv2.imwrite("first.jpg", frame)
# ok = Falseif not ok:print("Cannot read video file")sys.exit()# Define a bounding box
# bbox = (25, 65, 35, 90) # 左上坐标宽高
bbox = (90, 85, 50, 105) # 左上坐标宽高# Uncomment the line below to select a different bounding box
# bbox = cv2.selectROI(frame, False)# Initialize tracker with first frame and bounding box
ok = tracker.init(frame, bbox)while True:num += 1# Read a new frameok, frame = video.read()if not ok:break# Start timertimer = cv2.getTickCount()# Update trackerok, bbox = tracker.update(frame)# Calculate Frames per second (FPS)fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);# Draw bounding boxif ok:# Tracking successp1 = (int(bbox[0]), int(bbox[1]))p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))cv2.rectangle(frame, p1, p2, (0, 0, 255), 2, 1)else:# Tracking failurecv2.putText(frame, "Tracking failure detected", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)# Display tracker type on framecv2.putText(frame, "GOTURN Tracker", (100, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50, 170, 50), 2);# Display FPS on framecv2.putText(frame, "FPS : " + str(int(fps)), (100, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50, 170, 50), 2);# Display resultcv2.imshow("Tracking", frame)cv2.imwrite(f"{str(num).zfill(3)}.jpg", frame)# Exit if ESC pressedk = cv2.waitKey(1) & 0xffif k == 27:break
5、结果展示
未设置成循环播放,可刷新网页循环播放
这个一开始就跟丢了
这个效果还差不多,不过人头一直没有跟踪上,后面也慢慢的飘了
6、优缺点分析
GOTURN是一种基于深度学习的对象跟踪算法
一、优点
-
高速度:GOTURN算法能够以非常高的速度运行,在Caffe的GPU上可以实现100fps(帧每秒)的速度,在OpenCV的CPU上也能达到20fps的速度。这使得GOTURN在处理实时视频跟踪任务时具有很高的效率。
-
离线训练:GOTURN算法利用了大量数据进行离线训练,这使得它在跟踪未见过的类别样例时也能表现出较好的效果。同时,由于不需要在线微调网络参数,只需要一次前向传播就能得到目标位置,因此跟踪速度非常快。
-
鲁棒性:GOTURN算法对视角、形变和光照变化具有一定的鲁棒性。这意味着在目标发生一定的形变、视角变化或光照变化时,算法仍然能够准确地跟踪目标。
-
泛化能力强:由于采用视频和图片训练的方式,GOTURN算法具有较强的泛化能力。它不仅能够处理视频中的目标跟踪任务,还能对静态图片中的目标进行跟踪。
二、缺点
- 对遮挡敏感:虽然GOTURN算法对视角、形变和光照变化具有鲁棒性,但它对遮挡比较敏感。当目标被其他物体遮挡时,算法的跟踪性能可能会受到影响。
- 依赖物体运动的平稳性:GOTURN算法假设物体在视频中相邻两帧的运动具有相对平稳的性质。因此,当目标发生剧烈运动或快速移动时,算法的跟踪性能可能会下降。
- 跟踪失败后恢复困难:一旦GOTURN算法在跟踪过程中失败,它可能无法及时呈现错误报告,并且难以从失败中恢复。这可能导致算法在长时间跟踪任务中表现不佳。
综上所述,GOTURN算法以其高速度和离线训练的优势在目标跟踪领域具有一定的应用价值。然而,它对遮挡的敏感性和对物体运动平稳性的依赖也限制了其在某些复杂场景下的应用。因此,在选择目标跟踪算法时,需要根据具体的应用场景和需求进行权衡和选择。
7、参考
- http://davheld.github.io/GOTURN/GOTURN.html
- 目标跟踪(2)GOTURN:基于深度学习的目标跟踪
- 模型下载地址
https://github.com/spmallick/goturn-files - https://learnopencv.com/goturn-deep-learning-based-object-tracking/
- C++ source code and grouth truth for shadow detection / removal
相关文章:
【python】OpenCV—Tracking(10.3)—GOTURN
文章目录 1、功能描述2、模型介绍3、代码实现4、完整代码5、结果展示6、优缺点分析7、参考 1、功能描述 基于 Generic Object Tracking using Regression Networks 方法,实现单目标跟踪 2、模型介绍 (1)发表来自 Held D, Thrun S, Savarese…...
git pull遇到一个问题
shell request failed on channel 0 需要修改服务器配置[rootadmin ~]# cat /etc/security/limits.d/20-nproc.conf # Default limit for number of users processes to prevent # accidental fork bombs. # See rhbz #432903 for reasoning.* soft nproc 409…...
书生-第四期闯关:完成SSH连接与端口映射并运行hello_world.py
端口映射完成后,访问127.0.0.1:7860成功展示如下界面: 书生浦语大模型实战营 项目地址:https://github.com/InternLM/Tutorial/...
【CSS3】css开篇基础(5)
1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…...
AI产品独立开发变现实战营,炒掉老板做自由职业赚大钱
课程背景 在经济下行和外部就业压力增大的背景下,为解决程序员的焦虑、失业和被裁员,我们开始了这门课程,课程基于3个真实已经盈利的商业项目,从0到1带你实践AI产品的设计、开发、运营和盈利模式的全流程开发。 课程特色 增加‘…...
【UE5.3 Cesium for Unreal】编译GlobePawn
目录 前言 效果 步骤 一、下载所需文件 二、下载CesiumForUnreal插件 三、处理下载的文件 四、修改代码 “CesiumForUnreal.uplugin”部分 “CesiumEditor.cpp”部分 “CesiumEditor.h”部分 “CesiumPanel.cpp”部分 “IonQuickAddPanel.cpp”部分 “IonQuickAd…...
idea连接数据库出现错误的解决方式
在使用idea连接数据库时,出现错误: The server has terminated the handshake. The protocol list option (enabledTLSProtocols) is set, this option might cause connection issues with some versions of MySQL. Consider removing the protocol li…...
数据分级分类工具:敏感数据识别中的AI智能化转型之路
背景 在现代数字化和信息化飞速发展的背景下,数据安全愈发成为企业与组织的重要课题,尤其是敏感数据的保护更是重中之重。敏感数据的泄露不仅会导致商业损失和法律责任,还会直接影响客户信任和企业声誉。为此,数据分级分类工具逐…...
乘云而上,OceanBase再越山峰
一座山峰都是一个挑战,每一次攀登都是一次超越。 商业数据库时代,面对国外数据库巨头这座大山,实现市场突破一直都是中国数据库产业多年夙愿,而OceanBase在金融核心系统等领域的攻坚克难,为产业突破交出一副令人信服的…...
设计模式4-工厂模式策略模式
目录 一 工厂模式 1.1 思想 1.2 案例 1.2.1 接口 1.2.2 实现类 1.2.3 工厂类 1.2.4 调用 二 策略模式 2.1 思想 2.2 案例 2.2.1 接口 2.2.2 实现类 2.2.3 策略类 2.2.4 调用 三 工厂模式策略模式 3.1 思想 3.2 案例 3.2.1 接口 3.2.2 实现类 3.2.3 定义F…...
使用Html5基本标签实现“时空电影网”案例步骤及详细代码
根据您的需求,我为您实现了对“时空电影网”电影节页面的美化。以下是详细的步骤: 设置一级标题“电影节”文字的颜色:将一级标题的颜色设置为深蓝色(#0000FF)。 <h1><font color"darkblue">电…...
Servlet 3.0 新特性全解
文章目录 Servlet3.0新特性全解Servlet 3.0 新增特性Servlet3.0的注解Servlet3.0的Web模块支持servlet3.0提供的异步处理提供异步原因实现异步原理配置servlet类成为异步的servlet类具体实现异步监听器改进的ServletAPI(上传文件) Servlet3.0新特性全解 tomcat 7以上的版本都支…...
VUE组件学习 | 五、v-for组件
v-for 指令基础知识 v-for 是 Vue.js 中的一个指令,用于基于源数据多次渲染元素或模板块。它类似于 JavaScript 中的 for 循环。 基本语法 <template><div><!-- 基本列表渲染 --><ul><li v-for"item in items" :key"i…...
uniapp写移动端,适配苹果手机底部导航栏,ios安全区问题,苹果手机遮挡底部信息,uview的u-action-sheet组件
手机上有很多组件,需要手机底部弹窗来做选择,picker选择器,select列选择器呀这些,在苹果手机上会被底部nav遮住 采用了好几种配置的方式,多多少少都不太行,还是采用css来做吧,但是css来写想让它生效&#x…...
CentOS9 Stream上安装Edge浏览器
CentOS9 Stream上安装Edge浏览器 1. 下载 Microsoft Edge RPM 包2. 安装 Edge 浏览器3. 启动 Microsoft Edge4. 更新 Microsoft Edge(可选) 如果运行的时候出现错误:[5809:5809:1030/234136.530802:ERROR:zygote_host_impl_linux.cc(101)] Ru…...
el-datepicker此刻按钮点击失效
文章目录 此刻按钮失效原因:使用了禁用未来日期解决办法:重写此刻按钮点击事件代码(包含禁用未来日期和时分秒的处理)框出主要代码(因为包含禁用日期功能)(取你所需) 此刻按钮失效原…...
VUE组件学习 | 六、v-if, v-else-if, v-else组件
v-if、v-else-if 和 v-else 指令基础知识 在 Vue.js 中,v-if、v-else-if 和 v-else 是一组指令,用于根据表达式的值条件性地渲染元素。 基本语法 <template><div><!-- 基础条件渲染 --><h1 v-if"type A">类型 A&l…...
机器学习算法之回归算法
一、回归算法思维导图 二、算法概念、原理、应用场景和实例代码 1、线性回归 1.1、概念 线性回归算法是一种统计分析方法,用于确定两种或两种以上变量之间的定量关系。 线性回归算法通过建立线性方程来预测因变量(y)和一个或多个自变量…...
cordova android 内嵌vue页面 启动页之后白屏问题处理
困扰很久的问题 一直都用splash 做延迟加载 但在 一些android机器上还是会有 这短暂的白屏其实就是vue页面尚未完全渲染的间隙 处理方案 在html中添加 <body><div id"splash-screen" style"position: fixed; top: 0; left: 0; width: 100%; height: 1…...
自研小程序-心情追忆
在近期从繁忙的工作中暂时抽身之后,我决定利用这段宝贵的时间来保持我的Java技能不致生疏,并通过一个个人项目来探索人工智能的魅力。 我在Hugging Face(国内镜像站点:HF-Mirror)上发现了一个关于情感分析的练习项目&…...
【部署与升级-会议签到的web安装】
部署与升级-会议的远程安装 技术路线界面规划flaskAPI以及socketio.emit shellout浏览器和后端交互到处是偶遇 技术路线 运行的基础是Flask-Soketio, 并借鉴了后台运行系统指令的代码 和scrncpy项目,app安装的脚本 #mermaid-svg-8H9rbzbpgpnAXfA3 {font-family:"trebuche…...
【jvm】如何设置新生代和老年代的比例
目录 1. 说明2. 使用-XX:NewRatio参数3. 使用-Xmn参数4. 配置新生区中的Eden区和Survivor区比例5. 综合配置示例6. 注意事项 1. 说明 1.新生代(Young Generation)和老年代(Old Generation)的比例可以通过特定的参数进行设置。2.这…...
系统学习CFD,常见收敛问题、及如何与机器学习相结合
一、如何系统学习CFD 系统学习计算流体力学(CFD)需要按照一定的步骤和层次进行,以下是一个学习路径的建议: 1.基础知识学习: 掌握流体力学的基本原理,包括流体静力学、流体动力学、流体控制方程等。 学习…...
REST架构与实现
一、REST 架构风格 基本概念 REST(Representational State Transfer),即表述性状态转移,是一种软件架构风格。它通过使用标准的 HTTP 方法操作网络上的资源来实现信息交互。在 REST 架构风格中,网络上的一切都被抽象成资源,例如,在一个在线购物系统中,商品、订单、用户…...
AI驱动的低代码未来:加速应用开发的智能解决方案
引言 随着数字化转型的浪潮席卷全球,企业对快速构建应用程序的需求愈发强烈。然而,传统的软件开发周期冗长、成本高昂,往往无法满足快速变化的市场需求。在此背景下,低代码平台逐渐成为开发者和企业的优选方案,以其“低…...
快速上手 Rust——环境配置与项目初始化
Rust 跨界:全面掌握跨平台应用开发 第一章:快速上手 Rust 1.1 环境配置与项目初始化 1.1.1 安装 Rust 和 Cargo 在开始学习 Rust 之前,首先需要安装 Rust 编程语言及其包管理工具 Cargo。Rust 的安装非常简单,使用官方的安装脚…...
分布式事务Seata-AT模式
1. seata安装 docker 安装 docker run --name seata-server \-p 8091:8091 \-p 7091:7091 \-e SEATA_IP192.168.0.250 \-e SEATA_PORT8091 \seataio/seata-server将安装好的配置文件数据,拷贝一份到物理机 docker cp seata-serve:/seata-server/resources /User/…...
编程知识概览
编程,这个在现代社会中无处不在的词汇,已经从最初的计算机专业人士的专属技能,变成了许多人日常生活和工作中不可或缺的一部分。从简单的网页浏览、邮件发送,到复杂的游戏开发、数据分析,编程的应用几乎覆盖了所有领域…...
基于 GADF+Swin-CNN-GAM 的高创新扰动信号识别模型!
往期精彩内容: Python-电能质量扰动信号数据介绍与分类-CSDN博客 Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(三)基于Transformer的一…...
【Nextcloud】在 Ubuntu 22.04.3 LTS 上的 Nextcloud Hub 8 (29.0.0) 优化
[TOC](Nextcloud Hub 8 (29.0.0) 优化) Nextcloud 优化是个长期的过程,只能遇到问题解决问题了。遇到的问题和解决办法会逐步的编写完善。 打开 PHP 内存限制 伴随着内容增多,并添加更多的功能,访问 Nextcloud 变慢。通过修改PHP 内存限制&am…...
哪些做图形推理的网站/有什么好的网站吗
请以尽量高效的方法用”*”打印出一个空心正方形,num为边长。 void print_square(int num); #include <stdio.h>int main() {int x,y,num;printf("please input the num:\n");scanf("%d",&num);for(x 0; x < num; x){for(y 0 ;…...
织梦可以做相亲网站/seo网站是什么意思
ArcEngine数据删除几种方法和性能比较 1、IFeatureCursor 游标查询后,遍历删除 2、更新游标删除IFeatureCursor.DeleteFeature() 3、ITable.DeleteSearchedRows删除 4、 IDataset.Workspace.ExecuteSQL 一、 几种删除方法代码 1. 查询结果中删除 private void …...
套图吧wordpress/商城全网推广运营公司
摘要:本文介绍了C11中如何开启新线程,并详细讲解了线程的基础同步原语:mutex, lock_guard, unique_lock, condition variable和semaphore等。如何采用async, packaged_task和promise实现future同步机制?怎样处理spurious wakeup?…...
休闲零食网站建设+中企动力/产品推广文案
Python中输入多行字符串: 方法一:使用三引号 >>> str1 = Le vent se lve, il faut tenter de vivre. 起风了,唯有努力生存。 (纵有疾风起,人生不言弃。) >>> str1 Le vent se lve, il faut tenter de vivre. \n起风了,唯有努力生存。\n(纵有疾风起,人生…...
淄博网站建设哪家专业/谷歌优化技巧
存储数据 存储海量数据 数据持久化的首选方案应该是关系型数据库,关系型数据库的产品很多,包括:Oracle、MySQL、SQLServer、PostgreSQL等。如果要存储海量的低价值数据,文档数据库也是不错的选择,MongoDB是文档数据库…...
怎么注册域名网站/爱站网影院
ubuntu安装后分辨率只有一个选项,ubuntu安装后分辨率 ubuntu 16.04安装后分辨率只有一个选项 1024x768,使用xrandr命令出现错误:xrandr: Failed to get size of gamma for output default,使用cvt命令也无法设置,修改…...