noprianto
noprianto
. 12 min read

TensorFlow – Custom Object Detection API Cloud

Bismillah,
Gak papa ya judulnya menggunakan bahasa inggris, ke depan semoga konten juga bisa menggunakan bahasa inggris juga. Sebenarnya dari judul sudah kelihatan, yang akan kita lakukan adalah melakukan training data menggunakan cloud yaitu google colab. Google colab merupakan layanan google yang secara gratis untuk belajar machine learning berbasis cloud, kemudian dengan google colab kita juga tidak dikhawatirkan dengan spesifikasi komputer yang minim untuk melakukan training data karena yang cukup Anda butuhkan adalah koneksi internet. Bagi Anda yang sudah terbiasa menggunakan jupyter notebook akan sangat gampang jika menggunakannya, untuk lebih jelasnya bisa Anda baca-baca di website resminya di sini. Sebelum Anda memulai sebaiknya hal-hal berikut ini wajib sudah dilakukan

  • Mendaftar dan membuat project di google cloud platform. Bisa dibaca pada tulisan saya di sini.
  • Install Tensorflow Object Detection API. Sudah sangat lengkap di sini untuk step by stepnya.
  • Setting google cloud storage, karena nanti data-data akan disimpan di sana.
  • Install Google Cloud SDK, agar mudah melakukan perintah-perintah melalui komputer Anda. Dapat Anda temui proses instllasi tersebut di sini.
  • Menyiapkan semua konfigurasi yang dibutuhkan untuk melakukan training, sebaiknya Anda sudah berhasil menjalankan training di local komputer/laptop untuk beberapa iterasi.

Untuk memudahkan dalam memahami alur dari tulisan ini, saya bagi menjadi beberapa point seperti berikut

Pembuatan Paket Installasi

Paket disini nanti yang dibutuhkan ketika proses training, tool untuk pembuatan paket sudah disediakan ketika kita download atau clone tensorflow. Ketikkan perintah di bawah ini untuk membuat paket depedency TF-slim dan libraray picocotools.

# dari direktori tensorflow/models/research/
bash object_detection/dataset_tools/create_pycocotools_package.sh /tmp/pycocotools

Ketika dijalankan output dari perintah di atas kira-kira seperti di bawah ini.

Cloning into 'cocoapi'…
remote: Enumerating objects: 953, done.
remote: Total 953 (delta 0), reused 0 (delta 0), pack-reused 953
Receiving objects: 100% (953/953), 11.70 MiB | 2.48 MiB/s, done.
Resolving deltas: 100% (566/566), done

Sekarang coba dilakukan pengecekan dalam direktori /tmp/pycocotools seharusnya ada file pycocotools-2.0.tar.gz. Selanjutnya kita akan membuat modul object detection dengan command di bawah ini

python3 setup.py sdist

Kira-kira output dari perintah di atas ada sebagai berikut

...
creating object_detection-0.1
creating object_detection-0.1/object_detection
creating object_detection-0.1/object_detection.egg-info
creating object_detection-0.1/object_detection/anchor_generators
creating object_detection-0.1/object_detection/box_coders
...

Silakan cek hasil perintah di atas dalam direktori dist, seharusnya akan ada file object_detection-0.1.tar.gz yang terbentuk. Kemudian modul selanjutnya yang akan kita buat adalah slim, dengan perintah di bawah ini yang perlu Anda lakukan.

(cd slim && python3 setup.py sdist)

Output pada terminal Anda kurang lebih seperti di bawah ini

...
creating slim-0.1
creating slim-0.1/datasets
creating slim-0.1/deployment
creating slim-0.1/nets
creating slim-0.1/nets/mobilenet
...

Hasil dari perintah di atas bisa Anda cek dalam direktori slim/dist seharusnya akan terbentuk file slim-0.1.tar.gz

Mendefinisikan Environment Variable

