文章目录
- 一、图像分割介绍
- 二、YOLOv5-Seg介绍
- 三、代码获取
- 四、视频讲解
- 五、环境搭建
- 六、数据集准备
-
- 6.1 数据集转换
- 6.2 数据集验证
- 七、模型训练
- 八、模型验证
- 九、模型测试
- 十、评价指标
一、图像分割介绍
图像分割是指将一幅图像划分为若干个互不重叠的区域,每个区域内的像素具有相似的特征或属性。图像分割是图像处理和计算机视觉领域的一个重要任务,它在很多应用中起到关键作用,如目标检测、目标跟踪、图像编辑、医学图像分析等。
图像分割的目标是将图像中的目标从背景中分离出来,使得目标区域内的像素具有一致的特征,同时与背景区域有明显的差异。常见的图像分割方法包括基于阈值的方法、边缘检测方法、区域生长方法、基于图割的方法等。
基于阈值的方法是最简单的图像分割方法之一,它根据像素的灰度值与预先设定的阈值进行比较,将像素分为目标和背景两类。这种方法适用于目标与背景之间的灰度差异较大的情况。
边缘检测方法是通过检测图像中的边缘来进行分割的方法。边缘是图像中像素值变化较大的地方,通过检测边缘可以将目标与背景分开。常用的边缘检测算法包括Sobel算子、Canny算子等。
区域生长方法是基于像素相似性的图像分割方法,它从一个或多个种子像素开始,通过像素之间的相似性进行生长,将相似的像素合并为一个区域。这种方法适用于目标与背景之间的灰度差异较小的情况。
基于图割的方法是一种基于图论的图像分割方法,它将图像分割问题转化为图论中的最小割问题。通过构建一个图,将图像中的像素作为图的节点,将像素之间的相似性作为边的权重,然后通过最小割算法将图像分割为不同的区域。
总之,图像分割是图像处理和计算机视觉中的重要任务,它可以将图像中的目标从背景中分离出来,为后续的图像分析和处理提供基础。不同的图像分割方法适用于不同的应用场景,选择合适的方法可以提高分割的准确性和效果。
二、YOLOv5-Seg介绍
YOLOv5-Seg是基于YOLOv5的图像分割模型。YOLOv5是一种基于深度学习的目标检测算法,它使用轻量级的网络结构和高效的推理算法,在保持准确性的同时大大提高了检测速度。YOLOv5-Seg通过对YOLOv5进行改进和扩展,将其应用于图像分割任务。
相对于YOLOv5,YOLOv5-Seg在以下方面进行了改进:
- 网络结构:YOLOv5-Seg在YOLOv5的基础上进行了扩展和改进,添加了分割头部,使得模型能够同时进行目标检测和图像分割。
- 损失函数:YOLOv5-Seg使用了新的损失函数来适应图像分割任务。传统的YOLOv5使用的是目标检测任务的损失函数,而YOLOv5-Seg引入了分割任务的损失函数,以优化分割的准确性。
- 数据标注:YOLOv5-Seg需要使用像素级别的标注数据进行训练,而不仅仅是目标的边界框标注。因此,相对于YOLOv5,YOLOv5-Seg需要更加精细和详细的标注数据。
- 训练策略:由于YOLOv5-Seg同时进行目标检测和图像分割任务的训练,需要采用适当的训练策略来平衡两个任务之间的权重和损失函数。
- 推理算法:YOLOv5-Seg在推理过程中需要进行目标检测和图像分割的计算,因此需要相应的推理算法来实现高效的分割。
总之,YOLOv5-Seg相对于YOLOv5在网络结构、损失函数、数据标注、训练策略和推理算法等方面进行了改进和优化,使其能够更好地适应图像分割任务的需求。
三、代码获取
https://github.com/z1069614715/yolov5-seg
四、视频讲解
https://www.bilibili.com/video/BV1nV4y1P7HQ/?spm_id_from=333.337.search-card.all.click&vd_source=dda23f7bec965647e736cf2cc056bd59
五、环境搭建
安装cuda、pytorch、torchvision,然后执行pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
如果是cpu,则直接安装cpu对应的pytorch和torchvision,然后再执行后面的pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple。
参考这个博客:点击
六、数据集准备
6.1 数据集转换
方式1:通过labelme自己标注生成一个个的小json文件,这样你就可以得到全部图片对应的json文件了,然后将图片放在一个文件夹,所有的标注信息放在一个文件夹;或者所有图片和JSON再一个文件夹的形式。然后我们通过下面的代码将其转换为TXT标签文件。
import glob
import numpy as np
import json
import os
import cv2
# 根据原图和JSON格式的标签文件生成对应的YOLO的TXT标签文件保存到json_path路径下(保存文件名字和原来文件的名字一样,后缀换成txt)
json_path = r"./labelme/train2014" # 原始的JSON标签文件
TXT_path = r"./labelme/TXT_file" # 保存的TXT文件夹
image_path = r"./images/" # 原图
label_dict = {
'mat': 0, 'class 2': 1, 'class 3': 2} # 类别情况
json_files = glob.glob(json_path + "/*.json")
for json_file in json_files:
f = open(json_file)
json_info = json.load(f)
img = cv2.imread(os.path.join(image_path, json_info["imagePath"][0]))
height, width, _ = img.shape
np_w_h = np.array([[width, height]], np.int32)
txt_file = json_file.split("\\")[-1].replace(".json", ".txt")
txt_file = os.path.join(TXT_path, txt_file)
f = open(txt_file, "a")
for point_json in json_info["shapes"]:
txt_content = ""
np_points = np.array(point_json["points"], np.int32)
label = point_json["label"]
label_index = label_dict.get(label, None)
np_points = np.array(point_json["points"], np.int32)
norm_points = np_points / np_w_h
norm_points_list = norm_points.tolist()
txt_content += f"{
label_index} " + " ".join([" ".join([str(cell[0]), str(cell[1])]) for cell in norm_points_list]) + "\n"
f.write(txt_content)
或者图片和JSON在一个文件夹的形式,通过下面的代码会再相同文件夹下生成对应的txt文件
import os, cv2, json
import numpy as np
classes = ['square', 'triangle'] # 修改成对应的类别
base_path = '../dataset/labelme_dataset' # 指定json和图片的位置
path_list = [i.split('.')[0] for i in os.listdir(base_path)]
for path in path_list:
image = cv2.imread(f'{
base_path}/{
path}.jpg'