目錄
- 前言
- 一,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文件
最后的結果展示
總結
以上是生活随笔為你收集整理的【ffmpeg裁剪视频faster rcnn自动检测 via】全自动实现ffmpeg将视频切割为图片帧,再使用faster rcnn将图片中的人检测出来,最后将检测结果转化为via可识别的csv格式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。