cv2.dnn.readNet()로 이미지 처리하기

JJulme·2021년 9월 10일
1

1. readNet()

readNet() 함수는 전달된 framework 문자열, 또는 model과 config 파일 이름 확장자를 분석하여 내부에서 해당 프레임워크에 맞는 readNetFromXXX() 형태의 함수를 다시 호출해준다.

모델 확장자에 따라 호출하는 함수가 다르다.
.caffemodel -> readNetFromCaffe()
.pb -> readNetFromTensorflow()
readNetFromTorch(), readNetFromDarknet(), readNetFromModelOptimizer(), readNetFromONNX()

model_path = './opencv_face_detector_uint8.pb'
config_path = './opencv_face_detector.pbtxt'

Net = cv2.dnn.readNetFromTensorflow(model_path, config_path)

하지만 OpenCV 4.0.0 부터는 확장자 상관없이 readNet()을 사용하는 것이 좋다.

bool Net::emtpy() const;
	# 네트워크가 비어있다면 True 를 준다.

# python에서 이런식으로 쓸 수도 있다.
if net.emtpy():
	print('Not Network')
    sys.exit()

2. blobFromImage()

Net에 입력되는 데이터는 blob 형식으로 변경 해줘야 한다.
blob: opencv에서 Mat타입의 4차원(4D Tensor: NCHW) 행렬
N: 영상 개수
C: 채널 개수
H: 영상 세로
W: 영상 가로

blobFromImages(): 이미지가 두개 이상인 경우 사용

blob = cv2.dnn.blobFromImage(cv2.resize(frame,(300, 300)),
	1.0, (300, 300), (104.0, 177.0, 123.0))

3. setInput()

Net에 blob 형태의 데이터 넣어주는 함수

Net.setInput(blob)

4. forward()

Net을 실행 시켜줌(순방향)

prob = Net.forward()

결국 만들어지는 형태

model_path = './opencv_face_detector_uint8.pb'
config_path = './opencv_face_detector.pbtxt'

# 모델 불러오기
Net = cv2.dnn.readNet(model_path, config_path)
# 이미지 blob으로 설정
blob = cv2.dnn.blobFromImage(cv2.resize(frame,(300, 300)),
	1.0, (300, 300), (104.0, 177.0, 123.0))
# Net에 blob 데이터 넣어주기
Net.setInput(blob)
# Net 순방향 실행시키기
prob = Net.forward()

참고

https://deep-learning-study.tistory.com/299

0개의 댓글