运行以下命令将当前项目设置为刚创建的项目,将YOUR_PROJECT_NAME替换为项目名称:
1gcloudconfigsetprojectYOUR_PROJECT_NAME
然后,我们将使用以下命令创建云存储桶。请注意,存储桶名称必须全局唯一。
1gsutilmbgs://YOUR_UNIQUE_BUCKET_NAME
这可能会提示您先运行gcloudauthlogin,之后您需要提供发送到浏览器的验证码。
然后设置两个环境变量以简化在本教程中使用命令的方式:
1exportPROJECT="YOUR_PROJECT_ID"
2exportYOUR_GCS_BUCKET="YOUR_UNIQUE_BUCKET_NAME"
接下来,为了让CloudTPU能访问我们的项目,我们需要添加一个TPU特定服务帐户。首先,使用以下命令获取服务帐户的名称:
当此命令完成时,复制tpuServiceAccount(它看起来像your-service-account-12345@cloud-tpu.iam.gserviceaccount.com)的值,然后将其保存为环境变量:
1exportTPU_ACCOUNT=your-service-account
最后,给您的TPU服务帐户授予ml.serviceAgent角色:
1gcloudprojectsadd-iam-policy-binding$PROJECT
2--memberserviceAccount:$TPU_ACCOUNT--roleroles/ml.serviceAgent
安装Tensorflow
安装TensorFlow对象检测
如果这是您第一次使用TensorFlow对象检测,我们将非常欢迎您的首次尝试!要安装它,请按照此处说明进行操作。
注:说明链接
一旦对象检测安装完毕,请务必通过运行以下命令来测试是否安装成功:
如果安装成功,您应该看到以下输出:
1Ran18testsin0.079s
2
3OK
设置数据集
为了直接深入到训练环节,我们公开了文件pet_faces_train.record和pet_faces_val.record,点击此处这里公开。您可以使用公共TFRecord文件,或者如果您想自己生成它们,请按照此处的步骤操作。
注:这里公开链接
您可以使用以下命令下载并解压缩公共TFRecord文件:
1mkdir/tmp/pet_faces_tfrecord/
2cd/tmp/pet_faces_tfrecord/
请注意,这些TFRecord文件是分片的,因此一旦提取它们,您将拥有10个pet_faces_train.record文件和10个pet_faces_val.record文件。
上传数据集到GCS
一旦获得TFRecord文件后,将它们复制到GCS存储桶的data子目录下:
1gsutil-mcp-r/tmp/pet_faces_tfrecord/pet_faces*gs://${YOUR_GCS_BUCKET}/data/
使用GCS中的TFRecord文件,并切换到本地计算机的models/research目录。接下来,您将在GCS存储桶中添加该pet_label_map.pbtxt文件。我们将要检测的37个宠物品种一一映射到整数,以便我们的模型可以理解它们。最后,从models/research目录运行以下命令:
1gsutilcpobject_detection/data/pet_label_map.pbtxtgs://${YOUR_GCS_BUCKET}/data/pet_label_map.pbtxt
使用SSDMobileNet检查点进行迁移学习
为了识别图像中的各种物体,我们需要训练大量的模型。我们可以使用这些训练模型中的检查点,然后将它们应用于我们的自定义对象检测任务。这种方式是可行的,因为对于机器而言,识别包含基本对象(如桌子,椅子或猫)图像中的像素与识别包含特定宠物品种图像中的像素没有太大区别。
注:最新MobileNet检查点链接
一旦成功解压缩检查点后,将3个文件复制到GCS存储桶中。运行以下命令下载检查点并将其复制到存储桶中:
1cd/tmp
3tarx***ssd_mobilenet_v1_0.75_depth_300x300_coco14_sync_2018_07_03.tar.gz
4
当我们训练模型时,将使用这些检查点作为训练的起点。现在,您的GCS存储桶中应该有24个文件。目前我们已经准备好开始训练任务,但我们需要一种方法来告诉MLEngine我们的数据和模型检查点的位置。我们将使用配置文件执行此操作,我们将在下一步中设置该配置文件。我们的配置文件为我们的模型提供了超参数,训练数据的文件路径,测试数据和初始模型检查点。
在CloudMLEngine上使用CloudTPU训练量化模型
机器学习模型有两个不同的计算组件:训练和推理。在此示例中,我们利用CloudTPU来加速训练。我们在配置文件中对CloudTPU进行设置。
在CloudTPU上进行训练时,可以使用更大的批量大小,因为它们可以更轻松地处理大型数据集(在您自己的数据集上试验批量大小时,请确保使用8的倍数,因为数据需要均匀分配到CloudTPU)。在我们的模型上使用更大的批量大小,可以减少训练步骤的数量(在本例中我们使用2000)。
针对于此训练任务的焦点损失函数也适用于CloudTPU,损失函数在配置文件中的定义如下所示:
1loss{
2classification_loss{
3weighted_sigmoid_focal{
4alpha:0.75,
5gamma:2.0
6}
7}
损失函数用于计算数据集中每个示例的损失,然后对其进行重新计算,为错误分类的示例分配更多的相对权重。与其他训练任务中使用的挖掘操作相比,此逻辑更适合CloudTPU。你可以在Lin等人中阅读更多关于损失函数的内容(2017)。
初始化预训练模型检查点然后添加我们自己的训练数据的过程称为迁移学习。配置中的以下几行告诉我们的模型,我们将从预先训练的检查点开始进行转移学习。
1fine_tune_checkpoint:"gs://your-bucket/data/model.ckpt"
2fine_tune_checkpoint_type:"detection"
这就是模型量化的用武之地。利用量化技术我们可以将模型中的权重压缩为8-bit的定点表示。配置文件中的以下几行将生成量化模型:
1graph_rewriter{
2quantization{
3delay:1800
4activation_bits:8
5weight_bits:8
为了告诉MLEngine训练和测试文件以及模型检查点的位置,您需要在我们为您创建的配置文件中更新几行以指向您的存储桶。从research目录中,找到文件object_detection/samples/configs/ssd_mobilenet_v1_0.75_depth_quantized_300x300_pets_sync.config。将所有PATH_TO_BE_CONFIGURED字符串更新为GCS存储桶中data目录的绝对路径。
例如,train_input_reader配置部分将如下所示(确保YOUR_GCS_BUCKET为您的存储桶的名称):
1train_input_reader:{
2tf_record_input_reader{
3input_path:"gs://YOUR_GCS_BUCKET/data/pet_faces_train*"
4}
5label_map_path:"gs://YOUR_GCS_BUCKET/data/pet_label_map.pbtxt"
然后将此量化配置文件复制到您的GCS存储桶中:
1gsutilcpobject_detection/samples/configs/ssd_mobilenet_v1_0.75_depth_quantized_300x300_pets_sync.configgs://${YOUR_GCS_BUCKET}/data/pipeline.config
在我们启动CloudMLEngine的训练工作之前,我们需要打包ObjectDetectionAPI,pycocotools和TFSlim。我们可以使用以下命令执行此操作(从research/目录运行此命令,并注意括号是命令的一部分):
1bash
2object_detection/dataset_tools/create_pycocotools_package.sh/tmp/pycocotools
3(cdslim&&pythonsetup.pysdist)
至此,我们已经准备好开始训练我们的模型了!要启动训练,请运行以下gcloud命令:
2--job-dir=gs://${YOUR_GCS_BUCKET}/train
3--packagesdist/object_detection-0.1.tar.gz,slim/dist/slim-0.1.tar.gz,/tmp/pycocotools/pycocotools-2.0.tar.gz
4--module-nameobject_detection.model_tpu_main
5--runtime-version1.8
7--regionus-central1
8--
9--model_dir=gs://${YOUR_GCS_BUCKET}/train
10--tpu_zoneus-central1
11--pipeline_config_path=gs://${YOUR_GCS_BUCKET}/data/pipeline.config
请注意,如果您收到错误消息,指出没有可用的CloudTPU,我们建议您在另一个区域进行重试(CloudTPU目前可用于us-central1-b,us-central1-c,europe-west4-a,asia-east1-c)。
在启动训练工作之后,运行以下命令开始评估:
1gcloudml-enginejobssubmittraining`whoami`_object_detection_eval_validation_`date+%s`
4--module-nameobject_detection.model_main
10--pipeline_config_path=gs://${YOUR_GCS_BUCKET}/data/pipeline.config
11--checkpoint_dir=gs://${YOUR_GCS_BUCKET}/train
训练和评估都应在大约30分钟内完成。在运行时,您可以使用TensorBoard查看模型的准确性。要启动TensorBoard,请运行以下命令:
1tensorboard--logdir=gs://${YOUR_GCS_BUCKET}/train
请注意,您可能需要先运行gcloudauthapplication-defaultlogin。
在浏览器地址栏中输入localhost:6006,从而查看您的TensorBoard输出。在这里,您将看到一些常用的ML指标,用于分析模型的准确性。请注意,这些图表仅绘制了2个点,因为我们的模型是在很少的步骤中快速训练。这里的第一个点代表训练过程的早期,最后一个点显示最后一步的指标。
首先,让我们看一下0.5IOU(mAP@.50IOU)平均精度的图表:
平均精度衡量模型会对所有37个标签的正确性预测百分比。IoU特定于对象检测模型,代表Intersection-over-Union。我们用百分比表示测量模型生成的边界框与地面实况边界框之间的重叠度。此图表展示的是测量模型返回的正确边界框和标签的百分比,在这种情况下“正确”指的是与其对应的地面实况边界框重叠50%或更多。训练后,我们的模型实现了82%的平均精确度。
接下来,查看TensorBoard中的Images选项卡:
在左图中,我们看到了模型对此图像的预测,在右侧我们看到了正确的地面实况框。边界框非常准确,在本案例中,我们模型的标签预测是不正确的。没有ML模型是完美的。
使用TensorFlowLite在移动设备上运行
至此,您将拥有一个训练有素的宠物探测器,您可以使用thisColabnotebook在零设置的情况下在浏览器中测试图像。
注:thisColabnotebook链接
如上所述,对于本节,您需要使用提供的Dockerfile,或者从源代码构建TensorFlow(支持GCP)并安装bazel构建工具。请注意,如果您只想在不训练模型的情况下完成本教程的第二部分,我们已为您制作了预训练的模型。
为了使这些命令更容易运行,让我们设置一些环境变量:
1exportCONFIG_FILE=gs://${YOUR_GCS_BUCKET}/data/pipeline.config
2exportCHECKPOINT_PATH=gs://${YOUR_GCS_BUCKET}/train/model.ckpt-2000
3exportOUTPUT_DIR=/tmp/tflite
我们首先获得一个TensorFlow冻结图,其中包含我们可以与TensorFlowLite一起使用的兼容操作。首先,您需要安装这些python库。然后,为了获取冻结的图形,在models/research目录下运行脚本export_tflite_ssd_graph.py:
1pythonobject_detection/export_tflite_ssd_graph.py
2--pipeline_config_path=$CONFIG_FILE
3--trained_checkpoint_prefix=$CHECKPOINT_PATH
4--output_directory=$OUTPUT_DIR
5--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将输出我们可以直接输入到TensorFlowLite的冻结图形,并且是我们将要使用的图形。
1bazelrun-copttensorflow/contrib/lite/toco:toco--
2--input_file=$OUTPUT_DIR/tflite_graph.pb
3--output_file=$OUTPUT_DIR/detect.tflite
4--input_shapes=1,300,300,3
5--input_arrays=normalized_input_image_tensor
7--inference_type=QUANTIZED_UINT8
8--mean_values=128
9--std_values=128
10--change_concat_input_ranges=false
11--allow_custom_ops
将每个摄像机图像帧调整为300x300像素后,此命令采用输入张量normalized_input_image_tensor。
在Android设备上运行模型
在尝试获得刚训练的宠物模型之前,首先运行带有默认模型的演示应用程序,该模型是在COCO数据集上训练的。要编译演示应用程序,请从tensorflow目录下运行此bazel命令:
2//tensorflow/contrib/lite/examples/android:tflite_demo
上面的apk针对64位架构而编译。为了支持32位架构,可以修改编译参数为--config=android_arm。现在可以通过AndroidDebugBridge(adb)在支持调试模式的Android手机上安装演示:
1adbinstallbazel-bin/tensorflow/contrib/lite/examples/android/tflite_demo.apk
尝试启动该应用程序(称为TFLDetect)并将相机对准人,家具,汽车,宠物等。您将在检测到的对象周围看到带有标签的框。此应用程序使用COCO数据集进行训练。
一旦成功运行通用检测器,将其替换为您的定制宠物检测器将会非常简单。我们需要做的就是将应用程序指向我们新的detect.tflite文件,并为其指定新标签的名称。具体来说,我们将使用以下命令将TensorFlowLiteFlatbuffer资源复制到appassets目录:
1cp/tmp/tflite/detect.tflite
2tensorflow/contrib/lite/examples/android/app/src/main/assets
我们现在将编辑BUILD文件以指向新模型。首先,在目录tensorflow/contrib/lite/examples/android/中打开BUILD文件。然后找到assetssection,并将该行“@tflite_mobilenet_ssd_quant//:detect.tflite”(默认情况下指向COCO预训练模型)替换为您的TFLite宠物模型路径(“//tensorflow/contrib/lite/examples/android/app/src/main/assets:detect.tflite”)。最后,更改assetssection的最后一行以使用新的标签映射。如下所示:
1assets=[
2"//tensorflow/contrib/lite/examples/android/app/src/main/assets:labels_mobilenet_quant_v1_224.txt",
3"@tflite_mobilenet//:mobilenet_quant_v1_224.tflite",
4"@tflite_conv_actions_frozen//:conv_actions_frozen.tflite",
5"//tensorflow/contrib/lite/examples/android/app/src/main/assets:conv_actions_labels.txt",
6"@tflite_mobilenet_ssd//:mobilenet_ssd.tflite",
7"//tensorflow/contrib/lite/examples/android/app/src/main/assets:detect.tflite",
8"//tensorflow/contrib/lite/examples/android/app/src/main/assets:box_priors.txt",
9"//tensorflow/contrib/lite/examples/android/app/src/main/assets:pets_labels_list.txt",
10],
DetectorActivity.java修改如下所示:
1//ConfigurationvaluesfortheprepackagedSSDmodel.
2privatestaticfinalintTF_OD_API_INPUT_SIZE=300;
privatestaticfinalbooleanTF_OD_API_IS_QUANTIZED=true;
3privatestaticfinalStringTF_OD_API_MODEL_FILE="detect.tflite";
4privatestaticfinalStringTF_OD_API_LABELS_FILE="file:///android_asset/pets_labels_list.txt";
一旦我们复制完TensorFlowLite文件并编辑BUILD和DetectorActivity.java文件后,可以使用以下命令重新编译并安装应用程序:
3adbinstall-rbazel-bin/tensorflow/contrib/lite/examples/android/tflite_demo.apk
现在到了见证奇迹的时刻:找到离您最近的阿猫阿狗,试着去检测它们吧。
浏览量
原文标题:使用CloudTPU在30分钟内训练并部署实时移动物体探测器
下载发烧友APP
电子发烧友观察
长沙市望城经济技术开发区航空路6号手机智能终端产业园2号厂房3层(0731-88081133)