语义分割预测结果解决方案

deeplabv3+预测结果问题解决:


问题描述

详细问题见上一篇文章https://blog.csdn.net/lisahaomei/article/details/136680857?spm=1001.2014.3001.5501

原因分析:

针对数据集标签,分为像素只有0和1的图,这种标签全黑;然后是0-255的彩色图。根据需求使用这两种标签,我这里需要用0和1的图,而我用了0-255的彩图,所以无法预测结果。

像素只有0,1的图:
在这里插入图片描述

像素0和38的彩图:
在这里插入图片描述

解决方案:

针对二分类,例如识别裂缝,只有背景和裂缝两个元素,可以通过以下代码,实现像素值的转化:

from PIL import Image
import numpy as np
import os

if __name__ == '__main__':
    work_dir = "test"  # 图像所处文件夹
    file_names = os.listdir(work_dir)
    for file_name in file_names:
        # print(file_name) # ISIC_0000000_Segmentation.png
        file_path = os.path.join(work_dir, file_name)

        image = Image.open(file_path)
        img = np.array(image)
        img[img == 38] = 1  #这里将像素值为38的地方转为1,根据自己要求设置

        # 重新保存
        image = Image.fromarray(img, 'L')
        new_name = file_name[:-4]
        new_name = new_name.strip("_Segmentation")  # 文件名处理成和图像一样的名字

        image.save(f'{new_name}.png')

获取图片像素值的代码:

from PIL import Image, ImageTk
import tkinter as tk


def get_pixel(event):
    # 获取鼠标点击位置
    x = event.x
    y = event.y

    # 获取像素RGB值
    pixel = img.getpixel((x, y))

    # 显示像素信息
    print("Pixel at ({}, {}) - RGB: {}".format(x, y, pixel))


window = tk.Tk()# 创建窗口

img = Image.open("ok/1.png")# 打开图片文件

tk_img = ImageTk.PhotoImage(img)# 将图片转换为Tkinter可用的格式

canvas = tk.Canvas(window, width=img.size[0], height=img.size[1])# 创建画布
canvas.pack()

canvas.create_image(0, 0, anchor=tk.NW, image=tk_img)# 在画布上显示图片

canvas.bind("<Button-1>", get_pixel)# 绑定鼠标点击事件

window.mainloop()# 进入主循环

通用将0-255的彩图转换为0和1的黑图标签:

#--------------------------------------------------------#
#   该代码用于调整标签的格式
#--------------------------------------------------------#
import os

import numpy as np
from PIL import Image
from tqdm import tqdm

#-----------------------------------------------------------------------------------#
#   Origin_SegmentationClass_path   原始标签所在的路径
#   Out_SegmentationClass_path      输出标签所在的路径
#                                   处理后的标签为灰度图,如果设置的值太小会看不见具体情况。
#-----------------------------------------------------------------------------------#
Origin_SegmentationClass_path   = "D:/datas/Rock_rock/seg_s/"
Out_SegmentationClass_path      = "D:/datas/Rock_rock/seg_e/"

#-----------------------------------------------------------------------------------#
#   Origin_Point_Value  原始标签对应的像素点值
#   Out_Point_Value     输出标签对应的像素点值
#                       Origin_Point_Value需要与Out_Point_Value一一对应。
#   举例如下,当:
#   Origin_Point_Value = np.array([0, 255]);Out_Point_Value = np.array([0, 1])
#   代表将原始标签中值为0的像素点,调整为0,将原始标签中值为255的像素点,调整为1。
#
#   示例中仅调整了两个像素点值,实际上可以更多个,如:
#   Origin_Point_Value = np.array([0, 128, 255]);Out_Point_Value = np.array([0, 1, 2])
#
#   也可以是数组(当标签值为RGB像素点时),如
#   Origin_Point_Value = np.array([[0, 0, 0], [1, 1, 1]]);Out_Point_Value = np.array([0, 1])
#-----------------------------------------------------------------------------------#
Origin_Point_Value              = np.array([0, 255])
Out_Point_Value                 = np.array([0, 1])

if __name__ == "__main__":
    if not os.path.exists(Out_SegmentationClass_path):
        os.makedirs(Out_SegmentationClass_path)

    #---------------------------#
    #   遍历标签并赋值
    #---------------------------#
    png_names = os.listdir(Origin_SegmentationClass_path)
    print("正在遍历全部标签。")
    for png_name in tqdm(png_names):
        png     = Image.open(os.path.join(Origin_SegmentationClass_path, png_name))
        w, h    = png.size
        
        png     = np.array(png)
        out_png = np.zeros([h, w])
        for i in range(len(Origin_Point_Value)):
            mask = png[:, :] == Origin_Point_Value[i]
            if len(np.shape(mask)) > 2:
                mask = mask.all(-1)
            out_png[mask] = Out_Point_Value[i]
        
        out_png = Image.fromarray(np.array(out_png, np.uint8))
        out_png.save(os.path.join(Out_SegmentationClass_path, png_name))

    #-------------------------------------#
    #   统计输出,各个像素点的值得个数
    #-------------------------------------#
    print("正在统计输出的图片每个像素点的数量。")
    classes_nums        = np.zeros([256], np.int)
    for png_name in tqdm(png_names):
        png_file_name   = os.path.join(Out_SegmentationClass_path, png_name)
        if not os.path.exists(png_file_name):
            raise ValueError("未检测到标签图片%s,请查看具体路径下文件是否存在以及后缀是否为png。"%(png_file_name))
        
        png             = np.array(Image.open(png_file_name), np.uint8)
        classes_nums    += np.bincount(np.reshape(png, [-1]), minlength=256)
        
    print("打印像素点的值与数量。")
    print('-' * 37)
    print("| %15s | %15s |"%("Key", "Value"))
    print('-' * 37)
    for i in range(256):
        if classes_nums[i] > 0:
            print("| %15s | %15s |"%(str(i), str(classes_nums[i])))
            print('-' * 37)

