【ffmpeg裁剪视频faster rcnn自动检测 via】全自动实现ffmpeg将视频切割为图片帧,再使用faster rcnn将图片中的人检测出来,最后将检测结果转化为via可识别的csv格式

目录

 

  • 前言
  • 一,ffmpeg 自动裁剪
    • 1.1 目录结构
    • 1.2 cutVideoToImage.sh
    • 1.2 myVideo
    • 1.3 myVideo15mins
    • 1.5 myFrames
    • 1.6 运行
    • 1.7 查看结果
  • 二,detectron2中的faster rcnn检测
    • 2.1 img
    • 2.2 myvia.py
    • 2.3 运行
    • 2.4 结果展示
  • 三,via标注
    • 3.1 csv文件修改(去掉全部单引号)
    • 3.2 在via中导入图片
    • 3.2 导入csv文件

前言

B站讲解视频

通过slowfast的官网可以知道,使用ffmpeg将视频先裁剪15分钟的视频,然后将15分钟的视频转化为图片帧。再使用detectron2的faster rcnn检测所有图片,再用python将检测结果整理为via(VGG Image Annotator)可是识别的csv文件。

一,ffmpeg 自动裁剪

我们需要将视频剪辑为15分钟的视频,这里和ava不同,ava要的是视频第15分钟到30分钟的,但是我们这里就不用了,直接裁剪0到15分钟的视频。

然后是将15分钟的视频切割成帧,我这里是每秒一帧。

1.1 目录结构

首先创建四个文件夹
ffmpeg_code:存放ffmpeg代码
myFrames:存放视频裁剪后的图片帧
myVideo:原始视频
myVideo15mins:剪辑后的视频(15分钟)
在这里插入图片描述

1.2 cutVideoToImage.sh

ffmpeg_code下创建cutVideoToImage.sh
在这里插入图片描述

这个代码就是自动把视频裁剪,然后再裁剪图片

代码如下(有注释):

#这个shell是将视频先剪辑为15分钟视频,然后再将15分钟的视频按照每秒1帧剪辑为图片#开始之前 先清除 myFrames下的内容
rm -rf /home/lxn/yf_videos/myFrames#这里是剪辑视频,和ava官网不同,这里直接剪辑前15分钟的视频
videoName="eight.mp4"
ffmpeg -ss 0 -t 901 -i "../myVideo/${videoName}" "../myVideo15mins/${videoName}"#切割图片,每秒1帧
IN_DATA_DIR="../myVideo15mins"
OUT_DATA_DIR="../myFrames"if [[ ! -d "${OUT_DATA_DIR}" ]]; thenecho "${OUT_DATA_DIR} doesn't exist. Creating it.";mkdir -p ${OUT_DATA_DIR}
fifor video in $(ls -A1 -U ${IN_DATA_DIR}/*)
dovideo_name=${video##*/}if [[ $video_name = *".webm" ]]; thenvideo_name=${video_name::-5}elsevideo_name=${video_name::-4}fiout_video_dir=${OUT_DATA_DIR}/${video_name}/mkdir -p "${out_video_dir}"out_name="${out_video_dir}/${video_name}_%06d.jpg"ffmpeg -i "${video}" -r 1 -q:v 1 "${out_name}"
done#需要裁剪的图片移动到指定文件夹,用于faster rcnn自动框人
#首先清理指定文件夹里存在的图片
rm -rf /home/lxn/0yangfan/detectron2_repo/img/original
#存放检测结果的文件也需要清空
#rm -rf /home/lxn/0yangfan/detectron2_repo/img/detectionif [[ videoName = *".webm" ]]; thenvideoName=${videoName::-5}
elsevideoName=${videoName::-4}fi
cp -r "../myFrames/${videoName}" /home/lxn/0yangfan/detectron2_repo/img/original

在代码的最后一句:

cp -r "../myFrames/${videoName}" /home/lxn/0yangfan/detectron2_repo/img/original

这个表示将最后裁剪的图片放在/home/lxn/0yangfan/detectron2_repo/img/original目录下,这个img/original目录是自己创建的目录。

1.2 myVideo

myVideo下存放原始视频,就是我们自己收集的数据集视频
在这里插入图片描述

1.3 myVideo15mins

myVideo15mins中存放剪辑的视频(代码中自动剪辑存储)
在这里插入图片描述

