图像分割笔记(二): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程))

文章目录

  • 一、图像分割介绍
  • 二、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.shapenp_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_hnorm_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 npclasses = ['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'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/129449.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于安卓grovvy开发(一)bugly混淆自动上报

背景 打包,mapping,上传,这些是不是都困扰了开发很多。苦于复制粘贴?反正我是。于是,有了这个 最终效果 最终的效果,就是点击项目的打包gradle,复制mapping文件且进行bugly混淆的自动上报。 …

LeetCode141.环形链表

这个题非常简单,我一下子就想到了用HashSet,从前往后把节点放入hashset中,如果set中存在这个节点说明存在环,如果把链表遍历完了说明不存在环,直接返回false,以下时我的代码: public class Sol…

环境扫描/透射电子显微镜气体样品架的真空压力和微小流量控制解决方案

摘要:针对环境扫描/透射电子显微镜对样品杆中的真空压力气氛环境和流体流量精密控制控制要求,本文提出了更简单高效和准确的国产化解决方案。解决方案的关键是采用动态平衡法控制真空压力,真空压力控制范围为1E-03Pa~0.7MPa;采用压…

Pytest模式执行python脚本不生成allure测试报告

1.安装allure 下载allure的zip安装包 将allure.zip解压到python的lib目录中 将allure的bin路径添加到环境变量path中(注意:配置环境变量后,一定要重启电脑。因为环境变量没生效,我搞了半天在pycharm不能生成报告,在cmd中可以生成…

【Redis】.net core Redis事件订阅与发布,基础篇

2023年,第38周。给自己一个目标,然后坚持总会有收货,不信你试试! 发布与订阅(Publish/Subscribe,也简称为 Pub/Sub)是一种消息传递模式,用于解耦发布者和订阅者之间的关系。 目录 一…

华清远见第六课程day4作业

仿照string类&#xff0c;完成myString 类 #include <iostream> #include <cstring>using namespace std;class myString{ private:char *str;int size; public:myString():size(10){str new char[size];strcpy(str,"");}myString(const char*s){size …

【FPGA零基础学习之旅#12】三线制数码管驱动(74HC595)串行移位寄存器驱动

&#x1f389;欢迎来到FPGA专栏~三线制数码管驱动 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能指…

Transformer(二)—— ResNet(残差网络)

Transformer&#xff08;二&#xff09;—— ResNet&#xff08;残差网络&#xff09; 一、背景1.1 梯度消失/爆炸1.2 网络退化(Degradation) 二、思路2.1 为什么需要更深的网络2.2 理想中的深网络表现 三、实践和实验效果3.1 构造恒等映射&#xff1a;残差学习&#xff08;res…

0016Java程序设计-springboot幼儿园管理系统

摘 要目 录系统设计开发环境 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于幼儿园管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了幼儿园管理系统&a…

【进阶篇】MySQL的MVCC实现机制详解

文章目录 0.前言1.基础介绍1.1. 什么是MVCC?1.1. 什么是当前读和快照读&#xff1f;1.1. 当前读&#xff0c;快照读和MVCC的关系1.1. MVCC能解决什么问题&#xff0c;好处是&#xff1f;1.1.1. 提高并发性能1.1.2. 避免死锁1.1.3. 解决脏读、不可重复读和幻读等问题1.1.4. 实现…

【unity3D】如何修改相机的默认视角

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的如何修改相机的默认视角 如何修改相机的默认视角 Game窗口运行的话视角是这样的&#xff1a; 此时Scene窗口的视角是这样的&…

游戏发行平台都有什么服务和功能?

游戏发行平台通常提供一系列服务和功能&#xff0c;以帮助游戏开发商将游戏推向市场&#xff0c;并为玩家提供游戏。以下是一些常见的游戏发行平台服务和功能&#xff1a; 1、游戏发布 发行平台允许游戏开发商将游戏上传到平台上&#xff0c;以供玩家下载和安装。 2、游戏销售…

qt作业day4

//clock_exercise.cpp#include "clock_timer.h" #include "ui_clock_timer.h"//时间事件处理函数 void Clock_Timer::timerEvent(QTimerEvent *event) {if(event->timerId() time_id){sys_tm QDateTime :: currentDateTime(); // int year sy…

远程恋爱网站部署秘籍——群晖虚拟机助ni秀恩爱

文章目录 前言1. 安装网页运行环境1.1 安装php1.2 安装webstation 2. 下载网页源码文件2.1 访问网站地址并下载压缩包2.2 解压并上传至群辉NAS 3. 配置webstation3.1 配置网页服务3.2 配置网络门户 4. 局域网访问静态网页配置成功5. 使用cpolar发布静态网页&#xff0c;实现公网…

习题练习 C语言(暑期第四弹)

自我小提升&#xff01; 前言一、数组二、指针运算三、统计每个月兔子的总数四、双指针的应用五、判断指针六、珠玑妙算七、两数之和八、数组下标九、指针十、寻找峰值十一、二级指针十二、大端小端十三、无符号参数十四、数对十五、截取字符串总结 前言 重要的事说三遍&#…

分布式系统常用的模式

分布式系统常用的模式 Ambassador 名称&#xff1a;“大使”模式 介绍&#xff1a;作为应用程序和其他服务的“中间人”&#xff0c;负责应用程序和其他服务之间的通信&#xff0c;包括日志、监控或重试处理等任务。 举例&#xff1a;K8S使用Envoy作为一个“大使”来简化服务…

Docker 搭建Redis 集群之路

前言 搞技术就是动手,动手再动手,实践出真知,毕竟最终是要解决问题的呢,废话不多讲,开搞,主要是为了记录一下,毕竟过程还是有点艰辛呢需求(target) Windows 电脑 装一个虚拟机用虚拟机构造Linux 系统下载Docker 搭建Redis 集群代码交互集群过关斩将 检查电脑是否开启…

初识Kafka

kafka 第一章、初识Kafka 原先&#xff1a; kafka&#xff0c;由LinkedIn公司采用Scala语言开发的一个多分区&#xff0c;多副本&#xff0c;基于Zookeeper协调的分布式消息系统&#xff0c;被捐献给Apache基金会。 现在 分布式流式处理平台。 高吞吐 可持久化 可水平扩展 …

go小知识2

Golang开发新手常犯的50个错误_gezhonglei2007的博客-CSDN博客 一些题目整理&#xff0c;附带大佬的解释 1.go中哪些值不能寻址& 常量&#xff08;const常量&#xff0c;字面值3.14&#xff0c;字符串“xxx”&#xff0c;函数或方法, map的val值&#xff09; golang中接…

JVM系列 运行时数据区

系列文章目录 第一章 运行区实验 文章目录 系列文章目录前言一、堆&#xff08;Heap&#xff09;1.1、新生代/Young区1.1.1、Eden区1.1.2、Survival区 1.2、年老代&#xff08;old区&#xff09; 二、虚拟机栈&#xff08;Stack&#xff09;2.1、栈顶缓存技术2.2、溢出2.3、栈…