yolov8标注细胞、识别边缘、计算面积、灰度值计算

一、数据标注

1. 使用labelme软件标注每个细胞的边界信息,标注结果为JSON格式

在这里插入图片描述
在这里插入图片描述

2. JSON格式转yolo支持的txt格式
import json
import os
import glob
import os.path as osp'''此函数用来将labelme软件标注好的数据集转换为yolov5_7.0sege中使用的数据集:param jsonfilePath: labelme标注好的*.json文件所在文件夹:param resultDirPath: 转换好后的*.txt保存文件夹:param classList: 数据集中的类别标签
'''  
def labelme2yolov2Seg(jsonfilePath, resultDirPath, classList):# 0.创建保存转换结果的文件夹if (not os.path.exists(resultDirPath)):os.mkdir(resultDirPath)# 1.获取目录下所有的labelme标注好的Json文件,存入列表中jsonfileList = glob.glob(osp.join(jsonfilePath, "*.json") )print(jsonfileList)  # 打印文件夹下的文件名称# 2.遍历json文件,进行转换for jsonfile in jsonfileList:# 3. 打开json文件with open(jsonfile, "r",encoding='UTF-8') as f:file_in = json.load(f)# 4. 读取文件中记录的所有标注目标shapes = file_in["shapes"]# 5. 使用图像名称创建一个txt文件,用来保存数据with open(resultDirPath + "\\" + jsonfile.split("\\")[-1].replace(".json", ".txt"), "w") as file_handle:# 6. 遍历shapes中的每个目标的轮廓for shape in shapes:# 7.根据json中目标的类别标签,从classList中寻找类别的ID,然后写入txt文件中file_handle.writelines(str(classList.index(shape["label"])) + " ")# 8. 遍历shape轮廓中的每个点,每个点要进行图像尺寸的缩放,即x/width, y/heightfor point in shape["points"]:x = point[0] / file_in["imageWidth"]  # mask轮廓中一点的X坐标y = point[1] / file_in["imageHeight"]  # mask轮廓中一点的Y坐标file_handle.writelines(str(x) + " " + str(y) + " ")  # 写入mask轮廓点# 9.每个物体一行数据,一个物体遍历完成后需要换行file_handle.writelines("\n")# 10.所有物体都遍历完,需要关闭文件file_handle.close()# 10.所有物体都遍历完,需要关闭文件f.close()if __name__ == "__main__":jsonfilePath = r"D:/workspace/yolov8/datasets/json"  # 要转换的json文件所在目录resultDirPath = r"D:/workspace/yolov8/datasets/txt"  # 要生成的txt文件夹labelme2yolov2Seg(jsonfilePath=jsonfilePath, resultDirPath=resultDirPath, classList=['danhe','linba','yilin'])  # 更改为自己的类别名

转换结果:
在这里插入图片描述

二、训练数据

1. 配置文件

路径:ultralytics\cfg\datasets\cell_seg.yaml

path: ../datasets/cell_seg # dataset root dir
train: images/train # train images (relative to 'path')
val: images/val # val images (relative to 'path')
test: test/images # test images (optional)nc: 2# Classes
names:0: danhe1: linba
2. 训练脚本
# 细胞实例分割训练
from  ultralytics import YOLOmodel = YOLO('yolov8n-seg.pt')
# 训练自己的数据集,  文件路径: ultralytics/cfg/datasets/cell_seg.yaml
model.train(data='cell_seg.yaml', epochs=100, imgsz=320)
# 使用验证集 验证效果
model.val()
3. 训练结果

在这里插入图片描述
在这里插入图片描述

三、使用上述训练的模型,批量检测细胞、计算细胞面积、灰度值计算

1. 预测细胞类别及轮廓

# 细胞实例分割训练
from  ultralytics import YOLO
# best_seg.pt 训练结果中weight/best.pt
model = YOLO('best_seg.pt')
# 测试数据 批量检测
predict_results = model.predict(source="../datasets/cell/test/images", save=True)

