1. 下载安装Yolov7参考一下博文
(52条消息) YOLOv7保姆级教程(个人踩坑无数)----训练自己的数据集_AmbitionToFree的博客-CSDN博客
2. Yolov7支持的数据集格式为yolo格式,我的格式是json,所以需要自己转一下
注意:我这里面json格式中是两个角点(包络框左上角和右下角),不同的格式对应不同的代码,因为发现其他格式网上都有,就只有这一种没找到
代码如下:
import os
import json
import numpy as np
import cv2
#dir_json = 'D:\projects\json/50zhang\ceshijson/' # json存储的文件目录
dir_json = r'E:\projects\json\temp\objectDetection/'
dir_txt = r'E:\projects\json\temp\objectDetection/' # txt存储目录
list_json = os.listdir(dir_json)
def json2txt(path_json, path_txt): # 可修改生成格式
with open(path_json, 'r',encoding='utf-8') as path_json:
jsonx = json.load(path_json)
with open(path_txt, 'w+') as ftxt:
shapes = jsonx['shapes']
# path = dir_json+shape['image']
# img = cv2.imread(path)
# size =img.shape
width=jsonx['imageWidth']
height=jsonx['imageHeight']
for shape in shapes:
# label = str(annotation['label']) + ' '
x1 = shape['points'][0][0]
y1 = shape['points'][0][1]
x2 = shape['points'][1][0]
y2 = shape['points'][1][1]
if shape['label']=='trunk':
cat=0
else:
cat=1
dw = 1. / width
dh = 1. / height
x=dw *(x1+x2)/2
y=dh *(y1+y2)/2
w=dw *abs(x2-x1)
h = dh * abs(y2 - y1)
yolo = f"{cat} {x} {y} {w} {h} \n"
ftxt.writelines(yolo)
for cnt, json_name in enumerate(list_json):
if os.path.splitext(json_name)[-1] == ".json":
path_json = dir_json + json_name
path_txt = dir_txt + json_name.replace('.json', '.txt')
json2txt(path_json, path_txt)
3. 图片进行分割出训练集、验证集、测试集代码
# insanena
import shutil
import random
import os
# 原始路径
image_original_path = "/home/nvidia/ghy/yolov7/data/Grape_tree_data/images/"
label_original_path = "/home/nvidia/ghy/yolov7/data/Grape_tree_data/labels/"
cur_path = os.getcwd()
# 训练集路径
train_image_path = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/images/train/")
train_label_path = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/labels/train/")
# 验证集路径
val_image_path = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/images/val/")
val_label_path = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/labels/val/")
# 测试集路径
test_image_path = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/images/test/")
test_label_path = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/labels/test/")
# 训练集目录
list_train = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/train.txt")
list_val = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/val.txt")
list_test = os.path.join(cur_path, "/home/nvidia/ghy/yolov7/data/Grape_tree_data/yolo/test.txt")
train_percent = 0.8
val_percent = 0.1
test_percent = 0.1
def del_file(path):
for i in os.listdir(path):
file_data = path + "\\" + i
os.remove(file_data)
def mkdir():
if not os.path.exists(train_image_path):
os.makedirs(train_image_path)
else:
del_file(train_image_path)
if not os.path.exists(train_label_path):
os.makedirs(train_label_path)
else:
del_file(train_label_path)
if not os.path.exists(val_image_path):
os.makedirs(val_image_path)
else:
del_file(val_image_path)
if not os.path.exists(val_label_path):
os.makedirs(val_label_path)
else:
del_file(val_label_path)
if not os.path.exists(test_image_path):
os.makedirs(test_image_path)
else:
del_file(test_image_path)
if not os.path.exists(test_label_path):
os.makedirs(test_label_path)
else:
del_file(test_label_path)
def clearfile():
if os.path.exists(list_train):
os.remove(list_train)
if os.path.exists(list_val):
os.remove(list_val)
if os.path.exists(list_test):
os.remove(list_test)
def main():
mkdir()
clearfile()
file_train = open(list_train, 'w')
file_val = open(list_val, 'w')
file_test = open(list_test, 'w')
total_txt = os.listdir(label_original_path)
num_txt = len(total_txt)
list_all_txt = range(num_txt)
num_train = int(num_txt * train_percent)
num_val = int(num_txt * val_percent)
num_test = num_txt - num_train - num_val
train = random.sample(list_all_txt, num_train)
# train从list_all_txt取出num_train个元素
# 所以list_all_txt列表只剩下了这些元素
val_test = [i for i in list_all_txt if not i in train]
# 再从val_test取出num_val个元素,val_test剩下的元素就是test
val = random.sample(val_test, num_val)
print("TrainNum:{}, ValNum:{}, TestNum:{}".format(len(train), len(val), len(val_test) - len(val)))
for i in list_all_txt:
name = total_txt[i][:-4]
srcImage = image_original_path + name + '.jpg'
srcLabel = label_original_path + name + ".txt"
if i in train:
dst_train_Image = train_image_path + name + '.jpg'
dst_train_Label = train_label_path + name + '.txt'
shutil.copyfile(srcImage, dst_train_Image)
shutil.copyfile(srcLabel, dst_train_Label)
file_train.write(dst_train_Image + '\n')
elif i in val:
dst_val_Image = val_image_path + name + '.jpg'
dst_val_Label = val_label_path + name + '.txt'
shutil.copyfile(srcImage, dst_val_Image)
shutil.copyfile(srcLabel, dst_val_Label)
file_val.write(dst_val_Image + '\n')
else:
dst_test_Image = test_image_path + name + '.jpg'
dst_test_Label = test_label_path + name + '.txt'
shutil.copyfile(srcImage, dst_test_Image)
shutil.copyfile(srcLabel, dst_test_Label)
file_test.write(dst_test_Image + '\n')
file_train.close()
file_val.close()
file_test.close()
if __name__ == "__main__":
main()