Google Colab에서 YOLOv3을 사용하여 물체를 감지했습니다.

소개



Google Colaboratory에서, 물체 검출 시스템으로서 유명한 YOLO v3를 움직여 보았으므로 정리했습니다.

목차


  • 소개
  • 목차
  • YOLO v3이란?

  • Google Colab에서 YOLO v3
  • 환경
  • 준비
  • YOLO 설정
  • YOLO를 움직여 보자.

  • 요약
  • 참고문헌

  • YOLO v3이란?



    YOLO는 실시간 물체 감지 시스템입니다.
    Darknet이라는 신경망 프레임워크의 일부입니다.
    YOLO라는 말은, 「You only look once(한 번 밖에 보지 않는다)」의 이니셜을 취한 것입니다.
    YOLO v3은 YOLO의 version3입니다 (자세한 내용은 공식 페이지 참조).

    Google Colab에서 YOLO v3



    환경



    이번에 사용할 환경은 Google 공동체입니다.
    기타 버전은 다음과 같습니다.
    import platform
    import cv2
    
    print("Python " + platform.python_version())
    print("OpenCV " + cv2.__version__)
    # Python 3.6.9
    # OpenCV 4.1.2
    

    준비



    이미지를 표시하는 데 필요한 라이브러리를 가져옵니다.
    import cv2
    import matplotlib.pyplot as plt
    %matplotlib inline
    import matplotlib
    

    YOLO 설정



    이제 Google Colab에서 YOLO v3을 설정해 봅시다.
    작업 디렉토리를 만들고 그 안에서 작업하기로 결정합니다.
    덧붙여 이 셋업은 최초의 1회만 실시하면 이후 불필요합니다 (그 때문에, 작업 디렉토리 아래에서 작업합니다).
    import os
    
    os.mkdir(working_dir) # working_dir は作業ディレクトリ
    os.chdir(working_dir)
    

    darknet을 복제합니다.
    !git clone https://github.com/pjreddie/darknet
    

    복제가 완료되면 darknet 디렉토리 아래로 이동하여 make를 실행합니다.
    os.chdir(working_dir + 'darknet')
    !make
    

    make가 끝나면 학습된 모델(의 가중치)을 다운로드합니다.
    !wget https://pjreddie.com/media/files/yolov3.weights
    

    이것으로 Google Colab에 YOLO v3 설정이 완료됩니다.

    YOLO를 움직여 보자.



    그럼 YOLO를 움직여 물체 검출을 해봅시다.
    이미 준비된 샘플 이미지를 사용합니다.
    샘플 이미지는 darknet/data 아래에 있습니다.
    !./darknet detect cfg/yolov3.cfg yolov3.weights 'data/dog.jpg'
    
    # layer     filters    size              input                output
    #     0 conv     32  3 x 3 / 1   608 x 608 x   3   ->   608 x 608 x  32  0.639 BFLOPs
    #     1 conv     64  3 x 3 / 2   608 x 608 x  32   ->   304 x 304 x  64  3.407 BFLOPs
    #     2 conv     32  1 x 1 / 1   304 x 304 x  64   ->   304 x 304 x  32  0.379 BFLOPs
    #     3 conv     64  3 x 3 / 1   304 x 304 x  32   ->   304 x 304 x  64  3.407 BFLOPs
    #     4 res    1                 304 x 304 x  64   ->   304 x 304 x  64
    #     5 conv    128  3 x 3 / 2   304 x 304 x  64   ->   152 x 152 x 128  3.407 BFLOPs
    #     6 conv     64  1 x 1 / 1   152 x 152 x 128   ->   152 x 152 x  64  0.379 BFLOPs
    #     7 conv    128  3 x 3 / 1   152 x 152 x  64   ->   152 x 152 x 128  3.407 BFLOPs
    #     8 res    5                 152 x 152 x 128   ->   152 x 152 x 128
    # .........
    #    97 upsample            2x    38 x  38 x 128   ->    76 x  76 x 128
    #    98 route  97 36
    #    99 conv    128  1 x 1 / 1    76 x  76 x 384   ->    76 x  76 x 128  0.568 BFLOPs
    #   100 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
    #   101 conv    128  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x 128  0.379 BFLOPs
    #   102 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
    #   103 conv    128  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x 128  0.379 BFLOPs
    #   104 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
    #   105 conv    255  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x 255  0.754 BFLOPs
    #   106 yolo
    # Loading weights from yolov3.weights...Done!
    # data/dog.jpg: Predicted in 22.825540 seconds.
    # dog: 100%
    # truck: 92%
    # bicycle: 99%
    

    물체 검출이 끝났습니다.
    이제 이미지를 표시하고 확인해 봅시다.
    물체 감지 결과를 그린 이미지는 darknet/predictions.jpg 입니다.
    img_in = cv2.imread('data/dog.jpg')
    img_out = cv2.imread('predictions.jpg')
    plt.figure(figsize=[20,10])
    plt.subplot(121);plt.imshow(img_in[:,:,::-1]);plt.axis('off')
    plt.subplot(122);plt.imshow(img_out[:,:,::-1]);plt.axis('off')
    



    「개」 「자전거」 「차」를 검출할 수 있습니다.

    다른 이미지도 확인해 봅시다.
    !./darknet detect cfg/yolov3.cfg yolov3.weights 'data/horses.jpg'
    
    img_in = cv2.imread('data/horses.jpg')
    img_out = cv2.imread('predictions.jpg')
    plt.figure(figsize=[20,10])
    plt.subplot(121);plt.imshow(img_in[:,:,::-1]);plt.axis('off')
    plt.subplot(122);plt.imshow(img_out[:,:,::-1]);plt.axis('off')
    


    !./darknet detect cfg/yolov3.cfg yolov3.weights 'data/person.jpg'
    
    img_in = cv2.imread('data/person.jpg')
    img_out = cv2.imread('predictions.jpg')
    plt.figure(figsize=[20,10])
    plt.subplot(121);plt.imshow(img_in[:,:,::-1]);plt.axis('off')
    plt.subplot(122);plt.imshow(img_out[:,:,::-1]);plt.axis('off')
    


    !./darknet detect cfg/yolov3.cfg yolov3.weights 'data/kite.jpg'
    
    img_in = cv2.imread('data/kite.jpg')
    img_out = cv2.imread('predictions.jpg')
    plt.figure(figsize=[20,10])
    plt.subplot(121);plt.imshow(img_in[:,:,::-1]);plt.axis('off')
    plt.subplot(122);plt.imshow(img_out[:,:,::-1]);plt.axis('off')
    



    요약



    이번에는 Google Colaboratory 환경에서 YOLO v3을 실행해 보았습니다.
    이미 준비되어 있는 샘플 화상으로 물체 검출을 실시했습니다.
    다양한 이미지를 준비하고 물체 검출해 보면 재미 있다고 생각합니다.

    참고문헌


  • YOLO 공식 페이지
  • 【YOLO v3에서 실천】딥 러닝에 의한 물체 검출 입문(Udemy)
  • 좋은 웹페이지 즐겨찾기