Geometric Match Multi

1.1.1 개요

이미지 내의 기하학적 정보 패턴을 학습하고 검사 이미지에서 이미지 내의 동일 혹은 유사한 패턴을 탐지하는 알고리즘입니다.

1.1.2 알고리즘 상세 설명

기하학적 요소를 기반으로 탐색함으로 인해 기존 패턴 매칭방식에서 할 수 없는 폭넓은 범위의 탐지가 가능합니다. Geometric Match Multi은 Geometric Match에 한 가지의 패턴을 학습하여 검사하는 것이 아닌 여러개에 학습 데이터를 사용하여 동시에 검사를 진행하는 알고리즘입니다.

학습 데이터 주변 환경 변화 가려짐 현상
학습 데이터 외부 패턴 변화 가려짐 현상
주변 상태 변화
Geometric Match 동작 예시

Geometric Match 동작 예시와 같이 학습 데이터의 주변환경과 검사 이미지의 주변환경은 매우 다른 상태입니다. 하지만 기하 매칭 알고리즘은 주변환경이 변하더라도 정확히 해당 기하학적 정보만을 바탕으로 결과를 판단하기 때문에 주변상태와 무관하게 정확한 결과를 얻을 수 있습니다. 주변 환경 변화와 같이 십자가 주변의 환경이나 십자가 뒷면에 다른 형상이 있어 해당 영역에 영향을 주더라도 정확한 결과를 제공하게 됩니다. 또한 설비상 오류로 인해 패턴이 일부 훼손된 상태로 가려짐이 발생하더라도 기하 패턴에 대한 탐지가 가능합니다.

높은 수준의 정확도를 가진 매칭뿐만 아니라 사용자의 환경에 맞는 학습 환경을 제공하기위해 FLImaging® Geometric Match만의 커스터마이징 학습방법을 제공합니다.

Template Match Geometric Match
모든 도형의 학습 영역 지원

직사각형, 원뿐만 아니라 타원, 임의의 다각형, 곡선형 도형 등 FLImaging®에서 지원하는 모든 도형의 관심영역을 학습영역으로 사용가능합니다.

학습 이미지 내 노이즈 부분이 특징점으로 학습될 수가 있습니다. 전체적인 형태 정보만 필요하고 내부 노이즈 패턴이 불필요한 상황에 대한 처리를 위해 필터링 기능을 제공합니다. 학습 과정에서 발생하는 작은 노이즈부터 불필요한 작은 패턴까지 모두 필터링 가능함으로써 손쉬운 학습이 가능합니다.

Template Match Geometric Match
사용자가 원하는 구역에 대한 학습

Geometric Match Multi는 Geometric Match와 달리 여러 학습 데이터를 동시에 학습하고, 한 번에 다양한 기하학적 패턴 검사를 수행할 수 있습니다. 이를 통해 하나의 객체에 대해 여러 패턴을 검사할 수 있으며, 학습 데이터가 하나의 파일로 저장되어 관리가 용이하고 사용이 편리합니다.

Template Match
Fig. 패턴 2개(Rect, Circle) 학습 후 동작 결과

클래스별 겹치는 결과를 옵션 설정에 따라 제외가 가능합니다.

All 모드 Highest Score 모드
All 모드 Highest Score 모드
Fig. 클래스별 겹치는 영역 제거 옵션 처리 비교

클래스별로 최대 검출 갯수를 설정할 수 있습니다.
다중 객체를 검사 진행시 각 객체별 최대 갯수를 지정하여 원하는 검출 갯수 만큼 설정하여 패턴 검사를 진행할 수 있습니다.

Rect 1개, Circle 20개 Rect 2개, Circle 3개
All 모드 Highest Score 모드
Fig. 클래스별 검출 갯수 지정 비교

1.1.3 학습 방법

  1. FLImaging® 개발 스튜디오을 실행합니다.
개발 스튜디오 실행 화면
개발 스튜디오 실행 화면
  1. Menu 검색창에 Geometric Match Multi를 검색하거나 Advanced Functions에 Match 카테고리에 Geometric을 클릭합니다.
알고리즘 검색
알고리즘 검색
  1. 학습할 이미지를 불러옵니다.
    • 뷰에 마우스 우측 버튼 클릭 후 Load File 선택
Load File 선택
Load File 선택
파일 선택
파일 선택
이미지 파일 열기
이미지 파일 열기 완료
  1. 학습할 뷰를 선택합니다.
View 선택
View 선택
View 선택 완료
View 선택 완료
  1. 학습 영역을 지정합니다.
    • Learn View ROI에 항목에 마우스 우측 버튼을 클릭하여 Rect ROI를 클릭합니다.
ROI 타입 선택
ROI 타입 선택
ROI 영역 지정
ROI 영역 지정
ROI 등록
ROI 등록
영역 지정 완료
영역 지정 완료
  1. 학습을 진행합니다.
