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 然后输入下列命令:
git clone https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10.git
将提取到的文件保存到C:\tensorflow1\models\research\bject_detection
如图所示:
设置新的anaconda虚拟环境
C:\> conda create -n tensorflow1 pip python=3.7
然后发布激活环境
C:\> activate tensorflow1
(tensorflow1) C:\>python -m pip install --upgrade pip
在此环境中安装tensorflow-gpu:
(tensorflow1) C:\> pip install --ignore-installed --upgrade tensorflow-gpu
由于我们使用anaconda,安装tensorflow-gpu也将自动下载和安装正确的版本的CUDA和cuDNN。
没有gpu可以只是用cpu进行训练,如下所示可以这样修改(用cpu会很慢,可我没有GPU):
(tensorflow1) C:\> pip install --ignore-installed --upgrade tensorflow
安装其他必要的包:
(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环境变量设置
(tensorflow1) C:\> set PYTHONPATH=C:\tensorflow1\models;C:\tensorflow1\models\research;C:\tensorflow1\models\research\slim
编译原型运行setup.py
在 Anaconda 命令提示中,将目录更改为 “模型” 研究目录:
(tensorflow1) C:\> cd C:\tensorflow1\models\research
然后将以下命令复制并粘贴到命令行中并按”输入”
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:中运行
(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 目录中,发布此命令:
cd C:\tensorflow1\models\research\object_detection\colab_tutorials
(tensorflow1) C:\tensorflow1\models\research\object_detection\colab_tutorials> jupyter notebook object_detection_tutorial.ipynb
json转xml(参考自CSDN)
python 安装
pip install dicttoxml
- 源码
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号,后面会用到。
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