A A
[CV] OpenCV๋กœ Object Detection ๊ตฌํ˜„ํ•˜๊ธฐ (Part.2)

OpenCV DNN ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•˜์—ฌ SSD๊ธฐ๋ฐ˜ Object Detection ์ˆ˜ํ–‰ 

Tensorflow ์—์„œ Pretrained ๋œ ๋ชจ๋ธ ํŒŒ์ผ์„ OpenCV์—์„œ ๋กœ๋“œํ•˜์—ฌ ์ด๋ฏธ์ง€์™€ ์˜์ƒ์— ๋Œ€ํ•œ Object Detection์„ ์ˆ˜ํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ž…๋ ฅ ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉ๋  ์ด๋ฏธ์ง€ ๋ณด๊ธฐ

import cv2
import matplotlib.pyplot as plt
%matplotlib inline

img = cv2.imread('../../data/image/beatles01.jpg')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

print('image shape:', img.shape)
plt.figure(figsize=(12, 12))
plt.imshow(img_rgb)

  • Tensorflow์—์„œ Pretrained ๋œ Inference๋ชจ๋ธ(Frozen graph)์™€ ํ™˜๊ฒฝํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ํ›„ ์ด๋ฅผ ์ด์šฉํ•ด OpenCV์—์„œ Inference ๋ชจ๋ธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋ž˜์— ๋‹ค์šด๋กœ๋“œ URL์ด ์žˆ์Šต๋‹ˆ๋‹ค.
 

TensorFlow Object Detection API

Open Source Computer Vision Library. Contribute to opencv/opencv development by creating an account on GitHub.

github.com

 

  • pretrained ๋ชจ๋ธ์€ ์•„๋ž˜์˜ ๋งํฌ ์—์„œ ๋‹ค์šด๋กœ๋“œ ํ›„ ์••์ถ• ํ•ด์ œ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
 

๋ฆฌ๋””๋ ‰์…˜ ์•Œ๋ฆผ

 

www.google.com

 

  • pretrained ๋ชจ๋ธ์„ ์œ„ํ•œ ํ™˜๊ฒฝ ํŒŒ์ผ์€ ์•„๋ž˜์˜ ๋งํฌ์—์„œ ๋‹ค์šด๋กœ๋“œ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • download๋œ ๋ชจ๋ธ ํŒŒ์ผ๊ณผ config ํŒŒ์ผ์„ ์ธ์ž๋กœ ํ•˜์—ฌ inference ๋ชจ๋ธ์„ DNN์—์„œ ๋กœ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
 

opencv_extra/testdata/dnn/ssd_inception_v2_coco_2017_11_17.pbtxt at master · opencv/opencv_extra

OpenCV extra data. Contribute to opencv/opencv_extra development by creating an account on GitHub.

github.com

# mkdir pretrained; cd pretrained
# wget http://download.tensorflow.org/models/object_detection/ssd_inception_v2_coco_2017_11_17.tar.gz
# wget https://raw.githubusercontent.com/opencv/opencv_extra/master/testdata/dnn/ssd_inception_v2_coco_2017_11_17.pbtxt
# cd ssd_inception_v2_coco_2017_11_17; mv ssd_inception_v2_coco_2017_11_17.pbtxt graph.pbtxt
# https://github.com/opencv/opencv_extra/blob/master/testdata/dnn/ssd_inception_v2_coco_2017_11_17.pbtxt?raw=true -O ./graph.pbtxt
!pwd
!ls pretrained/ssd_inception_v2_coco_2017_11_17
cv_net = cv2.dnn.readNetFromTensorflow('./pretrained/ssd_inception_v2_coco_2017_11_17/frozen_inference_graph.pb', 
                                     './pretrained/ssd_inception_v2_coco_2017_11_17/graph.pbtxt')