1.5 myFrames

myFrames中存放剪辑的图片
在这里插入图片描述

1.6 运行

进入到目录:/ffmpeg_code中,然后执行如下命令:

 sudo sh cutVideoToImage.sh 

会花一点时间(顺便去背背单词)
在这里插入图片描述
在这里插入图片描述

1.7 查看结果

最后结果,是要在/home/lxn/0yangfan/detectron2_repo/img/original下查看,如果这里出现了903张剪辑好的图片,说明成功了。

二,detectron2中的faster rcnn检测

第一部分,我们已经将视频转化为图片,这一部分将使用detectron2中的faster rcnn 将全部图片进行检测。
在这里插入图片描述

2.1 img

在目录/detectron2_repo/下创建img目录,这个目录用来存放原始图片,处理后的图片,csv文件。
在这里插入图片描述
original:用于存放原始图片的目录(里面的图片是ffmpeg裁剪出来的,然后再复制到这个目录下的)。
在这里插入图片描述
detection用于存放检测后的图片
在这里插入图片描述

detection.csv:是将最后的检测结果转换为via可以识别的csv文件。

2.2 myvia.py

在目录/detectron2_repo/demo/下创建myvia.py这个文件:
在这里插入图片描述
代码如下(有注释):

#Copyright (c) Facebook, Inc. and its affiliates.
import argparse
import glob
import multiprocessing as mp
import os
import time
import cv2
import tqdm
import osfrom detectron2.config import get_cfg
from detectron2.data.detection_utils import read_image
from detectron2.utils.logger import setup_loggerfrom predictor import VisualizationDemoimport csv
import pandas as pd  #导入pandas包
import re# constants
WINDOW_NAME = "COCO detections"def setup_cfg(args):# load config from file and command-line argumentscfg = get_cfg()# To use demo for Panoptic-DeepLab, please uncomment the following two lines.# from detectron2.projects.panoptic_deeplab import add_panoptic_deeplab_config  # noqa# add_panoptic_deeplab_config(cfg)cfg.merge_from_file(args.config_file)cfg.merge_from_list(args.opts)# Set score_threshold for builtin modelscfg.MODEL.RETINANET.SCORE_THRESH_TEST = args.confidence_thresholdcfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = args.confidence_thresholdcfg.MODEL.PANOPTIC_FPN.COMBINE.INSTANCES_CONFIDENCE_THRESH = args.confidence_thresholdcfg.freeze()return cfgdef get_parser():parser = argparse.ArgumentParser(description="Detectron2 demo for builtin configs")parser.add_argument("--config-file",default="configs/quick_schedules/mask_rcnn_R_50_FPN_inference_acc_test.yaml",metavar="FILE",help="path to config file",)parser.add_argument("--webcam", action="store_true", help="Take inputs from webcam.")parser.add_argument("--video-input", help="Path to video file.")parser.add_argument("--input",nargs="+",help="A list of space separated input images; ""or a single glob pattern such as 'directory/*.jpg'",)parser.add_argument("--output",help="A file or directory to save output visualizations. ""If not given, will show output in an OpenCV window.",)parser.add_argument("--confidence-threshold",type=float,default=0.5,help="Minimum score for instance predictions to be shown",)parser.add_argument("--opts",help="Modify config options using the command-line 'KEY VALUE' pairs",default=[],nargs=argparse.REMAINDER,)return parserif __name__ == "__main__":mp.set_start_method("spawn", force=True)args = get_parser().parse_args()setup_logger(name="fvcore")logger = setup_logger()logger.info("Arguments: " + str(args))#图片的输入和输出文件夹imgOriginalPath = './img/original/'imgDetectionPath= './img/detection'# 读取文件下的图片名字for i,j,k in os.walk(imgOriginalPath):# k 存储了图片的名字#imgInputPaths用于存储图片完整地址#使用.sort()防止乱序k.sort()imgInputPaths = kcountI=0for namek in k:#循环将图片的完整地址加入imgInputPaths中imgInputPath = imgOriginalPath + namekimgInputPaths[countI]=imgInputPathcountI = countI + 1break#修改args里输入图片的里路径args.input = imgInputPaths#修改args里输出图片的路径args.output = imgDetectionPathcfg = setup_cfg(args)demo = VisualizationDemo(cfg)#创建csvcsvFile = open("./img/detection.csv", "w+",encoding="gbk") #创建写的对象CSVwriter = csv.writer(csvFile)     #先写入columns_name #写入列的名称CSVwriter.writerow(["filename","file_size","file_attributes","region_count","region_id","region_shape_attributes","region_attributes"])     #写入多行用CSVwriter#写入多行#CSVwriter.writerows([[1,a,b],[2,c,d],[3,d,e]])#csvFile.close()#https://blog.csdn.net/xz1308579340/article/details/81106310?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.controlif args.input:if len(args.input) == 1:args.input = glob.glob(os.path.expanduser(args.input[0]))assert args.input, "The input path(s) was not found"for path in tqdm.tqdm(args.input, disable=not args.output):# use PIL, to be consistent with evaluationimg = read_image(path, format="BGR")start_time = time.time()predictions,visualized_output = demo.run_on_image(img)#只要检测结果是人的目标结果mask = predictions["instances"].pred_classes == 0pred_boxes = predictions["instances"].pred_boxes.tensor[mask]#在路径中正则匹配图片的名称ImgNameT = re.findall(r'[^\\/:*?"<>|\r\n]+$', path)ImgName = ImgNameT[0]#获取图片大小(字节)ImgSize = os.path.getsize(path)#下面的为空(属性不管)img_file_attributes="{"+"}"#每张图片检测出多少人img_region_count = len(pred_boxes)#region_id表示在这张图中,这是第几个人,从0开始数region_id = 0#region_attributes 为空img_region_attributes = "{"+"}"#循环图中检测出的人的坐标,然后做修改,以适应viafor i in pred_boxes:#将i中的数据类型转化为可以用的数据类型(list)iList = i.cpu().numpy().tolist()#数据取整,并将坐标数据放入到img_region_shape_attributes = {"\"name\"" : "\"rect\"" , "\"x\"" : int(iList[0]) , "\"y\"" : int(iList[1]) ,"\"width\"" : int(iList[2]-iList[0]) , "\"height\"" : int(iList[3]-iList[1]) }#将信息写入csv中CSVwriter.writerow([ImgName,ImgSize,'"{}"',img_region_count,region_id,str(img_region_shape_attributes),'"{}"'])region_id = region_id + 1logger.info("{}: {} in {:.2f}s".format(path,"detected {} instances".format(len(predictions["instances"]))if "instances" in predictionselse "finished",time.time() - start_time,))if args.output:if os.path.isdir(args.output):assert os.path.isdir(args.output), args.outputout_filename = os.path.join(args.output, os.path.basename(path))else:assert len(args.input) == 1, "Please specify a directory with args.output"out_filename = args.outputvisualized_output.save(out_filename)else:cv2.namedWindow(WINDOW_NAME, cv2.WINDOW_NORMAL)cv2.imshow(WINDOW_NAME, visualized_output.get_image()[:, :, ::-1])if cv2.waitKey(0) == 27:break  # esc to quit#关闭csv    csvFile.close()

