火焰识别--重新标注后的Deeplabv3+训练

1、使用labelme重新标注,图片总共202张

labelme的使用说明:在Anaconda中新建一个环境

conda create --name=labelme python=3.5

激活环境:

activate labelme

需要安装的库:

pip install labelme
pip install pyqt5
pip install pillow

安装好就可以在activate lebelme后启用labelme:

labelme

以后每次用两步:在命令行窗口输入

activate labelme
labelme

打开labelme的界面:
这图片描述

2、将json文件制造成数据集

第一部分:
将使用labelme生成的json文件转换成标注后的图片

import os

path = "D:\\...\\...\\..."   # 使用labelme生成的json文件的保存位置

json_file = os.listdir(path)

for file in json_file:
	os.system("labelme_json_to_dataset %s" % os.path.join(path,file))

第二部分:
第一部分生成的文件有多个,只需要红框中那个图片作为标注后ground truth:
在这里插入图片描述
将每个文件夹(0000_json … 0200_json)中的label.png取出来并命名成上一级文件夹0000_json中前面的数字如0000.png、0001.png…。
代码如下:

import os
import PIL.Image as Image

filepath = "D:\\fir_images\\fire\\2nd\\json_file"

for file in os.listdir(filepath):
	pic_path = os.path.join(filepath, file, 'label.png')
	pic = Image.open(pic_path)
	string = file.split('_')[0]
	new_pic_path = os.path.join(os.getcwd(), 'labels', string+'.png')
	pic.save(new_pic_path)

ground truth制作完成:在这里插入图片描述

3、实验第一阶段–安装、配置环境

deeplab源代码已经被谷歌集成在GitHub中tensorflow/models

之后我会持续更新讲解整个deeplab源代码中各个文件、代码和文档,以及对源代码的详细注释讲解。

本文不设计deeplab理论,因此就算不了解deeplab原理和模型结构的读者仍可操作。

step1. 下载tensorflow/models

deeplab文件目录图如下(Note:此处需下载官方github上最新的models文件,很多网上的较老的models中会缺少不少的文件)

step2. 安装依赖库

deeplab 依赖以下的一些库:(此处官方github上也有介绍,见https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/installation.md)

  • Numpy
  • Pillow 1.0
  • tf Slim (which is included in the “tensorflow/models/research/” checkout)
  • Jupyter notebook
  • Matplotlib
  • Tensorflow(1.6或以上)

Special Note:

先讲一下tensorflow_gpu,cudacudnn三者之间的版本对应关系:

tensorflow_gpu1.5/1.6/以上 —— cuda9.0 —— cudnn7.0
tensorflow_gpu1.3/1.4 —— cuda8.0 —— cudnn6.0/5.0

而deeplab要求tensorflow1.6以上,即最好电脑,工作站或服务器上cuda是v9.0.

step3. Windows系统中添加tf.slim的路径至系统

在 deeplab/g3doc/installation.md 中提到,安装deeplab需要将 research/slim 路径加入 PYTHONPATH 中去,官方给出的方法是在每次运行之前都执行,但仅在linux系统中起作用

export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

windows 系统下的解决方案为:在py脚本中动态添加地址

将 deeplab 文件夹下的 train.pyeval.pyvis.py, export_model.py 这四个脚本的开头加语句,四个文件都要加(必须加在 import deeplab 语句之前)。

import sys
sys.path.append(r'D:\Code\tf-models\research')
sys.path.append(r'D:\Code\tf-models\research\slim')  # 以上两处的路径请按照真实的路径添加

step4. 本地环境测试

在tensorflow/models/research/下运行model_test.py

# From tensorflow/models/research/
python deeplab/model_test.py

如果环境正确,则提示:

Ran 5 tests in 10.758s

Note1:源代码中的类似filename_test.py(文件名带有_test)的格式文件都是用来测试filename.py所需要的环境是否正确。如

Note2:(如果有必要)。、

local_test.sh: 测试整个有关deeplab训练voc2012数据集的代码是否能正常运行,默认为xception模型

local_test_mobilenetv2.sh: 测试mobilenetv2模型时,整个deeplab模型代码是否能够正常运行

此处.sh文件可在git bash上运行,不同于linux系统,具体在tensorflow/models/research/deeplab/文件下:

# From tensorflow/models/research/deeplab
# local_test_mobilenetv2.sh同理
./local_test.sh

4、实验第二阶段–在PASCAL VOC 2012语义分割数据集上运行Deeplab

step1 解析voc2012数据

Note:这一步的操作基本都是在deeplab\datasets\文件夹下,文件目录如下:

在这里插入图片描述
因为windows不能运行download_and_convert_voc2012.sh自动下载voc2012,因此我们需要首先自己去官网下载voc2012数据。

voc2012下载解压后的文件结构如下图(解压后的Annotations文件夹已删除):

