个人技术分享

YOLOv8目标检测离线数据增强的方式:首先使用labelme对图像进行标注,将图像和标注文件存放到images和annotations文件夹中,然后使用离线数据增强代码对进行增强。

代码较长,完整代码下载地址:完整代码

使用方法:

1.在代码中设置增强次数和文件路径,选择想要数据增强的方式

2.数据增强完成后需要检查标签的正确性,检查标签是否越界的代码如下:


import os

# 定义两个文件夹的路径
folder1 = 'E:/images' ##图片文件夹
folder2 = 'E:/labels'##标签文件夹

# 定义函数,用于获取文件夹中的以.jpg和.json结尾的文件前缀
def get_prefixes_of_images_and_json_files(folder_path):
    valid_extensions = ['.jpg','.jpeg','.png', '.json']  # 图片和JSON文件的扩展名
    prefixes = set()
    for file in os.listdir(folder_path):
        _, extension = os.path.splitext(file)
        if extension.lower() in valid_extensions:
            filename = os.path.splitext(file)[0]
            prefixes.add(filename)
    return prefixes

# 获取每个文件夹中的图片和JSON文件前缀列表
prefixes_in_folder1 = get_prefixes_of_images_and_json_files(folder1)
prefixes_in_folder2 = get_prefixes_of_images_and_json_files(folder2)

# 比较前缀列表,并找出不同的前缀
different_prefixes = prefixes_in_folder1.symmetric_difference(prefixes_in_folder2)

# 打印出不同的前缀
for prefix in different_prefixes:
    print(prefix)

3.标签可视化代码如下:

import cv2
import os

img_dir = 'C:/Users/CDG/Desktop/yolov7-main/data/mydata/images/'
label_dir = 'C:/Users/CDG/Desktop/yolov7-main/data/mydata/labels/'
save_dir = 'data/keshihua/'  # 事先新建一个文件夹,用来存放标注好的图片

lable_file = os.listdir(label_dir)
img_file = os.listdir(img_dir)

for file in lable_file:

    file_dir = os.path.join(label_dir, file)

    with open(file_dir, 'r') as f:
        print(os.path.join(img_dir, file.split('.')[0] + '.jpg'))
        image_src = cv2.imread(os.path.join(img_dir, file.split('.')[0] + '.jpg'))
        image_row = image_src.shape[0]
        image_col = image_src.shape[1]

        for line in f.readlines():
            x_ = float(line.split(' ')[1])
            y_ = float(line.split(' ')[2])
            w_ = float(line.split(' ')[3])
            h_ = float(line.split(' ')[4])

            w = image_col
            h = image_row

            x1 = w * x_ - 0.5 * w * w_
            x2 = w * x_ + 0.5 * w * w_
            y1 = h * y_ - 0.5 * h * h_
            y2 = h * y_ + 0.5 * h * h_

            draw = cv2.rectangle(image_src, (int(x1), int(y1)), (int(x2), int(y2)), [0, 255, 0], 2)

        cv2.imwrite(os.path.join(save_dir, file.split('.')[0] + '.jpg'), draw)