2.3 运行

进入到目录:/detectron2_repo中,输入命令:

 python3 ./demo/myvia.py --config-file configs/COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml  --opts MODEL.WEIGHTS detectron2://COCO-Detection/faster_rcnn_R_50_FPN_3x/137849458/model_final_280758.pkl

在这里插入图片描述

在这里插入图片描述

2.4 结果展示

检测结果图
在这里插入图片描述
检测后的csv文件

在这里插入图片描述

 

三,via标注

最后,我们要把上一部分生成的csv文件导入到via中,开始之前,需要做一些准备。

3.1 csv文件修改(去掉全部单引号)

在这里插入图片描述
在文件夹detectron2_repo/img/中的detection.csv还不能直接用,要做一点点修改,修改如下:

使用文本编辑器打开detection.csv
在这里插入图片描述
要做的修改就是将这里面的全部 ’ 去掉(去掉全部的单引号)
在这里插入图片描述

3.2 在via中导入图片

打开via

在这里插入图片描述
选中原始图图片
在这里插入图片描述
导入成功后的样子
在这里插入图片描述

3.2 导入csv文件

按照下图方式选中detection.csv文件
在这里插入图片描述
最后的结果展示
在这里插入图片描述

任何程序错误,以及技术疑问或需要解答的,请添加

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu20.10(Linux)在wine下用pyinstaller打包python程序在window系统运行 交叉编译

