语义分割 | segnet 制作自己的数据,如何训练,如何测试,如何评价

 

本博文介绍如何手把手制作自己的数据集,并使用SegNet网络进行语义分割,如何训练,如何测试自己的分割模型。

----------------------------------------------------------------------------------------------------------------------------------------------------------

感谢:

1.源码参考cudnn5版本的caffe-segnet,https://github.com/TimoSaemann/caffe-segnet-cudnn5

2.作者的官方指导文档:http://mi.eng.cam.ac.uk/projects/segnet/tutorial.html

3.一份使用指导:https://github.com/TqDavid/SegNet-Tutorial/tree/master/CamVid

4.如果想测试SegNet的效果,这里有官方的在线测试demo: http://mi.eng.cam.ac.uk/projects/segnet/#demo

5.一份segnet的预训练model

https://github.com/alexgkendall/SegNet-Tutorial/blob/master/Example_Models/segnet_model_zoo.md,以及相对应的

segnet_basic_inference.prototxt
segnet_basic_solver.prototxt
segnet_basic_train.prototxt

6.参考了该博主的文章https://blog.csdn.net/caicai2526/article/details/77170223

7.以及该博主的文章https://blog.csdn.net/hjxu2016/article/details/77994925

8.对于已有mask和image,需要resize,可参考https://blog.csdn.net/u013249853/article/details/79827469

--------------------------------------------------------------------------------------------------------------------------------------------------------------

言归正传,开始正题。

下载上述caffe-segnet-cudnn5版本的代码,其路径后文称之为caffe_root,以下的操作都在该caffe_root目录下进行。

整体目录包含如下文件(夹):

一、制作自己数据集

        SegNet网络需要两个输入,一个是原始图像,三通道的;一个是mask label,也就是待分割目标的标签,mask要求是单通道8位灰度图,格式是uint8, 像素0表示背景,像素1表示目标的位置。 下面分别准备这两样东西。

         1. 原始图像就是你自己的照片了,注意一下:如果你不更改SegNet中参数,可以先保持与原作者的图像尺寸一致,后面可以根据自己的情况在更改,一般上采样2x,这里采用与原作者相同的图像尺寸,(360, 480)彩色图片,如果不是这样,建议resize一下,博主自己的图片是灰度的,resize前有一个转成rgb的过程,python代码函数;

# testdir为自己数据集路径,楼主的图是灰度图,所以有一个转换成rgb的过程,然后保存。
def resize_image_batch():
    file_list = os.listdir(testdir)
    for item in file_list:
        #print(traindir + item)
        imname = testdir + item
        im = cv2.imread(imname, 0)
        im = cv2.resize(im, (480, 360))
        im_RGB = cv2.cvtColor(im, cv2.COLOR_GRAY2RGB)
        print(im.shape)
        print(im_RGB.shape)
        #print(im)
        print("============================")
        #print(im_RGB[:,:,0])
        #print(im_RGB[:,:,1])
        #print(im_RGB[:,:,2])
        print(im.dtype)
        print(im_RGB.dtype)
        cv2.imwrite('zht_test_use/'+ item, im_RGB)
        #print("success!")

2.准备mask。

     首先,博主的mask来源是用labelme 得到的。labelme的使用方法,这里不再赘述。简言之,对于每一张图,我们可以得到其

json标注文件, 再通过,labelme_json_to_dataset命令,可以得到最终我们需要的label mask,我们所需的是文件夹下的label.png。

labelme_json_to_dataset批量生成数据集的shell脚本如下;

for item in $(find ./huaweishouji_20170720_train_360x480_try -iname "*.json"); 
do    
 echo $item;     
 labelme_json_to_dataset $item;
done

接下来将lable.png转换成uint8,背景像素是0,目标像素是1的mask..convert_to_mask 代码如下:

def convert_to_mask():
    file_list = os.listdir(traindir)
    for item in file_list:
        item_list = os.listdir(traindir + item)
        #print("len(item) : ", len(item_list))
        for atom in item_list:
            if atom == "label.png":
                np.set_printoptions(threshold='nan')
                imname = traindir + item + "/" + atom
                #print(imname)
                im = io.imread(imname, 1)
                print(imname)
                #print(im[:, :])
                print(im.shape)
                print(im.dtype)
                print("-------------after-----------------")
                img = (im * 255).astype(np.uint8)
                _, im_th= cv2.threshold(img, 0.0000000000000001, 1, cv2.THRESH_BINARY)
                  
                #print(img.shape)
                
                print(im_th.shape)
                print(im_th.dtype)
                #print(im_th[ :, :])
                print(item[:-5] + ".png")
                cv2.imwrite(train_write_dir + item[:-5] + '.png', im_th )
				#print(im[:,:,0])
                #print(im[:,:,1])
                #print(im[:,:,2])
                #im_RGB = cv2.cvtColor(im, cv2.COLOR_GRAY2RGB)
        #print(traindir + item)
        #imname = traindir + item
        #im = cv2.imread(imname, 0)
        #im = cv2.resize(im, (480, 360))
        #im_RGB = cv2.cvtColor(im, cv2.COLOR_GRAY2RGB)
        
        #print(im.shape)
        #print(im_RGB.shape)
        #print(im)
        #print("============================")
        #print(im_RGB[:,:,0])
        #print(im_RGB[:,:,1])
        #print(im_RGB[:,:,2])
        #print(im.dtype)
        #print(im_RGB.dtype)
        #cv2.imwrite('huaweishouji_20170720_test_360x480/'+ item, im_RGB)
def check_ma
  • 6
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
要使用SegNet训练自己的数据集,你需要按照以下步骤进行操作: 1. 收集和准备数据集:收集一组带有标记的图像和对应的标签,用于训练SegNet模型。确保图像和标签以相同的命名方式进行配对,并且标签图像与原图像的尺寸一致。 2. 数据预处理:对数据集进行预处理,包括调整图像大小、归一化、裁剪等操作。确保图像和标签的预处理方式一致,以便正确地进行训练。 3. 构建网络模型:使用SegNet的架构来构建模型。SegNet是一个基于编码器-解码器结构的语义分割模型,它可以用于像素级别的图像分割任务。你可以使用深度学习框架(如TensorFlow、PyTorch)来实现该模型。 4. 定义损失函数:为了训练SegNet模型,你需要定义一个适当的损失函数。常用的损失函数包括交叉熵损失函数和Dice损失函数,用于衡量预测结果与真实标签之间的差异。 5. 训练模型:将数据集划分为训练集和验证集,并利用训练集对SegNet模型进行训练。在训练过程中,使用优化算法(如随机梯度下降)来最小化损失函数。通过多次迭代训练,优化模型的参数。 6. 评估和调优:使用验证集评估训练好的模型的性能。你可以计算模型在验证集上的准确率、精确率、召回率等指标,以了解模型的效果。如果需要改进模型性能,你可以进行调整超参数、增加数据集大小或进行数据增强等操作。 7. 测试模型:最后,使用测试集对已训练好的SegNet模型进行测试。将模型应用于新的图像,并观察其分割结果的质量。 以上是训练SegNet模型使用自定义数据集的一般步骤,你可以根据具体情况进行调整和优化。请注意,这只是一个简单的指南,实际操作可能因数据集和问题而有所不同。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值