TensorFlow-lite模型训练

TensorFlow安装

安装pytorch、conda

该教程详情请见:PyTorch环境配置及安装

从github安装一个目标检测的库

在c盘新建一个文件夹 C:\tensorflow1

安装tensorflow

通过单击”克隆或下载”按钮并下载 zip 文件,下载位于https://github.com/tensorflow/models/tree/r1.13.0 的完整 TensorFlow 对象检测存储库。打开下载的 zip 文件,将”模型主”文件夹直接提取到您刚刚创建的 C:\tensorflow1 目录中。将”models-master”更名为”models”。

下载模型从 TensorFlow 的模型下载 Faster-RCNN-Inception-V2-COCO 模型

模型库

本教程将使用 Faster-RCNN-Inception-V2 模型。在此处下载模型。使用 WinZip 或 7-Zip 等文件归档程序打开下载的 fast_rcnn_inception_v2_coco_2018_01_28.tar.gz 文件,并将 fast_rcnn_inception_v2_coco_2018_01_28 文件夹解压到 C:\tensorflow1\models\research\object_detection 文件夹。(注意:模型日期和版本将来可能会发生变化,但它仍然适用于本教程。)

下载API存储库

打开git bash 然后输入下列命令:

1
git clone https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10.git

将提取到的文件保存到C:\tensorflow1\models\research\bject_detection

如图所示:

https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

设置新的anaconda虚拟环境

1
C:\> conda create -n tensorflow1 pip python=3.7

然后发布激活环境

1
2
C:\> activate tensorflow1
(tensorflow1) C:\>python -m pip install --upgrade pip

在此环境中安装tensorflow-gpu:

1
(tensorflow1) C:\> pip install --ignore-installed --upgrade tensorflow-gpu

由于我们使用anaconda,安装tensorflow-gpu也将自动下载和安装正确的版本的CUDA和cuDNN。

没有gpu可以只是用cpu进行训练,如下所示可以这样修改(用cpu会很慢,可我没有GPU):

1
(tensorflow1) C:\> pip install --ignore-installed --upgrade tensorflow

安装其他必要的包:

1
2
3
4
5
6
7
8
9
(tensorflow1) C:\> conda install -c anaconda protobuf
(tensorflow1) C:\> pip install pillow
(tensorflow1) C:\> pip install lxml
(tensorflow1) C:\> pip install Cython
(tensorflow1) C:\> pip install contextlib2
(tensorflow1) C:\> pip install jupyter
(tensorflow1) C:\> pip install matplotlib
(tensorflow1) C:\> pip install pandas
(tensorflow1) C:\> pip install opencv-python

PYTH环境变量设置

1
(tensorflow1) C:\> set PYTHONPATH=C:\tensorflow1\models;C:\tensorflow1\models\research;C:\tensorflow1\models\research\slim

编译原型运行setup.py

在 Anaconda 命令提示中,将目录更改为 “模型” 研究目录:

1
(tensorflow1) C:\> cd C:\tensorflow1\models\research

然后将以下命令复制并粘贴到命令行中并按”输入”

1
protoc --python_out=. .\object_detection\protos\anchor_generator.proto .\object_detection\protos\argmax_matcher.proto .\object_detection\protos\bipartite_matcher.proto .\object_detection\protos\box_coder.proto .\object_detection\protos\box_predictor.proto .\object_detection\protos\eval.proto .\object_detection\protos\faster_rcnn.proto .\object_detection\protos\faster_rcnn_box_coder.proto .\object_detection\protos\grid_anchor_generator.proto .\object_detection\protos\hyperparams.proto .\object_detection\protos\image_resizer.proto .\object_detection\protos\input_reader.proto .\object_detection\protos\losses.proto .\object_detection\protos\matcher.proto .\object_detection\protos\mean_stddev_box_coder.proto .\object_detection\protos\model.proto .\object_detection\protos\optimizer.proto .\object_detection\protos\pipeline.proto .\object_detection\protos\post_processing.proto .\object_detection\protos\preprocessor.proto .\object_detection\protos\region_similarity_calculator.proto .\object_detection\protos\square_box_coder.proto .\object_detection\protos\ssd.proto .\object_detection\protos\ssd_anchor_generator.proto .\object_detection\protos\string_int_label_map.proto .\object_detection\protos\train.proto .\object_detection\protos\keypoint_box_coder.proto .\object_detection\protos\multiscale_anchor_generator.proto .\object_detection\protos\graph_rewriter.proto .\object_detection\protos\calibration.proto .\object_detection\protos\flexible_grid_anchor_generator.proto