Untuk memudahkan pemanggilan variabel yang kelak akan digunakan sebaiknya Anda mendefinisikan diawal dalam sebuah variabel environment agar menghindari typo atau salah ketika. Berikut ini yang bisa Anda lakukan, saya hanya mendefiniskan untuk nama project dan direktori google cloud storage. Jika Anda ingin menambahkan environment variabel yang lain silakan.

export PROJECT=$(gcloud config list project --format "value(core.project)")
export YOUR_GCS_BUCKET="gs://${PROJECT}-ml"

Nilai dalam variabel environment silakan disesuaikan dengan yang terdapat dalam project Anda, untuk nama variabel sebaiknya mengandung makna serta mudah untuk diketik, jangan terlalu panjang karena nanti akan kita panggil dengan mengetik manual. Variabel environment tersebut hanya bersifat sementara, jika buka tab baru terminal atau ditutup maka variabel tersebut akan hilang.

Upload File Konfigurasi Training

Untuk dapat upload file konfigurasi sebenarnya langkahnya sangat mudah sekali, file tersebut tentunya akan kita upload ke google cloud storage yang telah kita konfigurasi sebelumnya(pembuatan bucket). Anda bisa menggunakan mode gui yang telah disediakan google atau dapat memanfaatkan Google Cloud SDK, perintah di bawah ini menggunakan Google Cloud SDK melalui terminal.

gsutil cp train.record ${YOUR_GCS_BUCKET}/data/train.record
gsutil cp test.record ${YOUR_GCS_BUCKET}/data/test.record
gsutil cp object_detection/data/plate_number_map.pbtxt \
    ${YOUR_GCS_BUCKET}/data/plate_number_map.pbtxt

Perintah di atas digunakan untuk melakukan upload atau copy file *.record dan *.pbtxt ke Google Cloud Storage Anda, file *.record adalah file hasil hasil covert dari labeling ke file TFRecord sedangkan file *.pbtxt adalah file yang berisi tentang informasi label dan class id dari sebuah training. Anda bisa membaca tentang pembuataan file tersebut bisa ditemukan di sini, di blog tersebut dijelaskan secara detail. Selanjutnya yang dibutuhkan adalah arsitektur model yang sudah ada misalkan ssd menggunakan dataset coco, silakan download terlebih dahulu di sini.

├── checkpoint
├── frozen_inference_graph.pb
├── model.ckpt.data-00000-of-00001
├── model.ckpt.index
├── model.ckpt.meta
├── pipeline.config
└── saved_model
├── saved_model.pb
└── variables
2 directories, 7 files

Isi file tersebut ditampilkan seperti di atas, selanjutnya Anda juga membutuhkan file config dari model tersebut. Silakan download file yang dimaksud di sini atau sebenarnya juga terdapat dalam folder object_detection/samples/configs/, yang harus Anda sesuaikan adalah lokasi dari file-file yang dibutuhkan. Contoh konfigurasi yang saya gunakan adalah sebagai berikut

# SSD with Mobilenet v1, configured for the Raccoon dataset.
# Users should configure the fine_tune_checkpoint field in the train config as
# well as the label_map_path and input_path fields in the train_input_reader and
# eval_input_reader. Search for "${YOUR_GCS_BUCKET}" to find the fields that
# should be configured.