在这里插入图片描述

按照官方文档将数据文件放置为如下图的目录结构(没有某个文件夹就新建一个):

deeplab/datasets/pascal_voc_seg
├── exp
│   └── train_on_train_set
│       ├── eval
│       │   └── events.out.tfevents....
│       ├── export
│       │   └── frozen_inference_graph.pb
│       ├── train
│       │   ├── checkpoint
│       │   ├── events.out.tfevents....
│       │   ├── graph.pbtxt
│       │   ├── model.ckpt-0.data-00000-of-00001
│       │   ├── model.ckpt-0.index
│       │   ├── model.ckpt-0.meta
│       │   └── ...
│       └── vis
│           ├── graph.pbtxt
│           ├── raw_segmentation_results
│           └── segmentation_results
├── init_models
│   └── deeplabv3_pascal_train_aug
│       ├── frozen_inference_graph.pb
│       ├── model.ckpt.data-00000-of-00001
│       └── model.ckpt.index
├── tfrecord
│   ├── ....tfrecord
│   └── ...
└── VOCdevkit
    └── VOC2012
        ├── Annotations
        ├── ImageSets
        │   ├── Action
        │   ├── Layout
        │   ├── Main
        │   └── Segmentation
        ├── JPEGImages
        ├── SegmentationClass
        ├── SegmentationClassRaw
        └── SegmentationObject

其中:

  • JPEGImages: 存放原图
  • SegmentationClass: 存放mask图,即labels
  • ImageSets\Segmentation: 存放列表数据(.txt)
  • tfrecord: 为稍后将数据转为tensorflow所需要的tfrecord格式的文件夹,需手动创建
  • train: 模型保存的文件路径,存放模型文件,需手动创建
  • eval: 评估时event事件文件夹,需手动创建
  • vis: 可视化文件夹,需手动创建

step2 移除 ground-truth 中的 colormap

# From deeplab/datasets/
python remove_gt_colormap.py --original_gt_folder=./pascal_voc_seg/VOCdevkit/VOC2012/SegmentationClass --output_dir=./pascal_voc_seg/VOCdevkit/VOC2012/SegmentationClassRaw 

上述命令和参数意义如下:

  • original_gt_folder: 原带有colormap的单通道maks所在文件夹
  • output_dir:去除colormap后的mask存放文件夹(之后需要将这个文件夹的图片作为label,并转换成tfrecord格式数据)
    运行成功后:
    在这里插入图片描述

step3 转换为tfrecord格式数据###

在datasets下的build_voc2012_data.py,在命令行中修改参数:

python build_voc2012_data.py --image_folder=./pascal_voc_seg/VOCdevkit/VOC2012/JPEGImages --semantic_segmentation_folder=./pascal_voc_seg/VOCdevkit/VOC2012/SegmentationClass --list_folder='./pascal_voc_seg/VOCdevkit/VOC2012/ImageSets/Segmentation' --image_format="jpg" --output_dir='./pascal_voc_seg/tfrecord'  

各参数意义如下:

  • image_folder:保存images的路径
  • semantic_segmentation_folder:保存labels的路径
  • list_folder:保存train\val.txt文件的路径
  • image_format:image的格式
  • output_dir:生成tfrecord格式的数据所要保存的位置

运行成功后,会提示如下信息:

>> Converting image 366/1464 shard 0  # 1464为train.txt中图片名个数
>> Converting image 732/1464 shard 1
>> Converting image 1098/1464 shard 2
>> Converting image 1464/1464 shard 3
>> Converting image 22/85 shard 0  # 85为val.txt中图片名数量,源文件中为1449
>> Converting image 44/85 shard 1
>> Converting image 66/85 shard 2
>> Converting image 85/85 shard 3

step4 运行train.py训练模型

先从官方github上下载预训练模型(官方github地址),本人下载的是xception65_coco_voc_trainaug,因此以此为例。下载后解压在deeplab/weights文件夹(需手动新建)中,如图所示:

接来来就是训练,在命令行中输入如下命令(假设环境已经ok且管理员方式打开命令提示符窗口,若严格按照上述推荐的步骤,则直接复制下述命令在命令提示符窗口不会有问题):

python train.py --logtostderr --training_number_of_steps=100 --train_split="train" --model_variant="xception_65" --atrous_rates=6 --atrous_rates=12 --atrous_rates=18 --output_stride=16 --decoder_output_stride=4 --train_crop_size=513 --train_crop_size=513 --train_batch_size=1 --fine_tune_batch_norm=False --dataset="pascal_voc_seg" --tf_initial_checkpoint=./weights/deeplabv3_pascal_train_aug/model.ckpt --train_logdir=./datasets/pascal_voc_seg/exp/train_on_train_set/train --dataset_dir=./datasets/pascal_voc_seg/tfrecord