在目录 C:\tensorflow1\models\research\delf directory:中运行

1
2
(tensorflow1) C:\tensorflow1\models\research\delf> python setup.py build
(tensorflow1) C:\tensorflow1\models\research\delf> python setup.py install

测试tensorflow设置验证工作原理

TensorFlow 对象检测 API 现已全部设置,用于使用经过预先训练的对象检测模型,或培训新的模型。您可以通过启动与 Jupyter 的object_detection_tutorial.ipynb 脚本来测试它并验证您的安装是否正常工作。从 [object_detection 目录中,发布此命令:

1
cd C:\tensorflow1\models\research\object_detection\colab_tutorials
1
(tensorflow1) C:\tensorflow1\models\research\object_detection\colab_tutorials> jupyter notebook object_detection_tutorial.ipynb

json转xml(参考自CSDN)

  • python 安装

    pip install dicttoxml

  • 源码
    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
    37
    38
    39
    40
    41
    42
    43
    import os
    from json import loads
    from dicttoxml import dicttoxml
    from xml.dom.minidom import parseString


    def jsonToXml(json_path, xml_path):
    # @abstract: transfer json file to xml file
    # json_path: complete path of the json file
    # xml_path: complete path of the xml file
    with open(json_path, 'r', encoding='UTF-8')as json_file:
    load_dict = loads(json_file.read())
    # print(load_dict)
    my_item_func = lambda x: 'Annotation'
    xml = dicttoxml(load_dict, custom_root='Annotations', item_func=my_item_func, attr_type=False)
    dom = parseString(xml)
    # print(dom.toprettyxml())
    # print(type(dom.toprettyxml()))
    with open(xml_path, 'w', encoding='UTF-8')as xml_file:
    xml_file.write(dom.toprettyxml())


    def json_to_xml(json_dir, xml_dir):
    # transfer all json file which in the json_dir to xml_dir
    if (os.path.exists(xml_dir) == False):
    os.makedirs(xml_dir)
    dir = os.listdir(json_dir)
    for file in dir:
    file_list = file.split(".")
    if (file_list[-1] == 'json'):
    jsonToXml(os.path.join(json_dir, file), os.path.join(xml_dir, file_list[0] + '.xml'))


    if __name__ == '__main__':
    # trandfer singal file
    j_path = "annotations_all.json"
    x_path = "annotations_all.xml"
    jsonToXml(j_path, x_path)

    # # transfer multi files
    # j_dir = "F:/清影科技/work/jsontoxml/json/"
    # x_dir = "F:/清影科技/work/jsontoxml/xml/"
    # json_to_xml(j_dir, x_dir)

模型训练

步骤 1b。配置训练

如果您正在训练自己的 TensorFlow Lite 模型,请确保已完成我之前指南中的以下项目:

  • 训练和测试图像及其 XML 标签文件放置在 \object_detection\images\train 和 \object_detection\images\test 文件夹中
  • train_labels.csv 和 test_labels.csv 已生成并位于 \object_detection\images 文件夹中
  • train.record 和 test.record 已生成并位于 \object_detection 文件夹中
  • labelmap.pbtxt 文件已创建并位于 \object_detection\training 文件夹中
  • \object_detection\protos 中的 proto 文件已经生成
    如果您对这些文件有任何疑问或不知道如何生成它们,我之前教程的第 2、3、4 和 5 步展示了它们是如何创建的。

将 ssd_mobilenet_v2_quantized_300x300_coco.config 文件从 \object_detection\samples\configs 文件夹复制到 \object_detection\training 文件夹。然后,使用文本编辑器打开文件。

对 ssd_mobilenet_v2_quantized_300x300_coco.config 文件进行以下更改。注意:路径必须用单个正斜杠(不是反斜杠)输入,否则 TensorFlow 在尝试训练模型时会给出文件路径错误!此外,路径必须包含在双引号 ( “ ) 中,而不是单引号 ( ‘ ) 中。

  • 第 9 行。将 num_classes 更改为您希望分类器检测的不同对象的数量。对于我的鸟/松鼠/浣熊检测器示例,有三个类,所以我设置了 num_classes: 3

  • 第 141 行。将 batch_size: 24 更改为 batch_size: 6 。较小的批大小将防止训练期间出现 OOM(内存不足)错误。

  • 第 156 行。将fine_tune_checkpoint 更改为:“C:/tensorflow1/models/research/object_detection/ssd_mobilenet_v2_quantized_300x300_coco_2019_01_03/model.ckpt”

  • 第 175 行。将 input_path 更改为:“C:/tensorflow1/models/research/object_detection/train.record”

  • 第 177 行。将 label_map_path 更改为:“C:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt”

  • 第 181 行。将 num_examples 更改为您在 \images\test 目录中拥有的图像数量。对于我的鸟/松鼠/浣熊检测器示例,有 582 个测试图像,因此我设置了 num_examples: 582。

  • 第 189 行。将 input_path 更改为:“C:/tensorflow1/models/research/object_detection/test.record”

  • 第 191 行。将 label_map_path 更改为:“C:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt”

更改完成后保存并退出训练文件。

步骤 1c。在 Anaconda 虚拟环境中运行训练

剩下要做的就是训练模型!首先,将“train.py”文件从 \object_detection\legacy 文件夹移动到主 \object_detection 文件夹中。(有关为什么我使用旧版 train.py 脚本而不是 model_main.py 进行训练,请参阅常见问题解答。)

然后,通过在“开始”菜单中搜索“Anaconda Prompt”并单击它来打开一个新的 Anaconda Prompt 窗口。通过发出以下命令激活“tensorflow1”虚拟环境(在我之前的教程中设置):
activate tensorflow1

然后,通过发出以下命令来设置 PYTHONPATH 环境变量:

set PYTHONPATH=C:\tensorflow1\models;C:\tensorflow1\models\research;C:\tensorflow1\models\research\slim

接下来,将目录更改为 \object_detection 文件夹:

cd C:\tensorflow1\models\research\object_detection

最后,通过发出以下命令来训练模型:
cd legacy

python train.py --logtostderr –train_dir=training/ --pipeline_config_path=training/ssd_mobilenet_v2_quantized_300x300_coco.config

如果一切设置正确,模型将在初始化几分钟后开始训练。

允许模型训练,直到损失始终低于 2。对于我的鸟/松鼠/浣熊检测器模型,这需要大约 9000 步,或 8 小时的训练。(时间会根据您的 CPU 和 GPU 的强大程度而有所不同。有关训练的更多信息以及如何使用 TensorBoard 查看训练作业进度的说明,请参阅我之前教程的第 6 步。)

一旦训练完成(即损失一直低于 2),按 Ctrl+C 停止训练。最新的检查点将保存在 \object_detection\training 文件夹中,我们将使用该检查点导出冻结的 TensorFlow Lite 图。记下training文件夹(即model.ckpt-XXXX)中model.ckpt文件的checkpoint号,后面会用到。

1
2
3
4
protoc --python_out=. .\object_detection\protos\anchor_generator.proto .\object_detection\protos\argmax_matcher.proto .\object_detection\protos\bipartite_matcher.proto .\object_detection\protos\box_coder.proto .\object_detection\protos\box_predictor.proto .\object_detection\protos\eval.proto .\object_detection\protos\faster_rcnn.proto .\object_detection\protos\faster_rcnn_box_coder.proto .\object_detection\protos\grid_anchor_generator.proto .\object_detection\protos\hyperparams.proto .\object_detection\protos\image_resizer.proto .\object_detection\protos\input_reader.proto .\object_detection\protos\losses.proto .\object_detection\protos\matcher.proto .\object_detection\protos\mean_stddev_box_coder.proto .\object_detection\protos\model.proto .\object_detection\protos\optimizer.proto .\object_detection\protos\pipeline.proto .\object_detection\protos\post_processing.proto .\object_detection\protos\preprocessor.proto .\object_detection\protos\region_similarity_calculator.proto .\object_detection\protos\square_box_coder.proto .\object_detection\protos\ssd.proto .\object_detection\protos\ssd_anchor_generator.proto .\object_detection\protos\string_int_label_map.proto .\object_detection\protos\train.proto .\object_detection\protos\keypoint_box_coder.proto .\object_detection\protos\multiscale_anchor_generator.proto .\object_detection\protos\graph_rewriter.proto .\object_detection\protos\calibration.proto .\object_detection\protos\flexible_grid_anchor_generator.proto


protoc --python_out=. C:\tensorflow1\models\research\object_detection\protos\anchor_generator.proto C:\tensorflow1\models\research\object_detection\protos\argmax_matcher.proto C:\tensorflow1\models\research\object_detection\protos\bipartite_matcher.proto C:\tensorflow1\models\research\object_detection\protos\box_coder.proto C:\tensorflow1\models\research\object_detection\protos\box_predictor.proto C:\tensorflow1\models\research\object_detection\protos\eval.proto C:\tensorflow1\models\research\object_detection\protos\faster_rcnn.proto C:\tensorflow1\models\research\object_detection\protos\faster_rcnn_box_coder.proto C:\tensorflow1\models\research\object_detection\protos\FILELIST.TXT C:\tensorflow1\models\research\object_detection\protos\graph_rewriter.proto C:\tensorflow1\models\research\object_detection\protos\grid_anchor_generator.proto C:\tensorflow1\models\research\object_detection\protos\hyperparams.proto C:\tensorflow1\models\research\object_detection\protos\image_resizer.proto C:\tensorflow1\models\research\object_detection\protos\input_reader.proto C:\tensorflow1\models\research\object_detection\protos\keypoint_box_coder.proto C:\tensorflow1\models\research\object_detection\protos\LIST.TXT C:\tensorflow1\models\research\object_detection\protos\losses.proto C:\tensorflow1\models\research\object_detection\protos\matcher.proto C:\tensorflow1\models\research\object_detection\protos\mean_stddev_box_coder.proto C:\tensorflow1\models\research\object_detection\protos\model.proto C:\tensorflow1\models\research\object_detection\protos\multiscale_anchor_generator.proto C:\tensorflow1\models\research\object_detection\protos\optimizer.proto C:\tensorflow1\models\research\object_detection\protos\pipeline.proto C:\tensorflow1\models\research\object_detection\protos\post_processing.proto C:\tensorflow1\models\research\object_detection\protos\preprocessor.proto C:\tensorflow1\models\research\object_detection\protos\region_similarity_calculator.proto C:\tensorflow1\models\research\object_detection\protos\square_box_coder.proto C:\tensorflow1\models\research\object_detection\protos\ssd.proto C:\tensorflow1\models\research\object_detection\protos\ssd_anchor_generator.proto C:\tensorflow1\models\research\object_detection\protos\string_int_label_map.proto C:\tensorflow1\models\research\object_detection\protos\train.proto