ROD
이 문서는 SaigieVision을 통해 이미지를 'Rotated Object Detection(회전 물체 검출)' 하는 방법에 대해 설명합니다.
여러분이 앞서 제공된 Quick Start 를 끝냈다면, 'Rotated Object Detection (이하 ROD)'을 수행하는 방법은 그리 어렵지 않습니다.
아래 코드 블럭은 간단하게 ROD 검사 진행 방법에 대해서 설명합니다.
{
// Prepare
SrImage srImage = new SrImage(@"..\..\sample.png");
string modelPath = @"..\..\model.saigerod";
int gpuIndex = 0;
// Initialize
RODEngine engine = new RODEngine(modelPath, gpuIndex);
// Model Info
ModelInfo model = engine.GetModelInfo();
// Option
ROIOption option = engine.GetInferenceOption();
option.CalcTime = true;
option.MaxNumOfDetectedObjects[1] = -1;
option.MaxNumOfDetectedObjects[2] = -1;
option.ObjectScoreThresholdPerClass[1] = 50;
option.ObjectScoreThresholdPerClass[2] = 50;
engine.SetInferenceOption(option);
// Inspection & Get Result
RODResult result = engine.Inspection(srImage);
Console.WriteLine($"ImreadTime:{result.InspectionTime.ImreadTime}");
Console.WriteLine($"InferenceTime:{result.InspectionTime.InferenceTime}");
Console.WriteLine($"PostProcessingTime:{result.InspectionTime.PostProcessingTime}");
foreach (var detectedObject in result.DetectedObjects)
{
Console.WriteLine($"Name:{detectedObject.ClassInfo.Name}");
Console.WriteLine($"Area:{detectedObject.Area}");
Console.WriteLine($"Score:{detectedObject.Score}");
}
// optional
srImage.Dispose();
}
Prepare
SrImage srImage = new SrImage(@"..\..\sample.png");
string modelPath = @"..\..\model.saigerod";
int gpuIndex = 0;
RODEngine 을 사용하기 위해 필요한 모든 데이터를 준비하는 과정입니다. 일반적으로 아래와 같은 3가지를 요구합니다.
- 검사에 사용할 GPU
- 검사에 사용할 샘플 이미지들
- 검사에 사용할 모델( .saigerod 파일)
SaigeVision은 NVIDIA사의 GPU만을 지원하고 있습니다.
GPU Index에 대해서는명령 프롬프트 (command)창을 통해nvidia-smi명령어를 입력하면 GPU의 index를 확인할 수 있습니다.
이미지는
SrImage객체를 통해 생성 가능합니다.8bit,16bit형태의 이미지를GrayScale,RGB,RGBA형태로 제공이 됩니다.
Initialize
RODEngine engine = new RODEngine(modelPath, gpuIndex)
RODEngine 생성자에서 .saigedet 모델파일에 대한 경로와 GPU Index를 매개변수로 설정하여 생성합니다.
Model Info (Optional)
ModelInfo model = engine.GetModelInfo();
ModelInfo 는 .saigerod 모델 파일에 대한 정보를 확인할 수 있습니다. 일반적으로 아래와 같은 정보를 확인할 수 있습니다.
- Network Type (어떤 종류의 딥러닝 네트워크를 사용했는지 나타냅니다)
- Classes Information (클래스 정보입니다. name, color에 대한 정보들을 확인할 수 있습니다.)
- Developer Version (모델을 학습할 때 사용한 SaigeVision Developer의 버전입니다.)
- Server Version (모델을 학습할 때 사용한 SaigeVision Developer의 구성 요소 중 서버의 버전입니다.)
- Module Version (모델을 학습할 때 사용한 SaigeVision Developer의 구성 요소 중 딥러닝 모듈의 버전입니다.)
- Roi Information (ROI 정보입니다.)
- Resize Factor (Segmentation, IEN 전용, 인풋 이미지에 적용되는 리사이즈 비율입니다. 추론 이미지에도 동일하게 적용됩니다.)
- Crop Size (Segmentation, IEN 전용, 학습 때 사용된 패치의 사이즈입니다. 추론 이미지와는 관련 없습니다)
- Image Resize (IAD, CLS 전용, 인풋 이미지에 적용되는 리사이즈 입니다. 추론 이미지에도 동일하게 적용됩니다)
자세한 내용은 Model Info 문서를 통하여 확인할 수 있습니다.
Option (Optional)
RODOption option = engine.GetInferenceOption();
option.MaxNumOfDetectedObjects[1] = -1;
option.ObjectScoreThresholdPerClass[1] = 50;
engine.SetInferenceOption(option);
RODOption 에서 GetInferenceOption() 을 통해서 옵션에 대해서 정보를 받을 수 있습니다.
SetInferenceOption() 을 통해서 옵션에 대해서 설정을 할 수 있습니다.
옵션은 아래와 같은 정보들을 설정할 수 있습니다.
- Calc Time (추론 API 실행에 소요되는 시간을 세분화하여 출력할지 결정합니다.)
- MaxNumOfDetectedObjects (출할 detected object의 최대 개수입니다.)
- ObjectScoreThresholdPerClass (클래스별 object area threshold 값입니다.)
자세한 내용은 ROD Option 문서를 통하여 확인할 수 있습니다.
Inspection & Result
RODResult result = engine.Inspection(bmp);
Console.WriteLine($"ImreadTime:{result.InspectionTime.ImreadTime}");
Console.WriteLine($"InferenceTime:{result.InspectionTime.InferenceTime}");
Console.WriteLine($"PostProcessingTime:{result.InspectionTime.PostProcessingTime}");
foreach (var detectedObject in result.DetectedObjects)
{
Console.WriteLine($"Name:{detectedObject.ClassInfo.Name}");
Console.WriteLine($"Area:{detectedObject.Area}");
Console.WriteLine($"Score:{detectedObject.Score}");
}
코드에서 볼수 있는 것처럼 'Inspection'을 수행하는 주 함수는 engine.Inspect()입니다. 모든 종류의 Engine들은 이러한 공통의 Inspect() 함수를 보유하고 있습니다. 또한, 다양한 사용을 위해 여러 형태로 중첩 되어 있습니다. 비동기로 검사하는 등의 여러 시나리오에서 선택적으로 사용할 수 있습니다.
RODResult 에서 결과에 대한 모든 정보를 확인할 수 있습니다. ROD 의 경우 아래와 같은 정보를 결과로 확인할 수 있습니다.
- Detected Objects (ROD을 통해 검출된 영역의 정보를 받아 옵니다.)
- Insepction Time (추론 API 실행에 소요된 시간을 밀리초 단위로 받아 옵니다.)
Optional
srImage.Dispose();
이 예제에서는 검사에 사용했던 SrImage들을 더 이상 사용할 곳이 없이게 Dispose() 합니다.