使用deeplab训练自己的数据集

介绍在Ubuntu下使用deeplab训练自己创建的数据集需要用到的环境配置及方法。

1 前言

在机场行李筐分拣项目中用到了deeplab网络确定行李筐的角度,本文主要介绍deeplab的环境搭建,训练方法及测试。
因为deeplab是语义分割的一种方法,因此用labelme打标签更为合适。
软件环境:Ubuntu16.04 + python2.7 + pytorch0.4.1 + CUDA10.2 + labelme
硬件配置:RTX2080Ti 11G

2 anaconda3的安装

  1. 去官方网站下载对应的版本:https://www.anaconda.com/products/individual
  2. 下载完成后切换到文件所在的目录下执行:bash Anaconda3-xxxxxx-Linux-x86_64.sh(下载文件名)
  3. 选择yes或回车,直至安装完成

3 数据集的制作

数据集制作的目标是将采集的用于训练的图片经打标签后变为可以用于网络训练的二值化png图片(打开后看到的是一团黑)。

3.1 labelme的安装

1
2
3
4
5
conda create -n labelme python=3.6          #建立一个名字为labelme的conda环境,python版本为3.6
conda activate labelme #激活labelme
conda install pyqt #安装pyqt
pip install labelme #安装labelme
labelme #运行labelme

3.2 正样本的制作

正样本是指包含有待识别目标,需要进行正常打标签的图片。

  1. 采集图片
  2. 使用labelme打标签,生成对应的json标签文件
  3. 在相对路径:anaconda3/envs/labelme/lib/python3.6/site-packages/labelme/cli 中用’boxdetect’目录下的 json_to_dataset.py 替换文件
  4. 利用json_to_dataset.py文件将.json文件转化为png标签文件:
    在运行命令之前需要确保两件事情:
  • 确保在labelme环境下(终端最左测有(labelme)标志)
  • 确保json文件的名字在不包括尾缀(.json)的情况下是四位数,或者改变json_to_dataset.py文件第45行的[:-9]为 -5-名字位数(不包括尾缀)
    确保以上两件事之后运行:labelme_json_to_dataset ./
    运行命令之后会生成labelpng文件,文件下有与json个数对应的png图片文件

3.3 负样本的制作

负样本是指不包含待识别目标,背景或者光线不同无法打标签但是需要用来训练的图片。
与正样本一样,需要三样东西

  1. 没有识别目标的图片(负样本图片)
  2. 复制对应个数的empty.png(纯黑的图片)并且改成和负样本图片对应的名字
  3. .json 文件第六行 “label”: “gray” 中的”gray”改成非识别目标的名字,比如dark等,然后复制和负样本对应个数以及修改成对应的名称

3.4 样本标签效果检测

编写一个脚本,将json转化后得到的灰度图进行增强,即对不同的目标进行不同颜色的显示,确认打标签效果。

1
2
3
4
5
6
7
8
9
## inc_color.py
from PIL import Image
mask = Image.open('1265.png').convert('L')

mask.putpalette([0, 0, 0, # putpalette给对象加上调色板,相当于上色:背景为黑色,目标1为红色,目标2为黄色,目标3为橙色(如果你的图中有更多的目标,可以自行添加更多的调色值)
255, 0, 0,
255, 255, 0,
255, 153, 0])
mask.show() # 查看mask上色后的效果

4 训练

4.1 文件整理

  1. 将上述步骤生成的png文件复制到boxdect/label目录下
  2. 把训练使用图片复制到boxdetect/datasets/TrainPic目录下
  3. 把json文件放在boxdetect/datasets/jsondata文件下
  4. 测试图片复制到boxdetect/datasets/TestPic目录下(非必须选项,训练完成后可以测试训练结果)

4.2 参数修改

修改文件./config.py中的:
self.TRAIN_DIR修改为训练图片的地址
self.TEST_DIR修改为图片测试图片的地址
self.JSON_DIR修改成jsondata文件存放的地址
self.TRAIN_EPOCHS修改为epoch大小

训练迭代次数,实际的总训练次数为 TRAIN_EPOCHS*(图片数量/4)

4.3 生成网络输入的文件

运行mktxt.py运行结果为生成trainbox.txt
运行mkexist.py运行结果为生成gray_trainbox.txt和white_trainbox.txt

4.4 训练

1
2
3
4
5
6
7
# 推荐使用anaconda创建一个运行环境(最好在运行以下命令之前实现终端科学上网):
# 创建一个命名为deeplab三个软件对应版本的环境(9.x版本的cuda也可以使用)
conda create -n deeplab python=2.7 pytorch=0.4.1 CUDA=10.2
# 激活pt环境
conda activate pt
# 开始训练。每2000代保存一次模型文件至boxsave文件夹下,tensorboard文件保存至logs文件夹下
python trainbox.py

训练代数保存的变量在trainbox.py文件下的318行

5 测试

  1. 修改imagesave.py文件中的模型为训练时保存的模型,复制boxsave文件下最后一个权重文件的名称替换imagesave.py文件下的deeplabv3plus_res50_atrous_box_1hsvitr8000

    测试的图片在 boxdetect/datasets/TrainPic 目录下

  2. 运行 python imagesave.py, 测试结果保存于saveimg文件夹

5 Q&A

Q:no module name xxx
A:pip install xxx #如果安装失败就在百度上面搜索一下模块的全名,有可能xxx只是模块名字的缩写,比如skimage,全名为scikit-image

Q:QObject::moveToThread: Current thread (0x157ea50) is not the object’s thread (0x1ce2a00).
Cannot move to target thread (0x157ea50)
qt.qpa.plugin: Could not load the Qt platform plugin “xcb” in “/home/yangfei/.local/lib/python3.6/site-packages/cv2/qt/plugins” even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: xcb, eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl.
已放弃 (核心已转储)
A:pip install opencv-python==4.1.0.25

寻找该目录以及子目录下是否含有某些内容:
sudo grep -r “xxx”

其中遇到的一些错误就是:
没啥装啥。
如果没有找到文件,就重新修正文件路径

------ 本文结束感谢您的阅读------
Donate a cup of cola?