YOLO 모델 로딩하는 코드
OpenCV 라이브러리를 사용해서 YOLO (You Only Look Once)라는 객체 탐지 모델을 불러올거다.
readNetFromDarknet 함수를 써서 YOLO 모델을 로드한다.
// YOLO 모델 설정 파일과 가중치 파일 경로 지정
String modelConfiguration = "yolov2.cfg";
String modelBinary = "yolov2.weights";
// YOLO 모델 로드
Net net = Dnn.readNetFromDarknet(modelConfiguration, modelBinary);
// 이미지 프레임을 딥러닝 모델이 처리할 수 있는 blob 형태로 변환
Mat inputBlob = Dnn.blobFromImage(frame, 1 / 255.0, new Size(416, 416), new Scalar(0, 0, 0), true, false);
// YOLO 네트워크에 inputBlob을 입력으로 설정
net.setInput(inputBlob, "data");
// 네트워크를 통해 예측 수행하고, 결과를 detectionMat에 저장
Mat detectionMat = net.forward("detection_out");
modelConfiguration: 네트워크 구조를 담고 있는 .cfg 파일 경로, 제대로 된 경로로 넣어야 작동한다.
modelBinary: 학습된 가중치 파일 경로, 이 파일이 있어야 모델이 뭘 탐지하는지 안다.
Dnn.readNetFromDarknet: OpenCV의 DNN 모듈에서 readNetFromDarknet 메서드를 이용해 모델을 불러온다. 이렇게 하면 net 객체가 만들어져서 나중에 이미지에서 객체를 탐지할 때 쓸 수 있다.
blobFromImage 쪽의 인자인 frame에는 처리하고 싶은 이미지가 들어가야 한다. 이 frame이 바로 YOLO 모델에 입력될 이미지다.
net.setInput(inputBlob, "data");는 YOLO 모델의 입력으로 inputBlob을 설정해주는 거다. inputBlob은 우리가 이전 단계에서 만든 이미지 데이터의 "blob" 형태다. "data"는 YOLO 모델의 기본 입력 레이어 이름이다. 다른 이름을 쓰면 제대로 작동하지 않을 수 있으니까 그대로 써야 한다.
Mat detectionMat = net.forward("detection_out");의 forward 함수는 YOLO 모델에 inputBlob을 넣고 예측을 수행하게 해준다.
"detection_out"은 YOLO의 출력 레이어 이름이다. 이 레이어에서 탐지 결과가 나온다.
detectionMat에는 모델이 탐지한 객체의 정보를 담은 결과가 저장된다. 예를 들어 탐지된 객체의 위치, 클래스, 신뢰도 같은 정보들이 들어있다.