model {
ssd {
num_classes: 1
box_coder {
faster_rcnn_box_coder {
y_scale: 10.0
x_scale: 10.0
height_scale: 5.0
width_scale: 5.0
}
}
matcher {
argmax_matcher {
matched_threshold: 0.5
unmatched_threshold: 0.5
ignore_thresholds: false
negatives_lower_than_unmatched: true
force_match_for_each_row: true
}
}
similarity_calculator {
iou_similarity {
}
}
anchor_generator {
ssd_anchor_generator {
num_layers: 6
min_scale: 0.2
max_scale: 0.95
aspect_ratios: 1.0
aspect_ratios: 2.0
aspect_ratios: 0.5
aspect_ratios: 3.0
aspect_ratios: 0.3333
}
}
image_resizer {
fixed_shape_resizer {
height: 300
width: 300
}
}
box_predictor {
convolutional_box_predictor {
min_depth: 0
max_depth: 0
num_layers_before_predictor: 0
use_dropout: false
dropout_keep_probability: 0.8
kernel_size: 1
box_code_size: 4
apply_sigmoid_to_scores: false
conv_hyperparams {
activation: RELU_6,
regularizer {
l2_regularizer {
weight: 0.00004
}
}
initializer {
truncated_normal_initializer {
stddev: 0.03
mean: 0.0
}
}
batch_norm {
train: true,
scale: true,
center: true,
decay: 0.9997,
epsilon: 0.001,
}
}
}
}
feature_extractor {
type: 'ssd_mobilenet_v1'
min_depth: 16
depth_multiplier: 1.0
conv_hyperparams {
activation: RELU_6,
regularizer {
l2_regularizer {
weight: 0.00004
}
}
initializer {
truncated_normal_initializer {
stddev: 0.03
mean: 0.0
}
}
batch_norm {
train: true,
scale: true,
center: true,
decay: 0.9997,
epsilon: 0.001,
}
}
}
loss {
classification_loss {
weighted_sigmoid {
anchorwise_output: true
}
}
localization_loss {
weighted_smooth_l1 {
anchorwise_output: true
}
}
hard_example_miner {
num_hard_examples: 3000
iou_threshold: 0.99
loss_type: CLASSIFICATION
max_negatives_per_positive: 3
min_negatives_per_image: 0
}
classification_weight: 1.0
localization_weight: 1.0
}
normalize_loss_by_num_matches: true
post_processing {
batch_non_max_suppression {
score_threshold: 1e-8
iou_threshold: 0.6
max_detections_per_class: 100
max_total_detections: 100
}
score_converter: SIGMOID
}
}
}
train_config: {
batch_size: 8
optimizer {
rms_prop_optimizer: {
learning_rate: {
exponential_decay_learning_rate {
initial_learning_rate: 0.004
decay_steps: 800720
decay_factor: 0.95
}
}
momentum_optimizer_value: 0.9
decay: 0.9
epsilon: 1.0
}
}
fine_tune_checkpoint: "gs://tf-plate-detection-ml/data/model.ckpt"
from_detection_checkpoint: true
num_steps: 10000
data_augmentation_options {
random_horizontal_flip {
}
}
data_augmentation_options {
ssd_random_crop {
}
}
}
train_input_reader: {
tf_record_input_reader {
input_path: "gs://tf-plate-detection-ml/data/train.record"
}
label_map_path: "gs://tf-plate-detection-ml/data/plate_number_map.pbtxt"
}
eval_config: {
num_examples: 40
}
eval_input_reader: {
tf_record_input_reader {
input_path: "gs://tf-plate-detection-ml/data/test.record"
}
label_map_path: "gs://tf-plate-detection-ml/data/plate_number_map.pbtxt"
shuffle: false
num_readers: 1
}
gsutil cp ssd_mobilenet_v1_coco_2018_01_28/model.ckpt.* ${YOUR_GCS_BUCKET}/data/
gsutil cp [path_file_config].config ${YOUR_GCS_BUCKET}/data/

Strukur direktori yang terdapat di dalam Google Cloud Storage kira-kira seperti di bawah ini

Google Cloud Platform
Google Cloud Platform

Satu file lagi yang dibutuhkan adalah file yaml untuk mendeskripsikan parameter-parameter ketika melakukan training. Contoh isi file tersebut adalah sebagai berikut

trainingInput:
runtimeVersion: '1.13'
pythonVersion: '3.5'
scaleTier: CUSTOM
masterType: standard
workerCount: 3
workerType: standard
parameterServerCount: 1
parameterServerType: standard

