[Python]웹캠을 이용한 실시간 사물 감지 프로그램 만들기 (텐서플로우 API)

2018. 7. 12. 23:01Programming/Python


안녕하세요! Nitro입니다.

오늘은 텐서플로우(TensorFlow) API에서 지원하는 사물 감지(Object Detection)를 웹캠까지 연결하여 실시간으로 확인해봅시다.

사실 모든 소스코드는 GitHub에 올라가 있습니다.

누군가가 이미 다 올려뒀더군요.

그렇기에 우리가 해야할 일은 단지 오픈소스를 다운받고, 노트북 파일을 py로 실행가능하게끔 변경해주고, 몇가지 오류만 잡아주면 된다는것입니다!


1. 소스코드 다운받기

친절하게도 누군가가 수많은 예제를 만들어 올려두었습니다.

https://github.com/tensorflow/models

그러므로 위 링크를 눌러서 다운로드해줍시다.


2. 앞축풀고 파일 정리하기

다운받은 앞축을 풀고 나면, 

models/research/object_detection/

폴더가 있을겁니다.


이번에는 그것만 필요하니 저 폴더만 따로 빼두셔도 됩니다.


3. 소스코드 작성하기

이제 본격적인 소스코드를 작성할 시간입니다.

이 예제는 기본적으로 notebook 파일로 작성되어있습니다.

.py 파일로 바꾸기 위해서 콘솔로 바꿔주고 해야 하긴 하지만, 그냥 바로 파일을 따로 만들어버립시다.


일단 웹캠 사용을 해야하기때문에 OpenCV또한 필요합니다.

import numpy as np
import os
import six.moves.urllib as urllib
import sys
import tarfile
import tensorflow as tf
import zipfile

from collections import defaultdict
from io import StringIO
from matplotlib import pyplot as plt
from PIL import Image

import cv2
#여기서 VideoCapture(0)은 웹캠 순서를 나타냅니다. 기본은 0이고, 인식되는 순서대로 늘어납니다.
#윈도우10의 기본 탑제되어있는 카매라 엡을 사용해보세요.
cap = cv2.VideoCapture(0)

sys.path.append("..")

from utils import label_map_util

from utils import visualization_utils as vis_util

MODEL_NAME = 'ssd_mobilenet_v1_coco_11_06_2017'
MODEL_FILE = MODEL_NAME + '.tar.gz'
DOWNLOAD_BASE = 'http://download.tensorflow.org/models/object_detection/'

PATH_TO_CKPT = MODEL_NAME + '/frozen_inference_graph.pb'

PATH_TO_LABELS = os.path.join('data', 'mscoco_label_map.pbtxt')

NUM_CLASSES = 90

opener = urllib.request.URLopener()
opener.retrieve(DOWNLOAD_BASE + MODEL_FILE, MODEL_FILE)
tar_file = tarfile.open(MODEL_FILE)
for file in tar_file.getmembers():
  file_name = os.path.basename(file.name)
  if 'frozen_inference_graph.pb' in file_name:
    tar_file.extract(file, os.getcwd())

detection_graph = tf.Graph()
with detection_graph.as_default():
  od_graph_def = tf.GraphDef()
  with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:
    serialized_graph = fid.read()
    od_graph_def.ParseFromString(serialized_graph)
    tf.import_graph_def(od_graph_def, name='')

label_map = label_map_util.load_labelmap(PATH_TO_LABELS)
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES, use_display_name=True)
category_index = label_map_util.create_category_index(categories)

def load_image_into_numpy_array(image):
  (im_width, im_height) = image.size
  return np.array(image.getdata()).reshape(
      (im_height, im_width, 3)).astype(np.uint8)

PATH_TO_TEST_IMAGES_DIR = 'test_images'
TEST_IMAGE_PATHS = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, 'image{}.jpg'.format(i)) for i in range(1, 3) ]

IMAGE_SIZE = (12, 8)

with detection_graph.as_default():
  with tf.Session(graph=detection_graph) as sess:
    while True:
      ret, image_np = cap.read()
      image_np_expanded = np.expand_dims(image_np, axis=0)
      image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
      boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
      scores = detection_graph.get_tensor_by_name('detection_scores:0')
      classes = detection_graph.get_tensor_by_name('detection_classes:0')
      num_detections = detection_graph.get_tensor_by_name('num_detections:0')
      (boxes, scores, classes, num_detections) = sess.run(
          [boxes, scores, classes, num_detections],
          feed_dict={image_tensor: image_np_expanded})
      vis_util.visualize_boxes_and_labels_on_image_array(
          image_np,
          np.squeeze(boxes),
          np.squeeze(classes).astype(np.int32),
          np.squeeze(scores),
          category_index,
          use_normalized_coordinates=True,
          line_thickness=8)

      cv2.imshow('object detection', cv2.resize(image_np, (800,600)))
      if cv2.waitKey(25) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break

#여기서 VideoCapture(0)은 웹캠 순서를 나타냅니다. 기본은 0이고, 인식되는 순서대로 늘어납니다.
#윈도우10의 기본 탑제되어있는 카매라 엡을 사용해보세요.
cap = cv2.VideoCapture(0)

위 부분을 잘 확인해주세요.

0은 카매라 틀었을때 바로나오는 캠입니다.


그리고 스크립트 파일 이름은 딱히 상관은 없습니다만.

저는 그냥 object.py로 저장했습니다.


4. 모듈 설치하기

소스코드만 있다고 굴러가는 프로그램은 아닙니다.

당연히 import한 모듈은 따로 받아줘야하는데요.

파이썬같은경우는 pip이라는 아주 아름다운 기능이 있으니 써먹도록 합시다.


numpy
six
tensorflow
matplotlib
image
opencv-python
finished


사실 다운을 받아야 하는 목록들은 위와 같습니다만...

직접 다운받기를 귀찮아하시는 여러분들을 위해 직접 배치 파일로 만들어뒀으니 그냥 실행시키시면 됩니다.


install help.bat

바이러스는 아니니 안심하시길.


5. 실행시키기

방금 입력한 소스코드 파일을 models/research/object_detection/ 경로로 이동시켜준 다음 실행시켜줍시다!

그리고 실행시키면..!



(개인정보 보호를 위해 모자이크 처리된 사진입니다.)

잠시 시간이 걸리다가 이렇게 화면으로 나오게 됩니다.

사람으로 인식해주니 고맙군요.

소스코드 살짝 건들면 스크린캡처로 바꿔줄수도 있습니다.

그러면 게임같은거할때 어쩌면 핵이 되버릴수도..!


그럼 다음 시간에 뵙도록 하죠.

Translation


English Ver

[Programing/Python] - [Python]Live object detection with webcam using Tensorflow API


반응형