OpenCV & Tensorflow์˜ CoCo ํด๋ž˜์Šค ID & Name ๋งคํ•‘

  • Class id๊ฐ€ 0~90 ์ด๋ฉด TF์—์„œ Faster R-CNN, Mask R-CNN ๋ชจ๋ธ ๋กœ๋“œํ• ๋•Œ ์‚ฌ์šฉ๋˜๋Š” Dataset ์ž…๋‹ˆ๋‹ค.
  • Class id๊ฐ€ 1~91 ์ด๋ฉด TF์—์„œ SSD ๋ชจ๋ธ ๋กœ๋“œํ• ๋•Œ ์‚ฌ์šฉ๋˜๋Š” Dataset์ž…๋‹ˆ๋‹ค.
  • Class id๊ฐ€ 0~79 ์ด๋ฉด TF์—์„œ DNN Darkent YOLO ๋ชจ๋ธ์„ ๋กœ๋“œํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” Dataset์ž…๋‹ˆ๋‹ค.
labels_to_names_seq= {0:'person',1:'bicycle',2:'car',3:'motorcycle',4:'airplane',5:'bus',6:'train',7:'truck',8:'boat',9:'traffic light',
                    10:'fire hydrant',11:'street sign',12:'stop sign',13:'parking meter',14:'bench',15:'bird',16:'cat',17:'dog',18:'horse',19:'sheep',
                    20:'cow',21:'elephant',22:'bear',23:'zebra',24:'giraffe',25:'hat',26:'backpack',27:'umbrella',28:'shoe',29:'eye glasses',
                    30:'handbag',31:'tie',32:'suitcase',33:'frisbee',34:'skis',35:'snowboard',36:'sports ball',37:'kite',38:'baseball bat',39:'baseball glove',
                    40:'skateboard',41:'surfboard',42:'tennis racket',43:'bottle',44:'plate',45:'wine glass',46:'cup',47:'fork',48:'knife',49:'spoon',
                    50:'bowl',51:'banana',52:'apple',53:'sandwich',54:'orange',55:'broccoli',56:'carrot',57:'hot dog',58:'pizza',59:'donut',
                    60:'cake',61:'chair',62:'couch',63:'potted plant',64:'bed',65:'mirror',66:'dining table',67:'window',68:'desk',69:'toilet',
                    70:'door',71:'tv',72:'laptop',73:'mouse',74:'remote',75:'keyboard',76:'cell phone',77:'microwave',78:'oven',79:'toaster',
                    80:'sink',81:'refrigerator',82:'blender',83:'book',84:'clock',85:'vase',86:'scissors',87:'teddy bear',88:'hair drier',89:'toothbrush',
                    90:'hair brush'}
  • ์ด๋Ÿฌํ•œ ํ˜•์‹์œผ๋กœ ๋ชจ๋ธ์—์„œ Dataset์˜ ํด๋ž˜์Šค ID๋ณ„ ํด๋ž˜์Šค๋ช…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

Image Preprocessing & Object Detection ์ˆ˜ํ–‰ํ›„ ๊ฒฐ๊ณผ ์‹œ๊ฐํ™”

์ด๋ฏธ์ง€๋ฅผ preprocessing ์ˆ˜ํ–‰ํ•˜์—ฌ Network์— ์ž…๋ ฅํ•˜๊ณ  Object Detection ์ˆ˜ํ–‰ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ฏธ์ง€์— ์‹œ๊ฐํ™” ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
# ์›๋ณธ ์ด๋ฏธ์ง€ (633, 806)๋ฅผ ๋„คํŠธ์›์— ์ž…๋ ฅ์‹œ์—๋Š” (300, 300)๋กœ resize ํ•จ. 
# ์ดํ›„ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉด resize๋œ ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜์œผ๋กœ bounding box ์œ„์น˜๊ฐ€ ์˜ˆ์ธก ๋˜๋ฏ€๋กœ ์ด๋ฅผ ๋‹ค์‹œ ์›๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์›๋ณธ ์ด๋ฏธ์ง€ shape์ •๋ณด ํ•„์š”
rows = img.shape[0]
cols = img.shape[1]
# cv2์˜ rectangle()์€ ์ธ์ž๋กœ ๋“ค์–ด์˜จ ์ด๋ฏธ์ง€ ๋ฐฐ์—ด์— ์ง์ ‘ ์‚ฌ๊ฐํ˜•์„ ์—…๋ฐ์ดํŠธ ํ•˜๋ฏ€๋กœ ๊ทธ๋ฆผ ํ‘œํ˜„์„ ์œ„ํ•œ ๋ณ„๋„์˜ ์ด๋ฏธ์ง€ ๋ฐฐ์—ด ์ƒ์„ฑ. 
draw_img = img.copy()

