视频数据集标注方法:使用VoTT进行视频数据集标注
By 自牧君 2021/12/04
一、 VoTT
1.1 简介
软件下载地址:www.github.com/Microsoft/VoTT/releases
VoTT是微软发布的用于图像目标检测的标注工具,它是基于JavaScript开发的,因此可以跨Windows和Linux平台运行,并且支持从图片和视频读取。此外,其还提供了基于CNTK训练的Faster-RCNN模型进行自动标注然后人工矫正的方式,这样大大减轻了标注所需的工作量。其分为V1和V2两个版本, 目前V1仅用于BUG修复,不再添加新功能支持, 因此建议直接用V2.
1.2 安装
安装好后,软件主界面如下:
1.3 准备工作
( 1 \mathbf{1} 1) 建立源文件夹 “source”:用来存放需要标注的视频。
( 2 \mathbf{2} 2) 建立目标文件夹 “target”:存放转化过程中的结果。
( 3 \mathbf{3} 3) 建立目标文件夹 “results”:存放最终标注的结果。
1.4 创建工程
( 1 \mathbf{1} 1) 点击 New Project 新建工程:
( 2 \mathbf{2} 2) 填写工程信息。第一项填写工程名称,第二项一般不需改动。
( 3 \mathbf{3} 3) 指定源文件夹source。 首先点击 “Add Connection”.
① 在 “Provider” 项下拉菜单选择 “Local File System”.
② 在 “Folder Path” 选项下,选择刚刚创建的源文件夹 “source”.
③ 选择完成后,点击 “Save Connection” 即可完成源文件夹指定。
( 4 \mathbf{4} 4) 指定目标文件夹target。步骤同上。
( 5 \mathbf{5} 5) Description 对工程的描述,为可选项。
Video Settings* 下的 “Frame Extraction Rate” 为视频帧率,默认是15帧,根据实际需求去改动。
( 6 \mathbf{6} 6) 最后是类别数,可以稍后再添加。这里我稍后再添加。最后点击 “Save Project” 新建工程。
1.5 标注
( 1 \mathbf{1} 1) 进入工程后的界面如下:
( 2 \mathbf{2} 2) 选取矩形标注框。
( 3 \mathbf{3} 3) 接下来进行逐帧标注。
① 用矩形标注框框选目标;
② 点击右上角的 “加号” 添加标签;
③ 输入标签名称 “coscinodiscus” (圆筛藻);
④ 回车键确定。
① 标注框选中目标后,点击右边的绿色标签;
② 矩形标注框变成和右边标签相同颜色(绿色) 时即标注成功。
( 4 \mathbf{4} 4) 点击下图所示的按钮,或着按键盘上的右箭头方向键,切换下一帧继续标注:
① 连续标注5~8帧,即可以开始自动标注。
1.6 自动标注
( 1 \mathbf{1} 1) 左边菜单栏,点击学士帽图标,进行自动标注的设置。
( 2 \mathbf{2} 2) 自动标注设置的菜单页面如下:
① 学习模型。一般保持默认即可。
② 勾选 “Auto Detect” 即可开始自动学习标注。
③ 保存自动标注设置。
( 3 \mathbf{3} 3) 开始自动学习标注。
( 4 \mathbf{4} 4) 把视频进度条手动拉到开始位置,加载学习模型:
( 5 \mathbf{5} 5) 自动学习标注有一定的瑕疵,需要手动检查纠正。
标注框变成正确标签的颜色 (这里是绿色) 即可。
( 6 \mathbf{6} 6) 不断重复,直到标注完为止。
1.7 保存
( 1 \mathbf{1} 1) 标注完成后,点击保存。
( 2 \mathbf{2} 2) 设置导出格式。基本保持默认即可。
“VoTT JSON” 选项下的 “Asset State” 项:
第一个选项是:输出全部图像。
第二个选项是:只输出当前所关联的图像 (默认选这个)。
第三个选项是:只输出当前所标记的图像。
( 3 \mathbf{3} 3) 导出结果。
结果将会保存到 “target” 文件夹中:
1.8 矩形标注框的显示
( 1 \mathbf{1} 1) 这一步用 python 代码来完成,代码如下:
注意:
① 要提前安装好以下库:
pip install opencv-python --user
pip install opencv-contrib-python --user
pip install bounding_box --user
② 下列代码中,有注释的那一行需要根据自己文件的实际路径、实际文件名修改。
import json
import cv2
import os
from bounding_box import bounding_box as bbox_plot
Img_Dir = 'F:\\videoDatasetTag\\target\\vott-json-export' # 这里填写target文件夹中vott-json-export文件夹的路径
Save_Dir = 'F:\\videoDatasetTag\\results' # 这里填写results文件夹路径
Draw_Tags = ['coscinodiscus'] # 这里填写标签名称
def make_video(img_dir, img_size=(1920, 1080), fps=5):
file_path = os.path.join(Save_Dir, "demo.mp4")
filelist = os.listdir(img_dir)
fourcc = cv2.VideoWriter_fourcc('D', 'I', 'V', 'X')
video = cv2.VideoWriter(file_path, fourcc, fps, img_size)
for item in filelist:
if item.endswith('.jpg'):
item = img_dir + '/' + item
img = cv2.imread(item)
video.write(img)
video.release()
def draw_one_img(img_name, img_timestamp, labels_list):
img_path = os.path.join(Img_Dir, img_name)
img = cv2.imread(img_path, cv2.IMREAD_COLOR)
for label in labels_list:
tag = label['tags'][0]
if not tag in Draw_Tags:
continue
bbox = label['boundingBox']
left = bbox['left']
top = bbox['top']
right = left + bbox['width']
bottom = top + bbox['height']
bbox_plot.add(img, left, top, right, bottom, tag, 'red')
save_name = 'time%s.jpg' % format(img_timestamp, '.2f').replace('.', '')
save_path = os.path.join(Save_Dir, save_name)
cv2.imwrite(save_path, img)
print(save_name, 'ok~')
def main():
lb_json = os.path.join(Img_Dir, 'test-export.json') # 这里填写\target\vott-json-export文件夹中.json后缀的文件名
with open(lb_json, 'r',encoding='utf-8') as f:
labels_dict = json.load(f)
assets = labels_dict['assets']
size = None
for k, v in assets.items():
img_name = v['asset']['name']
img_timestamp = v['asset']['timestamp']
if size is None:
w = v['asset']['size']['width']
h = v['asset']['size']['height']
size = (w, h)
labels_list = v['regions']
draw_one_img(img_name, img_timestamp, labels_list)
make_video(Save_Dir, img_size=size)
if __name__ == '__main__':
main()
( 2 \mathbf{2} 2) 执行上面的代码。
( 3 \mathbf{3} 3) 执行完毕后,在 “results” 文件夹中即可看到 2 \mathbf{2} 2 种标注格式:带有标注的① 视频和 ② 帧图片:
① 视频展示:
② 帧图片展示 (部分):
1.9 标注完成
训练时,如果需要的是以视频为单位,则采用步骤 1.8 1.8 1.8 中的 ①视频格式。
如果以单帧图片作为训练单位,则采用采用步骤 1.8 1.8 1.8 中的 ②帧图片格式。
1.10 测试过程中遇到的问题
( 1 \mathbf{1} 1) 该软件无法加载 .avi 格式的视频,我使用《格式工厂》软件转为 .mp4 格式后才能正常加载。
( 2 \mathbf{2} 2) 视频标注工作量大。此前工程设置了帧率为15帧,所以10秒的视频就有150帧,相当于标注了150张图片。更何况数据集中的视频动辄几分钟。自动标注也有瑕疵,需要逐帧对自动标注进行检查和微调。