同门在跑一个项目时,遇到了标签不对的问题,查阅了网络说明发现是以下的问题:
这是由于该网络中需要的标签的像素值为1或者0两个值,而我们所下载的标签的值不符合,估计是0和255两个值,所以导致在训练时出现精确度为0的情况。这种情况下有两种方案可以使得项目得以继续,其中一种是针对原始网络进行修改,为之添加可以归一化的代码或者将代码中的只能对0、1两个像素值进行计算的改为可以对0和255两个值进行计算;另一种思路是改标签的像数值,将其进行归一化。考虑到难易程度,我们选择第二种方案,就是针对标签图片进行修改。修改的代码如下所示:
from PIL import Image
import os
def normalize_binary_images(directory,directory2):
for filename in os.listdir(directory):
if filename.endswith(".bmp") or filename.endswith(".png") or filename.endswith(".jpg"):
image_path = os.path.join(directory, filename)
image = Image.open(image_path).convert("L")
# 获取图片的最大最小像素值
min_pixel = 255
max_pixel = 0
pixels = image.getdata()
for pixel in pixels:
min_pixel = min(min_pixel, pixel)
max_pixel = max(max_pixel, pixel)
# 将像素值小于等于阈值的设置为纯黑色(0),大于阈值的设置为纯白色(255)
threshold = (min_pixel + max_pixel) // 2
normalized_image = image.point(lambda p: 0 if p <= threshold else 255, "1")
# 保存归一化后的图像
normalized_image.save(os.path.join(directory2 ,filename))
print(f"Normalized {filename} successfully.")
# 使用示例
directory_path = "C:/F/水牛的项目" #归一化前的图像
directory_path1 = "C:/F/水牛的项目/转化后" #归一化后的图像
normalize_binary_images(directory_path, directory_path1)
只需要将使用示例中的路径改为你项目所在的路径即可。