整个过程,从训练到在Android设备上推理 只需要30分钟,Google云的花费不到5美元。完成后,你将拥有一个Android应用程序(即将推出的iOS教程!),可以对狗和猫品种进行实时检测,并且手机上的空间不超过12M。请注意,除了在云中训练对象检测模型之外,你也可以在自己的硬件或Colab上运行训练。
我们将首先建立训练模型所需的一些库和其他先决条件。请注意,设置过程可能比训练模型本身花费更长的时间。为方便起见,你可以使用Dockerfile,它提供了从源代码安装Tensorflow并下载本教程所需的数据集和模型的依赖项。。如果你决定使用Docker,则仍应使用“Google Cloud Setup”部分,然后跳至“将数据集上传到GCS”部分。Dockerfile还将为Tensorflow Lite部分构建Android依赖项。更多信息,请参阅随附的README文件。
首先,在谷歌云控制台中创建一个项目,并启用该项目的计费。我们使用Cloud Machine Learning Engine在Cloud TPU上运行我们的训练工作。ML Engine是Google Cloud的TensorFlow托管平台,它简化了训练和提供机器学习模型的过程。要使用它,请为刚刚创建的项目启用必要的API。
API:https://console.cloud.google.com/flows/enableapi?apiid=ml.googleapis.com,compute_component&_ga=2.43515109.-1978295503.1509743045
其次,我们将创建一个Google云存储桶,用于存储我们模型的训练和测试数据,以及我们训练工作中的模型检查点。
请注意,本教程中的所有命令都假设你正在运行Ubuntu。对于本教程中的许多命令,我们将使用Google Cloud gcloud CLI,并和Cloud Storage gsutil CLI一起与我们的GCS存储桶交互。如果你没有安装它们,你可以在访问下方链接安装
gcloud:https://cloud.google.com/sdk/docs/quickstart-debian-ubuntu
gsutil:https://cloud.google.com/storage/docs/gsutil_install
运行以下命令将当前项目设置为刚创建的项目,将YOUR_PROJECT_NAME替换为项目名称:
gcloud config set project YOUR_PROJECT_NAME
export PROJECT="YOUR_PROJECT_ID"
export YOUR_GCS_BUCKET="YOUR_UNIQUE_BUCKET_NAME"
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
https://ml.googleapis.com/v1/projects/${PROJECT}:getConfig
export TPU_ACCOUNT=your-service-account
gcloud projects add-iam-policy-binding $PROJECT \
--member serviceAccount:$TPU_ACCOUNT --role roles/ml.serviceAgent
如果你没有安装TensorFlow,请按照官网步骤操作。要按照本教程的设备上的部分进行操作,你需要按照下方链接的说明使用Bazel从源代码安装TensorFlow 。编译TensorFlow可能需要一段时间。如果你只想按照本教程的Cloud TPU训练部分进行操作,则无需从源代码编译TensorFlow,并且可以通过pip,Anaconda等安装已发布的版本。
链接:https://www.tensorflow.org/install/install_sources
如果这是你第一次使用TensorFlow对象检测,欢迎!
安装:https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.md
安装对象检测后,请通过运行以下命令来测试安装:
python object_detection / builders / model_builder_test.py
Ran 18 tests in 0.079s
OK
为了简单起见,我们将使用上一篇文章中关于训练对象检测模型的相同宠物品种数据集。该数据集包括大约7,400张图像 - 37种不同品种的猫和狗图像,每种200张图像。每个图像都有一个关联的注释文件,其中包括特定宠物在图像中所在的边界框坐标。我们不能直接将这些图像和注释提供给我们的模型;而是需要将它们转换为我们的模型可以理解的格式。为此,我们将使用TFRecord格式。
上一篇文:https://cloud.google.com/blog/big-data/2017/06/training-an-object-detector-using-cloud-machine-learning-engine
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 -
gsutil -m cp -r / tmp / pet_faces_tfrecord / pet_faces * gs:// $ {YOUR_GCS_BUCKET} / data /
gsutil cp object_detection / data / pet_label_map.pbtxt gs:// $ {YOUR_GCS_BUCKET} /data/pet_label_map.pbtxt
从头开始训练模型以识别宠物品种需要为每个宠物品种拍摄数千张训练图像并花费数小时或数天的训练时间。为了加快这一速度,我们可以利用迁移学习 - 我们采用已经在大量数据上训练执行类似的任务的模型权重来,然后用我们自己的数据上训练模型,微调预训练模型的层。
我们可以使用许多模型来训练识别图像中的各种对象。我们可以使用这些训练模型中的检查点,然后将它们应用于我们的自定义对象检测任务。这是有效的,对于机器而言,识别包含基本对象(如桌子,椅子或猫)的图像中的像素的任务与识别包含特定宠物品种的图像中的像素区别不大。
对于这个例子,我们使用MobileNet的SSD,MobileNet是一种针对移动设备进行优化的对象检测模型。首先,下载并提取已在COCO数据集上预训练的最新MobileNet检查点。要查看Object Detection API支持的所有模型的列表,请查看下方链接(model zoo)。提取检查点后,将3个文件复制到GCS存储桶中。运行以下命令下载检查点并将其复制到存储桶中:
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 /
机器学习模型有两个不同的计算组件:训练和推理。在此示例中,我们正在利用Cloud TPU来加速训练。配置文件中有几行专门与TPU训练相关。我们可以在TPU训练时使用更大的批尺寸,因为它们可以更轻松地处理大型数据集(在你自己的数据集上试验批尺寸时,请使用8的倍数,因为数据需要均匀分配8个TPU核心)。对于我们的模型来说,使用更大的批尺寸,我们可以减少训练步骤的数量(在本例中我们使用2000)。我们用于此训练作业的focal loss函数(在配置中的以下行中定义)也非常适合TPU:
loss {
classification_loss {
weighted_sigmoid_focal {
alpha: 0.75,
gamma: 2.0
}
}
损失函数计算数据集中每个实例的损失,然后重新计算权重,将更多的相对权重分配给难分类的实例。与其他训练工作中使用的难的实例挖掘操作相比,它更适合TPU(更多,阅读论文:https://arxiv.org/abs/1708.02002)。
综上,初始化预训练模型检查点然后添加我们自己的训练数据的过程称为迁移学习。配置中的以下几行告诉我们的模型,我们将从预先训练的检查点开始进行对象检测的迁移学习。
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
}
}
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”
}
gsutil cp object_detection / samples / configs / ssd_mobilenet_v1_0.75_depth_quantized_300x300_pets_sync.config gs:// $ {YOUR_GCS_BUCKET} /data/pipeline.config
bash object_detection / dataset_tools / create_pycocotools_package.sh / tmp / pycocotools
python setup.py sdist
(cd slim && python setup.py sdist)
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
tensorboard --logdir = gs:// $ {YOUR_GCS_BUCKET} / train
在左图中,我们看到了模型对此图像的预测,在右侧我们看到了正确的地面真值边框。边界框非常准确,但在这种特殊情况下,我们模型的标签预测是不正确的。没有ML模型可以是完美的。:)
此时,你以及拥有了一个训练好的宠物种类检测器,你可以使用Colab notebook在零点设置的情况下在浏览器中测试你自己的图像。要在手机上实时运行此模型需要一些额外的步骤。在本节中,我们将向你展示如何使用TensorFlow Lite获得更小的模型,并允许你利用针对移动设备优化的操作。TensorFlow Lite是TensorFlow针对移动和嵌入式设备的轻量级解决方案。它支持设备内机器学习推理,具有低延迟和小的二进制尺寸。TensorFlow Lite使用了许多技术,例如允许更小和更快(定点数学)模型的量化内核。
Colab notebook:https://colab.research.google.com/github/tensorflow/models/blob/master/research/object_detection/object_detection_tutorial.ipynb
如上所述,对于本节,你需要使用提供的Dockerfile,或者从源构建TensorFlow(支持GCP)并安装bazel构建工具。请注意,如果你只想在不训练模型的情况下完成本教程的第二部分,我们提供了一个预训练的模型。
预训练模型:https://storage.googleapis.com/download.tensorflow.org/models/tflite/ssd_mobilenet_v1_0.75_depth_300x300_quant_pets_2018_06_29.zip
为了使这些命令更容易运行,让我们设置一些环境变量:
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
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
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
bazel build -c opt --config=android_arm{,64} --cxxopt='--std=c++11' \
//tensorflow/contrib/lite/examples/android:tflite_demo
adb install bazel-bin / tensorflow / contrib / lite / examples / android / tflite_demo.apk
尝试运行这个初级app(TFLDetect),把你的相机对准人、家具、汽车、宠物等等。你将在检测到的对象周围看到带有标签的框。运行的测试应用程序是使用COCO数据集训练的。
示例:https://www.youtube.com/watch?v=jU5jYwbMTPQ&feature=youtu.be
当你使用通用检测器时,将其替换为你定制的宠物检测器非常简单。我们需要做的就是将应用程序指向我们新的detect.tflite文件,并为其指定新标签的名称。具体来说,我们使用以下命令将我们的TensorFlow Lite flatbuffer复制到app assets目录:
cp /tmp/tflite/detect.tflite \
tensorflow/contrib/lite/examples/android/app/src/main/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",
],
// 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";
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
现在来看最精彩的部分:找到最近的狗或猫,并尝试检测它。在像素2上,我们每秒大于15帧。
对象检测文档:https://github.com/tensorflow/models/tree/master/research/object_detection/g3doc
资源:https://github.com/tensorflow/models/tree/master/research/object_detection/dataset_tools
GitHub:https://github.com/tensorflow/models/tree/master/research/object_detection