noprianto
noprianto
. 5 min read

Object Recognized Menggunakan OpenCV

Bismillah,
Pada artikel kali ini saya akan menulis tentang pengenalan objek menggunakan OpenCV, di awal sementara kita memanfaatkan model yang sudah ada atau hasil dari training menggunakan tensorflow. Memang model tersebut belum tentu cocok diterapkan pada kasus yang kita hadapi atau kasus di sekitar kita.

Cerita sedikit terkait dengan pengenalan objek untuk pemanfaatan kehidupan sehari-hari, ada yang pernah tentang human counting di suatu ruangan atau di suatu pedestrian? Ya itu salah satu penerapannya kelak, ketika di suatu ruangan sudah diketahui jumlahnya yang ada di dalam tentunya nanti secara automatis bisa disesuaikan suhu ruangan sehingga tidak perlu penggunaan remote AC. Contoh yang kedua terkait pedestrian, tentunya kita bisa mengetahui orang-orang yang berlalu lalang pada trotoar atau pinggir-pinggir jalan. Kedua contoh tersebut tentunya membutuhkan kamera atau Closed-circuit television(CCTV) untuk melakukan perekaman, yang selanjutnya dilakukan pemprosesan.

Kenapa menggunakan OpenCV, yang akan datang agar bisa dimanfaatkan platform yang lain misalkan jika ingin diterapkan pada handphone. OpenCV untuk deep learning memang tidak menyediakan untuk melakukan proses training, akan tetapi support beberapa framework deep learning yang terkenal seperti Caffe, TensorFlow, dan Torch/PyTorch. Pointnya adalah OpenCV dapat digunakan untuk me-load model dari framework yang saya sebutkan di atas untuk melakukan testing.

Sebelum implementasi ke sebuah kode, beberapa sumber daya yang diperlukan adalah zoo model hasil training yang dapat didownload di sini. Zoo model merupakan sebuah kumpulan model yang sudah ditraining untuk mendeteksi objek dari beberapa dataset terkenal seperti COCO dataset, Kitti dataset, Open Images dataset, AVA v2.1 dataset dan iNaturalist Species Detection Dataset. Selanjutnya beberapa sumber daya yang perlu Anda persiapkan adalah sebagai berikut

  • Silakan download salah satu dari zoo model, sebagai contoh ssd_mobilenet_v1_coco. Model tersebut merupakan model yang ditraining menggunakan arsitektur MobileNet-SSD pada COCO dataset.
  • Kemudian ekstrak hasil download tersebut, isi file tersebut berupa checkpoint(*.ckpt.*), frozen graph proto(*.pb), dan file config(*.config)
  • Download file konfigurasi yang digunakan untuk melakukan training di sini, sesuai dengan arsitektur yang digunakan.
  • Download file python untuk mengenerate file graph proto(*.pbtxt) di sini dan di sini, disesuaikan dengan arsitektur yang digunakan.

Jika semuanya sudah dilakukan, selanjutnya saya sarankan membuat virtualenv agar project Anda tersusun dengan rapih. Pada postingan yang sebelumnya sudah pernah saya tulis tentang virtualenv, jika sudah silakan ketikkan baris perintah di bawah ini pada terminal atau command prompt untuk membuat file graph proto(*.pbtxt). Langkah ini perlu dilakukan ketika kita menggunakan OpenCV, jika menggunakan python tidak perlu dilakukan ketika melakukan testing model.

python tf_text_graph_ssd.py --input /path/to/model.pb --config /path/to/example.config --output /path/to/graph.pbtxt

Struktur direktori projek kira-kira seperti di bawah ini agar memudahkan temen-temen untuk menjalankan projeknya sesuai dengan yang saya dokumentasikan

├── cv_object_detection.py
├── images
│   └── objects.jpg
├── models
│   ├── classes.txt
│   ├── frozen_inference_graph.pb
│   ├── graph.pbtxt
│   └── pipeline.config
├── object_detection.py
├── tf_text_graph_common.py
├── tf_text_graph_faster_rcnn.py
└── tf_text_graph_ssd.py
python tf_text_graph_ssd.py --input models/frozen_inference_graph.pb --config models/pipeline.config --output models/graph.pbtxt

Output yang dihasilkan seperti di bawah ini

Scale: [0.200000-0.950000]
Aspect ratios: [1.0, 2.0, 0.5, 3.0, 0.333299994469]
Reduce boxes in the lowest layer: True
Number of classes: 90
Number of layers: 6
box predictor: convolutional
Input image size: 300x300

Untuk path silakan disesuaikan dengan path di laptop/PC temen-temen, jika berhasil harusnya akan ada file yang terbentuk *pbtxt. Karena kita menggunakan OpenCV, jangan lupa install opencv-python menggunakan command pip. Kira-kira perintah seperti di bawah ini

pip install opencv-python

Yang terakhir adalah implementasi kode menggunakan OpenCV di bawah ini

import cv2 as cv
import os

cvNet = cv.dnn.readNetFromTensorflow('models/frozen_inference_graph.pb', 'models/graph.pbtxt')
path_images = "images"
LABELS = open(os.path.join("models", "classes.txt")).read().strip().split("\n")

font_scale = 1
font = cv.FONT_HERSHEY_PLAIN
rectangle_bgr = (255, 255, 255)

for image_name in sorted(os.listdir(path_images)):
    img = cv.imread(os.path.join(path_images, image_name))
    rows = img.shape[0]
    cols = img.shape[1]
    # cvNet.setInput(cv.dnn.blobFromImage(img, 0.017, (300, 300), (127.5, 127.5, 127.5), True, False))
    cvNet.setInput(cv.dnn.blobFromImage(img, size=(300, 300), swapRB=True, crop=False))
    cvOut = cvNet.forward()

    for detection in cvOut[0, 0, :, :]:
        score = float(detection[2])
        class_id = int(detection[1])
        if score > 0.3:
            print("Score: {:.4f}, Class id: {}".format(score, class_id))
            left = detection[3] * cols
            top = detection[4] * rows
            right = detection[5] * cols
            bottom = detection[6] * rows
            text = "{} {:.2f}".format(LABELS[class_id], score)

            (text_width, text_height) = cv.getTextSize(text, font, fontScale=font_scale, thickness=1)[0]
            text_offset_x = int(left)
            text_offset_y = int(top) - 2
            box_coord = ((text_offset_x, text_offset_y), (text_offset_x + text_width-2, text_offset_y - text_height - 2))

            cv.rectangle(img, (int(left), int(top)), (int(right), int(bottom)), (255, 255, 255), thickness=2)
            cv.rectangle(img, box_coord[0], box_coord[1], rectangle_bgr, cv.FILLED)
            cv.putText(img, text, (text_offset_x, text_offset_y), font, fontScale=font_scale, color=(0, 0, 0),
                       thickness=1)
    # cv.namedWindow(image_name, cv.WINDOW_NORMAL)
    cv.imshow(image_name, img)
    cv.waitKey()

Jika dijalankan source code di atas hasilnya seperti di bawah ini

Object Detection

Demikian artikel saya mengenai object detection menggunakan OpenCV dengan model pre-trained, source code lengkap dapat Anda dapatkan di sini. Semoga tulisan saya bermanfaat bagi pecinta computer vision, ditunggu artikel yang selanjutnya ya. cheeers! 🙂

comments powered by Disqus