readNet() 함수는 전달된 framework 문자열, 또는 model과 config 파일 이름 확장자를 분석하여 내부에서 해당 프레임워크에 맞는 readNetFromXXX() 형태의 함수를 다시 호출합니다. 예를 들어 model 파일 확장자가 *.caffemodel이면 readNetFromCaffe() 함수를 호출하고, model 파일 확장자가 *.pb이면 readNetFromTensorflow() 함수를 다시 호출하여 Net 객체를 생성합니다. 이외에도 readNetFromTorch(), readNetFromDarknet(), readNetFromModelOptimizer(), readNetFromONNX() 함수가 OpenCV에서 제공되고 있습니다. readNetFromXXX() 형태의 함수를 사용자가 직접 호출하여 사용할 수도 있지만, OpenCV 4.0.0 버전부터는 readNet() 대표 함수를 사용하는 것이 좋습니다.
readNet() 함수를 이용하여 Net 객체를 생성한 후에는 Net::empty() 멤버 함수를 사용하여 Net 객체가 정상적으로 생성되었는지 확인하는 것이 좋습니다. 만약 Net::empty() 함수가 true를 반환하면 예외 처리 코드를 추가합니다.
bool Net::empty() const; |
|
• 반환값 |
네트워크가 비어 있으면 true를 반환합니다. |
일단 Net 객체가 정상적으로 생성되었다면 이제 생성된 네트워크에 새로운 데이터를 입력하여 그 결과를 확인할 수 있습니다. 이때 Net 객체로 표현되는 네트워크 입력으로 Mat 타입의 2차원 영상을 그대로 입력하는 것이 아니라 블롭(blob) 형식으로 변경해야 합니다. 블롭이란 영상 등의 데이터를 포함할 수 있는 다차원 데이터 표현 방식입니다. OpenCV에서 블롭은 Mat 타입의 4차원 행렬로 표현됩니다. 이때 각 차원은 NCHW 정보를 표현합니다. 여기서 N은 영상 개수, C는 채널 개수, H와 W는 각각 영상의 세로와 가로 크기를 의미합니다. OpenCV에서는 blobFromImage() 함수를 이용하여 Mat 영상으로부터 블롭을 생성합니다. blobFromImage() 함수 원형은 다음과 같습니다.