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)
感谢!