albitro commited on
Commit
96f110e
·
verified ·
1 Parent(s): 4a54cc6

YOLO26s fire/person detection: baseline vs preprocessed (dehaze+CLAHE)

Browse files
.gitattributes CHANGED
@@ -33,3 +33,7 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ baseline/confusion_matrix_normalized.png filter=lfs diff=lfs merge=lfs -text
37
+ baseline/results.png filter=lfs diff=lfs merge=lfs -text
38
+ filtered/confusion_matrix_normalized.png filter=lfs diff=lfs merge=lfs -text
39
+ filtered/results.png filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: agpl-3.0
3
+ tags:
4
+ - object-detection
5
+ - ultralytics
6
+ - yolo
7
+ - yolo26
8
+ - fire-detection
9
+ - computer-vision
10
+ - pytorch
11
+ library_name: ultralytics
12
+ pipeline_tag: object-detection
13
+ base_model: Ultralytics/YOLO26
14
+ ---
15
+
16
+ # YOLO26s Fire & Person Detection — 전처리 유무 비교
17
+
18
+ 화재 현장에서 **불(fire)** 과 **사람(person)** 을 탐지하는 YOLO26s 모델 두 개입니다.
19
+ 같은 데이터셋·같은 하이퍼파라미터로 학습했고, **입력 이미지 전처리 유무만 다릅니다.**
20
+
21
+ | | `baseline/` | `filtered/` |
22
+ |---|---|---|
23
+ | 학습 이미지 | Roboflow 원본 | 디헤이즈 + CLAHE 적용본 |
24
+ | 추론 시 전처리 | 불필요 | **필수** (아래 참조) |
25
+ | 용도 | 대조군 | 연무·저대비 환경 대응 |
26
+
27
+ ## 성능 (test split, 71 images / 94 instances)
28
+
29
+ | 모델 | P | R | mAP@50 | mAP@50-95 |
30
+ |---|---|---|---|---|
31
+ | baseline | 0.967 | 0.967 | 0.982 | 0.702 |
32
+ | **filtered** | **0.983** | **0.980** | **0.994** | **0.715** |
33
+
34
+ 클래스별 (mAP@50 / mAP@50-95):
35
+
36
+ | 클래스 | baseline | filtered |
37
+ |---|---|---|
38
+ | fire | 0.971 / 0.616 | **0.995 / 0.634** |
39
+ | person | **0.994** / 0.788 | 0.992 / **0.796** |
40
+
41
+ 전처리본이 모든 종합 지표에서 앞서고, 특히 `fire` 클래스의 mAP@50 이 0.971 → 0.995 로 오릅니다.
42
+ 다만 **test 셋이 71장뿐**이라 이 차이를 통계적으로 유의하다고 단정하기는 어렵습니다.
43
+ 경향의 근거로만 보시고, 판단이 중요한 용도라면 더 큰 셋에서 재확인하세요.
44
+
45
+ 각 폴더의 `results.csv`(에폭별 전체 곡선), `results.png`, `confusion_matrix_normalized.png`,
46
+ `BoxPR_curve.png` 로 학습 과정을 확인할 수 있습니다. 표의 수치는 각 모델의 best 체크포인트를
47
+ test split 에서 재평가한 값입니다.
48
+
49
+ ## 사용법
50
+
51
+ ### baseline
52
+
53
+ ```python
54
+ from ultralytics import YOLO
55
+ from huggingface_hub import hf_hub_download
56
+
57
+ w = hf_hub_download("albitro/yolo26s-fire-detection", "baseline/best.pt")
58
+ model = YOLO(w)
59
+
60
+ results = model("frame.jpg")
61
+ results[0].show()
62
+ ```
63
+
64
+ ### filtered — 전처리를 반드시 거쳐야 합니다
65
+
66
+ 이 가중치는 전처리된 픽셀로 학습되었습니다. 원본 이미지를 그대로 넣으면 학습/추론 분포가
67
+ 어긋나 성능이 떨어집니다. 학습에 쓴 것과 **동일한** 파이프라인을 `filtered/preprocess/` 에
68
+ 함께 올려두었습니다 (`opencv-python`, `numpy` 만 있으면 동작하며 ROS 의존성 없음).
69
+
70
+ ```python
71
+ import cv2
72
+ from ultralytics import YOLO
73
+ from huggingface_hub import snapshot_download
74
+
75
+ repo = snapshot_download("albitro/yolo26s-fire-detection")
76
+
77
+ import sys; sys.path.insert(0, f"{repo}/filtered")
78
+ from preprocess import build_default_pipeline
79
+
80
+ pipe = build_default_pipeline() # filter_params.json 의 값 그대로
81
+ model = YOLO(f"{repo}/filtered/best.pt")
82
+
83
+ bgr = cv2.imread("frame.jpg") # BGR, uint8
84
+ results = model(pipe.process(bgr))
85
+ results[0].show()
86
+ ```
87
+
88
+ `pipe.process()` 는 BGR uint8 을 받아 BGR uint8 을 돌려줍니다. 비디오 스트림에서는
89
+ `pipe` 를 한 번만 만들어 재사용하세요 (프레임마다 새로 만들 필요 없음).
90
+
91
+ ## 전처리 파이프라인
92
+
93
+ `mode="full"` — 감마 보정 → Dark Channel Prior 디헤이즈(guided filter refinement) → CLAHE.
94
+ 전체 파라미터는 `filtered/filter_params.json` 에 있고 `preprocess.DEFAULTS` 와 일치합니다.
95
+ 주요 값: `omega=0.95`, `t0=0.1`, `patch=15`, `scale=0.25`, `a_max=0.92`,
96
+ `clahe_clip=2.0`, `clahe_tile=8`, `gamma=1.0`.
97
+
98
+ ## 데이터셋
99
+
100
+ [Roboflow Universe — `-ssifa/it-t82tu` v1](https://universe.roboflow.com/-ssifa/it-t82tu/dataset/1)
101
+ (CC BY 4.0). 640×480, 2 클래스, train 307 / valid 94 / test 71.
102
+
103
+ `filtered` 데이터셋은 원본에 전처리를 적용한 사본입니다. **분할 멤버십·파일명·라벨이 원본과
104
+ 완전히 동일하고 픽셀값만 다릅니다** — 디헤이즈와 CLAHE 는 화소값 변환이라 바운딩박스가
105
+ 움직이지 않기 때문입니다. 두 모델의 차이가 전처리 효과인지 분할 운인지 헷갈리지 않도록
106
+ 의도적으로 이렇게 맞췄습니다. 재압축 손실이 전처리 조건에만 얹히는 것을 피하려고 사본은
107
+ PNG 무손실로 저장했습니다.
108
+
109
+ 데이터셋 자체는 이 레포에 포함돼 있지 않습니다. 클래스 정의는 `data.yaml` 참조.
110
+
111
+ ## 학습 설정
112
+
113
+ 두 모델 공통입니다. 전체는 각 폴더의 `args.yaml` 에 있습니다.
114
+
115
+ | | |
116
+ |---|---|
117
+ | base | `yolo26s.pt` (COCO pretrained) |
118
+ | epochs | 100 (baseline best @79, filtered best @95) |
119
+ | imgsz | 640 |
120
+ | batch | 16 |
121
+ | optimizer | auto |
122
+ | seed | 0 |
123
+ | device | Intel Arc B580 (XPU), PyTorch 2.13.0+xpu |
124
+ | ultralytics | 8.4.117 |
125
+
126
+ ## 한계
127
+
128
+ - **작은 데이터셋** (총 472장). 촬영 환경이 학습 데이터와 다르면 일반화가 떨어질 수 있습니다.
129
+ - test 셋 71장 기준의 비교라 두 모델 간 차이의 신뢰구간이 넓습니다.
130
+ - `fire` 의 mAP@50-95 가 0.63 수준입니다. 탐지 여부(mAP@50 0.995)는 신뢰할 만하지만
131
+ 불꽃 경계의 박스 정밀도는 그만큼 높지 않습니다 — 불꽃은 경계가 모호한 대상입니다.
132
+ - 안전이 걸린 용도에 단독 판단 근거로 쓰지 마세요. 사람의 확인을 거치는 경보 보조로만 쓰세요.
133
+
134
+ ## 라이선스
135
+
136
+ 가중치는 Ultralytics YOLO 에서 파생되어 **AGPL-3.0** 을 따릅니다. 네트워크 서비스로 배포할
137
+ 경우 소스 공개 의무가 따라옵니다. 상용 용도라면 Ultralytics 엔터프라이즈 라이선스를 확인하세요.
138
+ 학습 데이터셋은 CC BY 4.0 입니다.
baseline/BoxPR_curve.png ADDED
baseline/args.yaml ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ task: detect
2
+ mode: train
3
+ model: yolo26s.pt
4
+ data: <project>/datasets/fire/data.yaml
5
+ epochs: 100
6
+ time: null
7
+ patience: 100
8
+ batch: 16
9
+ imgsz: 640
10
+ save: true
11
+ save_period: -1
12
+ cache: false
13
+ device: xpu:0
14
+ workers: 8
15
+ project: <project>/runs
16
+ name: fire_v1-2
17
+ exist_ok: false
18
+ pretrained: true
19
+ cls_remap: true
20
+ optimizer: auto
21
+ verbose: true
22
+ seed: 0
23
+ deterministic: true
24
+ single_cls: false
25
+ rect: false
26
+ cos_lr: false
27
+ close_mosaic: 10
28
+ resume: false
29
+ amp: true
30
+ fraction: 1.0
31
+ profile: false
32
+ freeze: null
33
+ multi_scale: 0.0
34
+ compile: false
35
+ channels_last: false
36
+ overlap_mask: true
37
+ mask_ratio: 4
38
+ dropout: 0.0
39
+ val: true
40
+ split: val
41
+ save_json: false
42
+ conf: null
43
+ iou: 0.7
44
+ max_det: 300
45
+ quantize: null
46
+ dnn: false
47
+ plots: true
48
+ end2end: null
49
+ source: null
50
+ vid_stride: 1
51
+ stream_buffer: false
52
+ visualize: false
53
+ augment: false
54
+ agnostic_nms: false
55
+ classes: null
56
+ retina_masks: false
57
+ embed: null
58
+ show: false
59
+ save_frames: false
60
+ save_txt: false
61
+ save_conf: false
62
+ save_crop: false
63
+ show_labels: true
64
+ show_conf: true
65
+ show_boxes: true
66
+ line_width: null
67
+ format: torchscript
68
+ keras: false
69
+ optimize: false
70
+ dynamic: false
71
+ simplify: true
72
+ opset: null
73
+ workspace: null
74
+ nms: false
75
+ lr0: 0.01
76
+ lrf: 0.01
77
+ momentum: 0.937
78
+ weight_decay: 0.0005
79
+ warmup_epochs: 3.0
80
+ warmup_momentum: 0.8
81
+ warmup_bias_lr: 0.1
82
+ distill_model: null
83
+ dis: 6.0
84
+ box: 7.5
85
+ cls: 0.5
86
+ cls_pw: 0.0
87
+ dfl: 1.5
88
+ pose: 12.0
89
+ kobj: 1.0
90
+ rle: 1.0
91
+ angle: 1.0
92
+ dlog: 1.0
93
+ dgrad: 0.5
94
+ dlam: 1.0
95
+ nbs: 64
96
+ hsv_h: 0.015
97
+ hsv_s: 0.7
98
+ hsv_v: 0.4
99
+ degrees: 0.0
100
+ translate: 0.1
101
+ scale: 0.5
102
+ shear: 0.0
103
+ perspective: 0.0
104
+ flipud: 0.0
105
+ fliplr: 0.5
106
+ bgr: 0.0
107
+ mosaic: 1.0
108
+ mixup: 0.0
109
+ cutmix: 0.0
110
+ copy_paste: 0.0
111
+ copy_paste_mode: flip
112
+ auto_augment: randaugment
113
+ erasing: 0.4
114
+ cfg: null
115
+ tracker: tracktrack.yaml
116
+ save_dir: <project>/runs/fire_v1-2
baseline/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:fcae8a67665636c970c899e4efb970aa614cfaff2218ee3135b0f654b0a7f611
3
+ size 20307013
baseline/confusion_matrix_normalized.png ADDED

Git LFS Details

  • SHA256: 378edd1c7cba001c56f88bce2366026e9dd21ab8f885e3ad1a0e8efad0b0e209
  • Pointer size: 131 Bytes
  • Size of remote file: 104 kB
baseline/results.csv ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ epoch,time,train/box_loss,train/cls_loss,train/l1_loss,metrics/precision(B),metrics/recall(B),metrics/mAP50(B),metrics/mAP50-95(B),val/box_loss,val/cls_loss,val/l1_loss,lr/pg0,lr/pg1,lr/pg2
2
+ 1,69.4779,1.76901,6.39975,0.01151,0.7915,0.77,0.79966,0.4397,1.44382,4.06993,0.00995,0.000527883,0.000527883,0.000527883
3
+ 2,80.5741,1.64222,2.11951,0.00858,0.81763,0.85797,0.89891,0.50793,1.44833,2.22002,0.01209,0.00107282,0.00107282,0.00107282
4
+ 3,93.7845,1.63254,1.31573,0.01049,0.69304,0.71167,0.72671,0.30122,1.861,1.97117,0.01796,0.00160676,0.00160676,0.00160676
5
+ 4,105.455,1.68222,1.17047,0.01041,0.73331,0.59213,0.66799,0.32883,1.80555,1.53274,0.0173,0.00161749,0.00161749,0.00161749
6
+ 5,117.277,1.75763,1.06466,0.00966,0.76685,0.66238,0.79625,0.40872,1.69556,1.2305,0.01432,0.00160099,0.00160099,0.00160099
7
+ 6,129.11,1.65296,0.95468,0.00979,0.76236,0.80955,0.81817,0.4451,1.57598,1.13456,0.01378,0.00158448,0.00158448,0.00158448
8
+ 7,141.632,1.65575,0.89261,0.00927,0.79736,0.82146,0.81453,0.38677,1.88234,0.99191,0.01675,0.00156798,0.00156798,0.00156798
9
+ 8,153.141,1.60219,0.8335,0.00867,0.87062,0.77167,0.84421,0.41833,1.74352,0.77982,0.01507,0.00155148,0.00155148,0.00155148
10
+ 9,164.224,1.59211,0.76234,0.00919,0.90904,0.92598,0.94459,0.51958,1.48443,0.66578,0.01221,0.00153497,0.00153497,0.00153497
11
+ 10,175.419,1.49813,0.67632,0.00882,0.93397,0.92531,0.9564,0.60401,1.3331,0.54203,0.01028,0.00151847,0.00151847,0.00151847
12
+ 11,186.518,1.46298,0.72605,0.00852,0.90233,0.80344,0.91776,0.56182,1.3569,0.95349,0.01147,0.00150197,0.00150197,0.00150197
13
+ 12,197.595,1.50996,0.73845,0.00872,0.88067,0.90261,0.96136,0.58879,1.33676,0.58464,0.01011,0.00148546,0.00148546,0.00148546
14
+ 13,208.7,1.43278,0.66428,0.00778,0.92782,0.89833,0.9539,0.5725,1.39155,0.52803,0.01087,0.00146896,0.00146896,0.00146896
15
+ 14,219.697,1.43097,0.66197,0.00717,0.9045,0.86439,0.93566,0.54584,1.41843,0.57319,0.01145,0.00145246,0.00145246,0.00145246
16
+ 15,230.803,1.4838,0.6357,0.00836,0.94094,0.92795,0.94765,0.58035,1.36139,0.45846,0.01083,0.00143595,0.00143595,0.00143595
17
+ 16,241.905,1.40514,0.61444,0.00852,0.88761,0.92165,0.95991,0.62452,1.22391,0.50024,0.00964,0.00141945,0.00141945,0.00141945
18
+ 17,253.213,1.43699,0.68409,0.00797,0.91107,0.92459,0.95895,0.60748,1.22746,0.52862,0.00882,0.00140295,0.00140295,0.00140295
19
+ 18,264.34,1.36733,0.64636,0.00814,0.95642,0.96294,0.98122,0.60631,1.37848,0.48861,0.01122,0.00138644,0.00138644,0.00138644
20
+ 19,275.479,1.32061,0.6072,0.00752,0.9345,0.92333,0.94975,0.61415,1.25941,0.5182,0.01007,0.00136994,0.00136994,0.00136994
21
+ 20,286.644,1.33572,0.58161,0.00742,0.91871,0.91167,0.96801,0.63008,1.25372,0.53759,0.00952,0.00135344,0.00135344,0.00135344
22
+ 21,297.822,1.27783,0.55603,0.00683,0.92042,0.92833,0.9697,0.63045,1.21196,0.47014,0.00934,0.00133693,0.00133693,0.00133693
23
+ 22,309.004,1.3126,0.55219,0.00698,0.84327,0.90328,0.94677,0.60202,1.29646,0.59629,0.01101,0.00132043,0.00132043,0.00132043
24
+ 23,320.071,1.38986,0.56698,0.00756,0.91177,0.89264,0.9356,0.56644,1.36086,0.6158,0.01226,0.00130393,0.00130393,0.00130393
25
+ 24,331.141,1.31012,0.58796,0.00657,0.88816,0.96613,0.96446,0.65102,1.16717,0.40085,0.00886,0.00128742,0.00128742,0.00128742
26
+ 25,342.3,1.36189,0.60593,0.00709,0.90929,0.97684,0.96992,0.62924,1.20897,0.45831,0.00854,0.00127092,0.00127092,0.00127092
27
+ 26,353.279,1.30026,0.54865,0.0064,0.93683,0.86616,0.94611,0.62505,1.13536,0.79946,0.00795,0.00125442,0.00125442,0.00125442
28
+ 27,364.308,1.24071,0.52721,0.00634,0.93561,0.94575,0.98008,0.6656,1.09903,0.42888,0.00752,0.00123791,0.00123791,0.00123791
29
+ 28,375.496,1.19515,0.53448,0.00666,0.95722,0.93201,0.98014,0.66906,1.14623,0.38888,0.00825,0.00122141,0.00122141,0.00122141
30
+ 29,386.645,1.27725,0.55599,0.00612,0.95618,0.94743,0.98015,0.64521,1.19455,0.40559,0.00863,0.00120491,0.00120491,0.00120491
31
+ 30,397.672,1.2375,0.48231,0.00679,0.9433,0.93223,0.97292,0.63038,1.23646,0.40661,0.00877,0.0011884,0.0011884,0.0011884
32
+ 31,408.766,1.27221,0.56531,0.00651,0.97703,0.9017,0.97445,0.6244,1.22331,0.44632,0.0089,0.0011719,0.0011719,0.0011719
33
+ 32,419.874,1.2504,0.51416,0.00684,0.91884,0.97139,0.9814,0.65302,1.19938,0.37865,0.00891,0.0011554,0.0011554,0.0011554
34
+ 33,431.098,1.26826,0.49991,0.00631,0.94252,0.95954,0.97898,0.67191,1.09115,0.37734,0.0079,0.00113889,0.00113889,0.00113889
35
+ 34,442.271,1.25025,0.48533,0.00775,0.94825,0.95667,0.9786,0.65776,1.15891,0.37827,0.00846,0.00112239,0.00112239,0.00112239
36
+ 35,453.315,1.20091,0.47648,0.00599,0.9185,0.95667,0.97931,0.6602,1.13601,0.42479,0.00851,0.00110589,0.00110589,0.00110589
37
+ 36,464.365,1.25103,0.51972,0.00642,0.57527,0.57833,0.54242,0.27093,1.8537,2.16864,0.02127,0.00108938,0.00108938,0.00108938
38
+ 37,475.496,1.2047,0.48959,0.00589,0.98879,0.90398,0.95094,0.599,1.27207,0.5436,0.01095,0.00107288,0.00107288,0.00107288
39
+ 38,486.537,1.28658,0.5105,0.00657,0.96496,0.95901,0.98547,0.68765,1.10114,0.32401,0.00748,0.00105638,0.00105638,0.00105638
40
+ 39,497.65,1.1921,0.45768,0.00594,0.97926,0.95167,0.98488,0.67488,1.11301,0.33647,0.00769,0.00103987,0.00103987,0.00103987
41
+ 40,508.704,1.11496,0.47238,0.00597,0.96784,0.96864,0.98447,0.67064,1.12578,0.37497,0.00819,0.00102337,0.00102337,0.00102337
42
+ 41,519.832,1.20871,0.48473,0.00616,0.95792,0.94279,0.97326,0.65852,1.16922,0.33771,0.00838,0.00100687,0.00100687,0.00100687
43
+ 42,531.19,1.21076,0.47438,0.00587,0.95508,0.96333,0.98675,0.67379,1.09361,0.37597,0.00784,0.000990365,0.000990365,0.000990365
44
+ 43,542.362,1.18251,0.5301,0.00627,0.98982,0.9843,0.99476,0.6877,1.09107,0.29525,0.00718,0.000973861,0.000973861,0.000973861
45
+ 44,553.476,1.13135,0.45598,0.00633,0.95867,0.97167,0.98421,0.67759,1.092,0.33564,0.00746,0.000957358,0.000957358,0.000957358
46
+ 45,565.251,1.15995,0.43212,0.0059,0.98838,0.96333,0.98661,0.6859,1.11215,0.30036,0.00739,0.000940855,0.000940855,0.000940855
47
+ 46,577.149,1.1675,0.4539,0.00535,0.9671,0.96328,0.97834,0.66788,1.09901,0.31654,0.00715,0.000924352,0.000924352,0.000924352
48
+ 47,588.801,1.14151,0.43783,0.00561,0.98192,0.98871,0.99074,0.6968,1.041,0.30065,0.00689,0.000907848,0.000907848,0.000907848
49
+ 48,599.933,1.19046,0.46604,0.0056,0.95532,0.98667,0.98604,0.68423,1.07461,0.30349,0.00707,0.000891345,0.000891345,0.000891345
50
+ 49,611.102,1.08693,0.42817,0.00526,0.96354,0.97549,0.9841,0.69081,1.07765,0.31078,0.00716,0.000874842,0.000874842,0.000874842
51
+ 50,622.239,1.1153,0.39526,0.00526,0.96769,0.97407,0.98521,0.69695,1.03051,0.33009,0.00667,0.000858338,0.000858338,0.000858338
52
+ 51,633.475,1.16373,0.43748,0.00631,0.97153,0.97521,0.98588,0.67996,1.10862,0.31805,0.00733,0.000841835,0.000841835,0.000841835
53
+ 52,644.72,1.12076,0.44154,0.0055,0.98131,0.96153,0.98993,0.69032,1.07091,0.34904,0.0079,0.000825332,0.000825332,0.000825332
54
+ 53,655.829,1.13424,0.40929,0.00559,0.98471,0.96573,0.99239,0.69677,1.04389,0.31867,0.0072,0.000808828,0.000808828,0.000808828
55
+ 54,666.955,1.10863,0.4119,0.0054,0.94076,0.95601,0.98084,0.69621,1.00036,0.31165,0.00677,0.000792325,0.000792325,0.000792325
56
+ 55,678.336,1.09997,0.41168,0.00512,0.93792,0.95167,0.97327,0.68041,1.05552,0.36897,0.00753,0.000775822,0.000775822,0.000775822
57
+ 56,689.76,1.09294,0.40601,0.00543,0.95311,0.96158,0.97794,0.6945,1.04172,0.32688,0.00722,0.000759318,0.000759318,0.000759318
58
+ 57,701.216,1.09744,0.41877,0.0048,0.98903,0.97167,0.98734,0.71892,0.98807,0.30574,0.00661,0.000742815,0.000742815,0.000742815
59
+ 58,712.67,1.1152,0.42012,0.00546,0.98046,0.97489,0.98684,0.70128,1.03475,0.30584,0.00746,0.000726312,0.000726312,0.000726312
60
+ 59,723.916,1.08746,0.40496,0.00527,0.95401,0.99153,0.98287,0.68804,1.06285,0.29619,0.00719,0.000709809,0.000709809,0.000709809
61
+ 60,735.014,1.088,0.43048,0.00584,0.96487,0.97167,0.98486,0.70305,1.01592,0.3193,0.00678,0.000693305,0.000693305,0.000693305
62
+ 61,746.031,1.03685,0.39225,0.00475,0.95782,0.98479,0.98617,0.70447,1.01517,0.30774,0.00654,0.000676802,0.000676802,0.000676802
63
+ 62,757.263,1.05613,0.37951,0.0051,0.94158,0.95697,0.97874,0.70092,1.01318,0.34925,0.00729,0.000660299,0.000660299,0.000660299
64
+ 63,768.582,1.01874,0.36596,0.00496,0.9691,0.9711,0.98268,0.70802,0.99339,0.29712,0.00682,0.000643795,0.000643795,0.000643795
65
+ 64,779.703,1.00839,0.3671,0.00462,0.94516,0.98201,0.97514,0.68377,1.03571,0.32988,0.00669,0.000627292,0.000627292,0.000627292
66
+ 65,791.144,1.04833,0.41402,0.00522,0.98015,0.97167,0.98331,0.70434,0.99629,0.31258,0.00696,0.000610789,0.000610789,0.000610789
67
+ 66,802.485,1.02876,0.36046,0.00504,0.96989,0.97826,0.99167,0.71621,0.98247,0.30635,0.00667,0.000594286,0.000594286,0.000594286
68
+ 67,813.672,0.9986,0.38722,0.00491,0.96155,0.96482,0.99079,0.70719,1.0337,0.33457,0.00711,0.000577782,0.000577782,0.000577782
69
+ 68,825.077,0.94839,0.35042,0.00476,0.96743,0.97327,0.98422,0.72299,0.96381,0.30101,0.00649,0.000561279,0.000561279,0.000561279
70
+ 69,836.431,0.96792,0.36166,0.0046,0.96572,0.98092,0.98448,0.71964,0.99013,0.28922,0.00671,0.000544776,0.000544776,0.000544776
71
+ 70,847.74,0.98533,0.35489,0.00475,0.96335,0.98455,0.98685,0.7199,0.98213,0.28101,0.00659,0.000528272,0.000528272,0.000528272
72
+ 71,858.993,1.00644,0.37504,0.00482,0.96537,0.97335,0.98544,0.72189,0.9733,0.28595,0.00635,0.000511769,0.000511769,0.000511769
73
+ 72,870.209,0.93032,0.3498,0.00408,0.96875,0.99123,0.99316,0.72637,0.96675,0.2796,0.00652,0.000495266,0.000495266,0.000495266
74
+ 73,881.514,1.01423,0.38264,0.00516,0.98683,0.96371,0.9924,0.71834,0.9714,0.28595,0.00648,0.000478762,0.000478762,0.000478762
75
+ 74,892.518,1.01855,0.3533,0.00512,0.96319,0.97871,0.98452,0.71513,0.9893,0.28625,0.00616,0.000462259,0.000462259,0.000462259
76
+ 75,903.487,0.95495,0.36069,0.00435,0.94845,0.99087,0.98517,0.73054,0.95019,0.2814,0.00604,0.000445756,0.000445756,0.000445756
77
+ 76,915.154,0.97371,0.36317,0.00434,0.96197,0.99835,0.99092,0.72987,0.95362,0.27436,0.00602,0.000429253,0.000429253,0.000429253
78
+ 77,926.587,0.97219,0.32111,0.00411,0.95783,0.99813,0.989,0.70708,0.96659,0.2936,0.00596,0.000412749,0.000412749,0.000412749
79
+ 78,937.683,0.96066,0.34245,0.00449,0.95422,0.98291,0.98993,0.71738,0.9651,0.29326,0.00616,0.000396246,0.000396246,0.000396246
80
+ 79,949.044,0.94957,0.33964,0.00518,0.98321,0.97167,0.99156,0.73042,0.95213,0.28287,0.00595,0.000379743,0.000379743,0.000379743
81
+ 80,960.034,0.96943,0.34498,0.00451,0.95875,0.98562,0.98492,0.71759,0.95484,0.27256,0.00626,0.000363239,0.000363239,0.000363239
82
+ 81,970.964,0.92093,0.32339,0.00374,0.97751,0.97973,0.98805,0.72135,0.9512,0.28426,0.00613,0.000346736,0.000346736,0.000346736
83
+ 82,981.988,0.99228,0.35578,0.00422,0.9645,0.98588,0.98502,0.72344,0.95901,0.26445,0.00636,0.000330233,0.000330233,0.000330233
84
+ 83,992.936,0.96967,0.37723,0.00417,0.95661,0.98,0.98849,0.71984,0.9423,0.30135,0.00589,0.000313729,0.000313729,0.000313729
85
+ 84,1003.91,0.89125,0.33556,0.00404,0.94792,0.99153,0.98752,0.72714,0.94717,0.29723,0.00601,0.000297226,0.000297226,0.000297226
86
+ 85,1014.87,0.88399,0.31797,0.00383,0.95186,0.9848,0.98283,0.71114,0.97473,0.30022,0.00634,0.000280723,0.000280723,0.000280723
87
+ 86,1025.92,0.89497,0.33165,0.00395,0.94644,0.98,0.9828,0.72242,0.95473,0.3074,0.00625,0.00026422,0.00026422,0.00026422
88
+ 87,1036.88,0.84978,0.30174,0.0037,0.9614,0.95652,0.98357,0.72478,0.94927,0.29476,0.0062,0.000247716,0.000247716,0.000247716
89
+ 88,1047.83,0.90807,0.33803,0.00401,0.94999,0.97918,0.98328,0.72603,0.94276,0.29222,0.00596,0.000231213,0.000231213,0.000231213
90
+ 89,1058.78,0.90822,0.31666,0.00384,0.95459,0.97833,0.98275,0.71943,0.96633,0.2962,0.00616,0.00021471,0.00021471,0.00021471
91
+ 90,1069.73,1.00583,0.36165,0.00404,0.96453,0.98,0.98451,0.72471,0.95801,0.27855,0.00602,0.000198206,0.000198206,0.000198206
92
+ 91,1081.23,0.92395,0.29079,0.00458,0.95339,0.97833,0.98466,0.71622,0.9746,0.29853,0.0065,0.000181703,0.000181703,0.000181703
93
+ 92,1092.26,0.90617,0.27141,0.00443,0.9598,0.9689,0.98343,0.72293,0.96176,0.29656,0.00633,0.0001652,0.0001652,0.0001652
94
+ 93,1103.24,0.88551,0.28108,0.00393,0.96432,0.96354,0.98312,0.71889,0.96061,0.30729,0.0062,0.000148696,0.000148696,0.000148696
95
+ 94,1114.24,0.88316,0.25862,0.00424,0.96582,0.97833,0.98387,0.7234,0.95775,0.29151,0.00616,0.000132193,0.000132193,0.000132193
96
+ 95,1125.26,0.84926,0.26463,0.00426,0.96065,0.97167,0.98084,0.72293,0.96041,0.31509,0.0061,0.00011569,0.00011569,0.00011569
97
+ 96,1136.46,0.84746,0.27203,0.00427,0.96581,0.97826,0.98635,0.72685,0.9544,0.32283,0.00585,9.91865e-05,9.91865e-05,9.91865e-05
98
+ 97,1147.46,0.83627,0.2726,0.00387,0.95458,0.97428,0.98626,0.72511,0.9502,0.32277,0.0058,8.26832e-05,8.26832e-05,8.26832e-05
99
+ 98,1158.46,0.86099,0.27045,0.00402,0.94711,0.98526,0.98701,0.72306,0.958,0.31047,0.00605,6.61799e-05,6.61799e-05,6.61799e-05
100
+ 99,1169.6,0.81295,0.25478,0.00411,0.95957,0.97709,0.98757,0.72722,0.94692,0.32525,0.0058,4.96766e-05,4.96766e-05,4.96766e-05
101
+ 100,1180.67,0.86252,0.25898,0.00405,0.95995,0.98234,0.98824,0.72648,0.94584,0.31839,0.00577,3.31733e-05,3.31733e-05,3.31733e-05
baseline/results.png ADDED

Git LFS Details

  • SHA256: 56e0c592e86f1a0a093e7b449209f6c7baa290957fe4d0765c1e27ae00b67df6
  • Pointer size: 131 Bytes
  • Size of remote file: 320 kB
data.yaml ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ train: train/images
2
+ val: valid/images
3
+ test: test/images
4
+
5
+ nc: 2
6
+ names: ['fire', 'person']
7
+
8
+ roboflow:
9
+ workspace: -ssifa
10
+ project: it-t82tu
11
+ version: 1
12
+ license: CC BY 4.0
13
+ url: https://universe.roboflow.com/-ssifa/it-t82tu/dataset/1
filtered/BoxPR_curve.png ADDED
filtered/args.yaml ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ task: detect
2
+ mode: train
3
+ model: yolo26s.pt
4
+ data: <project>/datasets/fire_filtered/data.yaml
5
+ epochs: 100
6
+ time: null
7
+ patience: 100
8
+ batch: 16
9
+ imgsz: 640
10
+ save: true
11
+ save_period: -1
12
+ cache: false
13
+ device: xpu:0
14
+ workers: 8
15
+ project: <project>/runs
16
+ name: fire_filtered_v1
17
+ exist_ok: false
18
+ pretrained: true
19
+ cls_remap: true
20
+ optimizer: auto
21
+ verbose: true
22
+ seed: 0
23
+ deterministic: true
24
+ single_cls: false
25
+ rect: false
26
+ cos_lr: false
27
+ close_mosaic: 10
28
+ resume: false
29
+ amp: true
30
+ fraction: 1.0
31
+ profile: false
32
+ freeze: null
33
+ multi_scale: 0.0
34
+ compile: false
35
+ channels_last: false
36
+ overlap_mask: true
37
+ mask_ratio: 4
38
+ dropout: 0.0
39
+ val: true
40
+ split: val
41
+ save_json: false
42
+ conf: null
43
+ iou: 0.7
44
+ max_det: 300
45
+ quantize: null
46
+ dnn: false
47
+ plots: true
48
+ end2end: null
49
+ source: null
50
+ vid_stride: 1
51
+ stream_buffer: false
52
+ visualize: false
53
+ augment: false
54
+ agnostic_nms: false
55
+ classes: null
56
+ retina_masks: false
57
+ embed: null
58
+ show: false
59
+ save_frames: false
60
+ save_txt: false
61
+ save_conf: false
62
+ save_crop: false
63
+ show_labels: true
64
+ show_conf: true
65
+ show_boxes: true
66
+ line_width: null
67
+ format: torchscript
68
+ keras: false
69
+ optimize: false
70
+ dynamic: false
71
+ simplify: true
72
+ opset: null
73
+ workspace: null
74
+ nms: false
75
+ lr0: 0.01
76
+ lrf: 0.01
77
+ momentum: 0.937
78
+ weight_decay: 0.0005
79
+ warmup_epochs: 3.0
80
+ warmup_momentum: 0.8
81
+ warmup_bias_lr: 0.1
82
+ distill_model: null
83
+ dis: 6.0
84
+ box: 7.5
85
+ cls: 0.5
86
+ cls_pw: 0.0
87
+ dfl: 1.5
88
+ pose: 12.0
89
+ kobj: 1.0
90
+ rle: 1.0
91
+ angle: 1.0
92
+ dlog: 1.0
93
+ dgrad: 0.5
94
+ dlam: 1.0
95
+ nbs: 64
96
+ hsv_h: 0.015
97
+ hsv_s: 0.7
98
+ hsv_v: 0.4
99
+ degrees: 0.0
100
+ translate: 0.1
101
+ scale: 0.5
102
+ shear: 0.0
103
+ perspective: 0.0
104
+ flipud: 0.0
105
+ fliplr: 0.5
106
+ bgr: 0.0
107
+ mosaic: 1.0
108
+ mixup: 0.0
109
+ cutmix: 0.0
110
+ copy_paste: 0.0
111
+ copy_paste_mode: flip
112
+ auto_augment: randaugment
113
+ erasing: 0.4
114
+ cfg: null
115
+ tracker: tracktrack.yaml
116
+ save_dir: <project>/runs/fire_filtered_v1
filtered/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a09bc762875f61b0a822231ae12f15aeedb0408d62fcb03d9672c97a800ee989
3
+ size 20307077
filtered/confusion_matrix_normalized.png ADDED

Git LFS Details

  • SHA256: d151f0e4551f0ec6481b72f52d4e9129d408c505d2de07e388e4ccd5e8fc89c8
  • Pointer size: 131 Bytes
  • Size of remote file: 106 kB
filtered/filter_params.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "source": "<project>/datasets/fire",
3
+ "generated": "2026-08-13T19:24:38",
4
+ "image_format": "png",
5
+ "pipeline": {
6
+ "mode": "full",
7
+ "gamma": 1.0,
8
+ "lowlight": false,
9
+ "clahe_clip": 2.0,
10
+ "clahe_tile": 8,
11
+ "omega": 0.95,
12
+ "t0": 0.1,
13
+ "patch": 15,
14
+ "scale": 0.25,
15
+ "use_guided": true,
16
+ "guided_radius": 8,
17
+ "guided_eps": 0.001,
18
+ "a_max": 0.92,
19
+ "sky_ratio": 1.0
20
+ },
21
+ "note": "라벨·분할은 원본 그대로. 픽셀값만 다릅니다 (HANDOVER 7-4)."
22
+ }
filtered/preprocess/__init__.py ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """filtered/best.pt 이 학습된 것과 동일한 전처리 파이프라인.
2
+
3
+ 이 모델은 전처리된 픽셀로 학습되었습니다. 원본 이미지를 그대로 넣으면
4
+ 학습/추론 분포가 어긋나 성능이 떨어집니다. 반드시 여기를 거쳐서 넣으세요.
5
+
6
+ import cv2
7
+ from preprocess import build_default_pipeline
8
+ from ultralytics import YOLO
9
+
10
+ pipe = build_default_pipeline() # filter_params.json 의 값 그대로
11
+ model = YOLO("filtered/best.pt")
12
+
13
+ bgr = cv2.imread("frame.jpg")
14
+ result = model(pipe.process(bgr))[0]
15
+
16
+ 파라미터를 바꾸려면 build_default_pipeline(clahe_clip=3.0) 처럼 넘기되,
17
+ 학습 때와 달라지면 그만큼 조건이 어긋난다는 점을 감안하세요.
18
+ """
19
+
20
+ from .dehaze import ClaheEnhancer, DarkChannelDehazer, apply_gamma
21
+ from .pipeline import Pipeline
22
+
23
+ # filter_params.json 의 pipeline 블록과 동일해야 합니다.
24
+ DEFAULTS = {
25
+ "mode": "full", # 감마 -> DCP 디헤이즈 -> CLAHE
26
+ "gamma": 1.0,
27
+ "lowlight": False,
28
+ "clahe_clip": 2.0,
29
+ "clahe_tile": 8,
30
+ "omega": 0.95,
31
+ "t0": 0.1,
32
+ "patch": 15,
33
+ "scale": 0.25,
34
+ "use_guided": True,
35
+ "guided_radius": 8,
36
+ "guided_eps": 0.001,
37
+ "a_max": 0.92,
38
+ "sky_ratio": 1.0,
39
+ }
40
+
41
+
42
+ def build_default_pipeline(**overrides) -> Pipeline:
43
+ """학습 시 사용한 설정 그대로의 Pipeline 을 만듭니다."""
44
+ cfg = {**DEFAULTS, **overrides}
45
+ unknown = set(overrides) - set(DEFAULTS)
46
+ if unknown:
47
+ raise TypeError(f"알 수 없는 파라미터: {sorted(unknown)}")
48
+
49
+ return Pipeline(
50
+ mode=cfg["mode"],
51
+ gamma=cfg["gamma"],
52
+ lowlight=cfg["lowlight"],
53
+ clahe=ClaheEnhancer(cfg["clahe_clip"], (cfg["clahe_tile"], cfg["clahe_tile"])),
54
+ dehazer=DarkChannelDehazer(
55
+ omega=cfg["omega"],
56
+ t0=cfg["t0"],
57
+ patch=cfg["patch"],
58
+ scale=cfg["scale"],
59
+ use_guided=cfg["use_guided"],
60
+ guided_radius=cfg["guided_radius"],
61
+ guided_eps=cfg["guided_eps"],
62
+ a_max=cfg["a_max"],
63
+ sky_ratio=cfg["sky_ratio"],
64
+ ),
65
+ )
66
+
67
+
68
+ __all__ = [
69
+ "DEFAULTS",
70
+ "Pipeline",
71
+ "ClaheEnhancer",
72
+ "DarkChannelDehazer",
73
+ "apply_gamma",
74
+ "build_default_pipeline",
75
+ ]
filtered/preprocess/__pycache__/__init__.cpython-313.pyc ADDED
Binary file (2.49 kB). View file
 
