读入较大视频文件时,系统及DOS卡住

在逐帧读取视频时,开始追踪时,都引入进度汇报输出代码,等待过程可视化。

视频场景切换时的分段

物体消失或者出现都有置信度的剧烈变化,加入帧-置信度的二维坐标绘图,找出规律。

截取视频中有用的帧及目标框信息,作为标注好的数据

每隔100帧或者当场景切换,判定置信度大于0.95的帧,保存截图,保存目标框位置信息。

自动化选取开始帧的步骤,可以自由选取某一帧作为开始帧

修改过的test_ocean.py部分代码:

def single_track(siam_tracker, online_tracker, siam_net, video_path, init_rect, result_json, save_root, args, label_list):start_frame, toc = args.start_index, 0 # 0, 0regions = []lost = 0image_list = list()video_name = os.path.splitext(os.path.basename(video_path))[0]op_v_path = os.path.join(save_root, video_name + '.mp4')op_preview = os.path.join(save_root, os.path.basename(video_path).replace('.mp4', '') + '.jpg') # 保存预览图tmp_path = os.path.join(save_root, 'tmp.mp4') # 各参数cap = cv2.VideoCapture(video_path) # 处理视频width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))fps = cap.get(cv2.CAP_PROP_FPS) # 帧fourcc = cv2.VideoWriter_fourcc(*'mp4v')out = cv2.VideoWriter(op_v_path, fourcc, fps, (width, height)) # 保存结果视频fn = 0while(cap.isOpened()):fn += 1ret, frame = cap.read() # 读取一帧if not ret:breakimage_list.append(frame) # 存入listif fn % 500 == 0:print('正在启动,当前第{}帧'.format(fn))cap.release()cv2.destroyAllWindows()# print(len(image_list)) # 2049# print(type(image_list)) # <class 'list'># print('1', image_list[0][0])# print('2',image_list[0][1])picCount = 1 # 每个视频重置# 帧-置信度 绘图plt.figure(figsize=(20, 8)) # 窗口大小 这个不会被plt.cla()清除# 数据源 动态更新 一帧更新一次x = []y = []# 帧-置信度 绘图max_cls_score  = 0.8 # 阈值变化判断场景切换last_cls_score = 0.95now_cls_score  = 0for f, im in enumerate(image_list): # enumerate函数可以将list加一个 index 来遍历,也就是帧序号fshow_img = im.copy()if f < start_frame:out.write(im)if f % 300 == 0:print('正在启动,当前第{}帧'.format(f))continue# if f == 1:#     print(f) # 帧序号#     print(im) # 一张截图if f % 200 == 0:print('frame_index: {}/{}'.format(f, len(image_list)))rgb_im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)if len(im.shape) == 2: im = cv2.cvtColor(im, cv2.COLOR_GRAY2BGR)   # align with trainingif f == start_frame: # 到达开始帧 人为手动初始化框的位置 ###########不同视频不一样#print('1:', init_rect)x1, y1, x2, y2 = init_rectinit_rect = [x1, y1, x2-x1, y2-y1] # (min_x, min_y, w, h)#print('2:', init_rect)cx, cy, w, h = get_axis_aligned_bbox(np.array(init_rect))image = cv2.rectangle(show_img, (x1, y1), (x1+w, y1+h), (0, 255, 255), 2)cv2.imwrite(op_preview, image) # 保存预览图out.write(image)target_pos = np.array([cx, cy])target_sz = np.array([w, h])state = siam_tracker.init(im, target_pos, target_sz, siam_net)  # init trackerif args.online:online_tracker.init(im, rgb_im, siam_net, target_pos, target_sz, True, dataname=args.dataset, resume=args.resume)regions.append(init_rect+[1.0])elif f > start_frame:  # tracking  往后自动追踪标框if args.online: # 在线模型state = online_tracker.track(im, rgb_im, siam_tracker, state)else: # 离线模型state = siam_tracker.track(state, im)# print('state:', state)# exit(0)location = cxy_wh_2_rect(state['target_pos'], state['target_sz'])xmax, ymax = state['target_pos']w, h = state['target_sz']# xmax, ymax = int(xmax), int(ymax)# xmin, ymin = int(xmax - w + 1), int(ymax - h + 1)xmin, ymin, w, h = [int(_) for _ in location]xmax, ymax = xmin + w - 1, ymin + h - 1image = cv2.rectangle(show_img, (xmin, ymin), (xmax, ymax), (0, 255, 255), 2)cv2.imshow('image', image)cv2.waitKey(20)out.write(image)regions.append(location + [float(state['cls_score'])]) # 修改源码输出# 帧-置信度 绘图x.append(f) # 更新xy.append(float(state['cls_score'])) # 更新yplt.cla() # 清除之前的图 需要重新设置plt的属性plt.ion() # 打开交互模式(不阻塞)plt.title("judge", fontsize=22) # 标题及字号plt.xlabel("frame_index", fontsize=22) # X轴标题及字号plt.ylabel("cls_score", fontsize=22) # Y轴标题及字号plt.tick_params(axis='both', labelsize=12) # 刻度大小plt.xlim((0, len(image_list)))  #设置y轴范围plt.ylim((0.75, 1.0))  #设置y轴范围# 用plot画折线图 无法动态平滑plt.plot(x, y, linewidth=1)  # 线宽linewidth=1plt.plot(x, y, c='dimgray', linewidth=1.0, label='cls') # label:某个线条代表什么的标签plt.legend(loc='best')  # loc选项可以选择label的位置plt.grid() # 开启网格plt.pause(0.01) # 暂停 不然绘图窗口会出现卡顿,无法显示plt.show() # 展示# 帧-置信度 绘图# 以置信度变化 监测场景变化 now_cls_score  = float(state['cls_score']) # 1、相邻两帧判断 # if last_cls_score - now_cls_score > 0.15:#     print('监测到场景切换,帧数:', f)# last_cls_score = now_cls_score# 2、阶段最大值比较 if max_cls_score <= now_cls_score:if now_cls_score - max_cls_score >= 0.1:print('监测到场景切换,置信度剧烈上升(物体出现),帧数:', f)print('==================================================')max_cls_score = now_cls_score # 更新记录阶段最大值elif max_cls_score >= 0.9 and max_cls_score - now_cls_score >= 0.1:print('监测到场景切换,置信度剧烈下降(物体消失),帧数:', f)print('==================================================')max_cls_score = 0.8 # 重置最大值# 以置信度变化检测场景变化# 每隔x帧 # 置信度大于 %95 就抽取此帧if f % 100 == 0:# print(f, im)# json_line = regions[-1]if regions[-1][4] >= 0.95:print('保存一帧')path_dir = os.path.join(save_root, os.path.basename(video_path).replace('.mp4', ''))if not os.path.exists(path_dir):os.mkdir(path_dir)print('a dir made', path_dir)path_pic = os.path.join(path_dir, str(picCount) + '.jpg')picCount += 1cv2.imwrite(path_pic, im) # 保存截图label_list.append(path_pic + ':' + str(regions[-1])) # 图片路径:[x1, y1, x2, y2, 置信度分数]# cls_score = regions[-1][4]# print('cls_score:', cls_score) # 0.9853377938270569# print(type(json_line)) # <class 'list'># print(json_line) # [102.84621292590475, 27.406569899604165, 1025.5884199989205, 583.297738356335, 0.990504264831543]# print(json_line[4]) # 置信度 0.990504264831543# 每隔x帧 # 置信度大于 %95 就抽取此帧result_json[os.path.basename(op_v_path)] = regions# 帧-置信度 绘图plt.savefig(save_root + '/plot_' + str(video_name) + '.png', bbox_inches='tight') # 将图表多余的空白部分剪掉        # 帧-置信度 绘图out.release()# terminal = 'ffmpeg -i {} -vcodec h264 {}'.format(op_v_path.replace(' ', '\ '), tmp_path)# print('convert to h264:', terminal)# os.system(terminal)# os.remove(op_v_path)# os.rename(tmp_path, op_v_path) # 替换视频print('finished')toc /= cv2.getTickFrequency()# print('Video: {:12s} Time: {:2.1f}s Speed: {:3.1f}fps  Lost {}'.format(video['name'], toc, f / toc, lost))

