Oriented Object Detection DL
1 개요
- Oriented Object Detection은 입력된 이미지에서의 객체들을 방향과 같이 탐지하면서 동일한 클래스에 대해 인스턴스 단위로 구분하는 딥러닝 컴퓨터 비전 작업입니다. Oriented Object Detection과 다르게 결과가 Rect가 아닌 Quad로 나오게됩니다. 자체 개발된 OR R FLNet을 통하여 고성능 결과를 얻을 수 있습니다.
| Source | |
|---|---|
| Result | |
![]() |
![]() |
2 Oriented Object Detection 사용 방법
1 데이터 셋 준비
- Figure를 이용하여 라벨링이 된 Flif 형식의 학습 이미지
- 이미지에 Figure를 삽입하여 학습 이미지를 생성할 수 있습니다. Figure에는 반드시 이름이 들어가야 하며 "클래스 번호 (클래스 이름)" 형식이거나 "클래스 번호" 형식이여야 합니다.
- FLImaging에서 지원하는 모든 형식의 Figure로 라벨링할 수 있습니다. (라벨링 방법)
- 클래스 번호는 1번부터 시작해야 합니다.
- Oriented Object Detection의 경우 Figure의 Minimum Enclosing Rectangle을 기준으로 학습을 수행 하게 됩니다. 따라서 Quad로 라벨링하는 것을 권장합니다.