在这里插入图片描述

2. 识别轮廓、计算面积

from ultralytics import YOLO
import cv2
import os
import numpy as np# Load a pretrained YOLOv8n model
model =  YOLO('best_seg.pt')# Define path to the directory containing image files
source = '../datasets/cell/test/images'# 指定输出路径
output_dir = './output_images'
if not os.path.exists(output_dir):os.makedirs(output_dir)# 获取待预测文件名称,用于保存同名文件
def get_last_part_of_string(path):return os.path.basename(path)#  hex to BGR
def hex_to_bgr(hex):return tuple(int(hex[i:i+2], 16) for i in (4, 2, 0))# 颜色,同plotting.py的设置
hexs = ("FF3838", "FF9D97", "FF701F", "FFB21D", "CFD231","48F90A", "92CC17", "3DDB86", "1A9334", "00D4BB","2C99A8", "00C2FF", "344593", "6473FF", "0018EC","8438FF", "520085", "CB38FF", "FF95C8", "FF37C7"
)
colors = [hex_to_bgr(h) for h in hexs]# 开始预测
results = model(source=source, save=False)  # list of Results objectsfor result in results:image_path = result.pathimage = cv2.imread(image_path)boxes = result.boxes  # Boxes 对象,用于边界框输出masks = result.masks  # Masks 对象,用于分割掩码输出names = result.names  # 获取类别名称字典for box, mask in zip(boxes, masks):for cls, contour in zip(box.cls, mask.xy):class_id = int(cls.item())  # 获取张量的值并转换为整数color = colors[class_id % len(colors)]  # 获取颜色contour = np.array(contour, dtype=np.int32)  # 确保轮廓是整数类型area = cv2.contourArea(contour)  # 计算轮廓面积class_name = names[class_id]  # 获取类别名称# 计算轮廓的中心M = cv2.moments(contour)if M['m00'] != 0:cx = int(M['m10'] / M['m00'])cy = int(M['m01'] / M['m00'])else:cx, cy = 0, 0'''cv2.drawContours 参数:image: 输入图像,一般是二值图像或彩色图像;contours: 要绘制的轮廓,是一个 Python 列表,每个列表元素都是一个 Numpy 数组,代表一个轮廓;contourIdx: 要绘制的轮廓的索引,默认为 -1, 代表绘制所有轮廓;color: 轮廓的颜色,是一个三元组,分别表示 RGB 颜色;thickness: 线条的粗细,默认为 1;lineType: 线条类型,默认为 cv2.LINE_8;hierarchy: 轮廓的层次关系,是一个 Numpy 数组;maxLevel: 最多绘制的轮廓层'''# 绘制掩码轮廓cv2.drawContours(image, [contour], -1, color, 2)# 在图像上绘制面积和类名text = f'{class_name} {area:.2f}''''cv2.putText 参数:img: 需要绘制文本的图像。‌text: 要绘制的文本内容。‌org: 文本框的左下角坐标,‌即起始点(x,y)。‌fontFace: 字体类型, 如cv2.FONT_HERSHEY_SIMPLEX、cv2.FONT_HERSHEY_PLAIN等。fontScale: 字体大小, float类型, 一般设置为1.0。‌color: 文本颜色, BGR格式。thickness: 文本粗细, 如果设置为None, ‌则表示绘制实心文字。‌lineType: 线型, 可选类型包括cv2.LINE_4、cv2.LINE_8、cv2.LINE_AA等。bottomLeftOrigin: 如果为True, ‌则图像数据原点在左下角(‌默认情况下在左上角)‌。‌'''cv2.putText(image, text, (cx, cy), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1)# 保存图像output_path = os.path.join(output_dir, get_last_part_of_string(image_path))'''cv2.imwrite() 参数:filename: 要保存的文件路径和名称,包括路径(‌如果文件不在当前工作目录下)‌和文件扩展名(‌如 .jpg, .png 等)‌。img: 要保存的图像数据,通常是通过 OpenCV 读取或处理得到的。'''cv2.imwrite(output_path, image)print(f'Saved: {output_path}')