명칭 입력
학습 데이터 명칭을 입력합니다.
학습 진행
버튼(F6)을 클릭합니다.
메세지 출력
출력 메세지에 OK 출력시 정상적으로 학습이 동작이 완료되었습니다.
학습 완료
첫번째 학습 완료
학습 완료
추가로 학습하고 싶은 영역을 지정합니다.
학습 완료
명칭 입력
학습 완료
두번째 학습 완료

해당 동작을 코드로 표현하면 다음과 같습니다.

CGeometricMatchMulti geometricMatchMulti; // 알고리즘 객체 선언

CFLImage fliLearnImage; // 이미지 객체 선언
fliLearnImage.Load(L"D:/Learn.png"); // 이미지 파일 로드
geometricMatchMulti.SetLearnImage(fliLearnImage); // 학습 이미지 입력

CFLRect<double> flfLearnROI1(100.636943, 154.394904, 296.305732, 345.477707, 0.000000); // 첫번째 학습 영역 생성 
geometricMatchMulti.SetLearnROI(flfLearnROI1); // 학습 영역 입력

geometricMatchMulti.Learn(L"Case1"); // 첫번째 학습

CFLRect<double> flfLearnROI2(328.407643, 120.764331, 537.834395, 325.605096, 0.000000); // 두번째 학습 영역 생성 
geometricMatchMulti.SetLearnROI(flfLearnROI2); // 학습 영역 입력

geometricMatchMulti.Learn(L"Case2"); // 두번째 학습
CGeometricMatchMulti geometricMatchMulti = new CGeometricMatchMulti(); // 알고리즘 객체 선언

CFLImage fliLearnImage = new CFLImage(); // 이미지 객체 선언
fliLearnImage.Load("D:/Learn.png"); // 이미지 파일 로드
geometricMatchMulti.SetLearnImage(ref fliLearnImage); // 학습 이미지 입력

CFLRect<double> flfLearnROI1 = new CFLRect<double>(100.636943, 154.394904, 296.305732, 345.477707, 0.000000); // 첫번째 학습 영역 생성 
geometricMatchMulti.SetLearnROI(flfLearnROI1); // 학습 영역 입력

geometricMatchMulti.Learn("Case1"); // 첫번째 학습

CFLRect<double> flfLearnROI2 = new CFLRect<double>(328.407643, 120.764331, 537.834395, 325.605096, 0.000000); // 두번째 학습 영역 생성 
geometricMatchMulti.SetLearnROI(flfLearnROI2); // 학습 영역 입력

geometricMatchMulti.Learn("Case2"); // 두번째 학습
geometricMatchMulti = CGeometricMatchMulti() # 알고리즘 객체 선언

fliLearnImage = CFLImage() # 이미지 객체 선언
fliLearnImage.Load("D:/Learn.png") # 이미지 파일 로드
geometricMatchMulti.SetLearnImage(fliLearnImage) # 학습 이미지 입력

flfLearnROI1 = CFLRect[Double](100.636943, 154.394904, 296.305732, 345.477707, 0.000000) # 첫번째 학습 영역 생성 
geometricMatchMulti.SetLearnROI(flfLearnROI1) # 학습 영역 입력

geometricMatchMulti.Learn("Case1") # 첫번째 학습

flfLearnROI2 = CFLRect[Double](328.407643, 120.764331, 537.834395, 325.605096, 0.000000) # 두번째 학습 영역 생성 
geometricMatchMulti.SetLearnROI(flfLearnROI2) # 학습 영역 입력

geometricMatchMulti.Learn("Case2") # 두번째 학습

1.1.4 검사 방법

  1. 검사를 진행할 이미지를 불러옵니다.
Load File 선택
Load File 선택
파일 선택
파일 선택
이미지 파일 열기
이미지 파일 열기 완료
  1. 검사할 뷰를 선택합니다.
View 선택
View 선택
  1. 검사 옵션을 설정합니다.
옵션 설정
옵션 설정

Scale Min: 탐색할 패턴의 최소 크기 비율을 설정합니다.
Scale Max: 탐색할 패턴의 최대 크기 비율을 설정합니다.
Angle Bias: 패턴 탐색 시 기준이 되는 회전 각도를 설정합니다.
Angle Tolerance: 허용되는 회전 각도의 범위를 설정합니다.
Minimum Score: 탐색된 패턴의 최소 신뢰도 점수를 설정합니다.
Max Object: 이미지에서 탐색할 패턴의 최대 개수를 설정합니다.
Interpolation: 탐색 시 이미지 보간 방식을 설정합니다.

  1. 검사를 진행합니다.
    • Exectue 버튼 클릭(F5)
옵션 설정
옵션 설정
  1. 정상 검사 동작 완료시 다음과 같이 출력됩니다.