1.安装wine 在终端中输入&#xff1a; sudo apt-get install wine2.安装pip 在https://pypi.org/project/pip/#files下载pip-21.0.tar.gz&#xff0c;在压缩包上右键提取到此处&#xff0c;打开解压的文件夹pip-21.0 在该文件夹中打开终端安装pip-21.0.tar.gz&#xff1a; wi…

JVM(六)为什么新生代有两个Survivor分区?

本文会使用排除法的手段&#xff0c;来讲解新生代的区域划分&#xff0c;从而让读者能够更清晰的理解分代回收器的原理&#xff0c;在开始之前我们先来整体认识一下分代收集器。 分代收集器会把内存空间分为&#xff1a;老生代和新生代两个区域&#xff0c;而新生代又会分为&a…

io测试

top命令&#xff1a;查看12.6% waIO等待所占用的CPU时间的百分比,高过30%时IO压力高time dd if/dev/zero bs1M count2048 ofdirect_2G此命令为在当前目录下新建一个2G的文件如果 iostat 没有&#xff0c;要 yum install sysstatiostat -d -k 1 10参数 -d 表示&#xff0c;显示…

【slowfast复现 训练】训练过程 制作ava数据集 复现 SlowFast Networks for Video Recognition 训练 train

目录 前言一&#xff0c;ava相关文件准备 1.1 空间准备&#xff08;500G&#xff09;1.2 整体ava文件结构1.3 frames文件1.4 frame_lists 文件1.5 annotations 文件二&#xff0c;预训练模型三&#xff0c;配置文件 3.1 创建新的yaml文件3.2 yaml文件解释四&#xff0c;训练前言…

Qt6 在线安装图文步骤

说明&#xff1a; Qt 自从5.15版本开始&#xff0c;对非商业版本&#xff0c;也就是开源版本&#xff0c;不提供已经制作好的离线exe安装包&#xff0c;自这个版本开始你只有两种选择&#xff1a; 1、编译源码 例如qt-everywhere-src-5.15.2.zip 编译步骤繁琐&#xff0c;需严…

面试经验分享|精华版

面试经验分享曾经有一个年轻人&#xff0c;仅仅入职一个月就缔造了 40 万的价值&#xff0c;他是怎么做到的呢&#xff1f;那是一个平静的午后&#xff0c;却发生了一件令人意想不到的事情&#xff0c;上班没多久的小王&#xff0c;突然就删除了数据库&#xff0c;准备远走他乡…

【slowfast 减少ava数据集】将ava数据集缩小到2个,对数据集做训练,然后进行检测,为训练自己的数据集做准备

目录 前言一&#xff0c;数据文件结构 1.1 myava1.2 annotations1.3 annotations文件处理1.4 frame_lists1.5 frames二&#xff0c;预训练模型四&#xff0c;配置文件 4.1 创建新的yaml文件4.2 yaml文件解释五&#xff0c;训练六&#xff0c;结果查看前言 b站讲解 ava的数据集…

JAVA反射系列之Field,java.lang.reflect.Field使用获取方法。

2019独角兽企业重金招聘Python工程师标准>>> 首先必须明一点 Field类主要是用来辅助获取和操作类的属性的&#xff01; 1.怎么通过反射获取类的属性 先来看JDK提供的方法有如下几种&#xff1a; a)Class.getDeclaredField(String name); 返回一个 Field 对象&#x…

Python3自带HTTP文件传输服务(局域网文件共享)

一行命令搭建一个基于python3的http文件传输服务 WIN10系统下&#xff0c;打开打算要分享传输的文件夹&#xff08;文件夹内存放分享的文件&#xff0c;建议以压缩包形式存放&#xff09;&#xff0c;shift鼠标右键&#xff0c;出现如下图&#xff0c;选择“在此处打开Powershe…

90% 的人都会答错的面试题 == 和 equals 的区别

和 equals 的区别是什么&#xff1f; 解读对于基本类型和引用类型&#xff0c; 的作用效果是不同的&#xff0c;如下所示&#xff1a;基本类型&#xff1a;比较的是值是否相同&#xff1b;引用类型&#xff1a;比较的是引用是否相同&#xff1b;代码示例&#xff1a;String x …