在这里插入图片描述

3. 灰度值提取

from ultralytics import YOLO
import cv2
import os
import numpy as np# Load a pretrained YOLOv8n model
model =  YOLO('best_seg.pt')# Define path to the directory containing image files
source = '../datasets/cell/test/images'# 指定输出路径
output_dir = './output_images'
if not os.path.exists(output_dir):os.makedirs(output_dir)# 获取待预测文件名称,用于保存同名文件
def get_last_part_of_string(path):return os.path.basename(path)#  hex to BGR
def hex_to_bgr(hex):return tuple(int(hex[i:i+2], 16) for i in (4, 2, 0))# 颜色,同plotting.py的设置
hexs = ("FF3838", "FF9D97", "FF701F", "FFB21D", "CFD231","48F90A", "92CC17", "3DDB86", "1A9334", "00D4BB","2C99A8", "00C2FF", "344593", "6473FF", "0018EC","8438FF", "520085", "CB38FF", "FF95C8", "FF37C7"
)
colors = [hex_to_bgr(h) for h in hexs]# 开始预测
results = model(source=source, save=False)  # list of Results objectsn_points = 5
spacing = 30for result in results:image_path = result.pathimage = cv2.imread(image_path)boxes = result.boxes  # Boxes 对象,用于边界框输出masks = result.masks  # Masks 对象,用于分割掩码输出names = result.names  # 获取类别名称字典# 将图片转换成灰度图gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)for box, mask in zip(boxes, masks):for cls, contour in zip(box.cls, mask.xy):class_id = int(cls.item())  # 获取张量的值并转换为整数color = colors[class_id % len(colors)]  # 获取颜色contour = np.array(contour, dtype=np.int32)  # 确保轮廓是整数类型area = cv2.contourArea(contour)  # 计算轮廓面积class_name = names[class_id]  # 获取类别名称# 计算轮廓的中心M = cv2.moments(contour)if M['m00'] != 0:cx = int(M['m10'] / M['m00'])cy = int(M['m01'] / M['m00'])else:cx, cy = 0, 0'''cv2.drawContours 参数:image: 输入图像,一般是二值图像或彩色图像;contours: 要绘制的轮廓,是一个 Python 列表,每个列表元素都是一个 Numpy 数组,代表一个轮廓;contourIdx: 要绘制的轮廓的索引,默认为 -1, 代表绘制所有轮廓;color: 轮廓的颜色,是一个三元组,分别表示 RGB 颜色;thickness: 线条的粗细,默认为 1;lineType: 线条类型,默认为 cv2.LINE_8;hierarchy: 轮廓的层次关系,是一个 Numpy 数组;maxLevel: 最多绘制的轮廓层'''# 绘制掩码轮廓cv2.drawContours(gray_image, [contour], -1, color, 2)# 在图像上绘制面积和类名text = f'{class_name} {area:.2f}'cv2.putText(gray_image, text, (cx, cy-20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1)# 以轮廓为中心,在图像上绘制点for i in range(n_points):# 从中心店左移2个点的距离x = cx + i * spacing - spacing *2y = cy gray_value = gray_image[y, x]# 画点cv2.circle(gray_image, (x, y), 2, (255, 0, 0), 1)# 点描述cv2.putText(gray_image, str(i+1), (x-5, y-5), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (255, 0, 0), 1)# cv2.circle(gray_image, (x-(i * spacing), y), 2, (0, 255, 0), 1) gray_text = f"Point {i+1}({x},{y}): gray value = {gray_value} "print(gray_text)# 将点的灰度值绘制在图片的左上角cv2.putText(gray_image, gray_text, (10, 15+i*15), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 0, 0), 1)# 保存图像output_path = os.path.join(output_dir, get_last_part_of_string(image_path))'''cv2.imwrite() 参数:filename: 要保存的文件路径和名称,包括路径(‌如果文件不在当前工作目录下)‌和文件扩展名(‌如 .jpg, .png 等)‌。img: 要保存的图像数据,通常是通过 OpenCV 读取或处理得到的。'''cv2.imwrite(output_path, gray_image)print(f'Saved: {output_path}')