TracKit-Ocean:目标跟踪网络(二) -- 运行问题及解决逻辑设计相关推荐

  1. 基于核函数加权直方图的Mean Shift目标跟踪 (二维颜色直方图)

    前面有几篇博文介绍了在单张图像上的Mean Shift 迭代收敛过程,接下来将要为大家分享的是基于摄像头获取视频的视频目标跟踪,希望对大家有帮助!\(^o^)/~ 基于核函数加权直方图的Mean Sh ...

  2. OpenCV 4.5发布!更强的SIFT,OCR,RANSAC算法,新增目标跟踪网络SiamRPN++

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 OpenCV 4.5版本发布了! 详情:https://github.com/opencv/openc ...

  3. 超实时性单目标跟踪网络——Siamese RPN(CVPR2018 spotlight论文)

    今年sensetime在CVPR上的表现力压国内其他科研机构,直逼谷歌.以44篇论文(3oral,11spotlight,28poster)在国内一骑绝尘.其中有一篇北航大四学生李博为一作的论文Sia ...

  4. 目标跟踪系列二:Staple: Complementary Learners for Real-Time Tracking(2016CVPR)

    文章链接:http://arxiv.org/pdf/1512.01355 代码链接:https://github.com/bertinetto/staple 1.      考虑了两种方法的结合.Le ...

  5. VITAL视频目标跟踪源码运行笔记——Testing模式

    1. 论文基本信息 论文标题:VITAL: VIsual Tracking via Adversarial Learning 论文作者:Yibing Song (Tencent AI Lab)等人 论 ...

  6. 目标跟踪pytracking框架运行遇到的问题以及各种解法(cuda11.3+pytroch1.10)

    pytracking网址:https://github.com/visionml/pytrackingpytracking 强烈推荐这个视频 最大的难点在于这个视频cuda是用cuda10+pytor ...

  7. CVPR2020:点云三维目标跟踪的点对盒网络(P2B)

    CVPR2020:点云三维目标跟踪的点对盒网络(P2B) P2B: Point-to-Box Network for 3D Object Tracking in Point Clouds 代码:htt ...

  8. opencv动态目标跟踪学习总结

    用opencv实现对视频中动态目标的追踪 第一步,是要建立一个编程环境,然后加载opencv的库路径等等.具体步骤在 http://www.opencv.org.cn/ 的"安装" ...

  9. python目标跟踪精度曲线图_目标跟踪配置(三)-评价指标-benchmark(更新中,关注请收藏。。。)...

    目标跟踪基础与智能前沿 关注上方公众号,回复下方安装过程中对应关键字,获得对应安装包. 本文持续更新中- 连载可关注知乎专栏"目标跟踪基础与前沿" 文章目录 [ 目标跟踪基础与智能 ...

  10. 国际MOT研究及智能视频监控应用中的目标跟踪梳理

    多目标跟踪的问题提出:有一段视频,视频是由 N 个 连续帧构成的.从第一帧到最后一帧,里面有多个目标,不断地有出有进,不断地运动.我们的目的是对每个目标,能跟其他目标区分开,能跟踪它在不同帧中的轨迹. ...

最新文章

  1. 全球首个机器人抓取云竞赛落幕,华科夺冠,中国团队包揽前三
  2. 轻量级高精度分割网络推荐
  3. MySQL创建函数,报错;SQL Error (1418)
  4. caffe框架翻译-理解(转载)
  5. cdr 表格自动填充文字_PS那些好用到哭的新手小技巧(1)——如何快速去除文字图片的水印或背景文字?...
  6. Python爬虫项目--爱拍视频批量下载
  7. 为什么联通走归属地ip_为什么企业争先恐后地进行品牌虚拟IP打造?
  8. android ffmpeg编译动态库,最简单的android studio调用ffmpeg动态库
  9. Java事务管理之JDBC
  10. CentOS7+rsync+sersync实现数据实时同步
  11. 重点项目却总是腐化,程序员为什么会写烂代码?
  12. 【天梯选拔月赛】二叉树上我和你(中序+先序建树+bfs(队列)----水题)
  13. springMVC自定义类型转换器(字符串String转日期Date)
  14. finally语句与return语句相关问题
  15. 如何让OpenwrtX86和win7双系统共存在一块硬盘
  16. 元子弹老师-吉他指弹泛音
  17. flume+kafka集群解决某著名联锁大型超市超过25年POS线下收单系统变实时系统的典型案例
  18. 德玛西亚服务器显示排队,英雄联盟排队怎么进入-英雄联盟:激斗峡谷(国际服 LOL:Wild Rift)问答专区-OurPlay...
  19. vue-pdf打印出现方字块乱码问题
  20. 2021年度总结:这一年你过的怎么样?

热门文章

  1. 20170810上课笔记
  2. SQL查询效率:100万数据查询只需要1秒钟
  3. [转载]jQuery操作Table学习总结
  4. eXpressApp Framework 8.1.5 released on 27 Jue 2008 and What'a New
  5. RUBY常用类库文档翻译以及使用示例
  6. 100篇文献-万字总结 || 强化学习求解车间调度
  7. 【OpenCV学习笔记】【教程翻译】二(车牌识别算法框架)
  8. 【C++编程技巧】根据字符串中的指定字符作为分界将字符串拆分
  9. MFC 序列化的理解及困惑点
  10. 一个网站 一个域名跟服务器吗,域名服务器与根服务器区别吗