OpenCV and Python

Ice and Sunshine

摘要: 本文整理了常用的OpenCV图像处理操作的python代码,便于后续使用过程中的速查。


使用TensorFlow Object Detection API识别仪表表盘

前面用到了Tensorflow的物体识别API做了一个检测仪表表盘的实践,记录实践过程中的技巧。

Update: 2019/04/16,使用新版Tensorflow接口

1. 概述

本文主要介绍如何使用Tensorflow 物体识别API应用自己业务场景进行物体识别。将结合从事的一些实际经验,分享一个仪表表盘识别的案例。我们在一个利用机器视觉技术自动识别仪表表读数的项目中,需要首先识别各种不同类型表盘的显示屏位置。本案例分析将针对面板识别中采用的关键技术进行分析,详细阐述如何利用物体识别技术和已训练好的模型快速实现使用用户数据设计一个面向特定物体识别的深度神经网络。

目标: 从给定的水表图片中将关键的数字面板给扣取出来。

如下图所示,如果采用通用OCR技术对水表图片面板进行检测,将同时提取很多特征项,对实际的检测值造成比较大的干扰。

ocr-demo

1.1 模型及算法选型

在方案设计初期我们分别使用公有云服务、现有的成熟OCR软件、开源的OCR方案对目标对象进行了初步识别及分析。通过实测,现有方案无法满足我们的任务需求。为此希望能够利用深度学习在物体识别领域的成熟方案,构建一个面向水表图片面板识别的神经网络模型。

Model name Speed (ms) Pascal mAP@0.5 (ms) Outputs
faster_rcnn_resnet101_kitti 79 87 Boxes
Model name Speed (ms) Open Images mAP@0.52 Outputs
faster_rcnn_inception_resnet_v2_atrous_oid 727 37 Boxes
faster_rcnn_inception_resnet_v2_atrous_lowproposals_oid 347 Boxes

几种模型主要在精度和速度方面进行了取舍,如果需要一个高精度的模型可以选择faster R-CNN,如果希望速度快比如实时检测,则可以选择SSD模型。鉴于本方案中设计检测目标特征将为简单,可采用最轻量级的MobileSSD进行优化。

2. 实现流程

2.1 数据准备

数据准备的环节是除了训练过程之外最为耗时的环节,准备数据的质量和数量将直接决定了训练模型的好坏。图片数据最好在光线、角度、清晰度等方面能最大化的泛化实际的业务场景。由于在这个案例中我们只需要输出一个分类对象,而且输入对象被限定在水表图片上,所以整体涉及需要提取的特征参数空间不是很大,少量经过处理好的明显可供辨识的水表图片即可。目前可用水表图片攻击229张,我们采用80%用于训练,20%用于测试的方式进行划分。

如果分类较多,数据有限,可以选择从互联网上下载或者在开源数据集中获得所需的数据。

另外需要注意图片的大小,图片太大一方面影响训练过程的处理时间,另外大量图片载入内存将很容导致内存溢出,所以如果图像特征粒度不是特别精细可以采用低分辨率图片进行分析。

数据标记

对于物体识别而言,数据标记过程是一个相对复杂的过程,目前除了人工标记没有太好的自动或半监督手段,幸好针对图片的标记已经有了几款很好用的工具:

  • LabelImg

    • 这是一个可以直接在图片上做注释框自动生成标记信息的软件,注释信息将被保存为PASCAL VOC 格式的XML文件(ImageNet的文件格式)

    labelImage

  • FIAT (Fast Image Data Annotation Tool)

    • 该工具生成csv格式的注释文件

      data annotation

  • ImageMagick

    • 图片预处理工具
    • Use ImageMagick® to create, edit, compose, or convert bitmap images. It can read and write images in a variety of formats (over 200) including PNG, JPEG, GIF, HEIC, TIFF, DPX, EXR, WebP, Postscript, PDF, and SVG. Use ImageMagick to resize, flip, mirror, rotate, distort, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and Bézier curves.

