ultralytics实例分割mask读取

news2024/9/19 10:43:55

在前面学习YOLOv8的实例分割过程中,需要使用实例分割的数据集,其标签的标注格式如下:

实例分割勾勒轮廓

其中,第一个数字代表的是类别编号,后面的数据代表的是标注的坐标(转换到0-1之间)每两个为一个坐标,即 (x,y)

23 0.683625 0.829413 0.684172 0.767559 0.677578 0.71892 0.667703 0.67439 0.667703 0.656244 0.663312 0.624906 0.652891 0.600188 0.652328 0.583685 0.669344 0.551526 0.670453 0.525141 0.666063 0.497113 0.650687 0.451761 0.649594 0.448474 0.647391 0.427864 0.647938 0.423732 0.646844 0.399812 0.644656 0.394883 0.643547 0.388286 0.641906 0.351174 0.634219 0.28439 0.625437 0.25223 0.613375 0.255516 0.604031 0.237394 0.602938 0.234085 0.602391 0.217606 0.604031 0.2077 0.602938 0.198638 0.604594 0.190376 0.613922 0.159883 0.617203 0.140915 0.618859 0.140915 0.62325 0.154108 0.622703 0.160704 0.624344 0.165657 0.632031 0.161526 0.637516 0.145047 0.638609 0.14338 0.64575 0.147512 0.640266 0.172254 0.640266 0.181315 0.647391 0.192042 0.653984 0.189554 0.662766 0.182136 0.663312 0.188732 0.654531 0.203568 0.646844 0.218427 0.675391 0.300047 0.691844 0.370141 0.708313 0.404765 0.727531 0.421268 0.753875 0.465775 0.776922 0.502887 0.812047 0.530915 0.837297 0.591103 0.847172 0.630681 0.849359 0.640587 0.878453 0.669437 0.922359 0.690047 0.936625 0.697465 0.938281 0.753545 0.920719 0.748592 0.915219 0.737042 0.910828 0.714789 0.90425 0.696643 0.866375 0.668615 0.849906 0.655423 0.849359 0.732113 0.850469 0.763427 0.861984 0.805493 0.859797 0.816221 0.832906 0.815376 0.818625 0.816221 0.800516 0.818685 0.791734 0.821972 0.76375 0.716432 0.746734 0.694178 0.745094 0.691714 0.734656 0.798075 0.732469 0.833521 0.688562 0.836831 0.687453 0.838474 0.684172 0.838474
23 0.155094 0.952394 0.208703 0.924366 0.226187 0.894601 0.247172 0.868333 0.270469 0.912113 0.283297 0.917371 0.284453 0.917371 0.289125 0.896362 0.268141 0.845587 0.229687 0.836831 0.208703 0.859577 0.194719 0.877089 0.16675 0.887606 0.129453 0.898099 0.113141 0.917371 0.0944844 0.93662 0.0828281 0.962887 0.101484 0.966385 0.152766 0.954131

如何讲坐标画出轮廓呢,使用OpenCV中的cv.polylines方法

import cv2 as cv
import numpy as np
img=cv.imread("coco8-seg/images/train/000000000025.jpg")
w,h,c=img.shape
shape=np.array((w,h))
with open("coco8-seg/labels/train/000000000025.txt") as f:
    datas=f.read()
    datas=datas.split("\n")
    for data in datas:
        xys=data.split(" ")
        xys.pop(0)
        xys_new=[]
        i=0
        while(i<len(xys)-1):
            xys_new.append(float(xys[i])*h)
            xys_new.append(float(xys[i+1])*w)
            i=i+2
        xys_new=np.array(xys_new,np.int_)
        xys_new = xys_new.reshape((-1,1,2))
        cv.polylines(img,[xys_new],True,(0,0,0),thickness=5)
    cv.imshow("img",img)
    cv.waitKey(0)
    cv.destroyAllWindows()

画出的图像如下:

