본문 바로가기

프로그래머스 데브 코스/TIL

[6기] 프로그래머스 인공지능 데브코스 92일차 TIL

1201

[15주차 - Day5] Visual Recognition

Custom YOLO v3 제작 과제

# 강의에서 배운 Custom YOLO제작방법과
# 유튜브(https://www.youtube.com/watch?v=saDipJR14Lc)에 나오는 OpenCV를
# GPU와 같이 사용하는 방법을 같이 이용하여
# 로컬에서 GPU로 동작하는 Custom YOLO v3를 제작해보기

# 예를 들어 ‘총’을 들고 있는 사람을 인지하는 실시간 위험감시 프로그램 제작

# GPU로 OpenCV가 돌아가지 않으면 CPU로라도 제작

 

Custom YOLO 제작 전 YOLO v3 실습 수행

# darknet repository에서 clone하기
!git clone https://github.com/AlexeyAB/darknet


#GPU와 OPENCV의 사용이 가능하도록  makefile을 수정하기
%cd darknet
!sed -i 's/OPENCV=0/OPENCV=1/' Makefile
!sed -i 's/GPU=0/GPU=1/' Makefile
!sed -i 's/CUDNN=0/CUDNN=1/' Makefile


# CUDA버전 확인하기
!/usr/local/cuda/bin/nvcc --version


# make를 이용하여 darknet를 build
!make


# coco 데이터셋으로 사전학습된 weight값들을 다운로드함
!wget https://pjreddie.com/media/files/yolov3.weights


# helper함수들
def imShow(path):
  import cv2
  import matplotlib.pyplot as plt
  %matplotlib inline

  image = cv2.imread(path)  #경로로부터이미지를 불러읽어들여서
  height, width = image.shape[:2]   #현재 영상의 height와 width를 읽어서
  resized_image = cv2.resize(image,(3*width, 3*height), interpolation = cv2.INTER_CUBIC) #영상을 3배로 키운다(크게 보여주기 위해서)

  fig = plt.gcf()
  fig.set_size_inches(18, 10)
  plt.axis("off")
  plt.imshow(cv2.cvtColor(resized_image, cv2.COLOR_BGR2RGB))  #opencv로 읽어들인 영상은 BGR포맷을 갖기 때문에 RGB포맷으로 변환해야 함
  plt.show()

# google colab으로 파일을 업로드할 때 사용하는 함수를 정의
def upload():
  from google.colab import files
  uploaded = files.upload() 
  for name, data in uploaded.items():
    with open(name, 'wb') as f:
      f.write(data)
      print ('saved file', name)

# google colab에서 파일을 다운로드할 때 사용하는 함수를 정의
def download(path):
  from google.colab import files
  files.download(path)

- YOLO 수행을 위한 환경 설정 및 파라미터 로드

 

!./darknet detect <path to config> <path to weights> <path to image>

- Object Detector는 위의 코멘드로 실행시킬 수 있다

 

imShow('predictions.jpg')

- 위 코멘드를 사용하면 Detector가 끝난 이미지/영상을 보여 준다

 

# darknet detection을 실행하기
!./darknet detect cfg/yolov3.cfg yolov3.weights data/person.jpg

# 결과영상을 보여주기
imShow('predictions.jpg')

- person.jpg 이미지로 YOLO를 수행한 결과 사진

 

# dog.jpg에 대해서도 실행시켜보기
!./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
imShow('predictions.jpg')

- dog.jpg 이미지로 YOLO를 수행한 결과 사진

 

 

# 이미지를 root directory로 업로드하기 (밑에서는 street.jpg을 사용하기 때문에 street.jpg라는 이름의 이미지를 업로드함)
%cd ..
upload()

 

- 이제 내가 가지고 있는 사진을 이용한 YOLO를 수행하기 위해 이미지 업로드 코드를 실행

- 아래 결과에 보이는 <파일 선택> 버튼을 눌러서 원하는 이미지를 불러 오면 됨

 

- 위의 street.jpg 파일을 업로드 

 

# 다음의 명령으로 darknet에서 업로드한 영상에 대해 detection을 수행하고, 결과를 보여준다
%cd darknet
!./darknet detect cfg/yolov3.cfg yolov3.weights ../street.jpg
imShow('predictions.jpg')

- 결과 이미지 확인