在本方案中我们使用工具LabelImage将229张水表图片进行了标注,同时生成了PASCAL格式的XML文件,名字为000001.jpg的图片注释格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<annotation>
<folder>imgs</folder>
<filename>000001.jpg</filename>
<source>
<database>VOC</database>
<annotation>PASCAL VOC</annotation>
</source>
<size>
<width>2448</width>
<height>3264</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>panel</name>
<pose>Frontal</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>739</xmin>
<ymin>430</ymin>
<xmax>1475</xmax>
<ymax>796</ymax>
</bndbox>
</object>
</annotation>

我们在根目录新建一个annotations的文件夹存储229张图片的XML描述文件,同时根目录images文件夹用于存储所有的训练数据和测试数据。

数据描述格式

  • 在TensorFlow 物体检测API中使用 TFRecord file format格式对图像标记信息进行描述,所以我们无论采取下面的那种标记方式,最终需要生成TFRcord格式的文件格式。
  • TFRecord格式要去如下:

For every example in your dataset, you should have the following information:

  1. An RGB image for the dataset encoded as jpeg or png.
  2. A list of bounding boxes for the image. Each bounding box should contain:
    1. A bounding box coordinates (with origin in top left corner) defined by 4floating point numbers [ymin, xmin, ymax, xmax]. Note that we store thenormalized coordinates (x / width, y / height) in the TFRecord dataset.
    2. The class of the object in the bounding box.
  • TensorFlow针对主流的物体识别类数据集格式提供了转换工具,包括 PASCAL VOC datasetOxford Pet dataset等;

    • PASCAL VOC
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # From tensorflow/models/research/
    wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
    tar -xvf VOCtrainval_11-May-2012.tar
    python object_detection/dataset_tools/create_pascal_tf_record.py \
    --label_map_path=object_detection/data/pascal_label_map.pbtxt \
    --data_dir=VOCdevkit --year=VOC2012 --set=train \
    --output_path=pascal_train.record
    python object_detection/dataset_tools/create_pascal_tf_record.py \
    --label_map_path=object_detection/data/pascal_label_map.pbtxt \
    --data_dir=VOCdevkit --year=VOC2012 --set=val \
    --output_path=pascal_val.record
    • Oxford-IIIT Pet
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # From tensorflow/models/research/
    wget http://www.robots.ox.ac.uk/~vgg/data/pets/data/images.tar.gz
    wget http://www.robots.ox.ac.uk/~vgg/data/pets/data/annotations.tar.gz
    tar -xvf annotations.tar.gz
    tar -xvf images.tar.gz
    python object_detection/dataset_tools/create_pet_tf_record.py \
    --label_map_path=object_detection/data/pet_label_map.pbtxt \
    --data_dir=`pwd` \
    --output_dir=`pwd`
  • 如果你使用了自己的格式,可以参考TensorFlow官方文档完成格式转换;