在这里插入图片描述

以上是我们自己勾勒出的实例分割轮廓,那么,在ultralytics中,对于这些轮廓是如何处理的呢?

我们发现,在训练器加载过程中,首先会根据我们指定的数据集路径来读取相应的标注文件,可以看到,在这个labels属性中,数据集中图像的名称,目标类别,标注框以及分割的标签都成功的读取了。

在这里插入图片描述

事实上,分割所标注的坐标映射到图像上是这样的:

在这里插入图片描述

我们根据先前实例分割输入的标注分析,其输入的为mask模式,即如下图所示,mask为(4,160,160)

在这里插入图片描述

轮廓提取生成mask(错误方法)

开始时,博主想要直接读取标注文件然后画图,但却由于没有搞清填充图像的方法,所以像将坐标转换为线条,再通过腐蚀、阈值轮廓提取等方式来生成轮廓坐标,最后再进行填充,代码与效果图如下:

import cv2 as cv
import numpy as np
img=cv.imread("coco8-seg/images/train/000000000025.jpg")
w,h,c=img.shape
shape=np.array((w,h))
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
with open("coco8-seg/labels/train/000000000025.txt") as f:
    datas=f.read()
    datas=datas.split("\n")
    for data in datas:
        xys=data.split(" ")
        xys.pop(0)
        xys_new=[]
        i=0
        while(i<len(xys)-1):
            xys_new.append(float(xys[i])*h)
            xys_new.append(float(xys[i+1])*w)
            i=i+2
        xys_new=np.array(xys_new,np.int_)
        xys_new = xys_new.reshape((-1,1,2))
        cv.polylines(gray,[xys_new],True,(0,0,0),thickness=5)
        blur = cv.blur(gray,(7,7))
        ret, thresh = cv.threshold(gray, 0, 255, 0)
        thresh = cv.blur(thresh,(2,2))
        contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
        canvs=np.zeros_like(img)
        #cv.drawContours(canvs, contours, 0, (0, 255, 0), thickness=cv.FILLED)
        cv.drawContours(canvs, contours, 1, (0, 255, 0), thickness=cv.FILLED)
        cv.drawContours(canvs, contours, 2, (0, 255, 0), thickness=cv.FILLED)
        cv.drawContours(canvs, contours, 3, (0, 255, 0), thickness=cv.FILLED)
    cv.imshow("img1",gray)
    cv.imshow("img",canvs)
    cv.waitKey(0)
    cv.destroyAllWindows()

在这里插入图片描述
这里涉及到OpenCV中的轮廓寻找与绘制问题,contours为找到的轮廓坐标
在这里插入图片描述

但这种方法很明显是不行的,这个标注本不需要进行轮廓提取就可以直接使用,后来,通过观察轮廓坐标contours格式,我们也可以直接读取数据来进行mask转换。

直接利用坐标填充mask

通过分析,可以采用如下方式来利用坐标生成对应的mask,同时还可以将对应的类别给作为颜色区分

import cv2 as cv
import numpy as np
img=cv.imread("coco8-seg/images/train/000000000009.jpg")
w,h,c=img.shape
shape=np.array((w,h))
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
points=[]
cls=[]
with open("coco8-seg/labels/train/000000000009.txt") as f:
    datas=f.read()
    datas=datas.split("\n")
    canvs=np.zeros_like(img)
    for data in datas:
        xys=data.split(" ")
        cl=xys.pop(0)
        cls.append(cl)
        xys_new=[]
        i=0
        while(i<len(xys)-1):
            xys_new.append(float(xys[i])*h)
            xys_new.append(float(xys[i+1])*w)
            i=i+2
        xys_new=np.array(xys_new,np.int_)
        xys_new = xys_new.reshape((-1,1,2))
        points.append(xys_new)
        cv.polylines(gray,[xys_new],True,(0,0,0),thickness=5)
    points.pop(-1)#删除最后一个list,这个是空的,我们可以通过遍历的方式为不同类别设计不同颜色mask
    cls.pop(-1)
    for i,cl in enumerate(cls):
        cv.drawContours(canvs, [points[i]], -1, (int(cl)*3,int(cl)*3, int(cl)*3), thickness=cv.FILLED)

    cv.imshow("img1",gray)
    cv.imshow("img",canvs)
    cv.waitKey(0)
    cv.destroyAllWindows()

