使用YOLOv7训练钢化玻璃绝缘子及其缺陷检测模型
数据集介绍
数据集中的图片均选自与无人机在电力巡检过程中的航拍图片
图片样例如下:
1. 数据集准备
1. 1 建立文件夹
文件夹建立如下图所示:
1.2图像标注
标注软件的下载:
pip install labelimg -i (清华镜像源)
将需要标注的图片移动到 JPEGImages 文件夹中:
1.3 标注
1.3.1打开标注工具
在安装的环境中,输入 labelmg 即可:
如果安装成功,在桌面上就会弹出标注软件,如下:
1.3.2标注
标签文件如下图:
图像标注完成之后,进行第二部分检测
2.检测
2.1 yolov7代码下载
yolov7代码库 :https://github.com/WongKinYiu/yolov7
下载代码:
下载权重:
配置好环境之后,使用pycharm打开:找到detect.py,进行运行,检查模型是否可以正常推理。
若出现这个问题:
解决办法:
明天继续写哈!!先发布!!
2.2训练数据集放置及配置文件编写
2.2.1训练数据集放置
第一步:
这儿还要插入一张图片
第二步: 数据集转换voc格式转换成yolo格式
- 生成txt文件 新建make_txt.py
import os
import random
trainval_percent = 0.1
train_percent = 0.9
xmlfilepath = 'data/Annotations'
txtsavepath = 'data/ImageSets'
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
ftrainval = open('data/ImageSets/trainval.txt', 'w')
ftest = open('data/ImageSets/test.txt', 'w')
ftrain = open('data/ImageSets/train.txt', 'w')
fval = open('data/ImageSets/val.txt', 'w')
for i in list:
name = total_xml[i][:-4] + '\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftest.write(name)
else:
fval.write(name)
else:
ftrain.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
运行之后生成4个txt文件
- 生成labels和images
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
sets = ['train', 'test','val']
classes = ["insulator","flaw"]
# import os
path = "./data"
dirs = os.listdir(path)
print(dirs)
for dir in dirs:
if dir == "JPEGImages":
old_name = os.path.join(path, dir)
dir = "images"
new_dir = os.path.join(path,dir)
os.rename(old_name,new_dir)
def convert(size, box):
dw = 1. / size[0]
dh = 1. / size[1]
x = (box[0] + box[1]) / 2.0
y = (box[2] + box[3]) / 2.0
w = box[1] - box[0]
h = box[3] - box[2]
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return (x, y, w, h)
def convert_annotation(image_id):
in_file = open('data/Annotations/%s.xml' % (image_id),encoding='utf-8')
out_file = open('data/labels/%s.txt' % (image_id), 'w')
tree = ET.parse(in_file)
root = tree.getroot()
size = root.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text)
for obj in root.iter('object'):
difficult = obj.find('difficult').text
cls = obj.find('name').text
if cls not in classes or int(difficult) == 1:
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
float(xmlbox.find('ymax').text))
bb = convert((w, h), b)
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
wd = getcwd()
print(wd)
for image_set in sets:
if not os.path.exists('data/labels/'):
os.makedirs('data/labels/')
image_ids = open('data/ImageSets/%s.txt' % (image_set)).read().strip().split()
list_file = open('data/%s.txt' % (image_set), 'w')
for image_id in image_ids:
list_file.write('data/images/%s.jpg\n' % (image_id))
convert_annotation(image_id)
list_file.close()
如果文件夹命名和排放和我的一致,代码不需要改动,直接复制使用即可:
到这个地方为止,数据集就准备好了。
2.2.2配置文件编写
1. data文件夹下建立insulator.yaml文件
train: ./data/train.txt
val : ./data/val.txt
test: ./data/test.txt
nc: 2
names: ["insulator","flaw"]
2.3训练文件的配置
训练正常:图示