검사 완료
검사 완료

해당 동작을 코드로 표현하면 다음과 같습니다.

CGeometricMatchMulti geometricMatchMulti; // 학습한 알고리즘 객체와 동일해야합니다.

CFLImage fliSourceImage; // 이미지 객체 선언
fliSourceImage.Load(L"D:/Find.png"); // 이미지 파일 로드
geometricMatchMulti.SetSourceImage(fliSourceImage); // 검사 이미지 입력 

geometricMatchMulti.SetAngleTolerance(180.000000); // 검사 동작 범위 입력 (-180 ~ 180)
geometricMatchMulti.SetMaxObjectTotal(5); // 검출학 객체수 출력

geometricMatchMulti.Execute(); // 검사 동작

int64_t i64Size = geometricMatchMulti.GetResultCount(); // 검사 결과 갯수 확인

for(int64_t i = 0; i < i64Size; ++i) // 검사 결과 데이터 가져오기
{
	CGeometricMatchMulti::SResult results;
	geometricMatchMulti.GetResult(i, results);
}
CGeometricMatchMulti geometricMatchMulti = new CGeometricMatchMulti(); // 학습한 알고리즘 객체와 동일해야합니다.

CFLImage fliSourceImage = new CFLImage(); // 이미지 객체 선언
fliSourceImage.Load("D:/Find.png"); // 이미지 파일 로드
geometricMatchMulti.SetSourceImage(ref fliSourceImage); // 검사 이미지 입력 

geometricMatchMulti.SetAngleTolerance(180.000000); // 검사 동작 범위 입력 (-180 ~ 180)
geometricMatchMulti.SetMaxObjectTotal(5); // 검출학 객체수 출력

geometricMatchMulti.Execute(); // 검사 동작

long i64Size = geometricMatchMulti.GetResultCount(); // 검사 결과 갯수 확인

for(long i = 0; i < i64Size; ++i) // 검사 결과 데이터 가져오기
{
	CGeometricMatchMulti.SResult results = new CGeometricMatchMulti.SResult();
	geometricMatchMulti.GetResult(i, ref results);
}
geometricMatchMulti = CGeometricMatchMulti()  # 학습한 알고리즘 객체와 동일해야 합니다.

fliSourceImage = CFLImage()  # 이미지 객체 선언
fliSourceImage.Load("D:/Find.png")  # 이미지 파일 로드
geometricMatchMulti.SetSourceImage(fliSourceImage)  # 검사 이미지 입력

geometricMatchMulti.SetAngleTolerance(180.0)  # 검사 동작 범위 입력 (-180 ~ 180)
geometricMatchMulti.SetMaxObjectTotal(5)  # 검출할 객체 수 입력

geometricMatchMulti.Execute()  # 검사 동작

i64Size = geometricMatchMulti.GetResultCount()  # 검사 결과 개수 확인

for i in range(i64Size):  # 검사 결과 데이터 가져오기
    results = CGeometricMatchMulti.SResult()
    geometricMatchMulti.GetResult(i, results)

1.1.5 학습 동작 함수

1.1.6 검사 동작 함수

1.1.7 동작 결과 취득 함수

1.1.8 Learn Weight ROI 상세 설명

기본 학습 진행시 전체적인 학습 영역에서 기하학적 요소에 특징점을 고르게 선출하게되는데 Learn Weight ROI는 특정 영역에 가중치를 주어 해당 영역에 특징점 선출 비율을 조절 할 수 있습니다.

학습 이미지 학습 영역 지정 학습 결과 (특징점)
학습 이미지 원본 이미지 결과 원본 이미지 결과
Fig. 기본 학습 동작 결과

Weight ROI 지정(좌 0.1 우 0.9) 학습 결과
학습 이미지 원본 이미지 결과
Fig. Learn Weight 지정 결과 좌측 0.1, 우측 0.9

Fig. 학습 결과를 보면 같이 기본 동작에 학습을 진행시 특징점 위치가 전반적으로 분포됩니다. Figure 는 좌측에 가중치를 0.1 우측 영역에 0.9를 지정하고 학습 진행시 점에 특징점 분포가 가중치에 맞게 선출되게 됩니다.

Weight ROI 지정(가중치 0) 학습 결과
Weight ROI 지정(가중치 0) 학습 결과
Fig. Learn Weight 가중치 0

특정 영역에 가중치를 0으로 설정할 수 있습니다.
Fig. 과 같이 내부에 사각형 영역을 지정하고 가중치를 0으로 설정하여 해당 영역에 특징점에 뽑히지 않는 것을 확인할 수 있습니다.

1.1.9 Learn Guide Shape ROI 상세 설명

