PASCAL VOC训练集制作(从原始视频到目标检测训练数据集)

本文目的:实验用CCD采集到5个视频,需在5个视频中采集有效图片,并将这些图片利用LableImg软件进行标注,用来制备VOC格式的目标检测训练数据集。


第一步:有效视频截取

将采集到的视频利用bandicut软件进行无损视频截取,将所需的视频片段采集出来并放在一个文件夹中。(bandicut需要注册激活,网上所能下载的破解版软件试用有问题,最后还是使用正版软件,想办法将视频后带有水印的部分去掉即可)

 

第二步:从视频中提取视频帧作为训练图像

使用python opencv提取视频帧。每隔1s提取一帧保存到一个文件夹中,文件夹命名:ImageSets,注意:(高质量保存jpg文件,路径中不能出现中文)。代码如下:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

import cv2
import os
import sys

# input_path = sys.argv[1]  # 第一个输入参数是包含视频片段的路径
input_path = "G:\\videos\\videos"  # 第一个输入参数是包含视频片段的路径
# frame_interval = int(sys.argv[2])  # 第二个输入参数是设定每隔多少帧截取一帧
frame_interval = 35  # 第二个输入参数是设定每隔多少帧截取一帧
filenames = os.listdir(input_path)  # 列出文件夹下所有的视频文件

video_prefix = input_path.split(os.sep)[-1]  # 获取文件夹名称
frame_path = '{}_frames_highQ'.format(input_path)  # 新建文件夹,名称为原名加上_frames
if not os.path.exists(frame_path):
    os.mkdir(frame_path)

cap = cv2.VideoCapture()  # 初始化一个VideoCapture对象

for filename in filenames:
    filepath = os.sep.join([input_path, filename])
    cap.open(filepath)  # VideoCapture::open函数可以从文件获取视频
    n_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # 获取视频帧数

    for i in range(42):  # 为了避免视频头几帧质量低下,黑屏或者无关等
        cap.read()
    for i in range(n_frames):
        ret, frame = cap.read()

        # 每隔frame_interval帧进行一次截屏操作
        if i % frame_interval == 0:
            imagename = '{}_{}_{:0>6d}.jpg'.format(video_prefix, filename.split('.')[0], i)
            imagepath = os.sep.join([frame_path, imagename])
            print('exported {}!'.format(imagepath))
            cv2.imwrite(imagepath, frame, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
cap.release()  # 执行结束释放资源

第三步:将上诉提取的视频帧重命名,按照VOC格式。

windows下能运行的代码如下:

import os
import argparse as ap


def rename(path, num, start_index):
    filelist = os.listdir(path)
    filelist = sorted(filelist)
    # print(filelist)
    img = start_index
    Newdir = os.path.join(path, '../JPEGImages')
    if not os.path.exists(Newdir):
        os.makedirs(Newdir)
    for files in filelist:
        Olddir = os.path.join(path, files)
        if os.path.isdir(Olddir):
            continue
        filename = os.path.splitext(files)[0]
        filetype = os.path.splitext(files)[1]
        # print(filename, img)
        if str(img).zfill(num) == filename:
            img = img + 1
            continue
        New_name = str(img).zfill(num) + filetype
        # os.system("cp " + Olddir + ' ' + os.path.join(Newdir, New_name))
        New_name_path = os.path.join(path, New_name)
        os.rename(Olddir, New_name_path)
        img = img + 1
    print("Rename Done.")


if __name__ == "__main__":
    # Argument Parser
    parser = ap.ArgumentParser()
    parser.add_argument("--images", help="Path to images",
                        default="G:\\videos\\videos_frames_highQ_rename")
    parser.add_argument("--start", help="Path to images",
                        default=1)
    args = vars(parser.parse_args())
    images_path = args["images"]
    start_index = args["start"]
rename(images_path, 6, start_index)

 

第四步:对训练图像进行标注。

使用LabelImg软件进行标注,可在GITHUB上直接下载LabelImg的压缩包(windows环境).

得到标注的文件夹Annotations

 

第五步:利用标注好的XML文件生成trainval.txt,test.txt等文件。

import os
import argparse as ap
import random
import math

if __name__ == "__main__":
    # Argument Parser
    parser = ap.ArgumentParser()
    parser.add_argument("--images", help="Path to images",
                        default="JPEGImages/")
    parser.add_argument("--output", help="Path to output directory",
                        default="ImageSets/Main/")
    args = vars(parser.parse_args())
    images_path = args["images"]
    output_dir = args["output"]
    trainval_rate = 0.8
    train_rate = 0.7
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    images_names = os.listdir(images_path)
    images_list = []
    for img in images_names:
        images_list.append(img.split('.')[0])
    random.shuffle(images_list)
    annotation_num = len(images_list)
    trainval_num = int(math.ceil(trainval_rate * annotation_num))
    train_num = int(math.ceil(trainval_num * train_rate))
    trainval = images_list[0:trainval_num]
    test = images_list[trainval_num:]
    train = trainval[0:train_num]
    val = trainval[train_num:trainval_num]
    trainval = sorted(trainval)
    train = sorted(train)
    val = sorted(val)
    test = sorted(test)
    fout = open(os.path.join(output_dir, "trainval.txt"), 'w')
    for line in trainval:
        fout.write(line + "\n")
    fout.close()
    fout = open(os.path.join(output_dir, "train.txt"), 'w')
    for line in train:
        fout.write(line + "\n")
    fout.close()
    fout = open(os.path.join(output_dir, "val.txt"), 'w')
    for line in val:
        fout.write(line + "\n")
    fout.close()
    fout = open(os.path.join(output_dir, "test.txt"), 'w')
    for line in test:
        fout.write(line + "\n")
    fout.close()
    print(annotation_num, len(trainval), len(test), len(train), len(val))

 

第六步:完成数据制备

将以上产生的ImageSets文件夹,Annotations文件夹,JPEGImages文件夹放在VOCdevkit文件夹中,完成数据集制备。

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
训练自己的数据集需要以下几个步骤: 1. 准备数据集:准备好自己的数据集,包括图像和对应的标注。标注可以是像素级别的标注,也可以是语义分割标签。确保数据集的大小和分辨率与原始PASCAL VOC2012数据集相同。 2. 安装DeepLabv3:安装TensorFlow和DeepLabv3,并下载预训练模型。预训练模型可以在TensorFlow官方网站上下载,或者使用以下命令从命令行下载: ``` curl -O "http://download.tensorflow.org/models/deeplabv3_pascal_train_aug_2018_01_04.tar.gz" tar -xvf deeplabv3_pascal_train_aug_2018_01_04.tar.gz ``` 3. 数据预处理:使用预处理脚本将数据集转换为TensorFlow所需的TFRecord格式。预处理脚本可以从GitHub上的DeepLab仓库中下载。 4. 配置模型:根据自己的需求,修改配置文件,包括输入图像大小、batch size、学习率、训练迭代次数等。 5. 训练模型:运行训练脚本,开始训练模型。训练脚本可以从GitHub上的DeepLab仓库中下载。训练过程可能需要几个小时甚至几天,具体时间取决于数据集的大小和复杂度,以及GPU的性能。 6. 评估模型:使用评估脚本评估模型的性能。评估脚本可以从GitHub上的DeepLab仓库中下载。 7. 推理模型:使用训练好的模型进行推理,对新的图像进行语义分割。 需要注意的是,训练自己的数据集需要一定的计算资源和时间,同时还需要对DeepLabv3有一定的了解。建议在熟悉DeepLabv3和TensorFlow的基础上进行操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值