Python/파이썬 OpenCV 공부

[OpenCV 딥러닝] OpenCV에서 제공하는 DNN 모듈로 GoogLeNet 모델을 실행하여 영상 인식하기 - cv2.dnn.readNet

AI 꿈나무 2020. 10. 28. 13:53
반응형

GoogLeNet 영상 인식

 저번 포스팅에서는 CNN 모델을 OpenCV DNN 모듈로 실행하는 것을 해보았습니다.

 이번에는 OpenCV DNN 모듈을 이용해서 GoogLeNet 모델을 실행하는 것을 해보겠습니다.

 

 OpenCV에서는 GoogLeNet 모델을 학습을 시키는 것이 아니라 미리 학습해둔 파일을 받아와서 추론을 진행할 수 있습니다.

 

 학습이 어떻게 진행되었는지를 알아야 DNN 모듈에 적절한 입력값을 설정할 수 있습니다.

 GoogLeNet의 입력 : 224x224, BGR 컬러 영상, 평균 값 = (104,117,123)

 GoogLeNet의 출력 : 1x1000 행렬, 1000개 클래스에 대한 확률값

 

미리 학습된 GoogLeNet 학습 모델 및 구성 파일 다운로드

 Model Zoo에서 미리 학습되어진 파일을 다운받았습니다.

 Model Zoo는 model의 framework가 미리 학습되어진 파일을 모아둔 커뮤니티 입니다.

 

Caffe Model Zoo : github.com/BVLC/caffe

모델 파일 : dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel

설정 파일 : github.com/BVLC/caffe/blob/master/models/bvlc_googlenet/deploy.prototxt

클래스 이름 파일 : github.com/opencv/opencv/blob/4.1.0/samples/data/dnn/classification_classes_ILSVRC2012.txt

 

 위 홈페이지에서 다운 받은 파일을 이용했습니다.

 

구글넷 영상 인식 예제 코드

 예제코드는 황선규 박사님의 깃허브 홈페이지를 참고하였습니다.

 코드를 실습해보고 분석해보았습니다.

 

# 입력 영상을 불러오는 파일 이름
filename = 'space_shuttle.jpg'

# 명령 프롬프트에 임시파일 이름을 입력하여 파일을 불러올 수 있도록 하는 코드
if len(sys.argv) > 1:
    filename = sys.argv[1]
    
# 입력 영상 불러오기
img = cv2.imread(filename)

if img is None:
    print('Image load failed!')
    sys.exit()
    
# 네트워크 불러오기
# Caffe 설치된 파일 불러오기
model = 'googlenet/bvlc_googlenet.caffmodel'
config = 'googlenet/deploy.prototxt'

# dnn 객체 생성
net = cv2.dnn.readNet(model, congfig)

if net.empty():
    print('Network load failed!')
    sys.exit()
    
# 클래스 이름 불러오기
# 이전에 다운 받아온 클래스 이름 불러오기
# classNames에 1000개의 클래스 이름 등록
classNames = None
with open('googlenet/classification_classes_ILSVRC2012.txt', 'rt') as f:
    classNames = f.read().rstrip('\n').split('\n')
    
# 추론
# (1) : 0~255 픽셀값 그대로 이용, (224,224): 입력 영상 크기, (104,117,123): 평균 영상 크기
blob = cv2.dnn.blobFromImage(img, 1, (224, 224), (104, 117, 123))
net.setInput(blob)
prob = net.foward() # 확률에 대한 ndaaray 리턴

# 추론 결과 확인 & 화면 출력
out = prob.flatten()
classId = np.argmax(out) # 가장 큰 값 저장
confidence = out[classId] # 확률 값

# 확률 값을 보여주기 위해 text값을 제너레이션
text =  f'{classNames[classId]} ({confidence * 100:4.2f}%)'
cv2.putText(img, text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 1, cv2.LINE_AA)

cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()

 

 입력 사진을 blob 객체로 만들어서 network에 입력하면 미리 지정되어 있는 1000개의 클래스로 분류하게 됩니다.

 


OpenCV 깃허브 사이트와 황선규 박사님의 깃허브 사이트를 참고하면서 작성했습니다.

 

반응형