其中,部分参数意义如下:
tf_initial_checkpoint:# 加载权重,第一次应为在官方github下载的预训练模型权重
train_logdir: 保存训练的中间结果的路径
dataset_dir: 第三步生成的tfrecord文件的路径,注意是文件路径,不是tfrecord文件

运行成功信息如下:

INFO:tensorflow:global step 1: loss = 0.3148 (15.549 sec/step)
INFO:tensorflow:global step 2: loss = 0.1740 (8.497 sec/step)
INFO:tensorflow:global step 3: loss = 0.5984 (6.847 sec/step)
INFO:tensorflow:global step 4: loss = 0.1599 (6.683 sec/step)
INFO:tensorflow:global step 5: loss = 0.3978 (6.617 sec/step)
INFO:tensorflow:global step 6: loss = 0.4886 (5.881 sec/step)
………………
INFO:tensorflow:global step 97: loss = 0.7356 (6.090 sec/step)
INFO:tensorflow:global step 98: loss = 0.5818 (6.163 sec/step)
INFO:tensorflow:global_step/sec: 0.163526
INFO:tensorflow:Recording summary at step 98.
INFO:tensorflow:global step 99: loss = 0.2523 (8.893 sec/step)
INFO:tensorflow:global step 100: loss = 0.2783 (6.421 sec/step)
INFO:tensorflow:Stopping Training.
INFO:tensorflow:Finished training! Saving model to disk.

step5 运行eval.py,输出为MIOU值

在deeplab下执行以下命令:
python eval.py --logtostderr --eval_split=“val” --model_variant=“xception_65” --atrous_rates=6 --atrous_rates=12 --atrous_rates=18 --output_stride=16 --decoder_output_stride=4 --eval_crop_size=513 --eval_crop_size=513 --dataset=“pascal_voc_seg” --checkpoint_dir=./datasets/pascal_voc_seg/exp/train_on_train_set/train --eval_logdir=./pascal_voc_seg/exp/train_on_train_set/eval --dataset_dir=./datasets/pascal_voc_seg/tfrecord

其中部分文件路径参数意义如下:
checkpoint_dir:模型checkpoint所在路径
eval_logdir:结果输出路径,该文件夹需手动创建
dataset_dir:验证集tfrecord文件所在路径,同训练步骤,此处为tfrecord文件路径

Note:

(1) 如果在step2没有将label数据通过’remove_gt_colormap.py’转换为单通道数据,这里会报错提示:[‘predictions’ out of bound];

(2) 若采用官方github中issues上的解决方式,此处会运行成功,但会出现miou极低的情况,本次测试过,得到的miou为0.04.

step6 可视化训练结果

在deeplab下执行以下命令:
python vis.py --logtostderr --vis_split=“val” --model_variant=“xception_65” --atrous_rates=6 --atrous_rates=12 --atrous_rates=18 --output_stride=16 --decoder_output_stride=4 --vis_crop_size=513 --vis_crop_size=513 --dataset=“pascal_voc_seg” --checkpoint_dir=./datasets/pascal_voc_seg/exp/train_on_train_set/train --vis_logdir=./datasets/pascal_voc_seg/exp/train_on_train_set/vis --dataset_dir=./datasets/pascal_voc_seg/tfrecord

各参数意义:
checkpoint_dir: 模型checkpoint所在路径
vis_logdir: 预测结果保存路径,自己创建
dataset_dir: 生成的tfrecord数据集所在路径

成功运行提示信息如下:

INFO:tensorflow:Visualizing batch 1 / 85
INFO:tensorflow:Visualizing batch 2 / 85
INFO:tensorflow:Visualizing batch 3 / 85
INFO:tensorflow:Visualizing batch 4 / 85
INFO:tensorflow:Visualizing batch 5 / 85
INFO:tensorflow:Visualizing batch 6 / 85
INFO:tensorflow:Visualizing batch 7 / 85
INFO:tensorflow:Visualizing batch 8 / 85
INFO:tensorflow:Visualizing batch 9 / 85
INFO:tensorflow:Visualizing batch 10 / 85
……………………

最后,就可以在输出文件夹(’./datasets/pascal_voc_seg/exp/train_on_train_set/vis/vis_output’)中查看模型的预测结果了。

参考:

https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/pascal.md
https://www.aiuai.cn/aifarm257.html#1.TrainonPASCALVOC2012
https://blog.csdn.net/lijiancheng0614/article/details/80490309
https://blog.csdn.net/weixin_41713230/article/details/81081120
https://blog.csdn.net/Kelvin_XX/article/details/81946091
https://blog.csdn.net/X_Cosmic/article/details/80932542

猜你喜欢

转载自blog.csdn.net/w_xiaowen/article/details/85289750
今日推荐