【学习笔记】Semantic Segmentation Suite使用过程中的遇到的坑
最近因为需要要上手语义分割,发现语义分割大牛的源代码仿佛都是caffe框架下的,Tensorflow框架下都是爱好者根据大牛的源码和论文自己撸的……查来查去发现了一个语义分隔套件,上手使用的过程中遇到的问题记录下来,希望可以帮到有缘人。
问题一:训练用label图是RGB彩色图。
我的数据集的原图及标签展示:


这个是我遇到的第一个问题,因为我的数据集是使用Labelme软件制作的,制作好的label是8位的灰度图,怎么办?
我解决思路是,照猫画虎,按照作者的camvid数据集中的csv文件制作自己的csv文件,然后自己写个脚本,把灰度图变为RGB图。说干就干,脚本如下:(因为我的类别比较少,颜色都是一个个手撸进去的,类别太多的话考虑从csv文件中读取RGB值)
'''
This script is used to trans lableme gray lable to rgb lable.
@author:KH
20190325
'''
import os
from PIL import Image
x =0
y =0
img_path = '/home/kanghao/semantic-segmentation-suite/lmc_six_dataset/val_labels/'
file_img = sorted(os.listdir(img_path))
for image in file_img:
img_name = str(image)
#img_name = img_name.replace('.png','.jpg') #!!!
img = Image.open(os.path.join(img_path,image))
img = img.convert("RGB")
img_weight = img.size[0]
img_hight = img.size[1]
w_range = range(img_weight)
h_range = range(img_hight)
for x in w_range:
for y in h_range:
pix = img.getpixel((x,y))
if pix == (0,0,0): # background
pix = img.putpixel((x,y),(0,0,0))
elif pix == (1,1,1): # road
pix = img.putpixel((x,y),(0,255,0))
elif pix == (2,2,2): # grass
pix = img.putpixel((x,y),(144,228,144))
elif pix == (3,3,3): # fence
pix = img.putpixel((x,y),(255,255,0))
elif pix == (4,4,4): # stone
pix = img.putpixel((x,y),(255,0,0))
elif pix == (5,5,5): # pit
pix = img.putpixel((x,y),(30,144,255))
img.save("/home/kanghao/semantic-segmentation-suite/lmc_six_dataset/val_labels_rgb/" + img_name)
因为我的原图为jpb格式,而生成的label为png格式,有博主说两个图的格式要对应起来,于是我在脚本里染色的同时把pg转换为了jpg格式,这里坑就来了……
问题二:GT图是花的,训练多次后PRED图全黑?
转换完成后,开始训练,然而ground truth图抽风了……
我原始的GT图是这样的:

但是代码生成的GT图是这样的?? 而且这样训练下去的预测图都是黑色的……玩毛?

什么鬼?这个问题困扰了我很久,包括从源代码一步步的调试查找原因……最后的原因很简单……放大一副染色后的JPG 格式的图片看看:

发现什么了吗?是的,png到jpg后,由于编码格式改变……图片莫名奇妙产生了其他的RGB值!用PS来看RGB更明显,这就导致我的label中有不止我划分的6个类了………(在脚本中注释掉并且加了!!!的语句就是罪魁祸首)
至此,可算是可以训练了,目前训练结果尚可,但是还有问题就是我的某一类,比如草(grass,没骂街……)的准确率是0,预测不出来。 等我解决再来填坑,另推这位博主的套件详细使用过程 :)
