๋ฐ์ํ
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)
image shape: (633, 806, 3)
<matplotlib.image.AxesImage at 0x7fda701ddc88>
Inference ๋ชจ๋ธ ์์ฑ
Tensorflow์์ Pretrained ๋ Inference๋ชจ๋ธ(Frozen graph)์ ํ๊ฒฝํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ์ ํ ์ด๋ฅผ ์ด์ฉํด OpenCV์์ Inference ๋ชจ๋ธ์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
- ๋ค์ด๋ก๋ URL์ ์๋ ๋งํฌ์ ์์ต๋๋ค.
- Pretrained ๋ชจ๋ธ์ ์๋ ๋งํฌ์์ ๋ค์ด๋ก๋ ํ ์์ถ ํด์ ํด์ผํฉ๋๋ค.
- http://download.tensorflow.org/models/object_detection/ssd_inception_v2_coco_2017_11_17.tar.gz
- Pretrained ๋ชจ๋ธ์ ์ํ ํ๊ฒฝ ํ์ผ์ ์๋ ๋งํฌ์์ ๋ค์ด๋ก๋ ํด์ผํฉ๋๋ค.
- https://github.com/opencv/opencv_extra/blob/master/testdata/dnn/ssd_inception_v2_coco_2017_11_17.pbtxt
- download๋ ๋ชจ๋ธ ํ์ผ๊ณผ config ํ์ผ์ ์ธ์๋ก ํ์ฌ inference ๋ชจ๋ธ์ DNN์์ ๋ก๋ฉํฉ๋๋ค.
- ์ด Model ๋ฆฌ์คํธ๋ฅผ ๋ณด๋ฉด, MobileNet-SSD v2, Inception-SSD v2 ๋ชจ๋ธ์ ์ ์ฌ์ ๋๋ฐ์ด์ค์์ Object Detection์ด ๊ฐ๋ฅํฉ๋๋ค. ํ๋ฒ ์ํ ์ฑ๋ฅ์ ๋น๊ตํด ๋ด์ผ ํฉ๋๋ค.
# 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
/home/younggi.kim999/DLCV/Detection/ssd
checkpoint model.ckpt.data-00000-of-00001 saved_model
frozen_inference_graph.pb model.ckpt.index
graph.pbtxt model.ckpt.meta
- ์ฌ๊ธฐ ์๋ Directory๋ค์ Pre-Trained๋ Mdoel๋ค์ด ์๋ Directory์
๋๋ค.
- frozen_inference_graph.pb, graph.pbtxt ๊ฐ ํด๋น๋ฉ๋๋ค.
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')
- ์ฒซ๋ฒ์งธ 'frozen_inference_graph.pb'๋ wait file
- ๋๋ฒ์งธ 'graph.pbtxt'๋ config file ์ ๋๋ค.
CoCo ๋ฐ์ดํฐ์ ์ ํด๋์ค ID๋ณ ํด๋์ค๋ช ์ง์
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'}
OpenCV์ Tensorflow์ CoCo ํด๋์ค ID์ Name Mapping
์ด๋ฏธ์ง๋ฅผ 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)
(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>
๊ฒฐ๊ณผ ๋ฐฐ์ด์ ํํ (1, 1, 100, 7)
- ๊ฐ์ฒด ๊ฒ์ถ ๋คํธ์ํฌ์ ์ถ๋ ฅ ํํ๋ฅผ ๋ํ๋ ๋๋ค.
- (1, 1, 100, 7)๋ ๋ฐฐ์น ํฌ๊ธฐ 1, ์ฑ๋ 1, 100๊ฐ์ ๊ฒ์ถ๋ ๊ฐ์ฒด, ๊ฐ ๊ฐ์ฒด๋น 7๊ฐ์ ์ ๋ณด(ํด๋์ค ID, ์ ๋ขฐ๋ ์ ์, bounding box ์ขํ)๋ฅผ ์๋ฏธํฉ๋๋ค.
๊ฐ์ฒด ๊ฒ์ถ ๊ฒฐ๊ณผ
- ๊ฐ์ฒด ๊ฒ์ถ ๊ฒฐ๊ณผ๋ฅผ ์์๋๋ก ๋์ดํ ๊ฒ์ ๋๋ค.
- person: 0.9696 1: ๊ฒ์ถ๋ ๊ฐ์ฒด๊ฐ 'person'์ด๊ณ , ์ ๋ขฐ๋ ์ ์๋ 0.9696์ด๋ฉฐ, ํด๋์ค ID๋ 1์ ๋๋ค.
- ๋์ผํ ํ์์ผ๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ค๋ ๋์ด๋ฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, car: 0.8609 3์ ๊ฒ์ถ๋ ๊ฐ์ฒด๊ฐ 'car'์ด๊ณ , ์ ๋ขฐ๋ ์ ์๋ 0.8609์ด๋ฉฐ, ํด๋์ค ID๋ 3์ ๋๋ค.
- ์ด ์ฝ๋๋ ์ด๋ฏธ์ง ๊ฐ์ฒด ๊ฒ์ถ(Object Detection)์ ์ํํ์ฌ ์๋ณธ ์ด๋ฏธ์ง์ ๊ฒ์ถ๋ ๊ฐ์ฒด์ ๊ฒฝ๊ณ ์์(bounding box)์ ํด๋์ค๋ช ์ ํ์ํ๋ ๊ณผ์ ์ ํฌํจํฉ๋๋ค.
- ๋จผ์ ์๋ณธ ์ด๋ฏธ์ง์ ํฌ๊ธฐ์ ๋ณต์ฌ๋ณธ์ ์์ฑํ๊ณ , ์ด๋ฏธ์ง๋ฅผ (300, 300) ํฌ๊ธฐ๋ก ๋ฆฌ์ฌ์ด์ฆํ ํ RGB๋ก ๋ณํํ์ฌ ๋คํธ์ํฌ์ ์ ๋ ฅํฉ๋๋ค.
- ๊ฐ์ฒด ๊ฒ์ถ์ ์ํํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ถ์ถํ ๋ค, ๊ฒ์ถ๋ ๊ฐ ๊ฐ์ฒด์ ๋ํด ๊ฒ์ถ ์ ์๊ฐ 0.4 ์ด์์ธ ๊ฒฝ์ฐ bounding box ์ขํ๋ฅผ ์๋ณธ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ก ๋ณํํ์ฌ ๋ณต์ฌ๋ณธ ์ด๋ฏธ์ง์ ๊ฒฝ๊ณ ์์์ ํด๋์ค๋ช ์ ํ์ํฉ๋๋ค.
- ๋ง์ง๋ง์ผ๋ก ์ด๋ฏธ์ง๋ฅผ RGB ํ์์ผ๋ก ๋ณํํ์ฌ ์ถ๋ ฅํฉ๋๋ค.
๋จ์ผ ์ด๋ฏธ์ง์ 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
- ์ด ์ฝ๋๋ ์ ๋ ฅ๋ ์ด๋ฏธ์ง๋ฅผ ๋์์ผ๋ก ๊ฐ์ฒด ๊ฒ์ถ(Object Detection)์ ์ํํ๊ณ , ๊ฒ์ถ๋ ๊ฐ์ฒด ์ฃผ์์ ๊ฒฝ๊ณ ์์(bounding box)์ ํด๋์ค๋ช ์ ํ์ํ ์ด๋ฏธ์ง๋ฅผ ๋ฐํํ๋ ํจ์ get_detected_img๋ฅผ ์ ์ํฉ๋๋ค.
- ํจ์๋ OpenCV ๋ฅ๋ฌ๋ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ (300, 300) ํฌ๊ธฐ๋ก ๋ฆฌ์ฌ์ด์ฆํ ํ ๋คํธ์ํฌ์ ์ ๋ ฅํฉ๋๋ค.
- ๊ฐ์ฒด ๊ฒ์ถ ๊ฒฐ๊ณผ์์ ๊ฒ์ถ ์ ์๊ฐ ์ฃผ์ด์ง ์๊ณ๊ฐ๋ณด๋ค ๋์ ๊ฐ์ฒด๋ค๋ง ์ ํํ์ฌ, ์๋ณธ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ก ๋ณํ๋ bounding box๋ฅผ ๊ทธ๋ฆฝ๋๋ค.
- ์ด๋, ๊ฒฝ๊ณ ์์์ ํด๋์ค๋ช ์ ์ด๋ฏธ์ง์ ์ถ๊ฐํฉ๋๋ค. ํจ์๋ ์ํ ์๊ฐ์ ์ธก์ ํ์ฌ ํ์ ์ ์ถ๋ ฅํ๋ฉฐ, ๊ฒฐ๊ณผ ์ด๋ฏธ์ง๋ฅผ ๋ฐํํฉ๋๋ค.
Example
# 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)
Video Object Detection ์ํ
์๋ณธ ์์ ๋ณด๊ธฐ
from IPython.display import clear_output, Image, display, Video, HTML
Video('../../data/video/John_Wick_small.mp4') # ์ด๋ถ๋ถ์ ๋๋ ํ ๋ฆฌ์ ๋ง๊ฒ ์์ ํด์ผ ํฉ๋๋ค.
VideoCapture์ VideoWriter ์ค์ ํ๊ธฐ
- VideoCapture๋ฅผ ์ด์ฉํ์ฌ Video๋ฅผ frame๋ณ๋ก capture ํ ์ ์๋๋ก ์ค์ ํฉ๋๋ค.
- VideoCapture์ ์์ฑ์ ์ด์ฉํ์ฌ Video Frame์ ํฌ๊ธฐ ๋ฐ FPS๋ฅผ ์ค์ ํฉ๋๋ค.
- VideoWriter๋ฅผ ์ํ ์ธ์ฝ๋ฉ ์ฝ๋ฑ ์ค์ ๋ฐ ์์ write๋ฅผ ์ํ ์ค์ ์ ํด์ผํฉ๋๋ค.
์ด Frame ๋ณ๋ก iteration ํ๋ฉด์ Object Detection ์ ์ํํฉ๋๋ค.
๊ฐ๋ณ frame๋ณ๋ก ํ๋ฉด? ๋จ์ผ ์ด๋ฏธ์ง Object Detection๊ณผ ์ ์ฌํฉ๋๋ค.
Video Detection ์ ์ฉ ํจ์ ์์ฑ
๋น๋์ค ํ์ผ์ ์ ๋ ฅ๋ฐ์ ๊ฐ ํ๋ ์์ ๋ํด ๊ฐ์ฒด ๊ฒ์ถ(Object Detection)์ ์ํํ๊ณ ,
๊ฒ์ถ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ํ ๋น๋์ค๋ฅผ ์ถ๋ ฅํ๋ ํจ์ do_detected_video๋ฅผ ์ ์ํด ๋ณด๊ฒ ์ต๋๋ค.
def do_detected_video(cv_net, input_path, output_path, score_threshold, is_print):
cap = cv2.VideoCapture(input_path)
codec = cv2.VideoWriter_fourcc(*'XVID')
vid_size = (round(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
vid_fps = cap.get(cv2.CAP_PROP_FPS)
vid_writer = cv2.VideoWriter(output_path, codec, vid_fps, vid_size)
frame_cnt = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print('์ด Frame ๊ฐฏ์:', frame_cnt, )
green_color=(0, 255, 0)
red_color=(0, 0, 255)
while True:
hasFrame, img_frame = cap.read()
if not hasFrame:
print('๋ ์ด์ ์ฒ๋ฆฌํ frame์ด ์์ต๋๋ค.')
break
returned_frame = get_detected_img(cv_net, img_frame, score_threshold=score_threshold, use_copied_array=True, is_print=True)
vid_writer.write(returned_frame)
# end of while loop
vid_writer.release()
cap.release()
do_detected_video(cv_net, '../../data/video/John_Wick_small.mp4', '../../data/output/John_Wick_small_ssd01.avi', 0.4, True)
!gsutil cp ../../data/output/John_Wick_small_ssd01.avi gs://my_bucket_dlcv/data/output/John_Wick_small_ssd01.avi
์ฝ๋ ์ค๋ช
- ๋น๋์ค ํ์ผ ์ด๊ธฐ ๋ฐ ์ค์
- input_path๋ก ์ง์ ๋ ๋น๋์ค ํ์ผ์ ์ด๊ณ , ์ถ๋ ฅ ๋น๋์ค ํ์ผ์ output_path๋ก ์ง์ ๋ ๊ฒฝ๋ก์ ์ ์ฅํ ์ค๋น๋ฅผ ํฉ๋๋ค.
- ๋น๋์ค ์ฝ๋ฑ์ ์ค์ ํ๊ณ , ์ ๋ ฅ ๋น๋์ค์ ํ๋ ์ ํฌ๊ธฐ์ ํ๋ ์ ์๋(FPS)๋ฅผ ๊ฐ์ ธ์์ ์ถ๋ ฅ ๋น๋์ค ์ค์ ์ ์ฌ์ฉํฉ๋๋ค.
- ์ ๋ ฅ ๋น๋์ค์ ์ด ํ๋ ์ ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
- ํ๋ ์ ์ฒ๋ฆฌ ๋ฃจํ
- ๋น๋์ค์ ๊ฐ ํ๋ ์์ ๋ฐ๋ณต์ ์ผ๋ก ์ฝ์ด ๋ค์ ๋๋ค.
- ํ๋ ์์ด ๋ ์ด์ ์์ผ๋ฉด ๋ฃจํ๋ฅผ ์ข ๋ฃํฉ๋๋ค.
- ๊ฐ ํ๋ ์์ ๋ํด get_detected_img ํจ์๋ฅผ ํธ์ถํ์ฌ ๊ฐ์ฒด ๊ฒ์ถ์ ์ํํ๊ณ , ๊ฒ์ถ๋ ๊ฒฐ๊ณผ๋ฅผ ํ๋ ์์ ๋ฐ์ํฉ๋๋ค.
- ๊ฒ์ถ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์๋ ํ๋ ์์ ์ถ๋ ฅ ๋น๋์ค ํ์ผ์ ์์ฑํฉ๋๋ค.
- ๋น๋์ค ํ์ผ ๋ฆด๋ฆฌ์ค
- ๋ชจ๋ ํ๋ ์ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด, ์ถ๋ ฅ ๋น๋์ค ํ์ผ๊ณผ ์ ๋ ฅ ๋น๋์ค ํ์ผ์ ๋ซ๊ณ ๋ฆฌ์์ค๋ฅผ ํด์ ํฉ๋๋ค.
SSD + MobileNet์ผ๋ก Object Detection ์ํ
- ์๋ ๋งํฌ๊ฐ Download URL ์ ๋๋ค.
- Dataset ๋ค์ด๋ก๋ ๋งํฌ
http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v2_coco_2018_03_29.tar.gz
# !mkdir pretrained; cd pretrained
# !wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v2_coco_2018_03_29.tar.gz
# !wget https://raw.githubusercontent.com/opencv/opencv_extra/master/testdata/dnn/ssd_mobilenet_v2_coco_2018_03_29.pbtxt
# cd ssd_mobilenet_v2_coco_2018_03_29; mv ssd_mobilenet_v2_coco_2018_03_29.pbtxt graph.pbtxt
cv_net_mobile = cv2.dnn.readNetFromTensorflow('./pretrained/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb',
'./pretrained/ssd_mobilenet_v2_coco_2018_03_29/graph.pbtxt')
์์ Detection
do_detected_video(cv_net_mobile, '../../data/video/John_Wick_small.mp4', '../../data/output/John_Wick_small_ssd_mobile01.avi', 0.2, True)
# image ๋ก๋
img = cv2.imread('../../data/image/beatles01.jpg')
#coco dataset ํด๋์ค๋ช
๋งคํ
cv_net_mobile = cv2.dnn.readNetFromTensorflow('./pretrained/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb',
'./pretrained/ssd_mobilenet_v2_coco_2018_03_29/graph.pbtxt')
# Object Detetion ์ํ ํ ์๊ฐํ
draw_img = get_detected_img(cv_net_mobile, 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)
- ์บก์ณ ์ฌ์ง์ ๋ณด๋ฉด, ์ํ์ฑ๋ฅ์ด Inception ๋ณด๋ค ์ข๋ค๋ ํน์ง์ด ์์ต๋๋ค.
๋ฐ์ํ
'๐ Computer Vision' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CV] OpenCV์์ YOLO๋ฅผ ์ด์ฉํ Object Detection Part.1 (0) | 2024.07.15 |
---|---|
[CV] YOLO (You Only Look Once) (0) | 2024.07.14 |
[CV] SSD - Single Shot (Multibox) Detector (0) | 2024.07.07 |
[CV] OpenCV๋ก Object Detection ๊ตฌํํ๊ธฐ (Part.2) (0) | 2024.06.04 |
[CV] OpenCV๋ก Object Detection ๊ตฌํํ๊ธฐ (Part.1) (0) | 2024.06.02 |