Fig. 이미지의 이름이 있는 Figure를 삽입하여 만든 학습 데이터 샘플입니다.
2.2 학습
2.2.1. 학습 이미지 설정
2.2.2. 검증 이미지 설정(선택)
- 검증 지표
- mAP(mean Average precision)
- 정확도(precision)와 재현율(recall)을 이용하여 계산하는 지표입니다.
- 정확도(precision)
- 예측한 것 중에 진짜 정답인 비율입니다.
- Precision = TP / (TP + FP)
- TP = True Positive(정답도 Positive 예측도 Positive)
- FP = False Positive(정답은 Negative인데 예측은 Positive)
- 재현율(Recall)
- 정답 중에 예측에 성공한 비율입니다.
- Recall = TP / (TP + FN)
- FN = False Negative(정답은 Positive인데 예측은 Negative)
- 정확도(precision)
- 예측한 결과들을 Score로 정렬하여 각 Threshold마다 정확도와 재현율을 계산하여 PR곡선을만들고 PR곡선 아래 면적을 계산하여 AP를 구합니다.
Fig. PR Curve1. 각 클래스별 AP를 구하고 평균낸 것이 mAP입니다. 2. 범위는 0~1이며 1로 갈수록 높은 성능을 나타냅니다.
- 정확도(precision)와 재현율(recall)을 이용하여 계산하는 지표입니다.
- Precision(정확도)
- 예측한 것 중에 진짜 정답인 비율입니다.
- 미탐지가 있더라도 탐지한 것들중에는 모두 정확한 탐지를 원하는 경우 해당 지표를 이용합니다. Precision이 제일 높게나올 때를 기준으로 모델을 얻어 목표를 달성할 수 있습니다.
- Precision = TP / (TP + FP)
- TP = True Positive(정답도 Positive 예측도 Positive)
- FP = False Positive(정답은 Negative인데 예측은 Positive)
- Recall(재현율)
- 정답 중에 예측에 성공한 비율입니다.
- 오탐지가 있더라도 불량을 하나라도 놓치지 않고 싶을 때 해당 지표를 이용합니다. Recall이 제일 높게 나올 때를 기준으로 기준으로 모델을 얻어 목표를 달성할 수 있습니다.
- Recall = TP / (TP + FN)
- FN = False Negative(정답은 Positive인데 예측은 Negative)
- Metric
- mAP가 Metric으로 사용되어집니다.
- mAP(mean Average precision)
2.2.3. 모델 설정
2.2.4. 옵티 마이저 설정
2.2.5. Augmentation 설정(선택)
2.2.6. 학습 수행
- Oriented Object Detection 의 경우 종료 조건은 mAP 1이 나왔을 때 모두 맞췄다는 의미므로 1로 설정하는게 좋습니다.
- 추천 종료 조건
mAP >= 1
2.2.7. 조건 식
- 종료 조건(Stop Condition) & 자동 저장(Auto Save)에서 사용 가능한 조건 식 입니다.
- Common Conditional Expression
- Oriented Object Detection Expression
변수명 설명 Stop Condition 예시 Auto Save 예시 map 클래스 별로 정밀도(Precision)와 재현율(Recall)을 이용하여 여러 임계값에서 Precision-Recall 곡선을 그리고, 그 면적을 계산한 값의 평균입니다. 0 ~ 1 범위를 가지며 1로 갈수록 좋은 결과를 나타냅니다. cost <= 0.3 & map >= 1 epoch >= 10 & map >= max('map') & map > 0 metric map가 metric 사용됩니다. cost <= 0 | metric >= 1 epoch >= 10 & metric >= max('metric') & metric > 0 validation map가 validation으로 사용됩니다. cost <= 0 | validation >= 1 epoch >= 10 & validation >= max('validation') & validation > 0 - GUI 에서 설정 방법
- 종료 조건 식 설정
cost <= 0 | validation >= 1 | metric >= 1
Fig. GUI에서 종료 조건 설정 - 자동 저장 조건 식설정
epoch >= 10 & metric >= max('metric') & metric > 0
Fig. GUI에서 자동 저장 조건 설정
- 종료 조건 식 설정
2.3 추론
2.4 Save/Load
- Save/Load
- 모델파일을 저장하거나 불러옵니다.
- 확장자는 .flood입니다.
3 필수 옵션
3.1 학습 필수 옵션
-
모델 설정
-
지원 모델
- OR FLNet(V1 128 /V1 256 /V1 512 /V1 1024)
- 포스로직만의 효율적인 최신 AI 모델 설계 구조를 바탕으로 구현된 정밀한 결과를 도출하는 최고의 이미지 탐지 모델입니다.
- 추천 버전은 V1 512입니다.
- OR FLNet(V1 128 /V1 256 /V1 512 /V1 1024)
-
API
SetModel(EModel eModel = OR_FLNet)eModel: 학습에 사용할 모델을 설정합니다.
SetModelVersion(EModelVersion eModelVersion = EModelVersion_OR_FLNet_V1_512)eModelVersion: 학습에 사용할 모델의 버전을 설정합니다.
-
예제 코드
COrientedObjectDetectionDL oodDL; if(oodDL.SetModel(COrientedObjectDetectionDL::EModel_OR_FLNet).IsFail()) break; if(oodDL.SetModelVersion(COrientedObjectDetectionDL::EModelVersion_OR_FLNet_V1_512).IsFail()) break; -
GUI에서 설정 방법

