前言

B站讲解视频
我的研究生毕业论文方向就是时空行为检测,所以,slowfast和ava是我重点搞的,我的博客主页也有很多这些相关内容。

终于,到了标注数据这一块了,为了更简单的标注数据,我要做的这部分的数据包含大量的人,每张图片有30到40个人,如果要手动框人,再做行为标注,那是非常大的工作量,为了减小工作量,先使用faster rcnn把人的坐标算出来,然后倒入via中,实现算法的自动框人。

1 准备

1.1 detectron2安装及faster rcnn运行

1.1.1 detectron2官方网站

  • detectron2项目地址
  • detectron2文档

1.1.2 安装步骤

安装:

pip install -U torch torchvision cython
pip install -U 'git+https://github.com/facebookresearch/fvcore.git' 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
git clone https://github.com/facebookresearch/detectron2 detectron2_repo
pip install -e detectron2_repo

1.1.3 Faster RCNN目标检测

在终端输入:

python3 demo.py --config-file ../configs/COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml \--input ../img/1.jpg \--output ../img/1_1.jpg \--opts MODEL.WEIGHTS detectron2://COCO-Detection/faster_rcnn_R_50_FPN_3x/137849458/model_final_280758.pkl

1.1.4 参考

【Faster RCNN & detectron2】detectron2实现Faster RCNN目标检测

1.2 via的安装及使用

安装很简单,下载下来后,点开via.html就可以了

下载及使用指南:via官网

我下载的是2.0的版本,如下

2 faster rcnn 算法导出人类候选框为via格式

2.1 新建python脚本

在目录/detectron2_repo/demo/下新建一个python脚本,名字为:myvia.py


将下面的代码复制到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用于存储图片完整地址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.2 相关文件

2.2.1 img

在detectron2_repo/目录下新建img文件,这个文件用来存储输入和输出图片

2.2.2 original、detection、detection.csv

在img文件夹下创建original、detection、detection.csv

original用于存放输入的图片
detection用于存放检测后的图片
detection.csv是faster rcnn算法计算出来的人的坐标数据,然后转换为via可是别的csv文档

2.3 图片上传

在original文件夹中上传图片,注意顺序,这个顺序要和后面via图片顺序一致

2.4 运行

准备好上面的后,在终端进入/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.5 查看detection.csv

接下来查看csv文件,结果如下:

3 via自动标注

3.1 进入via

首先进入到via的界面

下图是从从官网下载的2.0版本的via,点开via.html

下图是进入via后的样子

3.2 导入图片

点击下图显示的 Add Files

选择多个图片

导入图片后的样子

3.4 修改detection.csv

使用notpad++(其它编译器也可以)打开detection.csv,如下图


使用替换功能,把全文的单引号全部删除(我使用替换功能,把 ’ 替换为 空),如下图所示

3.3 导入detection.csv

在Annotation中选择 Import Annotations (from csv),在这里把detection.csv添加

导入csv后,就应该出现如下结果:


这些人就被自动框出来了。

