图像分割 | FCN数据集制作的全流程(图像标注)

一 全卷积神经网络

文章所有代码已上传至github,觉得好用就给个star吧,谢谢

https://github.com/315386775/FCN_train

深度学习图像分割(FCN)训练自己的模型大致可以以下三步:

1.为自己的数据制作label;

2.将自己的数据分为train,val和test集;

3.仿照voc_lyaers.py编写自己的输入数据层。

其中主要是如何制作自己的数据label困扰着大家。

补充:由于图像大小的限制,这里给几个图像Resize的脚本:

(1)单张图片的resize

# coding = utf-8  
import Image  

def  convert(width,height):
    im = Image.open("C:\\xxx\\test.jpg")
    out = im.resize((width, height),Image.ANTIALIAS)
    out.save("C:\\xxx\\test.jpg")
if __name__ == '__main__':
    convert(256,256)

(2)resize整个文件夹里的图片

# coding = utf-8
import Image
import os

def convert(dir,width,height):
    file_list = os.listdir(dir)
    print(file_list)
    for filename in file_list:
        path = ''
        path = dir+filename
        im = Image.open(path)
        out = im.resize((256,256),Image.ANTIALIAS)
        print "%s has been resized!"%filename
        out.save(path)

if __name__ == '__main__':
   dir = raw_input('please input the operate dir:')
   convert(dir,256,256)

(3)按比例resize

# coding = utf-8  
import Image  

def  convert(width,height):
    im = Image.open("C:\\workspace\\PythonLearn1\\test_1.jpg")
    (x, y)= im.size
    x_s = width
    y_s = y * x_s / x
    out = im.resize((x_s, y_s), Image.ANTIALIAS)
    out.save("C:\\workspace\\PythonLearn1\\test_1_out.jpg")
if __name__ == '__main__':
    convert(256,256)

二 图像标签制作

第一步:使用github开源软件进行标注

地址:https://github.com/wkentaro/labelme

第二步:为标注出来的label.png进行着色

首先需要对照VOC分割的颜色进行着色,一定要保证颜色的准确性。Matlab代码:

function cmap = labelcolormap(N)

if nargin==0
    N=256
end
cmap = zeros(N,3);
for i=1:N
    id = i-1; r=0;g=0;b=0;
    for j=0:7
        r = bitor(r, bitshift(bitget(id,1),7 - j));
        g = bitor(g, bitshift(bitget(id,2),7 - j));
        b = bitor(b, bitshift(bitget(id,3),7 - j));
        id = bitshift(id,-3);
    end
    cmap(i,1)=r; cmap(i,2)=g; cmap(i,3)=b;
end
cmap = cmap / 255;

对应的颜色类别:

类别名称 R G B 
background 0 0 0 背景 
aeroplane 128 0 0 飞机 
bicycle 0 128 0 
bird 128 128 0 
boat 0 0 128 
bottle 128 0 128 瓶子 
bus 0 128 128 大巴 
car 128 128 128 
cat 64 0 0 猫 
chair 192 0 0 
cow 64 128 0 
diningtable 192 128 0 餐桌 
dog 64 0 128 
horse 192 0 128 
motorbike 64 128 128 
person 192 128 128 
pottedplant 0 64 0 盆栽 
sheep 128 64 0 
sofa 0 192 0 
train 128 192 0 
tvmonitor 0 64 128 显示器

然后使用python 的skimage库进行颜色填充,具体函数是skimage.color.label2rgb(),这部分代码以及颜色调整我已经完成了,由于代码太长就不贴出来了,有需要的可以私信我。

#!usr/bin/python
# -*- coding:utf-8 -*-
import PIL.Image
import numpy as np
from skimage import io,data,color
import matplotlib.pyplot as plt

img = PIL.Image.open('xxx.png')
img = np.array(img)
dst = color.label2rgb(img, bg_label=0, bg_color=(0, 0, 0))
io.imsave('xxx.png', dst)

其中skimage.color.label2rgb()的路径在:x:\Anaconda2\Lib\site-packages\skimage\color,修改如下两处,注意使用COLORS1。