在这个过程中,即需将原本的轮廓坐标转换为mask的形式,但这部分代码我并没有在ultralytics中找到。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编程修炼之Hibernate--- springboot启动初始化ddl过程与如何自定义修改 table 字段长度

文章目录 springboot启动初始化ddl过程如何自定义修改 table springboot启动初始化ddl过程 跟踪Springboot整合hibernate的启动代码&#xff1a; SessionFactoryImpl 的初始化里做了非常多的事情&#xff0c;初始化各种资源&#xff0c;并调用 SchemaManagementToolCoordinat…

c语言基础--------字符串指针

在 C 语言中&#xff0c;字符串指针是一个指向字符类型的指针&#xff0c;通常用于指向字符串的第一个字符。字符串在 C 语言中通常表示为字符数组&#xff0c;而字符串指针则是用来存储这种字符数组首地址的变量。 定义字符串指针 字符串指针的定义方式如下&#xff1a; ch…

Android更改包名和签名

一、更改包名 1、包名——鼠标右键——Refactor——Rename 修改自己想更改的包名和选择更改范围后点击Refactor就可以了 2.手动修改app的build.gradle文件中的applicationId&#xff08;改成和我们之前修改的包名相同&#xff09; 3.修改AndroidManifest.xml文件中的packag…

“AI+Security”系列第2期(三):面向LLM(大语言模型)的漏洞挖掘与对齐防御研究

近日&#xff0c;由安全极客、Wisemodel 社区和 InForSec 网络安全研究国际学术论坛联合主办的“AISecurity”系列第 2 期——对抗&#xff01;大模型自身安全的攻防博弈线上活动如期举行。 在此次活动中&#xff0c;前阿里云高级安全专家郑瀚带来了以《通往LLM安全对齐的道路…

网易云音乐故障 2 小时,这次到底谁背锅?(今天记得领补偿)

大家好&#xff0c;我是程序员鱼皮&#xff0c;8 月 19 日下午&#xff0c;网易云音乐突发严重故障&#xff0c;并登顶微博热搜&#xff0c;跟黑神话悟空抢了热度。 根据用户的反馈&#xff0c;故障的具体表现为&#xff1a;用户无法登录、歌单加载失败、播放信息获取失败、无法…

SQL— DML语句学习【后端 10】

数据库操作-DML 详解 在数据库管理系统中&#xff0c;DML&#xff08;Data Manipulation Language&#xff0c;数据操作语言&#xff09;扮演着至关重要的角色&#xff0c;它负责对数据库中的数据进行增、删、改操作。掌握DML操作对于数据库的日常维护和管理至关重要。本文将详…

CSP 2023 普及组第一轮 - CSP/S 2023初试题 完善程序第二题解析

一、题目阅读 &#xff08;编辑距离&#xff09;给定两个字符串&#xff0c;每次操作可以选择删除&#xff08;Delete&#xff09;、插入&#xff08;Insert&#xff09;、替换&#xff08;Replace&#xff09;&#xff0c;一个字符&#xff0c;求将第一个字符串转换为第二个字…

时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention

时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention 文章目录 前言时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention 一、BO-CNN-BiGRU-Attention模型1. 贝叶斯优化&#…

【C++ 第十二章】二叉搜索树

1.1 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 左边小&#xff1a;若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值右边大&#xff1a;若它的右子树不为空&#xff0c;则右子树上…

并网式光伏气象站——科技百科