Learn Guide Shape ROI는 지정 영역에 선을 통해 가중치 비율에 맞게 원하는 위치에 특징점을 뽑을 수가 있습니다.
가이드 영역에 선분에 입력한 Tolerance 거리 차이 내에 기하하적 요소에 특징점을 가중치에 맞게 추출합니다.
Fig. 에 학습 결과를 확인하면 입력한 가이드 영역에 위치에 따라 특징점이 추출됩니다. 특징점이 선출되는 비율은 가중치를 통해 조절이 가능합니다.

Guide Shape 영역 지정 학습 결과
Guide Shape 영역 지정 학습 결과
Guide Shape 영역 지정 학습 결과
Guide Shape 영역 지정 학습 결과
Guide Shape 영역 지정 학습 결과
Guide Shape 영역 지정 학습 결과
Fig. Guide Shape 사용 예

1.1.10 학습 데이터 Save & Load 방법 설명

학습한 데이터 파일을 저장 및 불러오기가 가능합니다.
이미 학습한 파일을 저장하여 편리하게 관리할 수 있습니다.

1.1.10.1 Save 동작 설명

학습을 진행한 후 해당 학습 데이터 파일을 파일로 저장할 수 있습니다.
Learn 동작을 진행한 이후 저장을 진행 할 수 있습니다.

CGeometricMatchMulti geometricMatchMulti;// 알고리즘 객체

// 패턴 학습
CFLImage fliLearnImage; // 이미지 객체
CFLRect<double> flfLearnROI; // 학습 관심 영역
geometricMatchMulti.SetLearnImage(fliLearnImage); // 학습 이미지 입력
geometricMatchMulti.SetLearnROI(flfLearnROI); // 학습 관심 영역 입력
geometricMatchMulti.Learn(L"학습 클래스 명칭 입력"); // 학습 진행

// 학습 파일 Save 진행
geometricMatchMulti.Save(L"파일 경로 입력"); // 파일 포멧은 .flmg
CGeometricMatchMulti geometricMatchMulti = new CGeometricMatchMulti();// 알고리즘 객체

// 패턴 학습
CFLImage fliLearnImage = new CFLImage(); // 이미지 객체
CFLRect<double> flfLearnROI = new CFLRect<double>(); // 학습 관심 영역
geometricMatchMulti.SetLearnImage(ref fliLearnImage); // 학습 이미지 입력
geometricMatchMulti.SetLearnROI(flfLearnROI); // 학습 관심 영역 입력
geometricMatchMulti.Learn("학습 클래스 명칭 입력"); // 학습 진행

// 학습 파일 Save 진행
geometricMatchMulti.Save("파일 경로 입력"); // 파일 포멧은 .flmg
geometricMatchMulti = CGeometricMatchMulti()  # 알고리즘 객체

# 패턴 학습
fliLearnImage = CFLImage()  # 이미지 객체
flfLearnROI = CFLRect[Double]()  # 학습 관심 영역
geometricMatchMulti.SetLearnImage(fliLearnImage)  # 학습 이미지 입력
geometricMatchMulti.SetLearnROI(flfLearnROI)  # 학습 관심 영역 입력
geometricMatchMulti.Learn("학습 클래스 명칭 입력")  # 학습 진행

# 학습 파일 Save 진행
geometricMatchMulti.Save("파일 경로 입력")  # 파일 포맷은 .flmg

1.1.10.2 Load 동작 설명

저장한 학습 파일을 불러오기가 가능합니다.
저장한 파일을 불러와서 바로 검사 진행이 바로 가능합니다.

CGeometricMatchMulti geometricMatchMulti; // 알고리즘 객체

// 학습 파일 Load 진행
geometricMatchMulti.Load(L"파일 경로 입력"); // 파일 포멧은 .flmg

// 패턴 탐색
CFLImage fliSourceImage; // 검사할 이미지 객체
geometricMatchMulti.SetSourceImage(fliSourceImage); // 검사 이미지 입력
geometricMatchMulti.Execute(); // 검사 동작
CGeometricMatchMulti geometricMatchMulti = new CGeometricMatchMulti(); // 알고리즘 객체

// 학습 파일 Load 진행
geometricMatchMulti.Load("파일 경로 입력"); // 파일 포멧은 .flmg

// 패턴 탐색
CFLImage fliSourceImage = new CFLImage(); // 검사할 이미지 객체
geometricMatchMulti.SetSourceImage(ref fliSourceImage); // 검사 이미지 입력
geometricMatchMulti.Execute(); // 검사 동작
geometricMatchMulti = CGeometricMatchMulti()  # 알고리즘 객체

# 학습 파일 Load 진행
geometricMatchMulti.Load("파일 경로 입력")  # 파일 포맷은 .flmg

# 패턴 탐색
fliSourceImage = CFLImage()  # 검사할 이미지 객체
geometricMatchMulti.SetSourceImage(fliSourceImage)  # 검사 이미지 입력
geometricMatchMulti.Execute()  # 검사 동작