目标检测数据处理所用到的脚本

目标检测数据处理所用到的脚本

最近在做项目时,需要对数据集进行一系列的处理,包括视频抽帧、对图片的重命名、划分训练集测试集、复制标注文件到别的文件下,图像增强之平移等等,用到了一些脚本,现在整理发布一下,一是记录下来,二是看有无需要的,自取。(小白一枚,有待进步)

"""
rename.py
此脚本用于批量替换更改文件夹下文件名
主要参考了os.path模块 https://www.runoob.com/python3/python3-os-path.html
"""

import os.path

path = r'C:\Users\LJL\Desktop\test1'
for root, dirs,files in os.walk(path):#os.walk() 遍历目录下所有的文件名
    # root是当前正在遍历的这个文件夹本身的路径;dirs是文件夹中所有子文件夹的名字;files是该文件夹下所有的文件的名字(不含子目录)
    i = 0
    j = 0
    k = 0
    for filename in files:
        if filename.split('.')[-1] == 'xml':#split方法对字符串进行分割,[-1]从后向前数第一个
            i += 1
            newName = 'dfdc_zbs_hxqgj_' + '20210719_'+str(i).zfill(6)+'.xml'#zfill(x)返回指定长度的字符串,原字符串右对齐,前面填充0
            os.rename(root +'/'+filename,root+'/'+newName) #两个参数一前一后是原文件名,目标文件名
            print("重命名【%s】为【%s】成功"%(filename, newName))

        elif filename.split('.')[-1] == 'jpg':
            i += 1
            newName = 'xxx' + 'xxx'+str(i).zfill(6)+'.jpg'
            os.rename(root + '/' + filename, root + '/' + newName)
            print("重命名【%s】为【%s】成功"%(filename, newName))

        elif filename.split('.')[-1] == 'txt':
            i += 1
            newName = 'xxx_' + 'xxx_'+str(i).zfill(6)+'.txt'
            os.rename(root + '/' + filename, root + '/' + newName)
            print("重命名【%s】为【%s】成功"%(filename, newName))

        else:
            print(None)

"""
笔记:
常用的用于遍历文件夹、文件的语句有
for root, dirs,files in os.walk(path):#os.walk() 遍历目录下所有的文件名
    for filename in files:

for pathAndFilename in glob.iglob(os.path.join(image_dir, "*.jpg")):#遍历目录下所有的jpg文件
    title, ext = os.path.splitext(os.path.basename(pathAndFilename))

if not os.path.exists(save_path):#新建文件夹
    os.makedirs(save_path)
"""
"""
rename1.py
此脚本用于批量替换更改文件夹下文件名中某个地方,
主要参考了os.path模块 https://www.runoob.com/python3/python3-os-path.html
"""


import os

path = r'C:\Users\LJL\Desktop\test1'
for root, dirs, files in os.walk(path):
    for filename in files:
        # title, text = os.path.splitext(os.path.basename(filename))#os.path.basename(filename)返回文件名
                                                                  #os.path.splitext()分割路径中的文件名与拓展名
        title, text = os.path.splitext(filename)
        # title = title.replace(" ", "_")
        # title = title.replace(",", "_")
        # title = title.replace(".", "")
        title = title.replace('xxx_', 'ccc')
        new_filename = os.path.join(root, title + text)
        print(new_filename)
        filename = os.path.join(root, filename)
        os.rename(filename, new_filename)
"""
video_process.py
此脚本使用opencv对视频进行抽帧,保存为图片
注意:路径里不要有中文
"""
import cv2
import os.path

file_path= r'C:\Users\LJL\Desktop\test2'  #文件路径
save_path = os.path.join(file_path,'pict1')#把两个参数合成一个文件名  文件保存路径
if not os.path.exists(save_path):
    os.makedirs(save_path)

for root,dirs,files in os.walk(file_path):
    for filename in files:
        videopath = os.path.join(file_path, filename)

        vc = cv2.VideoCapture(videopath)
        c = 1
        if vc.isOpened():
            rval, frame = vc.read()
        else:
            rval = False

        a = 1
        timeF = 10 # 视频帧计数间隔频率 130约等于5秒,50约等于2秒

        video_to_picture_path = os.path.join(save_path, filename.split('.')[0])# 视频文件夹的命名
        if not os.path.exists(video_to_picture_path):  # 创建每一个视频存储图片对应的文件夹
            os.makedirs(video_to_picture_path)
    
        while rval: # 循环读取视频帧
            rval, frame =vc.read()
            if c % timeF == 0: # 每隔timeF帧进行存储操作
                save_path = os.path.join(video_to_picture_path, filename.split('.')[0])
                try:
                    cv2.imwrite(save_path + '_' + str(a).zfill(6) + '.jpg', frame)
                    print(save_path+ '_' + str(a).zfill(6) + '.jpg')
                except cv2.error:
                    pass
                a = a + 1
            c = c + 1
            cv2.waitKey(1)
        vc.release()
    cv2.destroyAllWindows()