感谢!

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: YOLO V7实例分割是一种基于YOLO算法的目标检测和分割方法。YOLO(You Only Look Once)是一种实时物体检测算法,通过单次前向传递将图像分割为网格,并在每个单元格中预测边界框和类别概率。 YOLO V7实例分割在YOLO V5的基础上进行了改进,引入了语义分割技术。在每个单元格中,除了预测边界框和类别概率外,还预测每个像素的语义标签。这样可以将图像中的每个像素与相应的目标实例进行关联,实现实例级别的分割。同时,YOLO V7还使用了深度特征融合和多尺度训练等技术来提升分割的精度和效果。 YOLO V7实例分割具有以下优点: 1. 实时性:YOLO算法的前向传递速度非常快,可以在实时视频流中快速准确地检测和分割目标实例。 2. 精度和效果:通过引入语义分割技术,YOLO V7可以实现实例级别的分割,提供更准确和细粒度的目标分割结果。 3. 简单性:YOLO V7基于YOLO算法,相对于其他复杂的实例分割方法,操作相对简单,便于应用和部署。 总而言之,YOLO V7实例分割是一种高效、精确且易于应用的目标检测和分割方法,可以广泛应用于计算机视觉领域,如自动驾驶、安防监控、智能交通等。 ### 回答2: YOLO V7是基于YOLO算法的一个版本,主要用于实例分割任务。实例分割是计算机视觉领域的一个重要任务,它需要同时完成目标检测和语义分割两个任务。目标检测是指在图像中识别出目标的位置和类别,而语义分割是指将图像分割成不同的语义区域。 YOLO V7采用的是一种单阶段的目标检测算法,相对于传统的两阶段算法,具有速度快的优势。同时,YOLO V7还引入了语义分割的思想,使得算法不仅能够检测目标的位置和类别,还能够将目标进行精确的分割。 YOLO V7的实例分割过程如下:首先,输入一张图像经过卷积神经网络进行特征提取,得到特征图。然后,将特征图经过卷积操作得到不同尺度的特征图,用于检测不同尺寸的目标。 接下来,将尺度不同的特征图与预先定义的锚框进行匹配,得到目标的位置和类别的初步预测。然后,利用Mask R-CNN的思想,将特征图输入到分割网络中,得到目标的分割结果。 最后,通过后处理步骤,如非极大值抑制,滤除重叠较大的预测框,得到最终的实例分割结果。 总结来说,YOLO V7是一种快速而准确的实例分割算法,它通过结合目标检测和语义分割的思想,在保证高效性能的同时,实现了对目标的精确分割。 ### 回答3: YOLO V7是一种先进的实例分割算法,它结合了YOLO(You Only Look Once)目标检测算法和实例分割技术。相比于传统的目标检测算法,YOLO V7能够实时进行目标检测和实例分割,具有更快的速度和更好的效果。 实例分割是计算机视觉中的一个重要研究领域,目标是在图像中同时识别出不同的物体实例并进行像素级别的分割。YOLO V7使用深度卷积神经网络(CNN)来学习图像特征,并通过多层级的特征融合和上采样等技术来获取更丰富的特征表示。 与传统的实例分割算法相比,YOLO V7具有以下优势: 1. 实时性能:YOLO V7能够在实时视频中进行目标检测和实例分割,实现了高效的处理速度。 2. 精确度:YOLO V7在目标检测和实例分割任务上取得了很好的准确度,能够准确地标记出图像中的不同物体实例,并进行像素级别的分割。 3. 鲁棒性:YOLO V7对于各种环境和场景都具有很好的适应性,可以应对不同姿态、光照条件和遮挡等问题。 4. 可拓展性:YOLO V7的网络结构可以通过不断的训练和调优来适应不同的目标类别和场景,具有很好的可拓展性。 总之,YOLO V7是一种先进的实例分割算法,它融合了目标检测和实例分割技术,在实时性、精确度、鲁棒性和可拓展性等方面都具有明显优势,为计算机视觉领域的目标检测和实例分割任务提供了一种高效而准确的解决方案

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值