在本方案中我们采用自己处理的方式来进行格式转换,使用文件xml_to_csv.py将所有图片的PASCAL格式文件转化为一个csv文件,然后进一步的利用TensorFLow工具generate_tfrecord.py生成TFRecord格式文件:

  1. 执行python xml_to_csv.py,该文件将在根目录的annotations的文件夹下所有的*xml文件,并生成screen_labels.csv文件;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    import os
    import glob
    import pandas as pd
    import xml.etree.ElementTree as ET


    def xml_to_csv(path):
    xml_list = []
    for xml_file in glob.glob(path + '/*.xml'):
    tree = ET.parse(xml_file)
    root = tree.getroot()
    for member in root.findall('object'):
    filename = root.find('filename').text
    value = (root.find('filename').text,
    int(root.find('size')[0].text),
    int(root.find('size')[1].text),
    member[0].text,
    int(member[4][0].text),
    int(member[4][1].text),
    int(member[4][2].text),
    int(member[4][3].text)
    )
    xml_list.append(value)
    column_name = ['filename', 'width', 'height', 'class', 'xmin', 'ymin', 'xmax', 'ymax']
    xml_df = pd.DataFrame(xml_list, columns=column_name)
    return xml_df


    def main():
    image_path = os.path.join(os.getcwd(), 'Annotations') # Need Changes
    xml_df = xml_to_csv(image_path)
    xml_df.to_csv('screen_labels.csv', index=None) # Need Changes
    print('Successfully converted xml to csv.')


    main()
  1. 使用如下代码随机生成训练数据和测试数据:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import numpy as np
    import pandas as pd
    np.random.seed(1)
    full_labels = pd.read_csv('screen_labels.csv')
    gb = full_labels.groupby('filename')
    grouped_list = [gb.get_group(x) for x in gb.groups]
    train_index = np.random.choice(len(grouped_list), size=180, replace=False)
    test_index = np.setdiff1d(list(range(229)), train_index)
    train = pd.concat([grouped_list[i] for i in train_index])
    test = pd.concat([grouped_list[i] for i in test_index])
    train.to_csv('train_labels.csv', index=None)
    test.to_csv('test_labels.csv', index=None)
  2. 分别执行脚本将训练数据和测试数据转换为TFRecord:

    1
    2
    3
    4
    5
    6
    7
    # From tensorflow/models/research/
    protoc object_detection/protos/*.proto --python_out=.
    # Create train data:
    python generate_tfrecord.py --csv_input=data/train_labels.csv --output_path=train.record

    # Create test data:
    python generate_tfrecord.py --csv_input=data/test_labels.csv --output_path=test.record
  3. 将train.record和test.record的文件存储至根目录的data文件夹下

  4. 至此数据准备基本结束,我们创建了如下目录结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    .
    ├── annotations
    │   ├── 000001.xml
    ...
    │   └── 000229.xml
    ├── data
    │   ├── screen_labels.csv
    │   ├── test_labels.csv
    │   ├── test.record
    │   ├── train_labels.csv
    │   └── train.record
    ├── generate_tfrecord.py
    ├── images
    │   ├── 000001.jpg
    ...
    │   └── 000229.jpg
    ├── __init__.py
    ├── README.md
    ├── split labels.ipynb
    ├── test_generate_tfrecord.py
    ├── test_xml_to_csv.py
    └── xml_to_csv.py

2.2 模型配置/迁移学习

完全从头训练一个用于物体检测的模型即使采用大量GPU资源至少也需要数周时间,为了加速模型初期迭代过程,我们选择了一个已经在COCO数据集针对其他多种物体识别场景预训练好的模型,通过重复使用该模型的多数参数来快速生成我们的模型。更多技术内容可以参照迁移学习的技术实现。

由于没有足够的资源从头训练一个模型,我们将采用迁移学习技术,利用一个已经训练好的模型进行迁移学习及训练。

从测试角度考虑,本测试方案选择了体积最小,速度最快的用于嵌入式设备的SSD模型:ssd_mobilenet_v1_coco

下载模型包,可以得到如下文件:

1
2
3
4
5
6
7
8
9
10
11
.
├── object-detection.pbtxt
├── ssd_mobilenet_v1_pets.config
├── checkpoint
├── frozen_inference_graph.pb
├── model.ckpt.data-00000-of-00001
├── model.ckpt.index
├── model.ckpt.meta
└── saved_model
├── saved_model.pb
└── variables
  • a graph proto (graph.pbtxt)
  • a checkpoint (model.ckpt.data-00000-of-00001, model.ckpt.index, model.ckpt.meta)
  • a frozen graph proto with weights baked into the graph as constants (frozen_inference_graph.pb) to be used for out of the box inference
  • a config file (pipeline.config) which was used to generate the graph. These directly correspond to a config file in the samples/configs) directory but often with a modified score threshold.

我们下载并在根目录解压模型包ssd_mobilenet_v1_coco,同时创建一个training文件,存储如下文件:

1
2
3
training/
├── object-detection.pbtxt
└── ssd_mobilenet_v1_pets.config

Label Map

其中 object-detection.pbtxt是我们模型所有分类的标签,如下所示,如果有多个分类id从1开始递增,同时给每个标签一个唯一的名称(id为0预留给背景分类)

1
2
3
4
5
6
7
8
item {
id: 1
name: 'panel'
}
item{
id: 2
name: '其他分类'
}

配置物体识别训练流程文件

更多内容参考:https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/configuring_jobs.md

Tensorflow Object Detection API 使用 protobuf 文件来配置训练和检测的流程。通过配置Training Pipleline的参数配置可以决定训练参数的选择,我们将尽量多的利用已经训练好的参数进行训练。

一个配置文件由5部分组成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
model {
(... Add model config here...)
}

train_config : {
(... Add train_config here...)
}

train_input_reader: {
(... Add train_input configuration here...)
}

eval_config: {
}

eval_input_reader: {
(... Add eval_input configuration here...)
}
  1. The model configuration. This defines what type of model will be trained (ie. meta-architecture, feature extractor).
  2. The train_config, which decides what parameters should be used to train model parameters (ie. SGD parameters, input preprocessing and feature extractor initialization values).
  3. The eval_config, which determines what set of metrics will be reported for evaluation (currently we only support the PASCAL VOC metrics).
  4. The train_input_config, which defines what dataset the model should be trained on.
  5. The eval_input_config, which defines what dataset the model will be evaluated on. Typically this should be different than the training input dataset.

ssd_mobilenet_v1_pets.config为模型配置文件,我们在样例(详见:object_detection/samples/configs 文件夹)上进行如下修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  ssd {
num_classes: 1 #修改类别为实际类别值
box_coder {
faster_rcnn_box_coder {
y_scale: 10.0
x_scale: 10.0
height_scale: 5.0
width_scale: 5.0
}
}

fine_tune_checkpoint: "ssd_mobilenet_v1_coco_2017_11_17/model.ckpt" #指向模型文件中的checkpoint文件
train_input_reader: {
tf_record_input_reader {
input_path: "data/train.record" #修改为上一个步骤生成的训练record路径
}
label_map_path: "data/object-detection.pbtxt" #修改为pbtxt文件路径,描述类别标签
}
eval_input_reader: {
tf_record_input_reader {
input_path: "data/test.record" #修改为上一个步骤生成的测试数据record路径
}
label_map_path: "data/object-detection.pbtxt" #修改为pbtxt文件路径,描述类别标签
shuffle: false
num_readers: 1
}

train_config provides two fields to specify pre-existing checkpoints: fine_tune_checkpoint and from_detection_checkpoint. fine_tune_checkpoint should provide a path to the pre-existing checkpoint (ie:”/usr/home/username/checkpoint/model.ckpt-#####”). from_detection_checkpoint is a boolean value. If false, it assumes the checkpoint was from an object classification checkpoint. Note that starting from a detection checkpoint will usually result in a faster training job than a classification checkpoint.

The list of provided checkpoints can be found here.

2.3 训练

Tensorflow Object Detection API 安装

  1. 从GitHub下载Tensorflow Object Detection API

    1
    git clone https://github.com/tensorflow/models.git
  2. 配置基本环境

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # For CPU
    pip install tensorflow
    # For GPU
    pip install tensorflow-gpu

    sudo apt-get install protobuf-compiler python-pil python-lxml python-tk
    pip install --user Cython
    pip install --user contextlib2
    pip install --user jupyter
    pip install --user matplotlib
  3. COCO API installation

    1
    2
    3
    4
    git clone https://github.com/cocodataset/cocoapi.git
    cd cocoapi/PythonAPI
    make
    cp -r pycocotools <path_to_tensorflow>/models/research/
  1. Protobuf 编译

Tensorflow通过Google的Protobufs来配置和训练模型,所以在开始使用之前需要对protobuf相关库进行编译。

1
2
# From tensorflow/models/research/
protoc object_detection/protos/*.proto --python_out=.
  1. Add Libraries to PYTHONPATH[重要]

在路径 tensorflow/models/research/ 下添加PYTHONPATH路径,实现全局引用

1
2
# From tensorflow/models/research/
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

Note: This command needs to run from every new terminal you start. If you wish to avoid running this manually, you can add it as a new line to the end of your ~/.bashrc file.

  1. 测试安装是否成功

    1
    2
    # From tensorflow/models/research/
    python object_detection/builders/model_builder_test.py

启动训练过程

  1. 将在数据准备和模型配置阶段的文件复制到tensorflow object_detect文件夹下/models/research/object_detection,包括data/文件夹,image/文件夹,training/文件夹,ssd_mobilenet_v1_coco_2017_11_17/原始模型文件夹

  2. 执行如下代码启动训练过程:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # From the tensorflow/models/research/ directory
    PIPELINE_CONFIG_PATH={path to pipeline config file}
    MODEL_DIR={path to model directory}
    NUM_TRAIN_STEPS=50000
    SAMPLE_1_OF_N_EVAL_EXAMPLES=1
    python object_detection/model_main.py \
    --pipeline_config_path=${PIPELINE_CONFIG_PATH} \
    --model_dir=${MODEL_DIR} \
    --num_train_steps=${NUM_TRAIN_STEPS} \
    --sample_1_of_n_eval_examples=$SAMPLE_1_OF_N_EVAL_EXAMPLES \
    --alsologtostderr

使用TensorBoard 跟踪训练过程

训练过程会持续几个小时到十几个小时,可以通过tensorboard查看训练的情况

使用一台Azure的CPU虚拟机进行训练~4s进行一次迭代,正常模型有比较不错结果迭代次数大概在10K以上。

1
tensorboard --logdir=${MODEL_DIR}

tensorboard_loss

2.4 导出模型

模型训练过程中,会每隔一段时间生成一个checkpoint,一个checkpoint至少包括三个文件:

  • model.ckpt-${CHECKPOINT_NUMBER}.data-00000-of-00001
  • model.ckpt-${CHECKPOINT_NUMBER}.index
  • model.ckpt-${CHECKPOINT_NUMBER}.meta

可以通过如下命令从checkpoints中提取模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Example Usage:
--------------
python export_inference_graph \
--input_type image_tensor \
--pipeline_config_path path/to/ssd_inception_v2.config \
--trained_checkpoint_prefix path/to/model.ckpt \
--output_directory path/to/exported_model_directory

-----
The expected output would be in the directory
path/to/exported_model_directory (which is created if it does not exist)
with contents:
- graph.pbtxt
- model.ckpt.data-00000-of-00001
- model.ckpt.info
- model.ckpt.meta
- frozen_inference_graph.pb
+ saved_model (a directory)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# From tensorflow/models/research/
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
python export_inference_graph.py \
--input_type image_tensor \
--pipeline_config_path training/ssd_mobilenet_v1_pets.config \
--trained_checkpoint_prefix training/model.ckpt-10116 \
--output_directory water_meter_panel
-----
INPUT_TYPE=image_tensor
PIPELINE_CONFIG_PATH="object_detection/training/pipeline.config"
TRAINED_CKPT_PREFIX=/home/ubuntu/1.objectDetection/training/model.ckpt-14450
EXPORT_DIR=/home/ubuntu/1.objectDetection/export

$ python object_detection/export_inference_graph.py \
--input_type=${INPUT_TYPE} \
--pipeline_config_path=${PIPELINE_CONFIG_PATH} \
--trained_checkpoint_prefix=${TRAINED_CKPT_PREFIX} \
--output_directory=${EXPORT_DIR}

-----
WARNING:tensorflow:From /home/gaoc/data/test/object_detect/models/research/object_detection/exporter.py:357: get_or_create_global_step (from tensorflow.contrib.framework.python.ops.variables) is deprecated and will be removed in a future version.
Instructions for updating:
Please switch to tf.train.get_or_create_global_step
2018-01-20 06:34:08.551446: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2018-01-20 06:34:14.056881: I tensorflow/core/grappler/devices.cc:51] Number of eligible GPUs (core count >= 8): 0
Converted 199 variables to const ops.

如果Exportor.py文件报bug,请参考https://github.com/tensorflow/models/issues/2861 修复

运行以上代码,将在water_meter_panel文件夹下生成模型所需的相关文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
gaoc@DataScience:~/data/test/object_detect/models/research/object_detection$ ls -l water_meter_panel/
total 44820
-rw-r--r-- 1 gaoc root 77 Jan 20 06:34 checkpoint
-rw-r--r-- 1 gaoc root 22636802 Jan 20 06:34 frozen_inference_graph.pb
-rw-r--r-- 1 gaoc root 22174240 Jan 20 06:34 model.ckpt.data-00000-of-00001
-rw-r--r-- 1 gaoc root 8873 Jan 20 06:34 model.ckpt.index
-rw-r--r-- 1 gaoc root 1058139 Jan 20 06:34 model.ckpt.meta
drwxr-xr-x 3 gaoc root 4096 Jan 20 06:34 saved_model
water_meter_panel/
├── checkpoint
├── frozen_inference_graph.pb
├── model.ckpt.data-00000-of-00001
├── model.ckpt.index
├── model.ckpt.meta
└── saved_model
├── saved_model.pb
└── variables

2.5 测试

1
2
3
4
5
6
# From the tensorflow/models/research/ directory
python object_detection/eval.py \
--logtostderr \
--pipeline_config_path=${PATH_TO_YOUR_PIPELINE_CONFIG} \
--checkpoint_dir=${PATH_TO_TRAIN_DIR} \
--eval_dir=${PATH_TO_EVAL_DIR}

物体识别领域的算法性能评价指标多数选择AP和mAP(mean average precision),多个类别物体检测中,每一个类别都可以根据recall和precision绘制一条曲线,AP就是该曲线下的面积,mAP是多个类别AP的平均值

1
2
3
4
5
6
7
8
Average Precision (AP):
AP% AP at IoU=.50:.05:.95 (primary challenge metric) APIoU=.50% AP at IoU=.50 (PASCAL VOC metric) APIoU=.75% AP at IoU=.75 (strict metric)
AP Across Scales:
APsmall% AP for small objects: area < 322 APmedium% AP for medium objects: 322 < area < 962 APlarge% AP for large objects: area > 962
Average Recall (AR):
ARmax=1% AR given 1 detection per image ARmax=10% AR given 10 detections per image ARmax=100% AR given 100 detections per image
AR Across Scales:
ARsmall% AR for small objects: area < 322 ARmedium% AR for medium objects: 322 < area < 962 ARlarge% AR for large objects: area > 962

AP_MAP

从性能测试结果来看该模型已经具备96%的检测精度了,具备投入生产环境所需的性能。

预测结果见下图,准确率达到了99%以上。

detect_demo

3. 结论

  • 对于简单业务场景的物体识别类案例,可以通过迁移学习利用已有的成熟模型快速迭代生成新的特定模型;
  • 这种迁移的另一个优势是对小数据样本具备很好的适应能力,可以解决前期数据不足和数据质量差的问题;
  • 当然采用这种方式也同时存在一定的弊端,比如由于模型预训练参数较多,模型体积较大,模型的选取需要反复测试和优化。

3.1 经验总结

  1. 虽然Tensorflow Object Detection API提供了丰富的文档介绍相关工作流程,但由于技术、平台和软件版本本身更新较快,实践中还是或多或少会遇到不少问题,静下心来多翻翻Github的issues里一般都有别人的提问及解答;建议还是先根据文档跑通demo,熟悉相关工具和流程再将框架迁移到自己的数据集之上;

  2. 建议自己识别的项目文件单独建立一个数据准备文件夹进行数据准备和相关配置脚本的准备,不要跟Github克隆的Object Detection项目混在一起,不容易管理,也不利于重复利用;

  3. TFOD API提供的Tensorflow可视化相当完备,启动训练任务之后,一定要同步启动验证脚本,可以实时跟踪训练进程;

  4. 很容易疏忽的一个步骤是关于PYTHON PATH的处理,在执行相关API之前一定要记得EXPORT相关path,可以些一个bash文件,在执行命令的Terminal中source一下;常见错误如下:

    1
    ImportError: No module named ’object_detection’
  5. 充分利用GPU和CPU进行训练:

    1. 如果使用CPU训练,控制配置参数中num_examples为一个很小的值(5-10),这样将使用验证数据中的一部分进行验证而不是全部;

    2. 配置CUDA_VISIBLE_DEVICES环境变量,选择使用哪个GPU或CPU来分配内存资源:

      1
      2
      $ export CUDA_VISIBLE_DEVICES="0"
      ...
      1
      2
      $ export CUDA_VISIBLE_DEVICES="1"
      ... another scripts

      配置为空使用CPU

  6. 尽量使用最新版的Tensorflow,在撰写本文时已经是1.7了,当时做实验用的是1.4,复现的时候发现1.4版本已经抛错了…

参考

1. The TensorFlow Object Detection API is an open source framework built on top of TensorFlow that makes it easy to construct, train and deploy object detection models.
2. See MSCOCO evaluation protocol.
  1. Image classification with a pre-trained deep neural network
  2. How to train your own Object Detector with TensorFlow’s Object Detector API
  3. https://github.com/datitran/raccoon_dataset
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×