filtered/preprocess/__pycache__/dehaze.cpython-313.pyc ADDED
Binary file (14.7 kB). View file
 
filtered/preprocess/__pycache__/pipeline.cpython-313.pyc ADDED
Binary file (5.61 kB). View file
 
filtered/preprocess/dehaze.py ADDED
@@ -0,0 +1,305 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Dark Channel Prior (DCP) 기반 디헤이즈 — He et al., CVPR 2009.
4
+
5
+ OpenCV에 완제품이 없어 직접 구현한 부분.
6
+ ROS에 의존하지 않으므로 주피터/CLI에서 그대로 import해 튜닝할 수 있습니다.
7
+
8
+ 실시간성 최적화 (발표에서의 기여 포인트):
9
+ - 대기광/투과율 추정을 축소 해상도(기본 1/4)에서 수행 → 픽셀 수 1/16
10
+ - guided filter도 축소 해상도에서 수행 후 투과율만 업샘플
11
+ - 복원식만 원본 해상도에서 계산 (벡터 연산 3줄)
12
+ - min filter는 cv2.erode 로 대체 (사각 커널 erode == min filter, C 구현)
13
+
14
+ 화재 도메인 특유의 함정:
15
+ - 표준 DCP의 대기광 A 추정은 "가장 밝은 픽셀"을 고르는데, 우리 장면에서는
16
+ 그게 **불씨/화염**일 수 있습니다. A가 과대 추정되면 화면 전체가 어두워지고
17
+ 정작 불씨 주변이 뭉개집니다.
18
+ - 대응: 상위 후보의 **평균**을 사용 + a_max로 상한 클리핑 + (옵션) 화면 상단
19
+ 영역만 후보로 삼기(sky_ratio). 아래 estimate_atmospheric_light 참고.
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ import cv2
25
+ import numpy as np
26
+
27
+
28
+ # ---------------------------------------------------------------- 기본 연산
29
+
30
+
31
+ def dark_channel(img: np.ndarray, patch: int) -> np.ndarray:
32
+ """다크 채널: 채널 최솟값 -> patch x patch 최소 필터.
33
+
34
+ img: float32 (H, W, 3), 0~1 범위
35
+ """
36
+ min_ch = np.min(img, axis=2)
37
+ if patch <= 1:
38
+ return min_ch
39
+ kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (patch, patch))
40
+ # erode(사각 커널) == 최소 필터. 직접 슬라이딩 윈도우 짜면 수십 배 느림.
41
+ return cv2.erode(min_ch, kernel)
42
+
43
+
44
+ def estimate_atmospheric_light(
45
+ img: np.ndarray,
46
+ dark: np.ndarray,
47
+ top_ratio: float = 0.001,
48
+ a_max: float = 0.92,
49
+ sky_ratio: float = 1.0,
50
+ ) -> np.ndarray:
51
+ """대기광 A 추정 (1, 1, 3).
52
+
53
+ top_ratio : 다크 채널 상위 몇 %를 후보로 볼지 (원논문 0.1%)
54
+ a_max : A 상한. 화염 같은 포화 픽셀이 섞였을 때 과대추정 방지
55
+ sky_ratio : 후보를 이미지 상단 몇 비율로 제한할지 (1.0 = 제한 없음).
56
+ 지하주차장처럼 하늘이 없으면 1.0 유지, 연기가 위에 깔리면 0.5~0.7.
57
+ """
58
+ h, w = dark.shape
59
+ limit = h if sky_ratio >= 1.0 else max(1, int(h * sky_ratio))
60
+
61
+ dark_roi = dark[:limit]
62
+ img_roi = img[:limit]
63
+
64
+ n = max(int(dark_roi.size * top_ratio), 1)
65
+ flat_dark = dark_roi.ravel()
66
+ idx = np.argpartition(flat_dark, -n)[-n:]
67
+
68
+ candidates = img_roi.reshape(-1, 3)[idx] # (n, 3)
69
+ # 원논문은 후보 중 "가장 밝은 한 픽셀"을 쓰지만, 스페큘러/화염 한 점에
70
+ # 통째로 끌려갑니다. 평균이 훨씬 안정적입니다.
71
+ a = candidates.mean(axis=0)
72
+ a = np.clip(a, 1e-3, a_max)
73
+ return a.reshape(1, 1, 3).astype(np.float32)
74
+
75
+
76
+ def guided_filter(guide: np.ndarray, src: np.ndarray, radius: int, eps: float) -> np.ndarray:
77
+ """단일 채널 guided filter (He et al.).
78
+
79
+ cv2.ximgproc.guidedFilter 는 opencv-contrib-python 이 있어야 쓸 수 있어서
80
+ box filter 5번으로 직접 구현했습니다. 의존성 없이 동작합니다.
81
+ """
82
+ guide = guide.astype(np.float32)
83
+ src = src.astype(np.float32)
84
+ k = (2 * radius + 1, 2 * radius + 1)
85
+
86
+ mean_i = cv2.blur(guide, k)
87
+ mean_p = cv2.blur(src, k)
88
+ corr_i = cv2.blur(guide * guide, k)
89
+ corr_ip = cv2.blur(guide * src, k)
90
+
91
+ var_i = corr_i - mean_i * mean_i
92
+ cov_ip = corr_ip - mean_i * mean_p
93
+
94
+ a = cov_ip / (var_i + eps)
95
+ b = mean_p - a * mean_i
96
+
97
+ mean_a = cv2.blur(a, k)
98
+ mean_b = cv2.blur(b, k)
99
+ return mean_a * guide + mean_b
100
+
101
+
102
+ # ---------------------------------------------------------------- 메인 클래스
103
+
104
+
105
+ class DarkChannelDehazer:
106
+ """DCP 디헤이저.
107
+
108
+ process(bgr_uint8) -> bgr_uint8 형태로 씁니다.
109
+ 파라미터는 ROS 파라미터에서 그대로 갈아끼울 수 있게 attribute로 노출.
110
+ """
111
+
112
+ def __init__(
113
+ self,
114
+ omega: float = 0.95,
115
+ t0: float = 0.1,
116
+ patch: int = 15,
117
+ scale: float = 0.25,
118
+ use_guided: bool = True,
119
+ guided_radius: int = 8,
120
+ guided_eps: float = 1e-3,
121
+ a_top_ratio: float = 0.001,
122
+ a_max: float = 0.92,
123
+ sky_ratio: float = 1.0,
124
+ a_smoothing: float = 0.0,
125
+ ):
126
+ self.omega = omega # 1.0으로 하면 원근감이 사라져 부자연스러움 (원논문 0.95)
127
+ self.t0 = t0 # 투과율 하한. 낮을수록 진한 연기까지 복원하지만 노이즈 폭발
128
+ self.patch = patch # 원본 해상도 기준 패치 크기
129
+ self.scale = scale # 추정 단계 축소 배율 (★ 실시간성의 핵심)
130
+ self.use_guided = use_guided
131
+ self.guided_radius = guided_radius # 축소 해상도 기준 반경
132
+ self.guided_eps = guided_eps
133
+ self.a_top_ratio = a_top_ratio
134
+ self.a_max = a_max
135
+ self.sky_ratio = sky_ratio
136
+
137
+ # 대기광 A의 프레임 간 EMA 계수 (0 = 끔, 0.9 = 강한 평활).
138
+ # A는 매 프레임 장면 내용에서 추정되므로, 로봇이 움직여 화면이 바뀌면
139
+ # **같은 불씨가 프레임마다 다른 밝기로 복원**됩니다. 영상에서는 깜빡임으로
140
+ # 보이고, YOLO 학습 데이터로 쓰면 같은 물체의 외형 분산이 커집니다.
141
+ # 시계열(동영상·rosbag·실주행)에는 켜고, 정지영상 비교 실험에는 끕니다.
142
+ # ★ 켜면 출력이 이전 프레임에 의존하므로 더 이상 결정론적이지 않습니다.
143
+ self.a_smoothing = a_smoothing
144
+ self._a_ema: np.ndarray | None = None
145
+
146
+ self.last_transmission: np.ndarray | None = None # 디버깅/발표 그림용
147
+ self.last_a: np.ndarray | None = None
148
+
149
+ def reset_state(self) -> None:
150
+ """프레임 간 누적 상태 초기화. 새 bag/영상을 시작할 때 호출."""
151
+ self._a_ema = None
152
+
153
+ # ------------------------------------------------------------------
154
+
155
+ def _patch_for_scale(self) -> int:
156
+ """축소본에서 같은 '실제 공간 범위'를 덮도록 패치도 함께 줄입니다.
157
+
158
+ 이걸 안 줄이면 축소본에서 패치가 상대적으로 너무 커져 투과율이
159
+ 과도하게 뭉개집니다(halo).
160
+ """
161
+ p = int(round(self.patch * self.scale))
162
+ p = max(3, p)
163
+ return p if p % 2 == 1 else p + 1
164
+
165
+ def estimate_transmission(self, img_f: np.ndarray) -> tuple[np.ndarray, np.ndarray]:
166
+ """축소본에서 A와 투과율 t를 추정해 (t_full, A) 반환. img_f: float32 0~1 원본 해상도."""
167
+ h, w = img_f.shape[:2]
168
+
169
+ if self.scale < 1.0:
170
+ small = cv2.resize(img_f, None, fx=self.scale, fy=self.scale,
171
+ interpolation=cv2.INTER_AREA)
172
+ else:
173
+ small = img_f
174
+
175
+ patch_s = self._patch_for_scale()
176
+
177
+ dark = dark_channel(small, patch_s)
178
+ a = estimate_atmospheric_light(small, dark, self.a_top_ratio,
179
+ self.a_max, self.sky_ratio)
180
+
181
+ # 프레임 간 평활 — t 계산에 들어가기 **전에** 적용해야
182
+ # 투과율까지 함께 안정됩니다.
183
+ if self.a_smoothing > 0.0:
184
+ if self._a_ema is None:
185
+ self._a_ema = a.copy()
186
+ else:
187
+ k = float(np.clip(self.a_smoothing, 0.0, 0.99))
188
+ self._a_ema = k * self._a_ema + (1.0 - k) * a
189
+ a = self._a_ema
190
+
191
+ # t = 1 - omega * darkchannel(I / A)
192
+ t_small = 1.0 - self.omega * dark_channel(small / a, patch_s)
193
+
194
+ if self.use_guided:
195
+ gray = cv2.cvtColor((small * 255).astype(np.uint8), cv2.COLOR_BGR2GRAY)
196
+ gray = gray.astype(np.float32) / 255.0
197
+ t_small = guided_filter(gray, t_small, self.guided_radius, self.guided_eps)
198
+
199
+ if self.scale < 1.0:
200
+ # 투과율은 저주파 신호라 업샘플해도 손실이 거의 없습니다. 이게 성립하는
201
+ # 덕분에 축소 추정이 정당화됩니다.
202
+ t = cv2.resize(t_small, (w, h), interpolation=cv2.INTER_LINEAR)
203
+ else:
204
+ t = t_small
205
+
206
+ return t, a
207
+
208
+ # ------------------------------------------------------------------
209
+
210
+ def process(self, bgr: np.ndarray) -> np.ndarray:
211
+ """bgr uint8 -> 디헤이즈된 bgr uint8."""
212
+ img_f = bgr.astype(np.float32) / 255.0
213
+
214
+ t, a = self.estimate_transmission(img_f)
215
+ t = np.clip(t, self.t0, 1.0)
216
+
217
+ self.last_transmission = t
218
+ self.last_a = a
219
+
220
+ # 복원식 J = (I - A) / t + A
221
+ out = (img_f - a) / t[..., None] + a
222
+ return np.clip(out * 255.0, 0, 255).astype(np.uint8)
223
+
224
+ def process_lowlight(
225
+ self,
226
+ bgr: np.ndarray,
227
+ omega: float = 0.8,
228
+ t0: float = 0.25,
229
+ ) -> np.ndarray:
230
+ """저조도 보정 (옵션).
231
+
232
+ "저조도 영상을 반전하면 헤이즈 영상과 통계적으로 닮는다"는 관찰
233
+ (Dong et al., 2011)을 이용해 **같은 DCP 코드를 재사용**합니다.
234
+ 반전 -> 디헤이즈 -> 반전
235
+ CLAHE가 국소 대비를 올리는 것과 달리 이쪽은 전역 밝기를 끌어올립니다.
236
+
237
+ ★ 반전 영역은 파라미터가 달라야 합니다 (로컬 테스트로 발견한 함정).
238
+ - `a_max`: 연기 영역에서는 화염에 끌리는 걸 막으려 0.92로 조였지만,
239
+ 반전 영상은 원래 전체가 밝아 A가 정말 1.0 근처입니다. 여기에
240
+ 0.92를 그대로 쓰면 t가 하한까지 눌려 결과가 **오히려 어두워집니다.**
241
+ - `omega`/`t0`: 반전 영상은 '헤이즈'가 화면 전체에 깔린 상태라
242
+ 강도를 낮추고(0.8) 하한을 올려야(0.25) 노이즈��� 안 터집니다.
243
+
244
+ 조명이 완전히 꺼진 구간에서만 켜세요. 노이즈가 같이 증폭됩니다.
245
+ """
246
+ sub = DarkChannelDehazer(
247
+ omega=omega,
248
+ t0=t0,
249
+ patch=self.patch,
250
+ scale=self.scale,
251
+ use_guided=self.use_guided,
252
+ guided_radius=self.guided_radius,
253
+ guided_eps=self.guided_eps,
254
+ a_top_ratio=self.a_top_ratio,
255
+ a_max=1.0, # ★ 반전 영역에서는 조이지 않음
256
+ sky_ratio=1.0, # 반전되면 위/아래 의미가 뒤집혀 제한이 무의미
257
+ )
258
+ out = 255 - sub.process(255 - bgr)
259
+ self.last_transmission = sub.last_transmission
260
+ self.last_a = sub.last_a
261
+ return out
262
+
263
+
264
+ # ---------------------------------------------------------------- CLAHE
265
+
266
+
267
+ class ClaheEnhancer:
268
+ """LAB의 L 채널에만 CLAHE.
269
+
270
+ BGR 각 채널에 따로 걸면 채널별 히스토그램이 제각각 늘어나 **색이 틀어집니다**.
271
+ LAB는 밝기(L)와 색(a,b)이 분리돼 있어 L만 건드리면 색상은 보존됩니다.
272
+ """
273
+
274
+ def __init__(self, clip_limit: float = 2.0, tile_grid: tuple[int, int] = (8, 8)):
275
+ self.clip_limit = clip_limit
276
+ self.tile_grid = tuple(tile_grid)
277
+ self._clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=self.tile_grid)
278
+
279
+ def update(self, clip_limit: float, tile_grid) -> None:
280
+ self.clip_limit = clip_limit
281
+ self.tile_grid = tuple(tile_grid)
282
+ self._clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=self.tile_grid)
283
+
284
+ def process(self, bgr: np.ndarray) -> np.ndarray:
285
+ lab = cv2.cvtColor(bgr, cv2.COLOR_BGR2LAB)
286
+ lab[:, :, 0] = self._clahe.apply(lab[:, :, 0])
287
+ return cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)
288
+
289
+
290
+ def apply_gamma(bgr: np.ndarray, gamma: float) -> np.ndarray:
291
+ """감마 보정: out = (in/255)^gamma * 255.
292
+
293
+ **gamma < 1 이면 밝아지고, gamma > 1 이면 어두워집니다.**
294
+
295
+ 감마는 문헌마다 지수를 뒤집어 쓰는 경우가 있어(어떤 코드는 1/gamma를 씀)
296
+ 방향이 반대가 되기 쉽습니다. 여기서는 위 식으로 고정했고
297
+ tests/test_dehaze.py::TestGamma 가 방향을 잠가둡니다.
298
+
299
+ LUT 256개 조회라 해상도와 무관하게 비용이 거의 0입니다.
300
+ """
301
+ if abs(gamma - 1.0) < 1e-3:
302
+ return bgr
303
+ g = max(gamma, 1e-3)
304
+ lut = np.clip((np.arange(256) / 255.0) ** g * 255.0, 0, 255).astype(np.uint8)
305
+ return cv2.LUT(bgr, lut)
filtered/preprocess/pipeline.py ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ 전처리 파이프라인 — mode에 따른 처리 순서. ROS 비의존.
4
+
5
+ 노드 안에 if문으로 흩어놓으면 rclpy 없이는 "mode를 바꿨을 때 정말 다른
6
+ 처리가 도는가"를 검증할 수 없습니다. 여기로 빼서 노드·오프라인 도구·테스트가
7
+ **같은 코드**를 쓰게 했습니다.
8
+
9
+ passthrough : 무처리 (1단계 뼈대 — QoS·헤더 배선만 검증)
10
+ clahe : 감마 -> CLAHE (2단계)
11
+ dehaze : 감마 -> DCP (기여도 분리용)
12
+ full : 감마 -> DCP -> CLAHE (3단계)
13
+ aod : 감마 -> AOD-Net (DCP 대안)
14
+ aod_full : 감마 -> AOD-Net -> CLAHE
15
+
16
+ AOD-Net을 **별도 노드가 아니라 mode로** 넣은 이유는 HANDOVER 4-9. 비교 도구·
17
+ 정답 채점·불씨 생존 테스트·데이터셋 생성기·노드 배선이 전부 그대로 재사용되고,
18
+ A/B가 파라미터 한 줄이 됩니다.
19
+
20
+ 순서가 '디헤이즈 -> CLAHE'인 이유: 디헤이즈는 물리 모델의 역산이라
21
+ **입력이 원본 관측값 I여야** 성립합니다. CLAHE를 먼저 걸면 히스토그램이
22
+ 비선형으로 변형돼 I = J·t + A(1-t) 가정이 깨집니다.
23
+ """
24
+
25
+ from __future__ import annotations
26
+
27
+ import time
28
+
29
+ from .dehaze import ClaheEnhancer, DarkChannelDehazer, apply_gamma
30
+
31
+ MODES = ("passthrough", "clahe", "dehaze", "full", "aod", "aod_full")
32
+
33
+ # 디헤이즈가 도는 모드와, 그중 AOD-Net을 쓰는 모드.
34
+ DEHAZE_MODES = ("dehaze", "full", "aod", "aod_full")
35
+ AOD_MODES = ("aod", "aod_full")
36
+ CLAHE_MODES = ("clahe", "full", "aod_full")
37
+
38
+
39
+ class Pipeline:
40
+ def __init__(
41
+ self,
42
+ mode: str = "full",
43
+ gamma: float = 1.0,
44
+ lowlight: bool = False,
45
+ clahe: ClaheEnhancer | None = None,
46
+ dehazer: DarkChannelDehazer | None = None,
47
+ aod=None,
48
+ ):
49
+ self.set_mode(mode)
50
+ self.gamma = gamma
51
+ self.lowlight = lowlight
52
+ self.clahe = clahe or ClaheEnhancer()
53
+ self.dehazer = dehazer or DarkChannelDehazer()
54
+ # AOD-Net 디헤이저(`aodnet.GatedDehazer` 등). `process(bgr)->bgr` 인터페이스만
55
+ # 맞으면 됩니다. 없으면 aod* 모드를 쓸 때 예외 — **DCP로 조용히 대체하지
56
+ # 않습니다.** 대체하면 "aod 모드로 측정한 결과"가 실제로는 DCP 결과가 되어
57
+ # A/B 실험이 통째로 무의미해집니다.
58
+ self.aod = aod
59
+
60
+ # 마지막 프레임의 단계별 소요시간(ms). 병목 추적용.
61
+ self.timings: dict[str, float] = {"dehaze": 0.0, "clahe": 0.0, "total": 0.0}
62
+
63
+ def set_mode(self, mode: str) -> None:
64
+ if mode not in MODES:
65
+ raise ValueError(f"mode는 {MODES} 중 하나여야 합니다 (받은 값: {mode!r})")
66
+ self.mode = mode
67
+
68
+ def active_dehazer(self):
69
+ """현재 mode가 쓰는 디헤이저. aod* 모드인데 없으면 예외."""
70
+ if self.mode in AOD_MODES:
71
+ if self.aod is None:
72
+ raise ValueError(
73
+ f"mode={self.mode!r} 인데 AOD-Net 디헤이저가 없습니다. "
74
+ "onnx 경로를 주거나 dehaze/full 모드를 쓰세요. "
75
+ "(DCP로 자동 대체하지 않습니다 — A/B 실험이 오염됩니다)"
76
+ )
77
+ return self.aod
78
+ return self.dehazer
79
+
80
+ def process(self, bgr):
81
+ """bgr uint8 -> bgr uint8. 입력 배열은 변경하지 않습니다."""
82
+ t_start = time.perf_counter()
83
+ self.timings = {"dehaze": 0.0, "clahe": 0.0, "total": 0.0}
84
+
85
+ if self.mode == "passthrough":
86
+ self.timings["total"] = (time.perf_counter() - t_start) * 1000.0
87
+ return bgr
88
+
89
+ img = apply_gamma(bgr, self.gamma)
90
+
91
+ if self.mode in DEHAZE_MODES:
92
+ dehazer = self.active_dehazer()
93
+ t = time.perf_counter()
94
+ img = dehazer.process(img)
95
+ if self.lowlight:
96
+ if not hasattr(dehazer, "process_lowlight"):
97
+ # HANDOVER 4-9: AOD-Net에는 저조도 대응 경로가 없습니다.
98
+ # 조용히 건너뛰면 "저조도 보정이 켜진 줄 알았는데 안 돈"
99
+ # 상태가 되므로 막습니다.
100
+ raise ValueError(
101
+ f"mode={self.mode!r} 의 디헤이저에는 process_lowlight가 "
102
+ "없습니다. AOD-Net은 저조도 대응물이 없습니다 "
103
+ "(HANDOVER 4-9). lowlight를 끄거나 dehaze/full을 쓰세요."
104
+ )
105
+ img = dehazer.process_lowlight(img)
106
+ self.timings["dehaze"] = (time.perf_counter() - t) * 1000.0
107
+
108
+ if self.mode in CLAHE_MODES:
109
+ t = time.perf_counter()
110
+ img = self.clahe.process(img)
111
+ self.timings["clahe"] = (time.perf_counter() - t) * 1000.0
112
+
113
+ self.timings["total"] = (time.perf_counter() - t_start) * 1000.0
114
+ return img
filtered/results.csv ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ epoch,time,train/box_loss,train/cls_loss,train/l1_loss,metrics/precision(B),metrics/recall(B),metrics/mAP50(B),metrics/mAP50-95(B),val/box_loss,val/cls_loss,val/l1_loss,lr/pg0,lr/pg1,lr/pg2
2
+ 1,68.3183,1.71205,6.39083,0.01179,0.62227,0.597,0.61934,0.33528,1.46451,5.00338,0.01265,0.000527883,0.000527883,0.000527883
3
+ 2,79.2877,1.62319,2.22255,0.00896,0.75314,0.59667,0.70886,0.38332,1.53329,2.25363,0.013,0.00107282,0.00107282,0.00107282
4
+ 3,90.3152,1.61257,1.46465,0.01052,0.66699,0.66691,0.6637,0.28641,1.8444,1.86214,0.01786,0.00160676,0.00160676,0.00160676
5
+ 4,101.249,1.76684,1.11207,0.01101,0.81858,0.76923,0.83729,0.4162,1.81856,1.08361,0.01574,0.00161749,0.00161749,0.00161749
6
+ 5,112.251,1.68353,0.98747,0.00904,0.81902,0.72601,0.86189,0.45605,1.68546,1.39796,0.01579,0.00160099,0.00160099,0.00160099
7
+ 6,123.227,1.64414,0.88262,0.00929,0.77138,0.79231,0.82707,0.41766,1.64686,1.37749,0.01378,0.00158448,0.00158448,0.00158448
8
+ 7,134.162,1.64202,0.86832,0.00904,0.8793,0.88612,0.91846,0.50219,1.52848,0.76859,0.0141,0.00156798,0.00156798,0.00156798
9
+ 8,145.176,1.58717,0.77357,0.00936,0.92108,0.93421,0.9674,0.51936,1.54345,0.81961,0.01424,0.00155148,0.00155148,0.00155148
10
+ 9,156.178,1.62047,0.80139,0.00944,0.79664,0.91523,0.88788,0.51427,1.39841,1.11359,0.01135,0.00153497,0.00153497,0.00153497
11
+ 10,167.1,1.45905,0.68344,0.00854,0.9054,0.92508,0.9642,0.5638,1.39478,0.55417,0.01191,0.00151847,0.00151847,0.00151847
12
+ 11,178.12,1.50736,0.74635,0.00912,0.87188,0.88407,0.94419,0.52796,1.51032,0.72619,0.01175,0.00150197,0.00150197,0.00150197
13
+ 12,189.028,1.51877,0.76013,0.0091,0.94696,0.86671,0.95193,0.61047,1.29751,0.64831,0.01021,0.00148546,0.00148546,0.00148546
14
+ 13,200.119,1.44304,0.6993,0.00824,0.90143,0.89976,0.95199,0.55822,1.41894,0.73091,0.01195,0.00146896,0.00146896,0.00146896
15
+ 14,211.18,1.44533,0.66823,0.00777,0.93343,0.90393,0.95603,0.55421,1.45512,0.60236,0.01316,0.00145246,0.00145246,0.00145246
16
+ 15,222.192,1.44457,0.67232,0.008,0.88427,0.91316,0.94641,0.55544,1.36771,0.61029,0.01176,0.00143595,0.00143595,0.00143595
17
+ 16,233.199,1.36249,0.66416,0.0083,0.94768,0.91708,0.96378,0.58722,1.32085,0.48815,0.01048,0.00141945,0.00141945,0.00141945
18
+ 17,244.241,1.43236,0.66336,0.0076,0.93744,0.92167,0.95971,0.587,1.35777,0.50757,0.01083,0.00140295,0.00140295,0.00140295
19
+ 18,255.28,1.41758,0.62737,0.00842,0.91629,0.98261,0.97562,0.6214,1.24903,0.4726,0.00979,0.00138644,0.00138644,0.00138644
20
+ 19,266.419,1.33854,0.60368,0.00773,0.93342,0.94833,0.97307,0.58276,1.35149,0.51524,0.0108,0.00136994,0.00136994,0.00136994
21
+ 20,277.383,1.37654,0.60939,0.00767,0.90505,0.96256,0.96303,0.61501,1.29451,0.47395,0.0103,0.00135344,0.00135344,0.00135344
22
+ 21,288.316,1.33998,0.5811,0.007,0.94901,0.96167,0.96774,0.61696,1.2242,0.4506,0.00873,0.00133693,0.00133693,0.00133693
23
+ 22,299.336,1.32806,0.58252,0.00707,0.9255,0.87736,0.95013,0.59847,1.2785,0.5608,0.00987,0.00132043,0.00132043,0.00132043
24
+ 23,310.347,1.34707,0.59009,0.00731,0.9451,0.9091,0.94941,0.60511,1.3109,0.5005,0.00984,0.00130393,0.00130393,0.00130393
25
+ 24,321.362,1.35252,0.63038,0.00691,0.93999,0.95422,0.96958,0.60801,1.27304,0.46039,0.00977,0.00128742,0.00128742,0.00128742
26
+ 25,332.39,1.33223,0.60662,0.00691,0.95018,0.95,0.97866,0.62346,1.25189,0.43117,0.00946,0.00127092,0.00127092,0.00127092
27
+ 26,343.446,1.34318,0.54852,0.00692,0.88287,0.95418,0.97472,0.64004,1.19343,0.46845,0.00875,0.00125442,0.00125442,0.00125442
28
+ 27,354.449,1.25811,0.52676,0.00688,0.92119,0.96726,0.98419,0.63342,1.22096,0.4273,0.00928,0.00123791,0.00123791,0.00123791
29
+ 28,365.355,1.25548,0.50332,0.00713,0.94661,0.94254,0.98218,0.62645,1.24438,0.44089,0.01023,0.00122141,0.00122141,0.00122141
30
+ 29,376.268,1.30359,0.56775,0.00732,0.94789,0.93667,0.97553,0.64256,1.18308,0.43939,0.00864,0.00120491,0.00120491,0.00120491
31
+ 30,387.272,1.28193,0.53481,0.00684,0.93839,0.94189,0.97956,0.62292,1.27365,0.42621,0.0088,0.0011884,0.0011884,0.0011884
32
+ 31,398.179,1.31721,0.55837,0.00682,0.94284,0.93644,0.97426,0.63599,1.19031,0.42298,0.00914,0.0011719,0.0011719,0.0011719
33
+ 32,409.114,1.27069,0.52417,0.00696,0.91974,0.96188,0.97798,0.64763,1.18665,0.40617,0.00881,0.0011554,0.0011554,0.0011554
34
+ 33,420.112,1.32636,0.50735,0.00676,0.94358,0.94381,0.9786,0.66071,1.16715,0.40055,0.00846,0.00113889,0.00113889,0.00113889
35
+ 34,431.161,1.24123,0.48364,0.00795,0.9385,0.97858,0.98435,0.63972,1.20782,0.39326,0.0095,0.00112239,0.00112239,0.00112239
36
+ 35,442.202,1.21764,0.46968,0.00627,0.93715,0.9462,0.98334,0.6308,1.23066,0.40938,0.00939,0.00110589,0.00110589,0.00110589
37
+ 36,453.189,1.24047,0.48212,0.00636,0.95909,0.95654,0.98631,0.6584,1.13522,0.37419,0.00782,0.00108938,0.00108938,0.00108938
38
+ 37,464.224,1.20685,0.45185,0.00579,0.94401,0.96038,0.98698,0.6538,1.17294,0.38565,0.00832,0.00107288,0.00107288,0.00107288
39
+ 38,475.238,1.23108,0.46168,0.0063,0.93537,0.98472,0.98965,0.66469,1.15562,0.37191,0.00822,0.00105638,0.00105638,0.00105638
40
+ 39,486.304,1.19521,0.46093,0.00606,0.96205,0.9653,0.98423,0.66655,1.14036,0.36973,0.00787,0.00103987,0.00103987,0.00103987
41
+ 40,497.359,1.13589,0.44422,0.00626,0.94641,0.93734,0.98085,0.65608,1.14319,0.43395,0.00888,0.00102337,0.00102337,0.00102337
42
+ 41,508.328,1.18321,0.48713,0.00637,0.96373,0.97,0.98861,0.6781,1.10407,0.36534,0.00766,0.00100687,0.00100687,0.00100687
43
+ 42,519.437,1.15826,0.4558,0.00582,0.93412,0.97779,0.97812,0.65382,1.16919,0.36483,0.00844,0.000990365,0.000990365,0.000990365
44
+ 43,530.421,1.18208,0.51023,0.00623,0.95129,0.96821,0.9848,0.66103,1.18043,0.36542,0.00874,0.000973861,0.000973861,0.000973861
45
+ 44,541.413,1.11687,0.48725,0.00616,0.95629,0.9573,0.98972,0.6633,1.13319,0.37124,0.00785,0.000957358,0.000957358,0.000957358
46
+ 45,552.438,1.11687,0.43675,0.00561,0.96361,0.97676,0.99037,0.68848,1.09073,0.34697,0.00765,0.000940855,0.000940855,0.000940855
47
+ 46,563.518,1.11967,0.47496,0.00527,0.97183,0.93,0.98545,0.67929,1.0618,0.35976,0.00749,0.000924352,0.000924352,0.000924352
48
+ 47,574.497,1.11865,0.47884,0.00572,0.96339,0.96167,0.98742,0.65104,1.15573,0.37109,0.00779,0.000907848,0.000907848,0.000907848
49
+ 48,585.492,1.15039,0.46581,0.00558,0.94896,0.98167,0.98335,0.7013,1.06024,0.35512,0.0071,0.000891345,0.000891345,0.000891345
50
+ 49,596.56,1.09948,0.44629,0.00543,0.94539,0.972,0.98098,0.6861,1.08877,0.35494,0.00757,0.000874842,0.000874842,0.000874842
51
+ 50,607.524,1.09641,0.43992,0.00535,0.95656,0.97,0.98881,0.6838,1.10885,0.3283,0.00734,0.000858338,0.000858338,0.000858338
52
+ 51,618.539,1.18534,0.42525,0.00646,0.97577,0.97167,0.98384,0.68848,1.03005,0.29687,0.0071,0.000841835,0.000841835,0.000841835
53
+ 52,629.574,1.11733,0.4131,0.00536,0.95805,0.97833,0.98836,0.68363,1.07336,0.33075,0.00743,0.000825332,0.000825332,0.000825332
54
+ 53,640.58,1.06599,0.41432,0.00517,0.96767,0.97695,0.99089,0.68776,1.06178,0.30642,0.00723,0.000808828,0.000808828,0.000808828
55
+ 54,651.625,1.07433,0.45255,0.00506,0.98372,0.96933,0.99262,0.69038,1.07081,0.3038,0.00755,0.000792325,0.000792325,0.000792325
56
+ 55,662.583,1.108,0.42389,0.00495,0.97866,0.95585,0.98978,0.68444,1.11065,0.34027,0.00764,0.000775822,0.000775822,0.000775822
57
+ 56,673.47,1.10247,0.41158,0.00545,0.94846,0.97917,0.99142,0.68905,1.06702,0.31186,0.00707,0.000759318,0.000759318,0.000759318
58
+ 57,684.36,1.10509,0.42137,0.00486,0.96129,0.95978,0.98053,0.7011,1.02053,0.35015,0.00714,0.000742815,0.000742815,0.000742815
59
+ 58,695.257,1.08791,0.44736,0.00528,0.96366,0.96643,0.98742,0.69002,1.06026,0.34377,0.0074,0.000726312,0.000726312,0.000726312
60
+ 59,706.137,1.07712,0.41573,0.00507,0.96565,0.96605,0.99014,0.69185,1.03575,0.33898,0.00662,0.000709809,0.000709809,0.000709809
61
+ 60,717.045,1.05756,0.42605,0.00544,0.96828,0.98086,0.99087,0.71113,0.99662,0.31768,0.00679,0.000693305,0.000693305,0.000693305
62
+ 61,728.017,1.04357,0.41385,0.00487,0.95311,0.955,0.9881,0.69471,1.04782,0.34779,0.00697,0.000676802,0.000676802,0.000676802
63
+ 62,738.956,1.0411,0.3736,0.00494,0.97982,0.94333,0.98988,0.71654,1.01645,0.31435,0.0068,0.000660299,0.000660299,0.000660299
64
+ 63,749.972,1.04101,0.37722,0.0051,0.95709,0.98258,0.99113,0.7178,0.98603,0.30572,0.00654,0.000643795,0.000643795,0.000643795
65
+ 64,760.933,0.99839,0.3557,0.00447,0.95099,0.97546,0.9893,0.70825,1.00438,0.31945,0.0066,0.000627292,0.000627292,0.000627292
66
+ 65,771.807,1.04696,0.39404,0.005,0.97695,0.98,0.99091,0.70274,1.03625,0.30425,0.00688,0.000610789,0.000610789,0.000610789
67
+ 66,782.695,1.00238,0.36499,0.00478,0.9465,0.98828,0.99002,0.71045,1.03807,0.3133,0.00754,0.000594286,0.000594286,0.000594286
68
+ 67,793.586,0.99916,0.36216,0.00494,0.97944,0.96475,0.99114,0.71719,0.99835,0.30345,0.00666,0.000577782,0.000577782,0.000577782
69
+ 68,804.483,0.92284,0.35996,0.00456,0.98242,0.96283,0.99084,0.71813,0.9818,0.29966,0.00655,0.000561279,0.000561279,0.000561279
70
+ 69,815.46,0.99761,0.37319,0.00474,0.97557,0.97976,0.99271,0.72396,0.99996,0.28289,0.00657,0.000544776,0.000544776,0.000544776
71
+ 70,826.414,0.99125,0.37015,0.00498,0.98457,0.97647,0.99313,0.70943,1.00979,0.30092,0.00666,0.000528272,0.000528272,0.000528272
72
+ 71,837.341,1.02263,0.38169,0.00505,0.99175,0.97874,0.99326,0.71469,1.00974,0.28564,0.00679,0.000511769,0.000511769,0.000511769
73
+ 72,848.365,0.94143,0.35916,0.00405,0.98666,0.96666,0.99312,0.72022,0.97686,0.27241,0.00662,0.000495266,0.000495266,0.000495266
74
+ 73,859.365,0.99005,0.4006,0.00503,0.96686,0.98174,0.99353,0.72196,0.96347,0.27174,0.00663,0.000478762,0.000478762,0.000478762
75
+ 74,870.357,1.00689,0.35886,0.00501,0.98679,0.95836,0.99242,0.71345,1.01799,0.29319,0.00694,0.000462259,0.000462259,0.000462259
76
+ 75,881.349,0.97891,0.3396,0.00452,0.98021,0.968,0.99155,0.71198,1.00325,0.29961,0.00664,0.000445756,0.000445756,0.000445756
77
+ 76,892.515,0.97772,0.36955,0.00444,0.97237,0.985,0.99112,0.72694,0.9566,0.28873,0.00622,0.000429253,0.000429253,0.000429253
78
+ 77,903.72,0.95916,0.31968,0.00408,0.9631,0.97643,0.99192,0.71771,0.96223,0.28984,0.00622,0.000412749,0.000412749,0.000412749
79
+ 78,914.788,0.94522,0.36119,0.00442,0.98961,0.96615,0.99243,0.71701,0.97553,0.27905,0.00633,0.000396246,0.000396246,0.000396246
80
+ 79,925.876,0.92988,0.3435,0.00482,0.98132,0.97833,0.99191,0.71969,0.96169,0.28552,0.00605,0.000379743,0.000379743,0.000379743
81
+ 80,936.925,0.93212,0.33541,0.00419,0.99087,0.98095,0.99245,0.73176,0.93218,0.27828,0.00582,0.000363239,0.000363239,0.000363239
82
+ 81,948.105,0.91668,0.33026,0.00362,0.98999,0.97667,0.99266,0.71995,0.95377,0.27147,0.00626,0.000346736,0.000346736,0.000346736
83
+ 82,959.252,0.96913,0.34299,0.00401,0.97412,0.99158,0.99198,0.72411,0.94255,0.2938,0.00609,0.000330233,0.000330233,0.000330233
84
+ 83,970.636,0.95771,0.34312,0.00431,0.96396,0.9931,0.99243,0.72539,0.9632,0.26779,0.00641,0.000313729,0.000313729,0.000313729
85
+ 84,981.831,0.90092,0.31382,0.0041,0.95518,0.985,0.99233,0.72671,0.95196,0.27818,0.00638,0.000297226,0.000297226,0.000297226
86
+ 85,992.937,0.90189,0.32698,0.00395,0.99124,0.9677,0.99262,0.71672,0.98029,0.29905,0.00672,0.000280723,0.000280723,0.000280723
87
+ 86,1003.95,0.89058,0.3261,0.00407,0.99175,0.96402,0.9927,0.71607,0.9596,0.28027,0.00643,0.00026422,0.00026422,0.00026422
88
+ 87,1015,0.84484,0.30533,0.00379,0.99101,0.96621,0.99312,0.71108,0.9795,0.28154,0.0066,0.000247716,0.000247716,0.000247716
89
+ 88,1026.1,0.90922,0.32056,0.0041,0.99057,0.97416,0.99368,0.70908,0.98285,0.2777,0.00648,0.000231213,0.000231213,0.000231213
90
+ 89,1037.13,0.92142,0.33155,0.00406,0.97382,0.98418,0.99353,0.72079,0.96306,0.27242,0.00633,0.00021471,0.00021471,0.00021471
91
+ 90,1048.16,0.96423,0.33755,0.00396,0.97246,0.98925,0.9936,0.72695,0.93718,0.26259,0.00604,0.000198206,0.000198206,0.000198206
92
+ 91,1059.84,0.89399,0.28651,0.0043,0.96302,0.9958,0.9933,0.72104,0.95893,0.26445,0.00627,0.000181703,0.000181703,0.000181703
93
+ 92,1070.85,0.87042,0.27936,0.00411,0.97728,0.98916,0.99393,0.71487,0.97745,0.27432,0.00641,0.0001652,0.0001652,0.0001652
94
+ 93,1081.84,0.89867,0.28649,0.00419,0.98699,0.99001,0.99417,0.71594,0.9695,0.26801,0.00626,0.000148696,0.000148696,0.000148696
95
+ 94,1092.9,0.83723,0.24949,0.00394,0.9861,1,0.99448,0.72982,0.95889,0.25466,0.0061,0.000132193,0.000132193,0.000132193
96
+ 95,1103.91,0.82812,0.2512,0.00408,0.9799,0.99056,0.99429,0.73626,0.95221,0.2623,0.00605,0.00011569,0.00011569,0.00011569
97
+ 96,1115.04,0.83951,0.25672,0.00419,0.98129,0.985,0.99433,0.72763,0.95928,0.25971,0.00607,9.91865e-05,9.91865e-05,9.91865e-05
98
+ 97,1125.9,0.81262,0.25348,0.0036,0.98186,0.99378,0.99421,0.72422,0.96329,0.25618,0.00608,8.26832e-05,8.26832e-05,8.26832e-05
99
+ 98,1136.74,0.83746,0.26798,0.00393,0.97345,1,0.99401,0.73405,0.9612,0.25531,0.00608,6.61799e-05,6.61799e-05,6.61799e-05
100
+ 99,1147.6,0.78021,0.22998,0.00385,0.97166,1,0.99335,0.73146,0.95704,0.25904,0.00603,4.96766e-05,4.96766e-05,4.96766e-05
101
+ 100,1158.53,0.84883,0.25441,0.00392,0.97385,0.99333,0.99383,0.73097,0.95577,0.25855,0.00601,3.31733e-05,3.31733e-05,3.31733e-05
filtered/results.png ADDED

Git LFS Details

  • SHA256: c5de7c38b2a3742e9b124248da800038f72c285013c85115c9b4ae37a7b1c2c5
  • Pointer size: 131 Bytes
  • Size of remote file: 289 kB