DEFAULT_COLORS1 = ('maroon', 'lime', 'olive', 'navy', 'purple', 'teal',
                  'gray', 'fcncat', 'fcnchair', 'fcncow', 'fcndining',
                  'fcndog', 'fcnhorse', 'fcnmotor', 'fcnperson', 'fcnpotte',
                  'fcnsheep', 'fcnsofa', 'fcntrain', 'fcntv')

第三步:最关键的一步

需要注意的是,label文件要是gray格式,不然会出错:scores层输出与label的数据尺寸不一致,通道问题导致的,看下面的输出是否与VOC输出一致。

In [23]: img = PIL.Image.open('F:/DL/000001_json/test/dstfcn.png')
In [24]: np.unique(img)
Out[24]: array([0, 1, 2], dtype=uint8)

其中涉及到如何把24位png图转换为8位png图,直接上代码:

dirs=dir('F:/xxx/*.png');
for n=1:numel(dirs)
     strname=strcat('F:/xxx/',dirs(n).name);
     img=imread(strname);
     [x,map]=rgb2ind(img,256);
     newname=strcat('F:/xxx/',dirs(n).name);
     imwrite(x,map,newname,'png');
end

三 FCN模型训练

推荐博客:http://www.cnblogs.com/xuanxufeng/p/6243342.html

四 测试图片结果上色

from PIL import Image
import numpy as np
from datasets import CONFIG

# The arr is a predicted result
arr = np.load('arr.npy')

print 'The shape of the image is:', arr.shape
print 'The classes in the image are:', np.unique(arr)

# Define the palette
palette = []
for i in range(256):
    palette.extend((i, i, i))

# define the color of the 21 classes(PASACAL VOC)
palette[:3*21] = CONFIG['voc12']['palette'].flatten()

assert len(palette) == 768

im = Image.fromarray(arr)
im.show()
im.putpalette(palette)
im.show()

im.save('out.png')

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Kmeans聚类代码实现及优化

云豆贴心提醒,本文阅读时间6分钟 这篇文章直接给出上次关于Kmeans聚类的篮球远动员数据分析案例,最后介绍Matplotlib包绘图的优化知识。 希望这篇文...

2845
来自专栏潇涧技术专栏

Head First PageRank

PageRank算法是谷歌曾经独步天下的“倚天剑”,该算法由Larry Page和Sergey Brin在斯坦福大学读研时发明的,论文点击下载: The Pag...

792
来自专栏机器之心

教程 | TensorEditor :一个小白都能快速玩转的神经网络搭建工具

1656
来自专栏深度学习与计算机视觉

TensorFlow-Slim图像分类库

TensorFlow-Slim图像分类库 TF-slim是用于定义,训练和评估复杂模型的TensorFlow(tensorflow.contrib.slim)的...

6976
来自专栏贾志刚-OpenCV学堂

OpenCV3.3深度学习模块(DNN)应用-图像分类

DNN模块介绍 在OpenCV3.3版本发布中把DNN模块从扩展模块移到了OpenCV正式发布模块中,当前DNN模块最早来自Tiny-dnn,可以加载预先训练好...

4247
来自专栏WOLFRAM

Mathematica 11 在化学中的应用

1136
来自专栏AI研习社

Github 代码实践:Pytorch 实现的语义分割器

使用Detectron预训练权重输出 *e2e_mask_rcnn-R-101-FPN_2x* 的示例

1092
来自专栏AI研习社

Github 项目推荐 | TensorFlow 概率推理工具集 —— probability

Probability 是 TensorFlow 的概率推理工具集,它是集建模工具、推理算法、一些有用的模型和一般统计计算于一身的开发工具集合。利用 Tenso...

3634
来自专栏AI研习社

Github 项目推荐 | 类 Keras 的 PyTorch 深度学习框架 —— PyToune

PyToune 是一个类 Keras 的 Pytorch 深度学习框架,可用来处理训练神经网络所需的大部分模板代码。 用 PyToune 你可以: 更容易地训练...

32010
来自专栏大数据智能实战

DrQA实践

2017年七月份Facebook开源了其开放域问答系统DrQA的代码。关于DrQA,还有一篇2017年发表在ACL上的论文《Reading Wikipedi...

2565

扫码关注云+社区