作者|Abhishek 编译|Flin 来源|analyticsvidhya
第1部分
从在自定义数据集中训练检测器到使用TensorFlow 1.15在Jetson纳米板或云上进行推理的详细步骤
完整代码可在GitHub上获得
TensorFlow对象检测API V2的教程可作为jupyter notebook使用
TensorFlow对象检测API V1的教程可作为jupyter notebook使用
一些常见的困难包括
使用对象检测API库查找兼容的TensorFlow(和相关的cuda)版本
将自定义数据转换为tf记录格式
混淆了tf1.0和tf2.0的流程
手动更新模型配置文件以进行训练
运行训练过程并解决配置文件中的问题
将模型从一种格式导出到另一种格式以进行推理
混合了不同的模型格式类型——检查点、冻结图、saved_model (" .pb ")、tensorRT推断图等等
在训练模型上运行推理
将训练后的模型转换为量化格式,以便部署在诸如Jetson Nano的板上
构建引擎和部署引擎之间的tensorRT版本和cuda计算能力不匹配
这个清单永无止境……
为克服上述一些问题,我们在Monk Object Detection Toolkit中的Tensorflow 对象检测 API的两个版本上添加了一个低代码的pythonic包装器
使用它,开发人员和研究人员可以轻松地
使用TF推送定制训练数据集
使用pythonic API配置所有参数的模型文件
根据使用的网络和cuda版本的可用性,在TF1.0和TF2.0之间进行选择
根据自己的数据集训练、导出、优化、推断
使用TensorRT优化模型并导出到云服务器或Jetson Nano等嵌入式板
传统流程概述
下面提到的是使用TF训练和部署定制探测器的过程。在描述过程流程的同时,还强调了一个人在使一切正常工作时所面临的问题;还提到了tf1.0和2.0版本的对象检测库的区别
过程A:TensorFlow与目标检测装置的兼容性
要使用对象检测 2.0,请使用TensorFlow 2.3.0。版本2.0.0和2.1.0通常会导致“ tensorflow_core.keras.utils”. 2.2.0版在使用“CollectiveAllReduceExtended”模块进行训练时会导致错误。
使用TensorFlow 2.3.0时,需要Cuda 10.1。
要使用对象检测 1.0,请使用TensorFlow版本1.15.0或1.15.2。
使用TensorFlow 1.15时,需要Cuda 10.0。
TFLite转换仍然存在某些错误(将在以后的博客中讨论)
过程B:设置数据集
TensorFlow提供数据集工具以将数据转换为可接受的TF记录格式
但是这些示例仅适用于最常用的数据集,例如COCO,Pascal VOC,OpenImages,Pets-Dataset等。用户需要根据选择的示例笔记本,按照COCO、VOC、OID等格式重新格式化和排列数据集
另一种方法是更新示例代码以便提取自定义数据集,这本身就是一个艰难的过程
为了使自定义数据集的加载变得容易,我们修改了示例并添加了进一步的解析器以支持多种数据注释类型,并将其直接转换为TF-Records。
过程C:更新配置并开始训练过程
Monk的对象检测API 1.0包装器支持大约23个模型,对象检测API 2.0支持大约26个模型
一旦选择了模型并下载了权重,就必须手动更新配置文件。
API 1.0和2.0的配置文件格式不同,需要以稍微不同的方式进行手动更改
tf1.0中的某些配置存在基本特征提取参数的问题。
在对配置文件应用更新后,整个工作区必须按照TF Obj github site站点上的教程指定的方式进行安排。
重新安排后,可以开始训练。同样,针对TF 1.0和TF 2.0模型的训练是不同的。
通过“Monk对象检测”,我们添加了pythonic函数来更新配置文件,并且不再需要为工作空间使用严格的文件夹结构。两种TF版本的训练过程几乎都与Monk的包装程序相同。
过程D:导出经过训练的模型以进行推理
两种对象检测API均以检查点 (“.ckpt”) 格式提供训练有素的模型。
为了在TF 1.0中进行推理,通常使用冻结图形格式。
为了在TF 2.0中进行推理,通常使用保存的模型格式。
特别是对于初学者来说,转换模型的过程在两个API中都不相同,通常很难弄清楚
为了简化流程,我们添加了解析器,以使外部包装器格式保持相同,这意味着我们能同时使用TF 1.0 API和TF 2.0 API。
过程E:TensorRT推论的模型优化
导出的模型最终使用TensorRT转换为优化版本。
支持的优化包括浮点32位和16位(FP32,FP16)和整数8位(INT8)量化。
从tf1.0和tf2.0转换导出模型的量化过程是完全不同的。
TensorRT的版本存在其他问题。这意味着,使用TensorRT版本5.1.5优化的模型无法在使用TensorRT版本5.1.6的部署计算机上运行。一个非常具体的问题是使用TensorFlow 1.15.0的对象检测1.0。这个TensorFlow带有tensorRT 5.1.5,而Jetpacks中没有这样的版本。
TensorRT的另一个问题是cuda计算功能。意思是,除非采取适当措施,否则在具有7.0版计算能力的GPU(V100 Nvidia GPU)上优化的模型不能在具有5.3版计算能力的GPU(Jetson纳米板)上运行。
此博客通过训练和优化对象检测模型澄清了所有疑问
过程F:在Jetson Nano板上设置所有东西
- 由于两个API都需要不同的TensorFlow版本,因此安装过程有所不同,Jetpack版本,CUDA版本以及TF 1.0在涉及tensorRT版本时都需要进一步注意。
让我们从版本1.0开始,每次使用一个对象检测API模块。
TF对象检测API 1.0
过程A:在开发机器上安装
将要安装的库
先决条件:numpy,scipy,pandas,pillow,OpenCV-python
带TensorRT 5.1.5的TensorFlow-GPU V1.15.0;如果在Nano板上部署则不需要
带TensorRT 6.0.1的TensorFlow-GPU V1.15.2;如果在Nano板上进行部署,则需要
使用Monk Object Detection Toolkit的TF 对象检测 API 1.0
(确保CUDA 10.0和CUDNN 7随系统一起安装了NVidia驱动程序)
当模型要部署在Jetson Nano板上时,请按照以下说明配置你的开发(训练)机器
安装必备的Python库
$ git clone https://github.com/Tessellate-Imaging/Monk_Object_Detection.git
$ cd Monk_Object_Detection/12_tf_obj_1/installation
$ chmod +x install_cuda10_tensorrt6_part1.sh && ./install_cuda10_tensorrt6_part1.sh
安装TensorRT 6.0.1
# Go to https://developer.nvidia.com/tensorrt
# Download
# - nv-tensorrt-repo-ubuntu1804-cuda10.0-trt6.0.1.5-ga-20190913_1-1_amd64.deb (For Ubuntu18.04)
# - nv-tensorrt-repo-ubuntu1604-cuda10.0-trt6.0.1.5-ga-20190913_1-1_amd64.deb (For Ubuntu16.04)
# Run the following commands to install trt (in a terminal)
$ sudo dpkg -i nv-tensorrt-repo-ubuntu1804-cuda10.0-trt6.0.1.5-ga-20190913_1-1_amd64.deb
$ sudo apt-key add <key value will be mentioned as the output of previous command>
$ sudo apt-get update
$ sudo apt-get install tensorrt
$ sudo apt-get install uff-converter-tf
$ sudo apt-get install python3-libnvinfer-dev
安装Bazel 0.26.1并从GitHub克隆TensorFlow
# Install bazel version 0.26.1
# Download bazel deb package from https://github.com/bazelbuild/bazel/releases/tag/0.26.1
$ sudo dpkg -i bazel_0.26.1-linux-x86_64.deb
# Clone Tensorflow and switch to tensorflow 1.15.2
$ git clone https://github.com/tensorflow/tensorflow.git
$ cd tensorflow
$ git checkout v1.15.2
配置TensorFlow