搜索
bottom↓
回复: 6

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

[复制链接]

出25入84汤圆

发表于 2020-10-13 13:18:49 | 显示全部楼层 |阅读模式
本帖最后由 chun2495 于 2020-10-13 13:24 编辑

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

好了,开始吧!

二、制作训练数据

2.1 安装labelme并制作.json文件

在上一章安装的环境“deeplab”下安装labelme,命令为
  1. pip install pyqt5 -i https://pypi.tuna.tsinghua.edu.cn/simple
  2. pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple
复制代码

输入
  1. labelme
复制代码

打开软件,然后对图像进行边缘绘制,最后保存即可。这样每个图片就会对应同名的json文件。

2.2 json文件转化
deeplab训练需要的文件是灰度图片形式的,这里我们需要将json文件转化为VOC格式,方便进一步转化成deeplab所需要的灰度图格式。这里需要下载labelme项目到本地,在终端运行下载命令:
  1. 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,所以这里就两种)
  1. __ignore__
  2. _background_
  3. bladder
复制代码

由于我的图片本身就是灰阶图像,所以还需要修改文件“labelme2voc.py”第97行为(如果你的是RGB图像,就不用改了)
  1. img=img,#imgviz.rgb2gray(img),
复制代码

将终端切换到semantic_segmentation目录(还是deeplab环境下),输入并运行命令
  1. 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文件,然后运行命令
  1. python remove_gt_colormap.py \
  2.   --original_gt_folder="/Users/zhengyuchun/Desktop/Anaconda/semantic_segmentation/data_dataset_voc/SegmentationClassPNG" \
  3.   --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(所有测试集的文件名),但是我们几乎不会用到验证集。
数据集目录如下:
  1. -image
  2. -mask
  3. -index
  4. --train.txt
  5. --trainval.txt
  6. --val.txt
  7. -tfrecord
复制代码


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

  3. img_path = glob.glob('./image/*.jpg') #将root修改为data所在目录
  4. print(img_path)
  5. for each in img_path:
  6.    with open('./index/all.txt','a')as f:#将root修改为data所在目录
  7.         f.write(each[8:-4]+'\n') # :前根据你根目录字符的长度修改数值
复制代码

这里会在index内生成一个all.txt文件,里面包含了所有的数据文件名

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

  2. with open('./index/all.txt','r')as f:
  3.     lines = f.readlines()
  4.     g = [i for i in range(1, 13)]# 设置文件总数(1,文件总数+1)
  5.     random.shuffle(g)#这里我的比例为8:2:2
  6.     train = g[0:8] #设置需要的训练集数目
  7.     trainval = g[8:10]#设置需要的验证集数目
  8.     val = g[10:12]#设置需要的测试集数目

  9.     for index, line in enumerate(lines,1):#所有root修改为data所在目录
  10.         if index in train:
  11.             with open('./index/train.txt','a')as trainf:
  12.                 trainf.write(line)
  13.         elif index in trainval:
  14.             with open('./index/trainval.txt','a')as trainvalf:
  15.                 trainvalf.write(line)
  16.         elif index in val:
  17.             with open('./index/val.txt','a')as valf:
  18.                 valf.write(line)
复制代码

建立的的文件夹和文件结构如下


2.3.4 生成最终的tfrecord数据

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

运行完成后结果如下

至此,tfrecord数据制作完成。

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2020-10-13 13:52:15 | 显示全部楼层
如果能多添加一些操作的截图就更好理解了

出25入84汤圆

 楼主| 发表于 2020-10-13 14:00:33 | 显示全部楼层
zhangyg0123456 发表于 2020-10-13 13:52
如果能多添加一些操作的截图就更好理解了

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2020-12-25 13:22:20 | 显示全部楼层
持续关注,谢谢分享

出0入0汤圆

发表于 2020-12-26 15:13:29 来自手机 | 显示全部楼层
留存备用,估计有一条用得上

出0入8汤圆

发表于 2020-12-26 21:19:29 | 显示全部楼层
留存一下,谢谢认真编辑。

出0入42汤圆

发表于 2020-12-27 10:21:20 来自手机 | 显示全部楼层
感谢分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 09:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表