一、前言
踩了三天的坑,终于成功配置好YOLOV7的分割部分了,泪目。网上的教程太少了,一开始卡在detetron2的安装问题上,然后卡在数据集的制作上,最后靠查github的Issues然后去找数据集的规律才最终配置成功,现在来分享一下这几天的配置成果。
以下为我这个新手踩坑YOLOV7分割的全过程(对应的python版本为3.8.13)。
二、配置过程
1、在GitHub上下载YOLOV7源码,按照源码中的requirment.txt文件进行配置:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
2、下载yolov7-u7分支的文件(在左上角,点击一下main就能看到相应的分支)
3、安装detectron2,我的配置是cuda11.1、torch1.8.0+cu111、torchvision0.9.0+cu111、torchaudio0.8.0,另外还安装了VS2017;配置好torch之后开始按步骤安装detectron2,具体安装教程参考博客:
(29条消息) win+cuda10.2+VS2019+detectron2配置_爱画画的猴子的博客-CSDN博客
注:我尝试过了1.8.1和1.8.2的对应的gpu版本(cu102),都在安装的时候报错:RuntimeError: Error compiling objects for extension,然后安装了1.8.0版本成功了,但是却是cpu版本的,看了一下10.2没有1.8.0的gpu版,所以最后还是选择多装了一个cuda11.1,然后尝试了11.1对应的torch1.8.0+cu111版本,终于没有报错了。(如果不知道win10怎么同时容纳两个cuda版本的请上百度查,已经有很多教程了)
4、pycharm点文件-打开,选择到yolov7-u7的源码文件夹中的seg文件夹,然后点确定,配置好解释器,然后按照pycharm提示缺什么包就补什么包;设置到不再提示缺少依赖包之后就可以开始制作数据集了
三、数据集制作
数据集我这里制作的是COCO数据集。首先下载labelme进行数据标注制作(不会用的去百度,多的是教程),然后文件夹中会生成图片和json文件,在json文件中提取类别(需要按照类别制作编号,比如类别一编号为0,类别二编号为1......)、不规则标注坐标信息,然后把提取的信息放到txt文件中。下面分享具体的步骤:
1、先参照博客(29条消息) yolov5ds训练步骤_孟孟单单的博客-CSDN博客的第2点准备数据集中要求的文件排布进行设置(这个博客下载的文件中放到自己的数据集文件夹后记得把所有文件夹中的说明.md文件给删掉,否则添加在添加绝对路径的时候会出错),制作的png格式的label图片可以另外存在seg/labels/train1和seg/labels/val1中,其中seg/labels/train以及seg/labels/val两个文件夹需要留空,后面用来放txt文件
(虽然我感觉好像用不到这些png格式的标注图,只用到了jpg原图和txt标注文件;我使用json_to_dataset.exe文件的时候老报错,自己改了源码也还是不行,最后用了别的博客的代码把png标注图片做出来了,最后发现好像用不上,暴风哭泣;如果有会用png标注图片的老哥愿意分享的话请在评论区告诉我在哪能用上,谢谢!)
2、利用json文件制作txt文件(需要先把原图放到imgs文件夹下、把json文件放到jsons文件夹下,然后再使用以下代码文件进行制作),代码如下:
import json
import os
import cv2
img_path = r".\imgs"
path = r".\jsons"
txt_path = r".\txts"
if os.path.exists(txt_path) == False:
os.mkdir(txt_path)
for i in os.listdir(path):
img = cv2.imread(img_path + '\\' + i.split('.')[0] + '.bmp')
print(img_path + '\\' + i.split('.')[0] + '.bmp')
width = img.shape[1]
height = img.shape[0]
with open(path + '\\' + i, encoding='utf-8') as a:
# 读取文件
result = json.load(a)
# 获取姓名
#print(result.get("shapes")[0].get('points'))
label = result.get("shapes")[0].get('label')
print(label)
point = result.get("shapes")[0].get('points')
print(txt_path + '\\' + i.split(".")[0] + '.txt')
f = open(txt_path + '\\' + i.split(".")[0] + '.txt', "w")
f.close()
f = open(txt_path + '\\' + i.split(".")[0] + '.txt', "a")
if label == 'gray':
f.write('0')
elif label == 'white':
f.write('1')
elif label == 'black':
f.write('2')
for i in range(0, len(point)):
for j in range(0, len(point[i])):
dw = 1. / (width)
dh = 1. / (height)
if j == 0:
f.write(' ' + str(point[i][j] * dw))
elif j == 1:
f.write(' ' + str(point[i][j] * dh))
else:
print("坐标出错了")
f.close()
3、生成到txts文件夹下的txt文件就可以移动到数据集的seg/label文件夹下了,然后使用代码把对应的txt文件放到train以及val文件夹下,把txt文件放到train文件夹下的代码如下(放到val的代码只需要把下面的代码中两个path中的'\train'改成'\val即可'):
import os
import shutil
check_path = r'.\paper_data\seg\images\train' #原图文件夹,用于列出原图的名字
src_path = r'.\paper_data\seg\labels' #所有txt文件存放的位置
out_path = r'.\paper_data\seg\labels\train' #txt存放的位置
if os.path.exists(out_path) == False:
os.mkdir(out_path)
for i in os.listdir(check_path):
shutil.move(src_path + '\\' + i.split('.')[0] + '.txt', out_path)
4、最后一步,把det文件夹下的train.txt和val.txt全部复制粘贴到seg文件夹下,然后用系统自带的记事本批量替换路径,train.txt把det/images路径全部改到去seg/images/train路径中,val.txt把det/images路径全部改到去seg/images/val路径中。
到此,数据集就制作完成啦!
配上我的文件夹排布图片以便进行对比:
(注:不用担心为什么自己没有.cache文件,这个是yolov7代码运行训练文件的时候自己生成的,我们制作的时候有.txt文件就行了 )
三、开始训练
1、配置好models/segment/yolov7-seg.yaml文件:把nc改为自己的类别数+1,比如说我有三类(不包括背景),那我的数据就是nc=4
2、在seg/data文件夹下新建文件data.yaml,我的data.yaml配置如下:
train: C:/Users/hp/Desktop/deep-learning/test/YOLOV7/yolov7-u7/seg/paper_data/seg/train.txt
val: C:/Users/hp/Desktop/deep-learning/test/YOLOV7/yolov7-u7/seg/paper_data/seg/val.txt
test: C:/Users/hp/Desktop/deep-learning/test/YOLOV7/yolov7-u7/seg/paper_data/seg/val.txt
# number of classes
nc: 3
# class names
names:
0: gray
1: white
2: black
3、配置seg/segment/train.py文件(注意看清楚,是segment文件夹下的train.py,而不是源文件夹seg下的train.py)中的parse_opt()函数:
1)--weights改为'yolov5s.pt',文件可以在github的yolov5源码项目下面下载:
ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite (github.com)
2)--cfg中为'yolov7-seg.yaml'
3)--data中为ROOT / 'data/data.yaml'
4)根据自己需求修改--epochs、--batch-size(我游戏本rtx2060,设置为2,设到4的时候会报错,游戏本还是太菜了)
5)--device中为'0'
6)--workers中为0(这里是我的问题,我的电脑不改为0会报错)
7)--project中为'.'(我这里不改成这样会报错说不能包含符号“/”,貌似是bug)
然后运行train.py即可(最后运行完生成的结果不会显示到网上的,但是可以在seg/segment/exp?中找到训练过程的数据图片)
四、使用模型
配置seg/segment/predict.py,按照train.py中的配置进行修改,然后把--source中的路径改到自己想预测的文件路径下,比如说我要预测1.jpg,把路径改成'inference/images/1.jpg'即可,最后运行predict.py即可进行预测,保存位置一般为seg/runs/predict-seg/exp?中
五、结束语
配置网络没人指导,网上资料也不多的时候简直是痛苦面具,熬了几天夜才终于配置好,希望能对大家有所帮助