"""
picture_process.py
此脚本用于从以文件夹中按照百分比抽取一定比例的jpg文件以及对应的xml文件
把数据集按比例分成训练集,测试集
"""

import glob
import os
import shutil
import random

file_path = r'C:\Users\LJL\Desktop\test1'
save_path = os.path.join(file_path,'select')
if not os.path.exists(save_path):
    os.makedirs(save_path)

filenames = []

for pathAndFilename in glob.iglob(os.path.join(file_path, '*.jpg')):#遍历所有的jpg文件
    filenames.append(pathAndFilename)

test_ratio = 0.2
filenum = len(filenames)

num_test = int(filenum * test_ratio)
sample_train = random.sample(filenames, num_test)

for name in sample_train:
    shutil.move(os.path.join(file_path,name), save_path)
    shutil.move(os.path.join(file_path,name).replace('.jpg', '.xml'), save_path)

"""
picture_enhancement_move_xml.py
此脚本用于数据增强,上下左右移动一定像素值,xml文件坐标随着移动
"""
import glob
import os
import cv2
import numpy as np
import random
import xml.etree.ElementTree as ET

origin_path = r''
after_move_path = r''

if not os.path.exists(after_move_path):
    os.makedirs(after_move_path)

move_step = [-15,-30,-50,-70,15,20,40,60]

for pathAndFilename in glob.iglob(os.path.join(origin_path, "*.jpg")):#遍历所有的jpg文件
    title, ext = os.path.splitext(os.path.basename(pathAndFilename))#分离文件名和拓展名
    new_jpg_ext = ext.replace('.jpg', '_move.jpg')
    move_step_num = random.choice(move_step)#从列表中随机返回一个数

    img = cv2.imdecode(np.fromfile(pathAndFilename, dtype=np.uint8), -1)
    cols = img.shape[0]
    rows = img.sahpe[1]

    num = random.randint(1,2)

    if num == 1:
        M = np.float32([[1, 0, move_step_num], [0, 1, 0]]) # 1 0: x   0 1: y;  如需修改移动像素只需在第三位修改 (-15为左移15)
        dst = cv2.warpAffine(img, M, (rows, cols))
        cv2.imencode('.jpg', dst)[1].tofile(after_move_path + os.sep + title + new_jpg_ext) # 保存图片

        xml_path = pathAndFilename.replace(".jpg", ".xml")
        tree = ET.parse(xml_path)
        root = tree.getroot()

        sz = root.find('size')
        width = float(sz.find('width').text)
        height = float(sz.find('height').text)
        filename = root.find('filename').text

        for child in root.findall('object'):  # 找到图片中的所有框
            flag = 0
            sub = child.find('bndbox') # 找到框的标注值并进行读

            new_xmin = str(float(sub.find('xmin').text) + float(move_step_num))
            new_xmax = str(float(sub.find('xmax').text) + float(move_step_num))

            sub.find('xmin').text = new_xmin
            sub.find('xmax').text = new_xmax
            print(sub.find('xmin').text)
            print(sub.find('xmin').text)

        tree.write(after_move_path+os.sep+title+'_move.xml')
    elif move_step_num == 2:
        M = np.float32([[1, 0, 0], [0, 1, move_step_num]])  # 1 0: x   0 1: y;  如需修改移动像素只需在第三位修改 (-15为左移15)
        dst = cv2.warpAffine(img, M, (rows, cols))
        cv2.imencode('.jpg', dst)[1].tofile(after_move_path + os.sep + title + new_jpg_ext)  # 保存图片

        xmlpath = pathAndFilename.replace(".jpg", ".xml")
        tree = ET.parse(xmlpath)
        root = tree.getroot()

        sz = root.find('size')
        width = float(sz.find('width').text)
        height = float(sz.find('height').text)
        filename = root.find('filename').text
        for child in root.findall('object'):  # 找到图片中的所有框
            flag = 0
            sub = child.find('bndbox')  # 找到框的标注值并进行读

            new_xmin = str(float(sub.find('ymin').text) + float(move_step_num))
            new_xmax = str(float(sub.find('ymax').text) + float(move_step_num))

            sub.find('ymin').text = new_xmin
            sub.find('ymax').text = new_xmax
        tree.write(after_move_path + os.sep + title + '_move.xml')




应该是第一篇CSDN ,希望越来越熟练,多多积累。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值