测试 yolov8 分割模型 边缘检测

发现 cfg/default.yaml 参数 mask_ratio 等于4 直接训练如下边缘分割标签,推理时mask 稀疏,训练时分数偏低,mask_ratio 改为1训练时打印的mask 的 P指标一直为0,将imgsz=原图size 训练分数也不高

标注用的是labelme多边形

阅读源码发现可能是因为mask缩放导致

且出现上边缘mask被box过度剪裁的情况

修改了源码中的两处,还是保持mask_ratio等于4,重新训练,推理如下,虽然mask粗糙但几乎不产生断裂

修改如下:

1.ultralytics/data/utils.py

def polygon2mask(imgsz, polygons, color=1, downsample_ratio=1):mask = np.zeros(imgsz, dtype=np.uint8)polygons = np.asarray(polygons, dtype=np.int32)polygons = polygons.reshape((polygons.shape[0], -1, 2))cv2.fillPoly(mask, polygons, color=color)nh, nw = (imgsz[0] // downsample_ratio, imgsz[1] // downsample_ratio)# Note: fillPoly first then resize is trying to keep the same loss calculation method when mask-ratio=1return cv2.resize(mask, (nw, nh))

def polygon2mask(imgsz, polygons, color=1, downsample_ratio=1):mask = np.zeros((imgsz[0]// downsample_ratio,imgsz[1]// downsample_ratio), dtype=np.uint8)polygons=[[j*0.25 for j in i] for i in polygons]polygons = np.asarray(polygons, dtype=np.int32)polygons = polygons.reshape((polygons.shape[0], -1, 2))cv2.fillPoly(mask, polygons, color=color)return mask

2.ultralytics/models/yolo/segment/predict.py

类SegmentationPredictor postprocess方法 外扩mask 1个像素

def postprocess(self, preds, img, orig_imgs):"""Applies non-max suppression and processes detections for each image in an input batch."""p = ops.non_max_suppression(preds[0],self.args.conf,self.args.iou,agnostic=self.args.agnostic_nms,max_det=self.args.max_det,nc=len(self.model.names),classes=self.args.classes,)if not isinstance(orig_imgs, list):  # input images are a torch.Tensor, not a listorig_imgs = ops.convert_torch2numpy_batch(orig_imgs)results = []proto = preds[1][-1] if len(preds[1]) == 3 else preds[1]  # second output is len 3 if pt, but only 1 if exportedfor i, pred in enumerate(p):orig_img = orig_imgs[i]img_path = self.batch[0][i]if not len(pred):  # save empty boxesmasks = Noneelif self.args.retina_masks:pred[:, :4] = ops.scale_boxes(img.shape[2:], pred[:, :4], orig_img.shape)masks = ops.process_mask_native(proto[i], pred[:, 6:], pred[:, :4], orig_img.shape[:2])  # HWCelse:#外扩盒子c, mh, mw = proto[i].shape  # CHWih, iw = img.shape[2:]pred[:, :4][:, 0] -= iw / mw*1pred[:, :4][:, 1] -= ih / mh*1pred[:, :4][:, 2] += iw / mw*1pred[:, :4][:, 3] += ih / mh*1masks = ops.process_mask(proto[i], pred[:, 6:], pred[:, :4], img.shape[2:], upsample=True)  # HWCpred[:, :4] = ops.scale_boxes(img.shape[2:], pred[:, :4], orig_img.shape)results.append(Results(orig_img, path=img_path, names=self.model.names, boxes=pred[:, :6], masks=masks))return results

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

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

相关文章

P8823 [传智杯 #3 初赛] 期末考试成绩

前言: 大家好!我们又见面了~~~ 今天我来带大家学习P8823 [传智杯 #3 初赛] 期末考试成绩! 题目传送门 一、题意描述: 这道题给出一个人的成绩,这个人的成绩有三种可能: 可能性/结果情况结果x1 y1 ≥90分z1 直接输出4.0x2y2 <90分,>60z2(扣成绩-10)*0.1x3y3 &…

dpdk网络转发环境的搭建

文章目录 前言ip命令的使用配置dpdk-basicfwd需要的网络结构测试dpdk-basicfwddpdk-basicfwd代码分析附录basicfwd在tcp转发时的失败抓包信息DPDK的相关设置 前言 上手dpdk有两难。其一为环境搭建。被绑定之后的网卡没有IP&#xff0c;我如何给它发送数据呢&#xff1f;当然&a…

C++——结构体

1&#xff0c;结构体基本概念 结构体属于用户自定义的数据类型&#xff0c;允许用户存储不同的数据类型。像int&#xff08;整型&#xff09;&#xff0c;浮点型&#xff0c;bool型&#xff0c;字符串型等都是属于系统内置的数据类型。而今天要学习的结构体则是属于我们自定义…

Java 基于 SpringBoot+Vue 的社区团购系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Spring 事务原理一

从本篇博客开始&#xff0c;我们将梳理Spring事务相关的知识点。在开始前&#xff0c;想先给自己定一个目标&#xff1a;通过此次梳理要完全理解事务的基本概念及Spring实现事务的基本原理。为实现这个目标我想按以下几个步骤进行&#xff1a; 讲解事务中的一些基本概念使用Sp…

架构篇13:架构设计流程-详细方案设计

文章目录 架构设计第 4 步&#xff1a;详细方案设计详细方案设计实战小结 完成备选方案的设计和选择后&#xff0c;我们终于可以长出一口气&#xff0c;因为整个架构设计最难的一步已经完成了&#xff0c;但整体方案尚未完成&#xff0c;架构师还需继续努力。接下来我们需要再接…

java数据结构与算法刷题-----LeetCode645. 错误的集合(位运算解法需要重点掌握)

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 法一&#xff1a;桶排序思想法二&#xff1a;位运算 法一&#x…

QGraphicsView前有QWidget遮罩,导致QGraphicsItem鼠标事件不响应

场景&#xff1a;在一个QWidget上放置了一个QGraphicsView用于显示图像&#xff0c;QGraphicsView设置了场景&#xff0c;并添加了一个自定义QGraphicsItem。由于需求原因&#xff0c;又绘制了一个标尺QWidget放在QGraphicsView前部。 结果导致标尺QWidget显示时&#xff0c;重…

初识进程(Linux)

进程 前言1. 介绍冯诺依曼体系结构①. CPU——寄存器、运算器、控制器和时钟②. 存储器——内存③. 输入输出设备④. 程序运行过程⑤. 小结 2. 操作系统①. 基本介绍②. 先描述再组织&#xff08;重要&#xff1a;贯穿Linux内核&#xff09; 进程1. 概念2. 了解进程①进程PCB②…

从 Vscode 中远程连接 WSL 服务器:可以本地操作虚拟机

从 Vscode 中远程连接 WSL 服务器&#xff1a;可以本地操作虚拟机 1.下载 Vscode Visual Studio Code - Code Editing. Redefined 2.搜索框中输入>wsl&#xff0c;点击 WSL&#xff1a;Connect to WSL using Distro... 3.点击下载好的Ubuntu&#xff0c;当左下角出现图片同…

工业相机与镜头参数及选型

文章目录 1、相机成像系统模型1.1 视场1.2 成像简化模型 2、工业相机参数2.1 分辨率2.2 靶面尺寸2.3 像元尺寸2.4 帧率/行频2.5 像素深度2.6 动态范围2.7 信噪比2.8 曝光时间2.9 相机接口 3、工业镜头参数3.1 焦距3.2 光圈3.3 景深3.4 镜头分辨率3.5 工作距离&#xff08;Worki…

计算机提示opencl.dll丢失怎么办?解决opencl.dll丢失的办法

OpenCL&#xff08;Open Computing Language&#xff09;是一个开放的、跨平台的并行计算框架&#xff0c;它允许开发者使用统一的编程模型来编写程序&#xff0c;以实现在各种硬件平台上的高性能计算。OpenCL.dll是OpenCL运行时库的一部分&#xff0c;它包含了许多用于执行Ope…