【slowfast 训练自己的数据集】自定义动作,制作自己的数据集,使用预训练模型进行训练,并检测其结果

目录 前言一&#xff0c;视频的处理 1.1 视频准备1.2 切割视频为图片1.3 使用faster rcnn自动框人1.4 via标注图片二&#xff0c;数据集文件 2.1 数据集文件总览2.2 annotations 2.2.1 ava_train_v2.2.csv2.2.2 ava_val_v2.2.csv2.2.3 ava_val_excluded_timestamps_v2.2.csv2.…

windows Secure CRT使用SSH访问Linux服务器被拒绝,winscp访问Linux服务器被拒绝

我们在windows上使用Secure CRT、PUTTY等工具SSH连接到Linux服务器时&#xff0c;会出现linux服务器拒绝访问情况。 可能是Linux系统上没有安装SSH服务&#xff1b; 在终端输入&#xff1a; ssh localhost若出现&#xff1a; ssh: connect to host localhost port 22: Conne…

【代码收集】提前载入贴图

2019独角兽企业重金招聘Python工程师标准>>> 在进入一个比较大的场景的时候&#xff0c;我们一般都会提前load场景的贴图&#xff0c;使游戏更加流畅&#xff0c;一边加载一边显示游戏的加载的进度 具体的方法实现如下&#xff1a; CCTextureCache::sharedTextureCa…

Jetson nano上部署自己的Yolov5模型(TensorRT加速)onnx模型转engine文件

Jetson nano上部署自己的Yolov5模型&#xff08;TensorRT加速&#xff09;onnx模型转engine文件 背景 在主机上训练自己的Yolov5模型&#xff0c;转为TensorRT模型并部署到Jetson Nano上&#xff0c;用DeepStream运行。 硬件环境&#xff1a; RTX 2080TI主机 Jetson Nano 4…

Linux的tar、bzip2压缩解压命令

1.tar压缩 语法&#xff1a;tar 选项 压缩后的文件 目录 -c 打包 -z 打包同时压缩 -f 指定文件名 范例&#xff1a; tar -zcf test.tar.gz test2.tar解压 语法&#xff1a;tar 选项 解压的文件 -x 解包 -z 解压缩 -f 指定解压文件名 范例&#xff1a; tar -zxf test.tar.gz…

分析Linux文件rwx属性的含义

Linux上的文件以.开头的文件被系统视为隐藏文件&#xff0c;仅用ls命令是看不到他们的&#xff0c;而用ls -a除了显示 一般文件名外&#xff0c;连隐藏文件也会显示出来。 ls -l(这个参数是字母L的小写&#xff0c;不是数字1) 这个命令可以使用长格式显示文件内容&#xff0c;如…

程序员专属精美简历合集—第二弹

找工作除了技能之外最重要的就是简历&#xff0c;从某种意义上来说简历有时候比能力更重要&#xff01;为什么简历如此重要&#xff1f;根据拉勾的招聘调研报告显示&#xff0c;大约有 80% 的简历通不过主筛。所以简历就是一堆 0 之前的那个 1&#xff0c;如果简历通不过筛选&a…

CDH6报错解决全记录

一、服务器准备 1、服务器配置 准备3台服务器&#xff0c;建议最低配置如下&#xff08;阿里云大约每台每月六百多&#xff09;&#xff1a; centos7.4 8c 16G 39.101.192.109 node001 39.101.179.3 node002 39.99.236.205 node003 为服务器开启外网端口访问 7180、8900 2…

QT5动态创建多个按钮控件并关联信号槽函数

创建QT对话框工程&#xff0c;动态创建多个按钮&#xff0c;把动态创建的按钮存放在QList中&#xff0c;并关联同一个信号槽函数&#xff0c;在该槽函数中根据按钮对象名称各自进行其他事项处理。 在mainwindow.h文件添加 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include…

libcstl中的list没法插入自定义数据

一开始运行出错&#xff0c;开启debug以后发现在push自定义对象的时候调试器提示找不到一个叫/XXX/XXXX/XXXX/libcstl-2.3.0/src/cstl_list_private.c</br>而那个路径正是我进行安装的路径&#xff0c;安装完以后我把安装包给删除掉了&#xff0c;所以它找不到。这样的话…