并网式光伏气象站的工作原理简洁而充满智慧&#xff0c;并网式光伏气象站巧妙地通过太阳能电池板将太阳能转化为电能&#xff0c;利用先进的气象监测设备&#xff0c;‌对风速、‌风向、‌温度、‌湿度、‌光照等关键气象要素进行实时监测和记录&#xff0c;不仅充分利用了太阳…

【初阶数据结构题目】32. 希尔排序

文章目录 希尔排序希尔排序的时间复杂度计算 希尔排序 希尔排序法又称缩小增量法。希尔排序法的基本思想是&#xff1a;先选定一个整数&#xff08;通常是gap n/31&#xff09;&#xff0c;把待排序文件所有记录分成各组&#xff0c;所有的距离相等的记录分在同一组内&#x…

全国10米分辨率逐年植被覆盖度(FVC)数据集

本数据集包括2017至2023年间&#xff0c;全国植被覆盖度数据&#xff0c;FVC范围值为0-1&#xff0c;数据为浮点型&#xff0c;GeoTIFF格式。GeoTIFF文件均可用ArcGIS软件和GDAL读取和打开。 植被覆盖度是指植被&#xff08;包括叶、茎、枝&#xff09;在地面的垂直投影面积占统…

系统编程-进程初步2

进程初步2 目录 进程初步2 1、进程等待清理函数&#xff08;wait&#xff09; 2、等待指定的子进程&#xff08;waitpid&#xff09; 3、新的开辟进程的函数&#xff08;vfork&#xff09; 4、在程序中运行系统下的指令&#xff08;system&#xff09; 5、exec 函数族 …

初识指针4の学习笔记

目录 1>>前言 2>>字符指针变量 3>>数组指针变量 4>>函数指针变量 5>>函数指针数组 6>>回调函数是什么&#xff1f; 7>>结语 1>>前言 今天我会继续分享一些我做的笔记&#xff0c;以及我对指针的理解&#xff0c; 后续会…

查看会议所属CCF级别(A/B/C类会议)

步骤&#xff1a; 1、打开中国计算机学会官网&#xff1a;中国计算机学会 (ccf.org.cn)。 2、搜索框中输入会议名称&#xff0c;例如&#xff1a;SIGKDD。 3、点击打开如图所示来源是“学术评价”的网页。 4、进入如下页面。 可以看到&#xff0c;SIGKDD是CCF A类会议。 参考…

低代码: 关于Test Driven Development - 测试驱动开发组件与测试示例

TDD 的开发方式 Test Driven Development - 测试驱动开发这是一种非常有意思的开发方式,我们进入一个实际场景,拿需要自研的colorpicker表单组件来说表单中的很多属性,都需要进行一个颜色的选择,如背景颜色,字体颜色等等我们来看一下相关设计交互在这里我们分两个图,点击…

python的导入包飘红

本文是mac的解决方法 1、点击pycharm-preferences-paython interpreter 直接搜索你要导入的包名&#xff0c;选择版本号点击 install 2、第二种方法是命令 pip3 install pandas2.2.2

学习文件IO,让你从操作系统内核的角度去理解输入和输出(理论篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

day06——前后端交互

一、计算属性 计算属性就是基于现有的数据推算出来的新属性&#xff0c;只要依赖的数据变化&#xff0c;新属性就会自动更新&#xff0c;而且计算属性多次调用的情况下只会计算一次&#xff0c;效率非常高 简化写法 const app new Vue({ el: #app, data: {}, methods: {//跟da…

易境通海运系统:打造海运专线稳定合作的强力引擎

对于海运专线而言&#xff0c;稳定的合作伙伴至关重要。在激烈的市场竞争中&#xff0c;如何持续保持客户的高满意度&#xff0c;不断强化自身优势&#xff0c;并提升用户粘性&#xff0c;是众多海运专线必须面对并解决的问题。而拥有一套可靠的系统&#xff0c;提供完备的服务…