• 시작하기
  • 개발가이드
  • API 레퍼런스
  • 릴리즈 노트
Search Results for

    Show / Hide Table of Contents
    • Quick Start
    • Classification
    • Detection
    • Segmentation
    • IAD (Image Anomaly Detection)
    • OCR
    • IEN (Image Enhancement)
    • ROD (Rotated Object Detection)

    Segmentation


    이 문서는 SaigieVision을 통해 이미지를 'Segmentation(분할)' 하는 방법에 대해 설명합니다.

    여러분이 앞서 제공된 Quick Start 를 끝냈다면, 'Segmentation'을 수행하는 방법은 그리 어렵지 않습니다.

    아래 코드 블럭은 간단하게 Segmentation 검사 진행 방법에 대해서 설명합니다.

    {
        // Prepare
        SrImage srImage = new SrImage(@"..\..\sample.png");
        string modelPath = @"..\..\model.saigeseg";
        int gpuIndex = 0;
    
        // Initialize
        SegmentationEngine engine = new SegmentationEngine(modelPath, gpuIndex);
    
        // Model Info
        ModelInfo model = engine.GetModelInfo();
    
        // Option
        SegmentationOption option = engine.GetInferenceOption();
        option.CalcTime = true;
        option.CalcObject = true;
        option.CalcScoremap = true;
        option.CalcMask = true;
        option.CalcObjectAreaAndApplyThreshold = true;
        option.CalcObjectScoreAndApplyThreshold = true;
        option.OversizedImageHandling = OverSizeImageFlags.RESIZE_TO_FIT;
        engine.SetInferenceOption(option);
    
        // Inspection & Get Result
        SegmentationResult result = engine.Inspection(srImage);
        Console.WriteLine($"Contour Count:{result.SegmentedObjects.Length}");
        Console.WriteLine($"ImreadTime:{result.InspectionTime.ImreadTime}");
        Console.WriteLine($"InferenceTime:{result.InspectionTime.InferenceTime}");
        Console.WriteLine($"PostProcessingTime:{result.InspectionTime.PostProcessingTime}");
        foreach (var so in result.SegmentedObjects)
        {
            Console.WriteLine($"Name:{so.ClassInfo.Name}");
            Console.WriteLine($"Area:{so.Area}");
            Console.WriteLine($"Score:{so.Score}");
            Console.WriteLine($"Center Point X: ({so.BoundingRotBox.Center.X}");
            Console.WriteLine($"Center Point Y: ({so.BoundingRotBox.Center.Y}");
        }
    
        // optional
        srImage.Dispose();
    }
    

    Prepare

        SrImage srImage = new SrImage(@"..\..\sample.png");
        string modelPath = @"..\..\model.saigeseg";
        int gpuIndex = 0;
    

    SegmentationEngine 을 사용하기 위해 필요한 모든 데이터를 준비하는 과정입니다. 일반적으로 아래와 같은 3가지를 요구합니다.

    • 검사에 사용할 GPU
    • 검사에 사용할 샘플 이미지들
    • 검사에 사용할 모델( .saigeseg 파일)

    SaigeVision은 NVIDIA사의 GPU만을 지원하고 있습니다.
    GPU Index에 대해서는 명령 프롬프트 (command) 창을 통해 nvidia-smi 명령어를 입력하면 GPU의 index를 확인할 수 있습니다.

    이미지는 SrImage 객체를 통해 생성 가능합니다. 8bit, 16bit 형태의 이미지를 GrayScale, RGB, RGBA 형태로 제공이 됩니다.

    Initialize

        SegmentationEngine engine = new SegmentationEngine(modelPath, gpuIndex)
    

    SegmentationEngine 생성자에서 .saigeseg 모델파일에 대한 경로와 GPU Index를 매개변수로 설정하여 생성합니다.

    Model Info (Optional)

        ModelInfo model = engine.GetModelInfo();
    

    ModelInfo 는 .saigeseg 모델 파일에 대한 정보를 확인할 수 있습니다. 일반적으로 아래와 같은 정보를 확인할 수 있습니다.

    • 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)

        SegmentationOption option = engine.GetInferenceOption();
        option.CalcTime = true;
        option.CalcObject = true;
        option.CalcScoremap = true;
        option.CalcMask = true;
        option.CalcObjectAreaAndApplyThreshold = true;
        option.CalcObjectScoreAndApplyThreshold = true;
        option.OversizedImageHandling = OverSizeImageFlags.RESIZE_TO_FIT;
        engine.SetInferenceOption(option);
    

    SegmentationOption 에서 GetInferenceOption() 을 통해서 옵션에 대해서 정보를 받을 수 있습니다.
    SetInferenceOption() 을 통해서 옵션에 대해서 설정을 할 수 있습니다.
    옵션은 아래와 같은 정보들을 설정할 수 있습니다.

    • Calc Time (추론 API 실행에 소요되는 시간을 세분화하여 출력할지 결정합니다.)
    • Batch Size (추론을 한 번 수행할 때 추론하는 이미지의 개수입니다.)
    • CalcScoremap (true로 설정하면 추론 시 scoremap을 계산합니다.)
    • CalcMask (true로 설정하면 추론 시 mask를 계산합니다.)
    • CalcObjectAreaAndApplyThreshold (true로 설정하면 segmented object의 면적을 계산합니다. Segmented object의 면적이 object area threshold 보다 작으면 최종 결과에서 제외됩니다.)
    • CalcObjectScoreAndApplyThreshold (true로 설정하면 segmented object의 score를 계산합니다. Segmented object의 score가 object score threshold 보다 작으면 최종 결과에서 제외됩니다.)
    • OversizedImageHandling (SaigeHandleConfig에서 지정한 inspection size보다 큰 이미지를 처리하는 방법입니다. DO_NOT_INSPECT, RESIZE_TO_FIT, CROP_INTO_TILES 세 가지 옵션이 존재합니다.)

    자세한 내용은 Segmentation Option 문서를 통하여 확인할 수 있습니다.

    Inspection & Result

        SegmentationResult result = engine.Inspection(srImage);
        Console.WriteLine($"Contour Count:{result.SegmentedObjects.Length}");
        Console.WriteLine($"ImreadTime:{result.InspectionTime.ImreadTime}");
        Console.WriteLine($"InferenceTime:{result.InspectionTime.InferenceTime}");
        Console.WriteLine($"PostProcessingTime:{result.InspectionTime.PostProcessingTime}");
        foreach (var so in result.SegmentedObjects)
        {
            Console.WriteLine($"Name:{so.ClassInfo.Name}");
            Console.WriteLine($"Area:{so.Area}");
            Console.WriteLine($"Score:{so.Score}");
            Console.WriteLine($"Center Point X: ({so.BoundingRotBox.Center.X}");
            Console.WriteLine($"Center Point Y: ({so.BoundingRotBox.Center.Y}");
        }
    

    코드에서 볼수 있는 것처럼 'Inspection'을 수행하는 주 함수는 engine.Inspect()입니다. 모든 종류의 Engine들은 이러한 공통의 Inspect() 함수를 보유하고 있습니다. 또한, 다양한 사용을 위해 여러 형태로 중첩 되어 있습니다. 비동기 혹은 다수의 이미지들을 검사하는 등의 여러 시나리오에서 선택적으로 사용할 수 있습니다.

    SegmentationResult 에서 결과에 대한 모든 정보를 확인할 수 있습니다. Segmentation 의 경우 아래와 같은 정보를 결과로 확인할 수 있습니다. 일부 결과 정보에 대해서는 SegmentationResult 에서 true로 반영해야 정보를 받아올 수 있습니다.

    • Segmented Objects (Segmentation을 통해 검출된 영역의 정보를 받아 옵니다.)
    • Mask (Mask 이미지 정보입니다.)
    • Scoremap (Scoremap 이미지 정보입니다.)
    • Insepction Time (추론 API 실행에 소요된 시간을 밀리초 단위로 받아 옵니다.)

    Optional

        srImage.Dispose();
    

    이 예제에서는 검사에 사용했던 Bitmap들을 더 이상 사용할 곳이 없이게 Dispose() 합니다.

    많은 수의 이미지를 한번에 검사

    앞선 예제에서는 '한 장의 이미지'를 검사하는 시나리오에 대해서 살펴보았습니다. 하지만 '많은 수의 이미지'를 한번에 검사하고자 하는 경우에 대해 알아보겠습니다.

    샘플 코드에서 몇가지 부분을 수정하여 이 상황을 해결해봅시다.

    우선 SrImage을 배열로 만들어 '많은 수의 이미지' 데이터를 준비합니다. 아래와 같습니다.

        SrImage[] srImages = new SrImage[]
        {
            new SrImage(@"..\...\sample1.png"),
            new SrImage(@"..\...\sample2.png"),
            new SrImage(@"..\...\sample3.png"),
            new SrImage(@"..\...\sample4.png")
        };
    

    이후 생성자에서 숨어있던 마지막 인자를 사용할 수 있습니다.

        var engine = new SegmentationEngine(modelPath, gpuIndex, 4)
    

    마지막 인자는 '최대 이미지 수' 를 의미하며 한번에 (병렬로) 처리할 수 있는 이미지 수를 의미합니다.

    큰 값이 설정될수록 GPU 메모리 할당량이 커지므로, 메모리가 부족하다면 작은 수로 설정해 주세요.

    마지막으로 Inspect() 함수가 포함된 라인 이후를 수정합니다. 결과를 받아오는 GetResults() 함수를 복수명으로 변경 후 배열로 받아올 수 있도록 변경합니다.

        SegmentationResult[] results = engine.Inspection(srImages);
    

    이제 코드를 동작하여 '많은 수의 이미지'를 검사할 수 있습니다.

    • Improve this Doc
    In This Article
    Back to top Generated by DocFX