前言:这是一个轻量的视频标注软件,相比于ViTBAT等软件而言,不需要安装就可以使用。但是由于是一个韩国人开发的,所以相关的说明不太够,所以这里进行一个darklabel软件的使用指南。之后会在这个视频标注的基础上进行一些脚本的编制,有利于ReID数据集、目标检测数据集和MOT数据集的快速构建
它是一个实用程序,可以沿着视频(avi,mpg)或图像列表中对象的矩形边界框以各种格式标记和保存。 该程序可用于创建用于对象识别或图像跟踪目的的数据库。最大的功能是快速响应,便捷的界面以及减少工作量的便捷 功能(自动跟踪,使用插值进行标记,自动ID标记)。 任何人都可以将其用于非商业目的,如果您有任何问题或建议,请在评论中让我知道。最初是为我自己创建的,最近我 花了些时间来改进该程序(ver1.3)。我们已经改进了难以看清的细微之处,但是改善了程序的质量,执行的稳定性 和未知性。
软件示意:
工具栏在左侧:
支持各种格式的视频(avi,mpg等)和图像列表(jpg,bmp,png等)
多框设置和标签设置支持
支持对象识别和图像跟踪中使用的各种数据格式
使用图像跟踪器自动标记(通过跟踪标记)
支持使用插值功能的间隔标签
自动标记功能,可按类别自动为每个对象分配唯一的ID
建议使用tracker2,效果很好,几乎不用人工调整
视频演示:https://www.youtube.com/watch?v=vbydG78Al8s&t=11s
选择open video file,选择一个视频打开,最好不要太长
左右拖动一下滑块,看一下准备标注的对象
如果标注视频选择左侧工具栏中第三行,下拉找到frame开头的内容比如:frame#, n, [id, x1,y1,x2,y2,label],意思是左上角坐标和右下角坐标。
然后右侧框中进行画框,然后可以采用以下几种方法继续标注
最后选择合适的标注模型,点击Save GT,保存为txt文件
ffmpeg -i C:/plutopr.mp4 -acodec copy
-vf scale=1280:720
-ss 00:00:10 -t 15 C:/cutout1.mp4 -y
在公众号GiantPandaCV后台回复关键字“darklabel”
文件名:DarkLabel1.3_part1.zip
import os
import shutil
import cv2
def preprocessVideo(video_path):
if not os.path.exists(video_frame_save_path):
os.mkdir(video_frame_save_path)
vidcap = cv2.VideoCapture(video_path)
(cap, frame) = vidcap.read()
height = frame.shape[0]
width = frame.shape[1]
cnt_frame = 0
while (cap):
cv2.imwrite(
os.path.join(video_frame_save_path, "frame_%d.jpg" % (cnt_frame)),
frame)
cnt_frame += 1
(cap, frame) = vidcap.read()
vidcap.release()
return width, height
def postprocess(video_frame_save_path):
if os.path.exists(video_frame_save_path):
shutil.rmtree(video_frame_save_path)
def extractVideoImgs(frame, video_frame_save_path, coords):
x1, y1, x2, y2 = coords
# get image from save path
img = cv2.imread(
os.path.join(video_frame_save_path, "frame_%d.jpg" % (frame)))
# crop
save_img = img[y1:y2, x1:x2]
return save_img
if __name__ == "__main__":
for num in range(1, 34):
txt_path = r"C:\Users\pprp\Videos\face_%d_gt.txt" % (num)
video_path = r"C:\Users\pprp\Videos\face_%d.mp4" % (num)
reid_dst_path = r"C:\Users\pprp\Videos\reid"
if not os.path.exists(txt_path):
continue
video_name = os.path.basename(video_path).split('.')[0]
video_frame_save_path = os.path.join(os.path.dirname(video_path),
video_name)
f_txt = open(txt_path, "r")
width, height = preprocessVideo(video_path)
for line in f_txt.readlines():
bboxes = line.split(',')
# print(len(bboxes))
ids = []
frame_id = int(bboxes[0])
num_object = int(bboxes[1])
for num_obj in range(num_object):
# obj = 0, 1, 2
obj_id = bboxes[1 + (num_obj) * 6 + 1]
obj_x1 = int(bboxes[1 + (num_obj) * 6 + 2])
obj_y1 = int(bboxes[1 + (num_obj) * 6 + 3])
obj_x2 = int(bboxes[1 + (num_obj) * 6 + 4])
obj_y2 = int(bboxes[1 + (num_obj) * 6 + 5])
# process coord
obj_x1 = max(1, obj_x1)
obj_y1 = max(1, obj_y1)
obj_x2 = min(width - 1, obj_x2)
obj_y2 = min(width - 1, obj_y2)
print("%s:%d-%d-%d-%d" %
(obj_id, obj_x1, obj_y1, obj_x2, obj_y2))
# mkdir for reid dataset
id_dir = os.path.join(reid_dst_path,
video_name + "_id_" + obj_id)
if not os.path.exists(id_dir):
os.mkdir(id_dir)
# save pic
img = extractVideoImgs(frame_id, video_frame_save_path,
(obj_x1, obj_y1, obj_x2, obj_y2))
cv2.imwrite(
os.path.join(id_dir, "filename_%s_frame_%d.jpg") %
(video_name, frame_id), img)
f_txt.close()
postprocess(video_frame_save_path)
主要需要修改:
txt_path = r"C:\Users\pprp\Videos\face_%d_gt.txt" % (num)
video_path = r"C:\Users\pprp\Videos\face_%d.mp4" % (num)
reid_dst_path = r"C:\Users\pprp\Videos\reid"
运行即可在reid_dst_path下找到对应的数据集。
如果遇到图片需要旋转的问题,可以采用如下代码:
import os
import cv2
import numpy as np
dirlist = ['face_%d_id_0' % i for i in range(8,9) ] # ['face_8_id_0']
rootdir = r"C:\Users\pprp\Videos\reid"
for item in dirlist:
new_dir = os.path.join(rootdir, item)
for jpg_name in os.listdir(new_dir):
print(jpg_name)
jpg_path = os.path.join(new_dir, jpg_name)
img = cv2.imread(jpg_path)
img = np.rot90(img)
cv2.imwrite(jpg_path,img)