在这里插入图片描述

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

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

相关文章

【vue前端项目实战案例】之Vue仿饿了么App

本文将介绍一款仿“饿了么”商家页面的App。该案例是基于 Vue2.0 Vue Router webpack ES6 等技术栈实现的一款外卖类App,适合初学者进行学习。 项目源码下载链接在文章末尾 1 项目概述 该项目是一款仿“饿了么”商家页面的外卖类App,主要有以下功能…

【深度学习】“复杂场景下基于深度学习的卷积神经网络在鸟类多类别识别中的模型设计与性能优化研究“(上)

【深度学习】“复杂场景下基于深度学习的卷积神经网络在鸟类多类别识别中的模型设计与性能优化研究”(上) 大家好 我是寸铁👊 【深度学习】“复杂场景下基于深度学习的卷积神经网络在鸟类多类别识别中的模型设计与性能优化研究”(上)✨ 喜欢的小伙伴可以点点关注 &a…

LangChain-v0.2 构建 PDF 采集和问答系统

PDF 文件通常包含其他来源无法获取的重要非结构化数据。它们可能非常长,而且与纯文本文件不同,通常无法直接输入到语言模型的提示中。 在本中,我们将创建一个可以回答有关 PDF 文件的问题的系统。更具体地说,就是使用文档加载器加…

【前端 14】Vue常见指令

Vue常见指令 Vue.js 是一个构建用户界面的渐进式框架,它通过一系列简洁的指令(Directives)来增强HTML的功能,使得开发者能够更加方便地构建出响应式的Web应用。本文将详细讲解Vue中的几个核心指令:v-bind、v-model、v…

AndroidAOSP定制之关闭某些app的通知

AndroidAOSP定制之关闭某些app的通知 前言: ​ 最近在做AOSP系统定制时发现gms定制好了后,Google应用商店用不了,提示此设备未获得Play保护机制认证,Google应用和服务无法在此设备上运行,查看官方文档和资料,说是由于…

【学习笔记】| 03 - 使用STM32CubeMX新建工程

使用STM32CubeMX新建工程是一个相对直观的过程,主要涉及到选择芯片型号、配置外设、时钟系统、GPIO引脚等,并最终生成工程代码。以下是一个详细的步骤指南: 一、打开STM32CubeMX并新建工程 启动STM32CubeMX: 打开STM32CubeMX软件…

FPGA实验6: 有时钟使能两位十进制计数器的设计

一、实验目的与要求 1.. 熟练掌握使用原理图设计较复杂电路; 2. 学习原理图设计中总线的表示以及使用方法。 二、实验原理 运用Quartus II 集成环境下的图形设计方法设计有时钟使能的两位十进制计数器。进行波形仿真和分析、引脚分配并下载到实验设备上进行功能…

[ECharts] There is a chart instance already initialized on the dom. 已存在图表,渲染重复

报错:已存在图表,渲染重复 解决: 在合适的时机执行 dispose 方法即可 // echarts 全局存入 实例 let myChart: any;// 在你的 initChart 初始化 Echarts 方法中 先执行清理方法 const initChart () > {// 执行清理方法然后初始化if(myChart){cons…

AndroidStudio 开发环境搭建

文章目录 AndroidStudio 开发环境搭建JDK 下载与安装,配置环境变量JDK1.8 下载安装配置环境变量新建JAVA_HOME编辑Path 下载AndroidStudio最新版本历史版本先安装JDK,后启动AS以管理员身份运行打开解决双击打不开的问题Error:你的主机中的软件中止了一个…