-
Fig. GUI에서 사용할 모델을 설정하는 Dropdown List
Fig. GUI에서 사용한 모델 확인(학습 현황 다이얼로그)
3.2 추론 필수 옵션
4 선택 옵션
4.1 학습 선택 옵션
-
- 검증 이미지를 설정합니다. 검증 이미지는 라벨링이 되어있어야 합니다. 검증지표는 mAP(mean average precision)입니다.
-
검증 옵션 설정
- 검증 옵션을 설정합니다.
- API
SetLearningValidationStep(int32_t i32ValidationStep = 1)SetValidationObjectnessThreshold(float f32Threshold)- 검증에 사용할 객체 임계 값을 설정합니다.
SetValidationIoUThreshold(float f32Threshold)- 검증에 사용할 IoU Threshold 값을 설정합니다.
- 검증 시 추론한 박스와 정답 박스간의 IoU 임계 값입니다.
SetValidationNMSThreshold(float f32Threshold)- 검증에 사용할 NMS 임계값을 설정합니다. 추천 값
0.5f
- 검증에 사용할 NMS 임계값을 설정합니다. 추천 값
SetLearningRequiredAvgCostForValidation(float f32MinimumAvgCostForValidation)- 검증을 시작할 최소 평균 Cost를 설정합니다.
- 예제 코드
- GUI에서 사용 방법```cpp COrientedObjectDetectionDL oodDL; if(oodDL.SetLearningValidationStep(5).IsFail()) break; if(oodDL.SetValidationObjectnessThreshold(0.5).IsFail()) break; if(oodDL.SetValidationIoUThreshold(0.5).IsFail()) break; if(oodDL.SetValidationNMSThreshold(0.5).IsFail()) break; if(oodDL.SetLearningRequiredAvgCostForValidation(1.f).IsFail()) break; ```
Fig. GUI에서 검증 옵션 설정
4.2 추론 선택 옵션
-
추론 결과 옵션 설정
-
추론 결과 옵션을 설정합니다. Figure의 이름에 클래스 번호, 클래스 이름, 스코어 표시 여부를 설정할 수 있습니다.
-
추론 결과는 설정 된 ResultImage에 Figure로 출력 되게됩니다.
-
API
SetInferenceResultObjectnessThreshold(float f32Threshold)- Inference 객체 임계 값을 설정합니다.
SetInferenceResultNMSThreshold(float f32Threshold)- Inference 객체 NMS 값을 설정합니다.
SetInferenceResultItemSettings(COrientedObjectDetectionDL::EInferenceResultItemSettings eSetting = COrientedObjectDetectionDL::EInferenceResultItemSettings_ClassNum_ClassName_Objectness)- Inference 결과 Figure들에 담길 정보를 설정합니다.
- 기본 값은 ClassNum, ClassName, Objectness입니다.
-
예제 코드
- GUI에서 사용 방법```cpp COrientedObjectDetectionDL oodDL; if(oodDL.SetInferenceResultObjectnessThreshold(0.5f).IsFail()) break; if(oodDL.SetInferenceResultNMSThreshold(0.5f).IsFail()) break; if(oodDL.SetInferenceResultItemSettings(COrientedObjectDetectionDL::EInferenceResultItemSettings_ClassNum_ClassName_Objectness).IsFail()) break; ```
-
Fig. GUI에서 추론 옵션 설정
5 결과 출력
- Inference 결과 출력
- Inference & Inference Result Image 설정을 통해 설정한 Result Image에 추론 결과가 출력 되어집니다.
- 결과 이미지의 찾은 객체가 Rect Figure로 나타내어지게 됩니다.
- 학습 정보
-
학습 중 또는 학습이 완료된 마지막 결과를 얻어옵니다.
-
API
GetCurrentPreparingTensorIndex()- 현재 준비중인 텐서 인덱스를 가져옵니다.
GetCurrentValidationPreparingTensorIndex()- 현재 준비중인 검증 용 텐서 인덱스를 가져옵니다.
GetLearningResultLastAverageCost()- 마지막 평균 코스트를 가져옵니다.
GetLearningResultLastMeanAP()- 마지막 mAP를 가져옵니다.
GetLearningResultMaxMeanAP()- 마지막 최대 mAP를 가져옵니다.
GetLearningResultMaxMeanAPCumulativeEpoch()- 최대 mAP 시점의 에폭을 가져옵니다.
GetLearningResultLastRecall()- 마지막 재현율을 가져옵니다.
GetLearningResultMaxRecall()- 마지막 최대 재현율을 가져옵니다.
GetLearningResultMaxRecallCumulativeEpoch()- 최대 재현율 시점의 에폭을 가져옵니다.
GetLearningResultLastPrecision()- 마지막 정확도를 가져옵니다.
GetLearningResultMaxPrecision()- 마지막 최대 정확도를 가져옵니다.
GetLearningResultMaxPrecisionCumulativeEpoch()- 최대 정확도 시점의 에폭을 가져옵니다.
GetLearningResultCostHistory(Base::CFLArray<float>& flaCostHistory)- 학습 코스트 기록을 가져옵니다.
GetLearningResultAverageCostHistory(Base::CFLArray<float>& flaAvgCostHistory)- 학습 평균 코스트 기록을 가져옵니다.
GetLearningResultValidationEpochHistory(Base::CFLArray<int32_t>& flaValidationEpochHistory)- 학습 중 검증한 시점의 에폭 기록을 가져옵니다.
GetLearningResultAccuracyHistory(Base::CFLArray<float>& flaValidationHistory)- 학습 중 정확도(mAP) 기록을 가져옵니다.
GetLearningResultAllHistory(Base::CFLArray<float>& flaCostHistory, Base::CFLArray<float>& flaAvgCostHistory, Base::CFLArray<float>& flaValidationHistory, Base::CFLArray<int32_t>& flaValidationEpochHistory, Base::CFLArray<float>& flaRecallHistory, Base::CFLArray<float>& flaPrecisionHistory,)- 마지막 학습의 모든 결과를 가져옵니다.
GetLearningResultClassCount()- 학습 클래스 개수를 가져옵니다.
-
예제 코드
COrientedObjectDetectionDL oodDL; //////////////// //OrientedObjectDetection 학습 스레드 수행 //////////////// int32_t i32PrepareIndex = oodDL.GetCurrentPreparingTensorIndex(); int32_t i32PrepareValidationINdex = oodDL.GetCurrentValidationPreparingTensorIndex(); float f32CurrCost = oodDL.GetLearningResultLastCost(); float f32AvgCost = oodDL.GetLearningResultLastAverageCost(); float f32Validation = oodDL.GetLearningResultLastMeanAP(); float f32Recall = oodDL.GetLearningResultLastRecall(); float f32Precision = oodDL.GetLearningResultLastPrecision(); float f32MaxValidation = oodDL.GetLearningResultMaxMeanAP(); float f32MaxRecall = oodDL.GetLearningResultMaxRecall(); float f32MaxPrecision = oodDL.GetLearningResultMaxPrecision(); int32_t i32MaxMeanAPEpoch = oodDL.GetLearningResultMaxMeanAPCumulativeEpoch(); int32_t i32MaxRecallEpoch = oodDL.GetLearningResultMaxRecallCumulativeEpoch(); int32_t i32MaxPrecisionEpoch = oodDL.GetLearningResultMaxPrecisionCumulativeEpoch(); CFLArray<float> vctCosts; CFLArray<float> vctAvgCosts; CFLArray<float> vctmAP; CFLArray<float> vctRecall; CFLArray<float> vctPrecision; CFLArray<int32_t> vctValidationEpoch; if(oodDL.GetLearningResultCostHistory(vctCosts).IsFail()) break; if(oodDL.GetLearningResultAverageCostHistory(vctAvgCosts).IsFail()) break; if(oodDL.GetLearningResultValidationEpochHistory(vctValidationEpoch).IsFail()) break; if(oodDL.GetLearningResultAccuracyHistory(vctmAP).IsFail()) break; if(oodDL.GetLearningResultRecallHistory(vctRecall).IsFail()) break; if(oodDL.GetLearningResultPrecisionHistory(vctPrecision).IsFail()) break; if(oodDL.GetLearningResultAllHistory(&vctCosts, &vctAvgCosts, &vctmAP, &vctValidationEpoch, &vctRecall, &vctPrecision).IsFail()) break; -
GUI에서 확인 방법
Fig. 학습 다이얼로그에서 현황 확인(Epoch, Average Cost, map, recall, preicsion)
Fig. 그래프 뷰에서 현황 확인(Cost, Average Cost, map, recall, preicsion)
6 추론 결과 검증
- 검증 이미지를 이용하여 추론한 결과를 분석 할 수 있습니다. Instance Segmnetation DL과 동일하게 동작합니다.
- 추론 결과 검증
-

