chun2495 发表于 2020-10-13 13:18:49

【人工智能 图像分割 原创首发】第三章 制作自己的训练数据

本帖最后由 chun2495 于 2020-10-13 13:24 编辑

在训练自己的数据前,需要进行制作,这里比较复杂。
大致说下思路:
1. 首先你的图片需要进行标注,这里我们用labelme,很流行的工具。
2. 标注完的数据需要分类。一般分三类:训练组、测试组、验证组。
3. 将数据按照tensorflow要求的格式进行转换。

好了,开始吧!

二、制作训练数据

2.1 安装labelme并制作.json文件

在上一章安装的环境“deeplab”下安装labelme,命令为
pip install pyqt5 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple
输入
labelme
打开软件,然后对图像进行边缘绘制,最后保存即可。这样每个图片就会对应同名的json文件。

2.2 json文件转化
deeplab训练需要的文件是灰度图片形式的,这里我们需要将json文件转化为VOC格式,方便进一步转化成deeplab所需要的灰度图格式。这里需要下载labelme项目到本地,在终端运行下载命令:
git clone https://github.com/wkentaro/labelme.git 
当然也可以自己在网站下载,我就是这样的。下载完成后解压并进入目录:labelme/examples/semantic_segmentation
其实有用的就是这个目录,将semantic_segmentation目录及其下文件全部拷贝到自己的目录下,我的和图片目录在同一级别下。这里的data_annotated和data_dataset_voc是官方的示范文件,我们不需要,所以直接删掉data_dataset_voc文件夹,将data_annotated内文件全部删掉,只留下文件夹。将上一步制作好的json和原图拷贝至data_annotated。

然后修改label.txt内容(我的分类只有一种就是bladder,所以这里就两种)
__ignore__
_background_
bladder
由于我的图片本身就是灰阶图像,所以还需要修改文件“labelme2voc.py”第97行为(如果你的是RGB图像,就不用改了)
img=img,#imgviz.rgb2gray(img),
将终端切换到semantic_segmentation目录(还是deeplab环境下),输入并运行命令
python labelme2voc.py data_annotated data_dataset_voc --labels labels.txt
这样会再生成一个data_dataset_voc文件夹里面包含4个文件夹和一个txt文档。
txt为之前labelme标记环节所标记的类别,我这里有两类,分别是_background_,bladder。
JPEGImages里包含所有的原图;
SegmentationClass里包含的是转换后的npy文件,这里我们不需要。

接着利用deeplab中的remove_gt_colormap.py来去掉colormap。在models-r1.13.0/research/deeplab/datasets中找到该python文件,然后运行命令
python remove_gt_colormap.py \
--original_gt_folder="/Users/zhengyuchun/Desktop/Anaconda/semantic_segmentation/data_dataset_voc/SegmentationClassPNG" \
--output_dir="/Users/zhengyuchun/Desktop/Anaconda/semantic_segmentation/data_dataset_voc/SegmentationClassRaw"
再回到刚才的labelme文件夹中,这里生成了SegmentationClassRaw,里包含了所有转化后我们所需要的的PNG格式灰度图,这里乍一看是一张全黑的图片,但是对应像素值是有变化的(用mac自带的数码测色仪可以看到背景颜色是0,bladder是1)。SegmentationClassVisualization里则全是标记后的视觉图片,同样我们不需要。

2.3 tfrecord的制作
这里制作的是训练所需的文件。

2.3.1 建立如下文件夹。
在semantic_segmentation文件夹下,建立data_tfrecord文件夹,然后进入并建立四个文件夹image、mask、index、tfrecord。
然后将“data_dataset_voc/JPEGImages”内的图片全部复制到image文件夹内。还需要将“data_dataset_voc/SegmentationClassRaw”内的图片全部复制到mask文件夹内。
在index内创建三个txt文件:train.txt(所有训练集的文件名)、trainval.txt(所有验证集的文件名)、val.txt(所有测试集的文件名),但是我们几乎不会用到验证集。
数据集目录如下:
-image
-mask
-index
--train.txt
--trainval.txt
--val.txt
-tfrecord

2.3.2 获取所有文件名称。
在data_tfrecord文件夹下建立“get_all_name_1.py”文件,并输入以下代码,利用这个脚本可以获取刚才制作的所有数据的文件名
import random
import glob

img_path = glob.glob('./image/*.jpg') #将root修改为data所在目录
print(img_path)
for each in img_path:
   with open('./index/all.txt','a')as f:#将root修改为data所在目录
      f.write(each+'\n') # :前根据你根目录字符的长度修改数值
这里会在index内生成一个all.txt文件,里面包含了所有的数据文件名

2.3.3 为训练随机分配文件
在data_tfrecord文件夹下建立“assign_name_2.py”文件,并输入以下代码,再利用下面这个脚本对刚才获取的所有文件名随机分配至刚才的三个txt文件中。
import random

with open('./index/all.txt','r')as f:
    lines = f.readlines()
    g = # 设置文件总数(1,文件总数+1)
    random.shuffle(g)#这里我的比例为8:2:2
    train = g #设置需要的训练集数目
    trainval = g#设置需要的验证集数目
    val = g#设置需要的测试集数目

    for index, line in enumerate(lines,1):#所有root修改为data所在目录
      if index in train:
            with open('./index/train.txt','a')as trainf:
                trainf.write(line)
      elif index in trainval:
            with open('./index/trainval.txt','a')as trainvalf:
                trainvalf.write(line)
      elif index in val:
            with open('./index/val.txt','a')as valf:
                valf.write(line)
建立的的文件夹和文件结构如下


2.3.4 生成最终的tfrecord数据

利用/models-r1.13.0/research/deeplab/datasets/build_voc2012_data.py转换刚才制作的文件成tfrecord格式,更改运行所在文件夹到,在终端中运行命令()将root改为自己数据集的文件夹目录:
python ./build_voc2012_data.py \
  --image_folder="/Users/zhengyuchun/Desktop/Anaconda/semantic_segmentation/data_tfrecord/image" \
  --semantic_segmentation_folder="/Users/zhengyuchun/Desktop/Anaconda/semantic_segmentation/data_tfrecord/mask" \
  --list_folder="/Users/zhengyuchun/Desktop/Anaconda/semantic_segmentation/data_tfrecord/index" \
  --image_format="jpg" \
  --output_dir="/Users/zhengyuchun/Desktop/Anaconda/semantic_segmentation/data_tfrecord/tfrecord"
运行完成后结果如下

至此,tfrecord数据制作完成。

这一节非常繁琐,大家要有耐心,后面就容易多了。

zhangyg0123456 发表于 2020-10-13 13:52:15

如果能多添加一些操作的截图就更好理解了

chun2495 发表于 2020-10-13 14:00:33

zhangyg0123456 发表于 2020-10-13 13:52
如果能多添加一些操作的截图就更好理解了

那就加一张labelme的操作流程图

QL攻城狮 发表于 2020-12-25 13:22:20

持续关注,谢谢分享

resethdd 发表于 2020-12-26 15:13:29

留存备用,估计有一条用得上

yansw 发表于 2020-12-26 21:19:29

留存一下,谢谢认真编辑。

我是一个大白菜 发表于 2020-12-27 10:21:20

感谢分享
页: [1]
查看完整版本: 【人工智能 图像分割 原创首发】第三章 制作自己的训练数据