Petunjuk TensorFlow Object Detection API


Terjemahan dari tutorial TensorFlow Object Detection API - Pelatihan dan Mengevaluasi Custom Object Detector .

Kita semua tahu cara mengendarai mobil, cukup mudah, bukan? Tapi apa yang akan Anda lakukan jika seseorang meminta Anda naik ke pesawat? Itu benar - Anda akan membaca instruksinya. Demikian juga, manual di bawah ini akan membantu Anda mengatur API Anda dan menikmati penerbangan yang menyenangkan.

Pertama-tama, klon repositori dengan referensi . Saya harap Anda sudah menginstal TensorFlow .

git clone github.com/tensorflow/models.git

Dalam pembelajaran mesin, kami biasanya melatih dan menguji suatu model menggunakan file CSV. Tetapi dalam kasus ini, kami bertindak sesuai dengan skema yang ditunjukkan pada gambar:



Sebelum melanjutkan, mari kita memikirkan struktur direktori yang akan kita gunakan.

  • data / - Ini akan berisi catatan dan file CSV.
  • images / - Berikut ini adalah dataset untuk melatih model kami.
  • pelatihan / - Di sini kita menyimpan model yang terlatih.
  • eval / - Ini akan menyimpan hasil evaluasi model.

Langkah 1: menyimpan gambar ke CSV


Semuanya sangat sederhana di sini. Kami tidak akan mempelajari tugas ini, saya hanya akan memberikan beberapa tautan bermanfaat.

Tugas kita adalah memberi tag pada gambar dan membuat file train.CSV dan test.CSV.

  • Menggunakan alat labelImg, tandai gambar. Cara melakukannya, lihat di sini .
  • Konversi XML ke CSV, seperti yang ditunjukkan di sini .

Ada banyak cara untuk membuat file CSV, lebih atau kurang cocok untuk bekerja dengan setiap set data tertentu.

Sebagai bagian dari proyek kami, kami akan mencoba untuk mencapai deteksi nodus paru menggunakan dataset LUNA . Koordinat node sudah diketahui, dan karena itu pembuatan file CSV tidak sulit. Untuk menemukan node, kami menggunakan 6 koordinat yang ditunjukkan di bawah ini:



Anda harus mengoreksi hanya nama nodules kelas (node), semua yang lain akan tetap tidak berubah. Setelah objek yang ditandai disajikan dalam bentuk angka, Anda dapat melanjutkan ke pembuatan TFRecords.

Langkah 2: buat TFRecords


API Deteksi Objek TensorFlow tidak menerima input untuk melatih model dalam format CSV, jadi Anda perlu membuat TFRecords menggunakan file ini.

 """ Usage: # From tensorflow/models/ # Create train data: python generate_tfrecord.py --csv_input=data/train_labels.csv --output_path=train.record # Create test data: python generate_tfrecord.py --csv_input=data/test_labels.csv --output_path=test.record """ from __future__ import division from __future__ import print_function from __future__ import absolute_import import os import io import pandas as pd import tensorflow as tf from PIL import Image from object_detection.utils import dataset_util from collections import namedtuple, OrderedDict flags = tf.app.flags flags.DEFINE_string('csv_input', '', 'Path to the CSV input') flags.DEFINE_string('output_path', '', 'Path to output TFRecord') FLAGS = flags.FLAGS # TO-DO replace this with label map def class_text_to_int(row_label): if row_label == 'raccoon': return 1 else: None def split(df, group): data = namedtuple('data', ['filename', 'object']) gb = df.groupby(group) return [data(filename, gb.get_group(x)) for filename, x in zip(gb.groups.keys(), gb.groups)] def create_tf_example(group, path): with tf.gfile.GFile(os.path.join(path, '{}'.format(group.filename)), 'rb') as fid: encoded_jpg = fid.read() encoded_jpg_io = io.BytesIO(encoded_jpg) image = Image.open(encoded_jpg_io) width, height = image.size filename = group.filename.encode('utf8') image_format = b'jpg' xmins = [] xmaxs = [] ymins = [] ymaxs = [] classes_text = [] classes = [] for index, row in group.object.iterrows(): xmins.append(row['xmin'] / width) xmaxs.append(row['xmax'] / width) ymins.append(row['ymin'] / height) ymaxs.append(row['ymax'] / height) classes_text.append(row['class'].encode('utf8')) classes.append(class_text_to_int(row['class'])) tf_example = tf.train.Example(features=tf.train.Features(feature={ 'image/height': dataset_util.int64_feature(height), 'image/width': dataset_util.int64_feature(width), 'image/filename': dataset_util.bytes_feature(filename), 'image/source_id': dataset_util.bytes_feature(filename), 'image/encoded': dataset_util.bytes_feature(encoded_jpg), 'image/format': dataset_util.bytes_feature(image_format), 'image/object/bbox/xmin': dataset_util.float_list_feature(xmins), 'image/object/bbox/xmax': dataset_util.float_list_feature(xmaxs), 'image/object/bbox/ymin': dataset_util.float_list_feature(ymins), 'image/object/bbox/ymax': dataset_util.float_list_feature(ymaxs), 'image/object/class/text': dataset_util.bytes_list_feature(classes_text), 'image/object/class/label': dataset_util.int64_list_feature(classes), })) return tf_example def main(_): writer = tf.python_io.TFRecordWriter(FLAGS.output_path) path = os.path.join(os.getcwd(), 'images') examples = pd.read_csv(FLAGS.csv_input) grouped = split(examples, 'filename') for group in grouped: tf_example = create_tf_example(group, path) writer.write(tf_example.SerializeToString()) writer.close() output_path = os.path.join(os.getcwd(), FLAGS.output_path) print('Successfully created the TFRecords: {}'.format(output_path)) if __name__ == '__main__': tf.app.run() 