【faster rcnn 实现via的自动框人】使用detectron2中faster rcnn 算法生成人的坐标,将坐标导入via(VGG Image Annotator)中,实现自动框选出人的区域相关推荐

  1. 【Faster RCNN detectron2】detectron2实现Faster RCNN目标检测

    目录 1. 背景介绍 2.安装步骤 3.Faster RCNN目标检测 4. 效果 5.错误解决 6.参考博客 7,下一节代码解析 在上一篇博客记录了 SlowFast的复现过程,slowfast其中 ...

  2. CV之PoseEstimation:Pose Estimation人体姿态估计(AI识人,OpenPose+DeepCut+RMPE+Mask RCNN)的简介、案例应用之详细攻略

    CV之PoseEstimation:Pose Estimation人体姿态估计(AI识人,OpenPose+DeepCut+RMPE+Mask RCNN)的简介.案例应用之详细攻略 目录 Pose E ...

  3. 动作分析 姿态估计_单人或多人的人体姿态骨架估计算法概述

    原标题:单人或多人的人体姿态骨架估计算法概述 如何在大片中实现人物的特效,最终应用人体姿态估计.本博客介绍了使用深度学习技术及其应用的多人姿势估计方法. 人体骨骼骨架以图形格式表达人体运动.基本上,它 ...

  4. 边界框的回归策略搞不懂?算法太多分不清?看这篇就够了

    作者 | fivetrees 来源 | https://zhuanlan.zhihu.com/p/76477248 本文已由作者授权,未经允许,不得二次转载 [导读]目标检测包括目标分类和目标定位 2 ...

  5. 【Detectron2】详解Detectron2中Mask RCNN的部分代码

    整体来说,Backbone.RPN和Fast RCNN是三个相对独立的模块.Backbone对每张图片产生5 level的特征,并送入RPN. RPN对送入的特征,首先经过3x3卷积,随后用sibli ...

  6. java中什么方法用来清空流_这个真的写的很细,JavaIO中的常用处理流,看完只有10%的人还不懂了...

    JavaIO中的常用处理流 在前面,我们了解了有关JavaIO流基础的使用,其中对于IO流来说最基础的四大基类就是InputStream.OutputStream.Reader.Writer.而我们对 ...

  7. python中什么是算法_python自动开发之(算法)第二十七天

    1.什么是算法? 算法(Algorithm):一个计算过程,解决问题的方法 2.复习:递归 递归的两个特点:(1) 调用自身 (2)结束条件 deffunc1(x):print(x) func1(x- ...

  8. springboot生成包含特定数字_面试必问 —— Spring Boot 是如何实现自动配置的?

    什么是@Conditional? AutoConfigure源码分析 自动配置类中的条件注解 <Netty 实现原理与源码解析 -- 精品合集> <Spring 实现原理与源码解析 ...

  9. R语言批量处理2——导入excel,定位提取合并为数据框data.frame

    问题: R语言批量导入数据生成list表,然后提取每个list表相同变量数据,生成数据框形式data.frame. 文章目录 问题: 一.apply族应用 二.批量excel数据导入 三.list表中 ...

最新文章

  1. 有关try..catch..finally处理异常的总结
  2. Servlet学习笔记 Servlet原理
  3. SHT30温湿度传感器驱动设计分析及代码实现
  4. HTTP_请求消息_请求行
  5. 神经计算棒 [Error 5] Toolkit Error: Stage Details Not Supported: Transpose
  6. [css] 判断如下边框的颜色,并解释为什么[代码]?
  7. 一个关于先验概率、似然函数与后验概率计算的小例子
  8. VS2010解决闪退的方法
  9. com.sun:tools
  10. linux 替换文件夹内容,Linux批量替换文本,文件夹内所有文本内容
  11. StringUtil工具类 之 字符串长度截取函数
  12. Unity3D 性能优化
  13. IAR MCS-51 v7.51A 软件注册机下载
  14. Python程序员培训计划
  15. matlab中zeros和ones函数使用方法
  16. 七大行星排列图片_八大行星图片欣赏
  17. 2022华为机试社招OD高频考试真题【9, 10月份Q2, Q3考试新编程题目】
  18. 二维码相机遮罩层快速实现
  19. NYOJ_170聪明的kk
  20. 大饱眼福,52个数据可视化图表鉴赏

热门文章

  1. javaSE知识点汇总
  2. [译]Kube Router Documentation
  3. VDI序曲二 RemotoAPP部署
  4. 第一个Android工程HelloAndroid
  5. 你所应该知道的云计算
  6. 2.JVM和DVM之间的区别
  7. ORACLE 小时值必须介于1和12之间 解决方法
  8. 手机整屏显示数据php,完美解决手机网页大背景不能铺完整个屏幕的超级代码
  9. kafka java获取topic_通过编程方式获取Kafka中Topic的Metadata信息
  10. cuda 核函数 for循环_【CUDA 基础】4.4 核函数可达到的带宽