2018 年 7 月 13 日 — 发布者 Sara Robinson、Aakanksha Chowdhery 和 Jonathan Huang
如果您能够更快地训练和提供您的目标检测模型,那会怎么样?我们已经听到了您的反馈,今天我们很高兴地宣布支持在 Cloud TPU 上训练目标检测模型,模型量化,以及添加新模型,包括 RetinaNet 和 RetinaNet 的 MobileNet 改编版。您可以查看...
gcloud config set project YOUR_PROJECT_NAME
然后,我们将使用以下命令创建一个 Cloud Storage 存储桶。请注意,存储桶名称必须是全局唯一的,因此如果您选择的第一个名称已被占用,则可能会出现错误。gsutil mb gs://YOUR_UNIQUE_BUCKET_NAME
这可能会提示您首先运行 gcloud auth login
,之后您需要提供发送到浏览器的验证代码。export PROJECT="YOUR_PROJECT_ID"
export YOUR_GCS_BUCKET="YOUR_UNIQUE_BUCKET_NAME"
接下来,要让我们的 Cloud TPU 访问我们的项目,我们需要添加一个特定于 TPU 的服务帐户。首先,使用以下命令获取服务帐户的名称curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
https://ml.googleapis.com/v1/projects/${PROJECT}:getConfig
当此命令完成后,复制 tpuServiceAccount
的值(它看起来像 [email protected]
),然后将其保存为环境变量export TPU_ACCOUNT=your-service-account
最后,将 ml.serviceAgent
角色授予您的 TPU 服务帐户gcloud projects add-iam-policy-binding $PROJECT \
--member serviceAccount:$TPU_ACCOUNT --role roles/ml.serviceAgent
python object_detection/builders/model_builder_test.py
如果安装成功,您应该看到以下输出Ran 18 tests in 0.079s
OK
pet_faces_train.record
和 pet_faces_val.record
文件公开提供,您可以从这里获取。您可以使用公共 TFRecord 文件,或者如果您想自己生成它们,请按照此处的步骤操作。mkdir /tmp/pet_faces_tfrecord/
cd /tmp/pet_faces_tfrecord/
curl "http://download.tensorflow.org/models/object_detection/pet_faces_tfrecord.tar.gz" | tar xzf -
请注意,这些 TFRecord 文件是分片的,因此在解压缩它们后,您将拥有 10 个 pet_faces_train.record
文件和 10 个 pet_faces_val.record 文件
。/data
子目录下gsutil -m cp -r /tmp/pet_faces_tfrecord/pet_faces* gs://${YOUR_GCS_BUCKET}/data/
将您的 TFRecord 文件放入 GCS 后,回到本地机器上的 models/research
目录。接下来,您将在 GCS 存储桶中添加 pet_label_map.pbtxt 文件
。这将我们检测到的 37 种宠物品种中的每一种都映射到一个整数,以便我们的模型能够以数值格式理解它们。从 models/research
目录运行以下命令gsutil cp object_detection/data/pet_label_map.pbtxt gs://${YOUR_GCS_BUCKET}/data/pet_label_map.pbtxt
此时,您应该在 GCS 存储桶的 /data
子目录中拥有 21 个文件:用于训练和测试的 20 个分片 TFRecord 文件以及标签映射文件。cd /tmp
curl -O http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_0.75_depth_300x300_coco14_sync_2018_07_03.tar.gz
tar xzf ssd_mobilenet_v1_0.75_depth_300x300_coco14_sync_2018_07_03.tar.gz
gsutil cp /tmp/ssd_mobilenet_v1_0.75_depth_300x300_coco14_sync_2018_07_03/model.ckpt.* gs://${YOUR_GCS_BUCKET}/data/
当我们训练模型时,它将使用这些检查点作为训练的起点。现在您应该在 GCS 存储桶中拥有 24 个文件。我们几乎可以运行我们的训练作业了,但是我们需要一种方法来告诉 ML Engine 我们的数据和模型检查点在哪里。我们将使用配置文件来实现这一点,我们将在下一步中设置该文件。我们的配置文件提供了模型的超参数、训练数据的路径、测试数据和初始模型检查点。loss {
classification_loss {
weighted_sigmoid_focal {
alpha: 0.75,
gamma: 2.0
}
}
此损失函数计算数据集每个示例的损失,然后重新加权它们,为较难的误分类示例分配更多的相对权重。这种逻辑比其他训练作业中使用的难例挖掘操作更适合 TPU。您可以在Lin 等人(2017)中了解有关焦点损失的更多信息。fine_tune_checkpoint: "gs://your-bucket/data/model.ckpt"
fine_tune_checkpoint_type: "detection"
我们还需要考虑我们的模型在训练完成后如何使用。假设我们的宠物检测器成为全球热门,被世界各地的动物爱好者和宠物店使用。我们需要一种可扩展的方式来以低延迟处理这些推理请求。机器学习模型的输出是一个包含我们模型训练权重的二进制文件 - 这些文件通常很大,但由于我们将在移动设备上直接提供此模型,因此我们需要将其尽可能地缩小。graph_rewriter {
quantization {
delay: 1800
activation_bits: 8
weight_bits: 8
}
}
通常,量化模型将以全精度训练一定数量的步骤,然后切换到量化训练。上面的delay
数字告诉 ML Engine 在 1800 个训练步骤后开始量化我们的权重和激活。object_detection/samples/configs/ssd_mobilenet_v1_0.75_depth_quantized_300x300_pets_sync.config
。使用您在 GCS 存储桶中的数据目录的完整路径更新所有PATH_TO_BE_CONFIGURED
字符串。例如,配置文件的train_input_reader
部分将如下所示(确保将YOUR_GCS_BUCKET
替换为您存储桶的名称)train_input_reader: {
tf_record_input_reader {
input_path: "gs://YOUR_GCS_BUCKET/data/pet_faces_train*"
}
label_map_path: "gs://YOUR_GCS_BUCKET/data/pet_label_map.pbtxt"
}
然后将这个量化配置文件复制到您的 GCS 存储桶中gsutil cp object_detection/samples/configs/ssd_mobilenet_v1_0.75_depth_quantized_300x300_pets_sync.config gs://${YOUR_GCS_BUCKET}/data/pipeline.config
在 Cloud ML Engine 上启动我们的训练作业之前,我们需要打包对象检测 API、pycocotools 和 TF Slim。我们可以使用以下命令来完成(从research/
目录运行,注意括号是命令的一部分)bash object_detection/dataset_tools/create_pycocotools_package.sh /tmp/pycocotools
python setup.py sdist
(cd slim && python setup.py sdist)
我们准备训练我们的模型了!要开始训练,运行以下 gcloud 命令gcloud ml-engine jobs submit training `whoami`_object_detection_`date +%s` \
--job-dir=gs://${YOUR_GCS_BUCKET}/train \
--packages dist/object_detection-0.1.tar.gz,slim/dist/slim-0.1.tar.gz,/tmp/pycocotools/pycocotools-2.0.tar.gz \
--module-name object_detection.model_tpu_main \
--runtime-version 1.8 \
--scale-tier BASIC_TPU \
--region us-central1 \
-- \
--model_dir=gs://${YOUR_GCS_BUCKET}/train \
--tpu_zone us-central1 \
--pipeline_config_path=gs://${YOUR_GCS_BUCKET}/data/pipeline.config
注意,如果您收到一条错误消息,说没有可用的 Cloud TPU,建议您简单地在另一个区域中重试(Cloud TPU 目前在 us-central1-b、us-central1-c、europe-west4-a 和 asia-east1-c 可用)。gcloud ml-engine jobs submit training `whoami`_object_detection_eval_validation_`date +%s` \
--job-dir=gs://${YOUR_GCS_BUCKET}/train \
--packages dist/object_detection-0.1.tar.gz,slim/dist/slim-0.1.tar.gz,/tmp/pycocotools/pycocotools-2.0.tar.gz \
--module-name object_detection.model_main \
--runtime-version 1.8 \
--scale-tier BASIC_GPU \
--region us-central1 \
-- \
--model_dir=gs://${YOUR_GCS_BUCKET}/train \
--pipeline_config_path=gs://${YOUR_GCS_BUCKET}/data/pipeline.config \
--checkpoint_dir=gs://${YOUR_GCS_BUCKET}/train
训练和评估都应该在大约 30 分钟内完成。在它们运行的同时,您可以使用 TensorBoard 来查看模型的准确率。要启动TensorBoard,运行以下命令tensorboard --logdir=gs://${YOUR_GCS_BUCKET}/train
注意,您可能需要先运行gcloud auth application-default login
。localhost:6006
以查看您的 TensorBoard 输出。在这里,您将看到一些用于分析模型准确性的通用 ML 指标。注意,这些图表只绘制了 2 个点,因为模型在很少的步骤中快速训练(如果您之前使用过 TensorBoard,您可能习惯在这里看到更多曲线)。这里的第一点是在训练过程的早期,最后一个点显示了最后一步(第 2000 步)的指标。export CONFIG_FILE=gs://${YOUR_GCS_BUCKET}/data/pipeline.config
export CHECKPOINT_PATH=gs://${YOUR_GCS_BUCKET}/train/model.ckpt-2000
export OUTPUT_DIR=/tmp/tflite
我们首先获取一个具有兼容操作的 TensorFlow 冻结图,我们可以将其用于 TensorFlow Lite。首先,您需要安装这些 python 库。然后要获取冻结图,使用此命令从models/research
目录运行export_tflite_ssd_graph.py
脚本python object_detection/export_tflite_ssd_graph.py \
--pipeline_config_path=$CONFIG_FILE \
--trained_checkpoint_prefix=$CHECKPOINT_PATH \
--output_directory=$OUTPUT_DIR \
--add_postprocessing_op=true
在/tmp/tflite
目录中,您现在应该看到两个文件:tflite_graph.pb
和tflite_graph.pbtxt
(示例冻结图在这里)。注意,add_postprocessing
标志使模型能够利用定制的优化检测后处理操作,这可以被认为是tf.image.non_max_suppression
的替代品。确保不要将export_tflite_ssd_graph
与同一目录中的export_inference_graph
混淆。两个脚本都输出冻结图:export_tflite_ssd_graph
将输出我们可以直接输入 TensorFlow Lite 的冻结图,这也是我们将要使用的那个。bazel run -c opt tensorflow/contrib/lite/toco:toco -- \
--input_file=$OUTPUT_DIR/tflite_graph.pb \
--output_file=$OUTPUT_DIR/detect.tflite \
--input_shapes=1,300,300,3 \
--input_arrays=normalized_input_image_tensor \
--output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3' \
--inference_type=QUANTIZED_UINT8 \
--mean_values=128 \
--std_values=128 \
--change_concat_input_ranges=false \
--allow_custom_ops
此命令在将每个相机图像帧调整大小到 300x300 像素后,获取输入张量normalized_input_image_tensor
。量化模型的输出命名为'TFLite_Detection_PostProcess'
、'TFLite_Detection_PostProcess:1'
、'TFLite_Detection_PostProcess:2'
和'TFLite_Detection_PostProcess:3'
,并代表四个数组:detection_boxes、detection_classes、detection_scores 和 num_detections。此命令中使用的其他标志的文档在这里。如果运行成功,您现在应该在/tmp/tflite
目录中看到第三个文件,名为detect.tflite
(示例 tflite 文件在这里)。此文件包含图形和所有模型参数,可以通过 TensorFlow Lite 解释器在 Android 设备上运行,其大小应该小于 4 Mb。bazel build -c opt --config=android_arm{,64} --cxxopt='--std=c++11' \
//tensorflow/contrib/lite/examples/android:tflite_demo
上面的 apk 将为 64 位架构构建,您可以用--config=android_arm
替换它以支持 32 位。现在通过Android 调试桥 (adb) 将演示安装到启用调试的 Android 手机上adb install bazel-bin/tensorflow/contrib/lite/examples/android/tflite_demo.apk
尝试运行此入门应用程序(称为 TFLDetect)并将相机对准人、家具、汽车、宠物等。正常工作的测试应用程序应该看起来像这样。您将看到检测到对象的周围有框,以及它们的标签。正常工作的测试应用程序是使用 COCO 数据集训练的。cp /tmp/tflite/detect.tflite \
tensorflow/contrib/lite/examples/android/app/src/main/assets
我们现在将编辑 BUILD 文件以指向这个新模型。首先,打开 BUILD 文件tensorflow/contrib/lite/examples/android/BUILD。然后找到 assets 部分,将行"@tflite_mobilenet_ssd_quant//:detect.tflite"
(默认指向 COCO 预训练模型)替换为您 TFLite 宠物模型的路径“//tensorflow/contrib/lite/examples/android/app/src/main/assets:detect.tflite
”。最后,更改 assets 部分中的最后一行以使用新的标签映射。您最终的 assets 部分应如下所示assets = [
"//tensorflow/contrib/lite/examples/android/app/src/main/assets:labels_mobilenet_quant_v1_224.txt",
"@tflite_mobilenet//:mobilenet_quant_v1_224.tflite",
"@tflite_conv_actions_frozen//:conv_actions_frozen.tflite",
"//tensorflow/contrib/lite/examples/android/app/src/main/assets:conv_actions_labels.txt",
"@tflite_mobilenet_ssd//:mobilenet_ssd.tflite",
"//tensorflow/contrib/lite/examples/android/app/src/main/assets:detect.tflite",
"//tensorflow/contrib/lite/examples/android/app/src/main/assets:box_priors.txt",
"//tensorflow/contrib/lite/examples/android/app/src/main/assets:pets_labels_list.txt",
],
我们还需要告诉我们的应用程序使用新的标签映射。为此,请在文本编辑器中打开 tensorflow/contrib/lite/examples/android/app/src/main/java/org/tensorflow/demo/DetectorActivity.java 文件并找到 TF_OD_API_LABELS_FILE
的定义。将此路径更新为指向您的宠物标签映射文件:“file:///android_asset/pets_labels_list.txt
”。请注意,我们已经为您提供了 pets_labels_list.txt
文件。DetectorActivity.java 的这一新部分(大约在第 50 行)现在应该如下所示。// Configuration values for the prepackaged SSD model.
private static final int TF_OD_API_INPUT_SIZE = 300;
private static final boolean TF_OD_API_IS_QUANTIZED = true;
private static final String TF_OD_API_MODEL_FILE = "detect.tflite";
private static final String TF_OD_API_LABELS_FILE = "file:///android_asset/pets_labels_list.txt";
复制完 TensorFlow Lite 文件并编辑完 BUILD 和 DetectorActivity.java 文件后,使用以下命令重建和重新安装您的应用程序。bazel build -c opt --config=android_arm{,64} --cxxopt='--std=c++11' \
//tensorflow/contrib/lite/examples/android:tflite_demo
adb install -r bazel-bin/tensorflow/contrib/lite/examples/android/tflite_demo.apk
现在是最好的部分:找到最近的狗或猫,尝试检测它。在 Pixel 2 上,我们每秒获得超过 15 帧。
2018 年 7 月 13 日 — 发布者:Sara Robinson、Aakanksha Chowdhery 和 Jonathan Huang
如果您能够更快地训练和提供对象检测模型,会怎么样?我们听到了您的反馈,今天我们很高兴地宣布支持在 Cloud TPU 上训练对象检测模型、模型量化以及添加新的模型,包括 RetinaNet 和 RetinaNet 的 MobileNet 改编。您可以查看…