Setelah mengunduh file, buat satu perubahan kecil: pada baris 31, alih-alih kata raccoon beri tanda Anda sendiri. Dalam contoh yang diberikan, ini adalah nodules , node. Jika model Anda perlu mendefinisikan beberapa jenis objek, buat kelas tambahan.

Catatan Penomoran label harus dimulai dari satu, bukan dari nol. Misalnya, jika Anda menggunakan tiga jenis objek, mereka harus diberi nilai masing-masing 1, 2, dan 3.

Gunakan kode berikut untuk membuat file train.record :

 python generate_tfRecord.py --CSV_input=data/train.CSV --output_path=data/train.record 

Gunakan kode berikut untuk membuat file test.record :

 python generate_tfrecord.py — CSV_input=data/test.CSV — output_path=data/test.record 

Langkah 3: pelatihan model


Setelah file yang kita butuhkan dibuat, kita hampir siap untuk mulai belajar.

  1. Pilih model yang akan diajarkan. Anda harus menemukan kompromi antara kecepatan dan akurasi: semakin tinggi kecepatan, semakin rendah keakuratan tekad, dan sebaliknya. Di sini, sd_mobilenet_v1_coco digunakan sebagai contoh.
  2. Setelah memutuskan model mana yang akan Anda gunakan, unduh file konfigurasi yang sesuai . Dalam contoh ini, ini adalah ssd_mobilenet_v1_coco.config .
  3. Buat file object-detection.pbtxt yang terlihat seperti ini:

     item { id: 1 name: 'nodule' } 

    Beri nodule nama yang berbeda. Jika ada beberapa kelas, tambah nilai id dan masukkan nama baru.

Saatnya mengkonfigurasi file konfigurasi, membuat penyesuaian berikut.

Ubah jumlah kelas sesuai dengan kebutuhan Anda.

 #before num_classes: 90 #After num_classes: 1 

Jika kekuatan GPU Anda tidak mencukupi, turunkan nilai batch_size .

 batch_size: 24 

Tentukan jalur ke model ssd_mobilenet_v1_coco yang kami unduh sebelumnya.

 #before fine_tune_checkpoint: "PATH_TO_BE_CONFIGURED/model.ckpt" #after fine_tune_checkpoint: "ssd_mobilenet_v1_coco/model.ckpt" 

Tentukan path ke file train.record .

 #before train_input_reader: { tf_record_input_reader { input_path: "PATH_TO_BE_CONFIGURED/mscoco_train.record" } label_map_path: "PATH_TO_BE_CONFIGURED/mscoco_label_map.pbtxt" } #after train_input_reader: { tf_record_input_reader { input_path: "data/train.record" } label_map_path: "data/object-detection.pbtxt" } 

Tentukan path ke file test.record.

 #before eval_input_reader: { tf_record_input_reader { input_path: "PATH_TO_BE_CONFIGURED/mscoco_val.record" } label_map_path: "PATH_TO_BE_CONFIGURED/mscoco_label_map.pbtxt" shuffle: false num_readers: 1} #after eval_input_reader: { tf_record_input_reader { input_path: "data/test.record" } label_map_path: "data/object-detection.pbtxt" shuffle: false num_readers: 1} 

Sekarang salin data / dan gambar / folder ke folder model / penelitian / deteksi objek . Jika Anda diminta untuk menggabungkan folder, terima folder itu.

Selain itu, kita akan membutuhkan file train.py yang terletak di direktori deteksi objek / .

 cd models/research/object-detection 

Buat pelatihan / folder di objek-deteksi / folder . Itu dalam pelatihan / kami akan menyimpan model kami. Salin ssd_mobilenet_v1_coco.config ke file pelatihan / konfigurasi. Pelatihan dilakukan dengan menggunakan perintah:

 python train.py --logtostderr \ --train_dir=training/ \ --pipeline_config_path=training/ssd_mobilenet_v1_coco.config 

Jika semuanya berjalan sesuai rencana, Anda akan melihat bagaimana fungsi kerugian berubah di setiap tahap.

Langkah 4: Evaluasi Model


Akhirnya, kami mengevaluasi model yang disimpan dalam direktori pelatihan / . Untuk melakukan ini, jalankan file eval.py dan masukkan perintah berikut:

 python eval.py \ --logtostderr \ --pipeline_config_path=training/ssd_mobilenet_v1_coco.config \ --checkpoint_dir=training/ \ --eval_dir=eval/ 

Hasil verifikasi akan tercermin dalam folder / eval . Mereka dapat divisualisasikan menggunakan TensorBoard.

 #To visualize the eval results tensorboard --logdir=eval/ #TO visualize the training results tensorboard --logdir=training/ 

Buka tautan melalui browser. Di tab Gambar , Anda akan melihat hasil model:



Itu saja, Anda telah berhasil mengonfigurasi API Deteksi Objek TensorFlow.

Salah satu kesalahan paling umum:

No module named deployment on object_detection/train.py

Itu dipecahkan menggunakan perintah:

 # From tensorflow/models/research/ export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim 

Anda dapat membaca tentang cara mengubah parameter Faster-RCNN / SSD di sini .

Terima kasih atas perhatian anda!

Source: https://habr.com/ru/post/id422353/


All Articles