windows下Icnet训练自己的数据集

一、数据集标注:Labelme

       安装后labelme后,在C:\Users\xxx\Anaconda3\Lib\site-packages\labelme\utils下修改_io.py       

    def lblsave(filename, lbl):
    if osp.splitext(filename)[1] != '.png':
        filename += '.png'
    # Assume label ranses [-1, 254] for int32,
    # and [0, 255] for uint8 as VOC.
    if lbl.min() >= -1 and lbl.max() < 255:
        lbl_pil = PIL.Image.fromarray(lbl.astype(np.uint8), mode='L')
        # colormap = label_colormap(255)
        # lbl_pil.putpalette((colormap * 255).astype(np.uint8).flatten())
        lbl_pil.save(filename)
    else:
        logger.warn(
            '[%s] Cannot save the pixel-wise class label as PNG, '
            'so please use the npy file.' % filename
        )

       原来的labelme版本程序是生成8位彩色的label.png,按照上面代码修改程序得到8位全部为黑色的label.png文件。这个黑色的图片才是我们这个程序需要的标注的数据。(为什么这么说?彩色的和黑色的label.png文件经过自己的测试发现,训练百张图片数据,黑色的label.png经过几百次循环loss值在0.094左右就得到很好的结果。但是彩色的经过几千次后loss值基本上就不变化了虽然loss值为0.089比彩色还低,但是预测图片都是黑色的。有这样的结果差异我想可能跟本身作者的程序有关吧。在跑通这个程序之前,提醒大家的是不同的程序可能需要不同的label.png,根据自己的经验有的需要8位彩色的label.png,甚至还有的程序需要24位的label.png。这个如何选择呢?其实很简单,这个你需要看作者github上的源代码给出的demo用到的数据集的label.png格式,最好与作者保持一致。比如这个程序作者的源代码就是用的cityscapes上给出的就是8位非彩色的label.png,所以自己就需要修改一下源码)

2、程序训练。

     github地址:https://github.com/hellochick/ICNet-tensorflow

     自己在一开始用到这个程序,但是作者一直在更新,导致最新的版本与之前的有了很大的改动,自己刚开始并不成功。于是我找到了之前作者的版本。我看很多****上的很多关于ICnet上的文章基本上都是基于早期版本的,为了自己更好的按照前人的思路,我找到了fork作者早期版本的程序。

   大家可以参照这个github:https://github.com/jinfagang/seg_icnet

  当然,大家也可以尝试一下用最新作者的源代码跑一下数据看一下效果。

   程序的操作可以详细的参照normal_moon写的文章 https://blog.****.net/weixin_39347054/article/details/83021471#commentsedit 

  我的原图片格式是png而非jpg(jpg图片对程序或者有影响或者没影响这个我没验证),大家最好先使用png格式的图片当训练集。我这里需要分为两类,一类背景background,一类前景。所以我的num_class为2类。并且我的ignore_label设置为100。看到很多文章说是background 和ignore_label不是一样的,切记切记。我训练的方式是初始加载预处理的模型。训练后跑inference.py程序后得到如下图:

  windows下Icnet训练自己的数据集