Coggle数据科学 | 大模型技术内参:39 种提示工程 在 29 种 NLP 任务精度对比

本文来源公众号“Coggle数据科学”,仅用于学术分享,侵权删,干货满满。 原文链接:大模型技术内参:39 种提示工程 在 29 种 NLP 任务精度对比 大语言模型(LLMs)在许多不同的自然语言处理&#x…

Linux网络-netstat命令

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注我,我尽量把自己会的都分享给大家,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux服务器作为一个常用的网络服务器,主要的作用就是向客户端提供网络…

1143. 最长公共子序列(详细版)

目录 dp解法: 1.状态代表什么: 2. 状态转移方程 3.初始化 3. so为什么要这样? 代码实现: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0…

从小白到架构师:万字长文 | 社交媒体应用系统设计

移动互联网时代,社交媒体应用彻底改变了我们联系和共享信息的方式。这些平台在幕后处理庞大的用户群、数据存储和实时交互。 在本文中,我们将深入探讨如何设计一个可扩展且高性能的社交媒体应用系统。我们将探讨关键组件、流程图、功能需求以及容量规划…

科普文:分布式数据一致性协议Paxos

1 什么是Paxos Paxos协议其实说的就是Paxos算法, Paxos算法是基于消息传递且具有高度容错特性的一致性算 法,是目前公认的解决分布式一致性问题最有效的算法之一。 Paxos由 莱斯利兰伯特(Leslie Lamport)于1998年在《The Part-Time Parliament》论文中首次公 开&…

Gitops-Argo-Cli安装与使用

一、安装Argo-Cli工具 Release v2.9.21 argoproj/argo-cd GitHub **选择合适的符合你操作系统以及CPU架构的二进制文件 #依v2.9.21-X86-64-Linux操作系统为例 wget https://github.com/argoproj/argo-cd/releases/download/v2.9.21/argocd-linux-amd64 #添加执行权限并且移…

论文中的流程图参考图片

写论文的时候,在绘制流程图时,一直纠结n是大写还是小写,用不用斜体,号两边要不要空格。今天找到了一张标准的流程图来参考。图片来自 Zhi-Chang Ba et al, Combination of DCE-MRI and NME-DWI via Deep Neural Network for Predi…

虚拟机复制后网络不可用,报错“network.service - LSB: Bring up/down networking”

查询IP地址,eth33 没有显示IP地址 尝试重启,有报错,并且有提示,按照提示执行下看看 解决办法 chkconfig NetworkManager offsystemctl disable NetworkManager.serviceservice NetworkManager stopservice network restart 之后检…

边缘计算网关项目(含上报进程、32Modbus采集进程、设备搜索响应进程源码)

目录 边缘层 架构说明 包含知识点 数据上报进程 功能描述 功能开发 上报线程 数据存储线程 指令处理线程 项目源码 上报模块.c代码: 上报模块Makefile代码: STM32采集模块.c代码 设备搜索响应模块Linux部分.c代码 设备搜索响应模块Qt端代码.h …

C语言画蜡烛图

GPT-4o (OpenAI) 在C语言中,绘制蜡烛图(Candlestick Chart)不是直接的任务,因为C语言本身不包含高级图形绘制库。然而,可以通过某些图形库来完成这项任务,例如使用GTK、SDL、OpenGL等。 以下是通过GTK库绘…

Hive3:Hive初体验

1、创建表 CREATE TABLE test(id INT, name STRING, gender STRING);2、新增数据 INSERT INTO test VALUES(1, 王力红, 男); INSERT INTO test VALUES(2, 钉钉盯, 女); INSERT INTO test VALUES(3, 咔咔咔, 女);3、查询数据 简单查询 select * from test;带聚合函数的查询 …