YOLO语义分割标注文件txt还原到图像中

最近做图像分割任务过程中,使用labelme对图像进行标注,得到的数据文件是json,转换为YOLO训练所需的txt格式后,想对标注文件进行检验,即将txt标注文件还原到原图像中,下面是代码:

import cv2
import numpy as np
'''
读取txt标注文件及原图
'''
def read_txt_labels(txt_file):
  """
  从 txt 标注文件中读取标签
  :param txt_file: txt 标注文件路径
  :return: 标签列表
  """
  with open(txt_file, "r") as f:
    labels = []
    for line in f.readlines():
      label_data = line.strip().split(" ")
      class_id = int(label_data[0])
      # 解析边界框坐标
      coordinates = [float(x) for x in label_data[1:]]
      labels.append([class_id, coordinates])
  return labels

def draw_labels(image, labels):
  """
  在图像上绘制分割区域
  :param image: 图像
  :param labels: 标签列表
  """
  for label in labels:
    class_id, coordinates = label
    # 将坐标转换为整数并重新塑形为多边形
    points = [(int(x * image.shape[1]), int(y * image.shape[0])) for x, y in zip(coordinates[::2], coordinates[1::2])]
    # 使用多边形填充
    cv2.fillPoly(image, [np.array(points)], (0, 255, 0))  # 绿色表示分割区域

def main():
  """
  将 YOLO 语义分割的 txt 标注文件还原到原图中
  """
  # 读取图像
  image = cv2.imread("D:\Desktop\gasdata\images\\0002.jpg")
  # 读取 txt 标注文件
  txt_file = "D:\Desktop\gasdata\\txt\\0002.txt"
  labels = read_txt_labels(txt_file)
  # 绘制分割区域
  draw_labels(image, labels)
  # 获取窗口大小
  window_size = (1600, 800)  # 您可以根据需要调整窗口大小
  # 调整图像大小
  image = cv2.resize(image, window_size)
  # 创建一个与窗口大小相同的黑色图像
  background = np.zeros((window_size[1], window_size[0], 3), np.uint8)
  # 将图像放置在黑色背景的中心
  image_x = int((window_size[0] - image.shape[1]) / 2)
  image_y = int((window_size[1] - image.shape[0]) / 2)
  background[image_y:image_y + image.shape[0], image_x:image_x + image.shape[1]] = image
  cv2.namedWindow("Image", cv2.WINDOW_NORMAL)
  cv2.imshow("Image", image)
  cv2.waitKey(0)
if __name__ == "__main__":
  main()

效果图:

在这里插入图片描述

如果仅对轮廓进行标注,不填充整个区域,则只需修改draw_labels函数:

def draw_labels(image, labels):
  """
  在图像上绘制分割区域轮廓
  :param image: 图像
  :param labels: 标签列表
  """
  for label in labels:
    class_id, coordinates = label
    # 将坐标转换为整数并重新塑形为多边形
    points = [(int(x * image.shape[1]), int(y * image.shape[0])) for x, y in zip(coordinates[::2], coordinates[1::2])]
    # 使用多边形绘制轮廓
    cv2.polylines(image, [np.array(points)], True, (0, 255, 0), 2)  # 红色表示分割区域轮廓

效果图:

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
构建一个 YOLO(You Only Look Once)语义分割模型是一项复杂的任务,需要进行以下步骤: 1. 数据收集和准备:收集包含各种类别的图像和对应标签。每个图像需要有像素级别的标注,以区分不同的物体。确保数据集具有足够的多样性和数量。 2. 数据预处理:对数据进行预处理,包括图像的大小调整、数据增强(如旋、翻、裁剪等)和标签的编码处理。 3. 构建模型架构:选择适当的深度学习架构来构建 YOLO 语义分割模型。可以使用常见的网络架构,如 U-Net、FCN(全卷积网络)或 DeepLab 等。确保模型具有适当的感受野和上下文信息来进行准确的语义分割。 4. 模型训练:使用准备好的数据集对模型进行训练。在训练过程,需要定义合适的损失函数,如交叉熵损失或 Dice 损失函数,并选择适当的优化算法,如 Adam 或 SGD。通过迭代训练,优化模型参数来提高准确性。 5. 模型评估和调优:使用验证集对模型进行评估,计算准确率、召回率、F1 分数等指标。根据评估结果调整模型架构、超参数或数据集,以提高模型性能。 6. 模型推理和应用:使用经过训练和调优的模型对新的图像进行语义分割。将模型应用于实际场景,可以通过像素级别的标注来获取物体的位置和类别信息。 请注意,构建 YOLO 语义分割模型是一项复杂的任务,需要深度学习和计算机视觉领域的知识和经验。确保掌握相关基础知识并参考相关文献和代码库来完成这个任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万里守约

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值