简单记录一下,把项目git下来后 :GitHub - RizwanMunawar/yolov7-segmentation: YOLOv7 Instance Segmentation using OpenCV and PyTorchhttps://github.com/RizwanMunawar/yolov7-segmentation
0.开发环境
Windows+Anaconda
建立虚拟环境,再装包
1.准备数据集+后续步骤
1.1 文件目录
建一个train,再建一个test文件夹
1.2 yaml配置文件
新建custom.yaml
train: ./data/train/
val: ./data/test/
# number of classes
nc: 2
# class names
names: [ 'background', 'crack' ]
1.3 数据集转格式
将Crack500数据集中的mask.png格式转化为YOLOv8.txt格式工具_mask转化为yolo格式-CSDN博客
Crack500的验证集是图片,Yolo需要txt格式的,转一下
新建一个convert.py文件,改两处路径
import copy
import cv2
import os
import shutil
import numpy as np
###!!!!!!!改这里1
path = "./data/test/labels"
files = os.listdir(path)
for file in files:
name = file.split('.')[0]
file_path = os.path.join(path,name+'.png')
img = cv2.imread(file_path)
# img = cv2.imread(path)
H,W=img.shape[0:2]
print(H,W)
#img1 = cv2.imread("F:/Deep_Learning/Model/YOLOv8_Seg/Dataset/images/20160222_080933_361_1.jpg")
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,bin_img = cv2.threshold(gray_img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cnt,hit = cv2.findContours(bin_img,cv2.RETR_TREE,cv2.CHAIN_APPROX_TC89_KCOS)
#cv2.drawContours(img1,cnt,-1,(0,255,0),5)
cnt = list(cnt)
###!!!!!!!改这里2
f = open("./data/test/newlabels/{}.txt".format(file.split(".")[0]), "a+")
for j in cnt:
result = []
pre = j[0]
for i in j:
if abs(i[0][0] - pre[0][0]) > 1 or abs(i[0][1] - pre[0][1]) > 1:# 在这里可以调整间隔点,我设置为1
pre = i
temp = list(i[0])
temp[0] /= W
temp[1] /= H
result.append(temp)
#cv2.circle(img1,i[0],1,(0,0,255),2)
print(result)
print(len(result))
# if len(result) != 0:
if len(result) != 0:
f.write("0 ")
for line in result:
line = str(line)[1:-2].replace(",","")
# print(line)
f.write(line+" ")
f.write("\n")
f.close()
#cv2.imshow("test",img1)
# while True:
# key = cv2.waitKey(1) # 等待 1 毫秒,返回键盘按键的 ASCII 值
# if key == ord('q'): # 如果按下 'q' 键,退出循环
# break
#
# cv2.destroyAllWindows() # 关闭窗口
1.4 数据集改名字
要求原图和标签图文件名相同,所以要删掉_mask后缀
再新建个delete.py,改一处路径(可能需要用两次)
import os
# 指定要操作的目录路径
directory_path = './data/test/labels123'
# 遍历目录中的所有文件和子目录
for filename in os.listdir(directory_path):
# 确保是文件而不是目录
if os.path.isfile(os.path.join(directory_path, filename)):
# 获取文件的基本名和扩展名
base, ext = os.path.splitext(filename)
# 检查文件名长度是否足够删除五个字符
if len(base) >= 3:
# 删除文件名倒数五个字符
new_base = base[:-5]
# 构建新的文件名
new_filename = new_base + ext
# 重命名文件
old_file_path = os.path.join(directory_path, filename)
new_file_path = os.path.join(directory_path, new_filename)
os.rename(old_file_path, new_file_path)
print(f"Renamed '{filename}' to '{new_filename}'")
else:
print(f"Skipping '{filename}' because it's too short to remove 3 characters.")
print("All files have been renamed.")
1.5 照git项目的readme继续步骤就可以了
2.可能的问题
2.1 FreeTypeFont‘ object has no attribute ‘getsize‘报错解决
把Pillow卸载了重装 Pillow 7.1.2
2.2 AttributeError: module ‘numpy‘ has no attribute ‘int‘
把numpy卸载了重装 numpy 1.18.5
2.3 问题总结
在requirements.txt文件中,可以看到安装的时候都是>=,其实可以全改成==就ok了
# Base ----------------------------------------
matplotlib>=3.2.2
numpy>=1.18.5
opencv-python>=4.1.1
Pillow>=7.1.2
PyYAML>=5.3.1
requests>=2.23.0
scipy>=1.4.1
torch>=1.7.0
torchvision>=0.8.1
tqdm>=4.64.0
protobuf<=3.21.6# Logging -------------------------------------
tensorboard>=2.4.1
# wandb
# clearml# Plotting ------------------------------------
pandas>=1.1.4
seaborn>=0.11.0#Tracking .....................................
filterpy
scikit-image# Export --------------------------------------
# coremltools>=5.2 # CoreML export
# onnx>=1.9.0 # ONNX export
# onnx-simplifier>=0.4.1 # ONNX simplifier
# nvidia-pyindex # TensorRT export
# nvidia-tensorrt # TensorRT export
# scikit-learn==0.19.2 # CoreML quantization
# tensorflow>=2.4.1 # TFLite export (or tensorflow-cpu, tensorflow-aarch64)
# tensorflowjs>=3.9.0 # TF.js export
# openvino-dev # OpenVINO export# Extras --------------------------------------
ipython # interactive notebook
psutil # system utilization
thop>=0.1.1 # FLOPs computation
# albumentations>=1.0.3
# pycocotools>=2.0 # COCO mAP
# roboflow