Untuk memahami tentang konfigurasi tersebut dapat dipahami di sini, dengan melakukan ujicoba pada parameter-parameter tersebut akan memaksimalkan ketika training. Tetapi tentunya konfigurasi tersebut disesuaikan dengan layanan Google Cloud, maksudnya adalah Google Cloud memberikan spesifikasi minimal ketika kita mendaftar di akun yang gratis. Jika untuk kebutuhan belajar, menurut saya sudah mencukupi daripada harus menjalankan di local komputer/laptop.

Silakan jalankan perintah di bawah ini untuk melakukan training, atau membuat job pada Google Cloud

gcloud ai-platform jobs submit training object_detection_date +%m_%d_%Y_%H_%M_%S \
--job-dir=${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 \
--region us-central1 \
--config object_detection/samples/cloud/cloud-sample.yml \
-- \
--model_dir=${YOUR_GCS_BUCKET}/data \
--pipeline_config_path=${YOUR_GCS_BUCKET}/data/ssd_mobilenet_v1_plate_number_cloud.config

Kemudian untuk memantau job training yang kita lakukan dapat menggunakan perintah di bawah ini, sebenarnya Anda juga bisa melihat aktifitasnya dalam dashboard Google Cloud Platform via browser tetapi saya lebih suka lewat terminal.

gcloud ai-platform jobs stream-logs [job_id]

Contohnya adalah sebagai berikut

gcloud ai-platform jobs stream-logs object_detection_05_14_2019_13_23_17
...
ERROR 2019-05-14 09:20:53 +0700 service import matplotlibnmatplotlib.use('Agg')nimport matplotlib.pyplot as plt
ERROR 2019-05-14 09:20:53 +0700 service ^
ERROR 2019-05-14 09:20:53 +0700 service SyntaxError: invalid syntax
ERROR 2019-05-14 09:20:53 +0700 service
ERROR 2019-05-14 09:20:53 +0700 service To find out more about why your job exited please check the logs: https://console.cloud.google.com/logs/viewer?project=84697927134&resource=ml_job%2Fjob_id%2Fobject_detection_05_14_2019_09_14_13&advancedFilter=resource.type%3D%22ml_job%22%0Aresource.labels.job_id%3D%22object_detection_05_14_2019_09_14_13%22
INFO 2019-05-14 09:21:45 +0700 service Finished tearing down training program.
INFO 2019-05-14 09:21:45 +0700 service Job failed.
...

Jika ditemukan error di atas jangan khawatir, ada yang perlu Anda sesuaikan sedikit ketika pembuatan paket picocotools. Error tersebut karena karakter new line “\n” pada MacOS. Silakan disesuikan file yang ada di object_detection/dataset_tools/create_pycocotools_package.sh

sed "s/import matplotlib\.pyplot as plt/import matplotlib\nmatplotlib\.use\(\'Agg\'\)\nimport matplotlib\.pyplot as plt/g" pycocotools/coco.py > coco.py.updated

Diganti menjadi

sed "s/import matplotlib\.pyplot as plt/import matplotlib;matplotlib\.use\(\'Agg\'\);import matplotlib\.pyplot as plt/g" pycocotools/coco.py > coco.py.updated

Monitoring Training Dengan Tensorboard

Dengan tensorflow kita dapat melihat hasil visualisasi dari hasil training yang telah kita lakukan atau sedang berlangsung. Silakan jalankan perintah di bawah ini pada terminal untuk melihat hasil training menggunakan tensorboard

gcloud auth application-default login
tensorboard --logdir=${YOUR_GCS_BUCKET}

Kemudian buka browser Anda dengan URL localhost:6060, jika semuanya normal harusnya akan tampil seperti ditunjukkan pada gambar di bawah ini

Tensorboard
Tensorboard

Demikianlah tulisan saya mengenai training data object detection API tensorflow memanfaatkan layanana Google Cloud Platform, untuk file-file pendukung dapat diunduh di sini. Semoga bermanfaat bagi temen-temen yang suka bermain dengan computer vision. Cheers! 🙂

Referensi

comments powered by Disqus