# ์›๋ณธ ์ด๋ฏธ์ง€ ๋ฐฐ์—ด์„ ์‚ฌ์ด์ฆˆ (300, 300)์œผ๋กœ, BGR์„ RGB๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐฐ์—ด ์ž…๋ ฅ
cv_net.setInput(cv2.dnn.blobFromImage(img,  size=(300, 300), swapRB=True, crop=False))
# Object Detection ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ cv_out์œผ๋กœ ๋ฐ˜ํ™˜ 
cv_out = cv_net.forward()
print(cv_out.shape)

# bounding box์˜ ํ…Œ๋‘๋ฆฌ์™€ caption ๊ธ€์ž์ƒ‰ ์ง€์ •
green_color=(0, 255, 0)
red_color=(0, 0, 255)
# detected ๋œ object๋“ค์„ iteration ํ•˜๋ฉด์„œ ์ •๋ณด ์ถ”์ถœ
for detection in cv_out[0,0,:,:]:
    score = float(detection[2])
    class_id = int(detection[1])
    # detected๋œ object๋“ค์˜ score๊ฐ€ 0.4 ์ด์ƒ๋งŒ ์ถ”์ถœ
    if score > 0.4:
        # detected๋œ object๋“ค์€ image ํฌ๊ธฐ๊ฐ€ (300, 300)์œผ๋กœ scale๋œ ๊ธฐ์ค€์œผ๋กœ ์˜ˆ์ธก๋˜์—ˆ์œผ๋ฏ€๋กœ ๋‹ค์‹œ ์›๋ณธ ์ด๋ฏธ์ง€ ๋น„์œจ๋กœ ๊ณ„์‚ฐ
        left = detection[3] * cols
        top = detection[4] * rows
        right = detection[5] * cols
        bottom = detection[6] * rows
        # labels_to_names ๋”•์…”๋„ˆ๋ฆฌ๋กœ class_id๊ฐ’์„ ํด๋ž˜์Šค๋ช…์œผ๋กœ ๋ณ€๊ฒฝ. opencv์—์„œ๋Š” class_id + 1๋กœ ๋งคํ•‘ํ•ด์•ผํ•จ.
        caption = "{}: {:.4f}".format(labels_to_names[class_id], score)
        
        #cv2.rectangle()์€ ์ธ์ž๋กœ ๋“ค์–ด์˜จ draw_img์— ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆผ. ์œ„์น˜ ์ธ์ž๋Š” ๋ฐ˜๋“œ์‹œ ์ •์ˆ˜ํ˜•.
        cv2.rectangle(draw_img, (int(left), int(top)), (int(right), int(bottom)), color=green_color, thickness=2)
        cv2.putText(draw_img, caption, (int(left), int(top - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.7, red_color, 2)
        print(caption, class_id)

img_rgb = cv2.cvtColor(draw_img, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(12, 12))
plt.imshow(img_rgb)
  • ํ•œ๋ฒˆ ์ฝ”๋“œ ์„ค๋ช…์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • cv_out ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๊ฐ์ฒด ๊ฒ€์ถœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ ๊ฐ ๊ฐ์ฒด์— ๋Œ€ํ•ด ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด ๊ฒ€์ถœ ์‹ ๋ขฐ๋„ ์ ์ˆ˜์ธ score๊ฐ€ 0.4 ์ด์ƒ์ธ ๊ฒฝ์šฐ์—๋งŒ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒ€์ถœ๋œ ๊ฐ์ฒด์˜ ์ขŒํ‘œ๋Š” (300, 300) ํฌ๊ธฐ์˜ ์ด๋ฏธ์ง€ ๊ธฐ์ค€์œผ๋กœ ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์›๋ณธ ์ด๋ฏธ์ง€ ํฌ๊ธฐ (cols, rows)์— ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • labels_to_names ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค ID๋ฅผ ํด๋ž˜์Šค๋ช…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์‹ ๋ขฐ๋„ ์ ์ˆ˜๋ฅผ ํฌํ•จํ•œ ์บก์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • cv2.rectangle ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ draw_img ์ด๋ฏธ์ง€์— ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฌ๋ฉฐ, cv2.putText ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บก์…˜์„ ์ด๋ฏธ์ง€์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ, ์บก์…˜๊ณผ ํด๋ž˜์Šค ID๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. OpenCV๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ BGR ํ˜•์‹์˜ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ด๋ฅผ RGB ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„, plt.figure์™€ plt.imshow๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ณผ์ •์—์„œ ์ด๋ฏธ์ง€์—๋Š” ๊ฐ ๊ฐ์ฒด์˜ ๊ฒฝ๊ณ„ ์ƒ์ž์™€ ์บก์…˜์ด ๊ทธ๋ ค์ง€๋ฉฐ, ์ด๋ฅผ matplotlib์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
(1, 1, 100, 7)
person: 0.9696 1
person: 0.9660 1
person: 0.8916 1
person: 0.6298 1
car: 0.8609 3
car: 0.7223 3
car: 0.7184 3
car: 0.7095 3
car: 0.5949 3
car: 0.5511 3
<matplotlib.image.AxesImage at 0x7fda6c0c92b0>


๋‹จ์ผ ์ด๋ฏธ์ง€์˜ Object Detection์„ ํ•จ์ˆ˜๋กœ ์ƒ์„ฑ

์ด๋ฒˆ์—๋Š” ๋‹จ์ผ ์ด๋ฏธ์ง€์˜ Object Detection ๋ถ€๋ถ„์„ ํ•จ์ˆ˜๋กœ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
import time

def get_detected_img(cv_net, img_array, score_threshold, use_copied_array=True, is_print=True):
    
    rows = img_array.shape[0]
    cols = img_array.shape[1]
    
    draw_img = None
    if use_copied_array:
        draw_img = img_array.copy()
        #draw_img = cv2.cvtColor(draw_img, cv2.COLOR_BGR2RGB)
    else:
        draw_img = img_array
    
    cv_net.setInput(cv2.dnn.blobFromImage(img_array, size=(300, 300), swapRB=True, crop=False))
    
    start = time.time()
    cv_out = cv_net.forward()
    
    green_color=(0, 255, 0)
    red_color=(0, 0, 255)

    # detected ๋œ object๋“ค์„ iteration ํ•˜๋ฉด์„œ ์ •๋ณด ์ถ”์ถœ
    for detection in cv_out[0,0,:,:]:
        score = float(detection[2])
        class_id = int(detection[1])
        # detected๋œ object๋“ค์˜ score๊ฐ€ 0.4 ์ด์ƒ๋งŒ ์ถ”์ถœ
        if score > score_threshold:
            # detected๋œ object๋“ค์€ image ํฌ๊ธฐ๊ฐ€ (300, 300)์œผ๋กœ scale๋œ ๊ธฐ์ค€์œผ๋กœ ์˜ˆ์ธก๋˜์—ˆ์œผ๋ฏ€๋กœ ๋‹ค์‹œ ์›๋ณธ ์ด๋ฏธ์ง€ ๋น„์œจ๋กœ ๊ณ„์‚ฐ
            left = detection[3] * cols
            top = detection[4] * rows
            right = detection[5] * cols
            bottom = detection[6] * rows
            # labels_to_names ๋”•์…”๋„ˆ๋ฆฌ๋กœ class_id๊ฐ’์„ ํด๋ž˜์Šค๋ช…์œผ๋กœ ๋ณ€๊ฒฝ. opencv์—์„œ๋Š” class_id + 1๋กœ ๋งคํ•‘ํ•ด์•ผํ•จ.
            caption = "{}: {:.4f}".format(labels_to_names[class_id], score)

            #cv2.rectangle()์€ ์ธ์ž๋กœ ๋“ค์–ด์˜จ draw_img์— ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆผ. ์œ„์น˜ ์ธ์ž๋Š” ๋ฐ˜๋“œ์‹œ ์ •์ˆ˜ํ˜•.
            cv2.rectangle(draw_img, (int(left), int(top)), (int(right), int(bottom)), color=green_color, thickness=2)
            cv2.putText(draw_img, caption, (int(left), int(top - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.7, red_color, 2)
    if is_print:
        print('Detection ์ˆ˜ํ–‰์‹œ๊ฐ„:',round(time.time() - start, 2),"์ดˆ")

    return draw_img
  • get_detected_img ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ ์ด๋ฏธ์ง€(img_array)์—์„œ ๊ฐ์ฒด๋ฅผ ๊ฒ€์ถœํ•˜๊ณ , ๊ฒ€์ถœ๋œ ๊ฐ์ฒด์˜ ๊ฒฝ๊ณ„ ์ƒ์ž์™€ ์บก์…˜์„ ์ด๋ฏธ์ง€์— ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ๋จผ์ €, ์ž…๋ ฅ ์ด๋ฏธ์ง€์˜ ํ–‰(rows)๊ณผ ์—ด(cols) ํฌ๊ธฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. draw_img ๋ณ€์ˆ˜๋Š” use_copied_array ์ธ์ž์— ๋”ฐ๋ผ ์ž…๋ ฅ ์ด๋ฏธ์ง€์˜ ๋ณต์‚ฌ๋ณธ ๋˜๋Š” ์›๋ณธ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • cv_net.setInput ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋„คํŠธ์›Œํฌ์˜ ์ž…๋ ฅ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋•Œ ์ด๋ฏธ์ง€๋Š” (300, 300) ํฌ๊ธฐ๋กœ ๋ฆฌ์‚ฌ์ด์ฆˆ๋˜๊ณ , RGB ์ฑ„๋„ ์ˆœ์„œ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด ๊ฒ€์ถœ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์‹œ์ž‘ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•˜๊ณ , cv_net.forward() ํ•จ์ˆ˜๋กœ ๊ฐ์ฒด ๊ฒ€์ถœ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์ดํ›„ cv_out ๋ฐฐ์—ด์—์„œ ๊ฒ€์ถœ๋œ ๊ฐ์ฒด๋“ค์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๊ฐ๊ฐ์˜ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
    • ์‹ ๋ขฐ๋„ ์ ์ˆ˜(score)๊ฐ€ score_threshold ์ด์ƒ์ธ ๊ฐ์ฒด๋งŒ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฒ€์ถœ๋œ ๊ฐ์ฒด์˜ ์ขŒํ‘œ๋Š” ์›๋ณธ ์ด๋ฏธ์ง€ ํฌ๊ธฐ์— ๋งž๊ฒŒ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • labels_to_names ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค ID๋ฅผ ํด๋ž˜์Šค๋ช…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์‹ ๋ขฐ๋„ ์ ์ˆ˜๋ฅผ ํฌํ•จํ•œ ์บก์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • cv2.rectangle ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ถœ๋œ ๊ฐ์ฒด์˜ ์œ„์น˜์— ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฌ๊ณ , cv2.putText ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บก์…˜์„ ์ด๋ฏธ์ง€์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ, is_print๊ฐ€ True์ธ ๊ฒฝ์šฐ ๊ฐ์ฒด ๊ฒ€์ถœ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜๋œ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์ด ์ด๋ฏธ์ง€๋Š” ๊ฒ€์ถœ๋œ ๊ฐ์ฒด์˜ ๊ฒฝ๊ณ„ ์ƒ์ž์™€ ์บก์…˜์ด ํฌํ•จ๋œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
# image ๋กœ๋“œ 
img = cv2.imread('../../data/image/john_wick01.jpg')

#coco dataset ํด๋ž˜์Šค๋ช… ๋งคํ•‘

# tensorflow inference ๋ชจ๋ธ ๋กœ๋”ฉ
cv_net = cv2.dnn.readNetFromTensorflow('./pretrained/ssd_inception_v2_coco_2017_11_17/frozen_inference_graph.pb', 
                                     './pretrained/ssd_inception_v2_coco_2017_11_17/graph.pbtxt')
# Object Detetion ์ˆ˜ํ–‰ ํ›„ ์‹œ๊ฐํ™” 
draw_img = get_detected_img(cv_net, img, score_threshold=0.4, use_copied_array=True, is_print=True)

img_rgb = cv2.cvtColor(draw_img, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(12, 12))
plt.imshow(img_rgb)

์œ„์˜ ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ ์ž…๋‹ˆ๋‹ค.