CLIP ๊ธฐ๋ฐ ์ ํ ๊ฒฐํจ ํ์ง ๋ชจ๋ธ ์นด๋
๋ชฉ์ฐจ (Table of Contents)
- ๋ชจ๋ธ ์ธ๋ถ์ฌํญ
- ํ์ต ์ธ๋ถ์ฌํญ
- AD-CLIP Model Architecture
- Optimizer and Loss Function
- Metrics
- Training Parameters
- Pre-trained CLIP model
- Evaluation Parameters
- ํ์ต ์ฑ๋ฅ ๋ฐ ํ ์คํธ ๊ฒฐ๊ณผ
- ๋ชจ๋ธ ๋ณ๊ฒฝ ์ด๋ ฅ
- ๋ชจ๋ธ ๋ฒ์ ๊ด๋ฆฌ ์ฒด๊ณ
- ์ค์น ๋ฐ ์คํ ๊ฐ์ด๋
- ๋ชจ๋ธ ์คํ ๋จ๊ณ
- ๋ชจ๋ธ ๊ณต๊ฒฉ ์ทจ์ฝ์ ๋ถ์
- ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ณด์ยท๋ผ์ด์ ์ค ์ํ ๊ด๋ฆฌ ์ฒด๊ณ
- References
๋ชจ๋ธ ์ธ๋ถ์ฌํญ
๋ชจ๋ธ ์ค๋ช
AnomalyCLIP์ ํน์ ๊ฐ์ฒด์ ์์กดํ์ง ์๋ ํ ์คํธ ํ๋กฌํํธ๋ฅผ ํ์ตํ์ฌ ์ด๋ฏธ์ง ๋ด์ ์ ๊ฒฝ ๊ฐ์ฒด์ ์๊ด์์ด ์ผ๋ฐ์ ์ธ ์ ์ ๋ฐ ๋น์ ์ ํจํด์ ํฌ์ฐฉํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ์ด ๋ชจ๋ธ์ CLIP ๊ธฐ๋ฐ ์ด์ ํ์ง ๊ธฐ๋ฒ์ ํ์ฉํ์ฌ ์ ํ ๊ฒฐํจ์ ํ์งํฉ๋๋ค. ์ฌ์ ํ์ต๋ CLIP ๋ชจ๋ธ์ ํ์ธํ๋(Fine-tuning)ํ์ฌ ์ ํ ์ด๋ฏธ์ง์์ ๊ฒฐํจ์ ์๋ณํ๋ฉฐ, ์ด๋ฅผ ํตํด ์์ฐ ๋ผ์ธ์ ํ์ง ๊ด๋ฆฌ ๋ฐ ๊ฒฐํจ ํ์ง ์์ ์ ์๋ํํ ์ ์์ต๋๋ค.
| ์์ฑ | ๊ฐ |
|---|---|
| ๊ฐ๋ฐ์ | ์ค์๋ฏผ |
| ์ ์ ํ์ | SOLUWINS Co., Ltd. (์๋ฃจ์์ค) |
| ์ฐธ๊ณ ์ฐ๊ตฌ | zhou2023 anomalyclip [github] |
| ๋ชจ๋ธ ์ ํ | CLIP (Contrastive Language-Image Pretraining) - Domain-Agnostic Prompt Learning Model |
| ํ๋ก๊ทธ๋๋ฐ ์ธ์ด | Python |
| ๋ผ์ด์ ์ค | Apache 2.0, MIT, OpenAI |
๊ธฐ์ ์ ์ ํ์ฌํญ
| ์ ํ์ฌํญ | ์ค๋ช |
|---|---|
| ๋ฐ์ดํฐ ์๊ตฌ์ฌํญ | ์ถฉ๋ถํ๊ณ ๋ค์ํ ํ๋ จ ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ฉฐ, ๋ฐ์ดํฐ์ ์ด ๋ถ์กฑํ๊ฑฐ๋ ๋ถ๊ท ํํ ๊ฒฝ์ฐ ๋ชจ๋ธ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค. |
| ์ฑ๋ฅ ์ ํ | ์ค์๊ฐ ๊ฒฐํจ ๊ฐ์ง ์ฑ๋ฅ์ ํ๋์จ์ด ์ฌ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ผ๋ฉฐ, ๋์ ํด์๋์์์ ์ ํ๋๊ฐ ๋จ์ด์ง ์ ์์ต๋๋ค. |
| ํ์ง ํ๊ณ | ๊ฒฐํจ์ด ๋ฏธ์ธํ๊ฑฐ๋ ์ ํ ๊ฐ ์ ์ฌ์ฑ์ด ๋งค์ฐ ๋์ ๊ฒฝ์ฐ, ๋ชจ๋ธ์ด ๊ฒฐํจ์ ์ ํํ๊ฒ ํ์งํ์ง ๋ชปํ ์ ์์ต๋๋ค. |
ํ์ต ์ธ๋ถ์ฌํญ
ํ๋์จ์ด ํ๊ฒฝ
| ๊ตฌ์ฑ ์์ | ์ฌ์ |
|---|---|
| CPU | Intel Core i9-13900K (24 Cores, 32 Threads) |
| RAM | 64GB DDR5 |
| GPU | NVIDIA RTX 4090Ti 24GB |
| Storage | 1TB NVMe SSD + 2TB HDD |
์ํํธ์จ์ด ํ๊ฒฝ
| ๊ตฌ์ฑ ์์ | ๋ฒ์ |
|---|---|
| OS | Windows 11 64 bit / Ubuntu 20.04LTS |
| Python | 3.8 (anaconda) |
| PyTorch | 1.9.0 |
| OpenCV | 4.5.3 |
| Cuda Toolkit | 11.8 |
| CuDNN | 9.3.0.75 for cuda11 |
๋ฐ์ดํฐ์ ์ ๋ณด
์ด ๋ชจ๋ธ์ ์ ํ์ ์ ์ ์ด๋ฏธ์ง์ ๊ฒฐํจ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ จ๋ฉ๋๋ค. ์ด ๋ฐ์ดํฐ๋ ์ ํ์ ์ด๋ฏธ์ง, ๊ฒฐํจ ์์ญ์ ๋ํ ground truth ์ ๋ณด, ๊ทธ๋ฆฌ๊ณ ๊ธฐํ ๊ด๋ จ ํน์ฑ์ ํฌํจํ๊ณ ์์ต๋๋ค. ์ด๋ฏธ์ง๋ CLIP ๋ชจ๋ธ์ ์ ๋ ฅ ํ์์ ์ ํฉํ๋๋ก ์ ์ฒ๋ฆฌ๋๋ฉฐ, ๊ฒฐํจ ์์ญ์ ํ๊ฐ๋ฅผ ์ํด ground truth ๋งํน์ด ํฌํจ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ค: https://huggingface.co/datasets/quandao92/ad-clip-dataset
- ๋ฐ์ดํฐ ์์ง ์ฅ๋น:
- ์์ง H/W: jetson orin nano 8GB
- ์นด๋ฉ๋ผ: BFS-U3-89S6C Color Camera
- ๋ ์ฆ: 8mm Fiexd Focal Length Lens
- ์กฐ๋ช : LIDLA-120070
- ๋ฐ์ดํฐ ํ์: .bpm, .jpg
๋ฐ์ดํฐ ๋ฒ์ ๊ด๋ฆฌ
1์ฐจ: 20240903_V0_๊ฐ์ด ํ๊ฒฝ ๋ฐ์ดํฐ ์์ง
- V01: ์ ์ฒ๋ฆฌ ์ ๋ฐ์ดํฐ ์๋ณธ โ ๋ฐ์ดํฐ ์์ง ์๋ณธ: 120ea
- V02: ๋ฐ์ดํฐ ๋ถ๋ฅ โ ์ ์/๋ถ๋ ๋ถ๋ฅ: 116ea/4ea
- V03: ๋ฐ์ดํฐ ๋ถ๋ฅ, ๋ฐ์ดํฐ ํ์ โ ์ด๋ฏธ์ง ์ฆ๊ฐ_45/90/135๋๋ก ํ์ _360ea
Ground Truth Marking
PCA ๋ถํฌ ์๊ฐํ
Isolation Forest๋ก ์ด์๊ฐ ์๋ณ ๊ฒฐ๊ณผ
2์ฐจ: 20240910_V1_ํ์ฐ์ง ๋ด ์ด๋ฏธ์ง ์์ง
- V01: ์ ์ฒ๋ฆฌ ์ ๋ฐ์ดํฐ ์๋ณธ โ ๋ฐ์ดํฐ ์์ง ์๋ณธ: 350ea
- V02: ๋ฐ์ดํฐ ๋ถ๋ฅ โ ์ ์/๋ถ๋ ๋ถ๋ฅ: 336ea/14ea
- V03: ๋ฐ์ดํฐ ๋ถ๋ฅ, ๋ฐ์ดํฐ ํ์ โ ์ด๋ฏธ์ง ์ฆ๊ฐ: 1,050ea
Ground Truth Marking
PCA ๋ถํฌ ์๊ฐํ
Isolation Forest๋ก ์ด์๊ฐ ์๋ณ ๊ฒฐ๊ณผ
3์ฐจ: 20250328_V2_์ค๋น ๋ด ๋ฐ์ดํฐ ์์ง
- V01: ์ ์ฒ๋ฆฌ ์ ๋ฐ์ดํฐ ์๋ณธ โ ์ด๋ฏธ์ง ์์ง_2,010๊ฐ
- V02: ๋ฐ์ดํฐ ๋ถ๋ฅ โ ์ ์/๋ถ๋ ๋ถ๋ฅ ์ํ_1,918/92
- V03: ๋ฐ์ดํฐ ๋ถ๋ฅ, ๋ฐ์ดํฐ ํ์ โ ์ด๋ฏธ์ง ์ฆ๊ฐ ์ํ_์ด๋ฏธ์ง ํ์ ์ ํตํด ์ด๋ฏธ์ง ๊ฐ์ 6,030๊ฐ
Ground Truth Marking
PCA ๋ถํฌ ์๊ฐํ
Isolation Forest๋ก ์ด์๊ฐ ์๋ณ ๊ฒฐ๊ณผ
Data Configuration
์ด๋ฏธ์ง ํฌ๊ธฐ ์กฐ์ ๋ฐ ์ ๊ทํ:
- ์ด๋ฏธ์ง๋ ์ผ์ ํ ํฌ๊ธฐ(์: 518x518)๋ก ๋ฆฌ์ฌ์ด์ฆ๋๋ฉฐ, CLIP ๋ชจ๋ธ์ ์ ๋ ฅ์ผ๋ก ์ ํฉํ๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค.
- ์ ๊ทํ๋ฅผ ํตํด ํฝ์ ๊ฐ์ [0, 1] ๋ฒ์๋ก ๋ณํํฉ๋๋ค.
Ground Truth ๋งํน:
- ๊ฒฐํจ์ด ์๋ ์ด๋ฏธ์ง์ ๋ํด ๊ฒฐํจ ์์ญ์ bounding box ํ์ ๋๋ binary mask๋ก ํ์ํฉ๋๋ค.
- ๋งํน๋ ๋ฐ์ดํฐ๋ฅผ JSON ๋๋ CSV ํ์์ผ๋ก ์ ์ฅํ์ฌ ๋ชจ๋ธ ํ๊ฐ ์ ์ฌ์ฉํฉ๋๋ค.
Ground Truth Marking
๋ฐ์ดํฐ ๋ถ๋ฅ:
- Normal: ๊ฒฐํจ์ด ์๋ ์ ์ ์ ํ์ ์ด๋ฏธ์ง.
- Error: ๊ฒฐํจ์ด ์๋ ์ ํ์ ์ด๋ฏธ์ง. ๊ฒฐํจ ์์น์ ๊ด๋ จ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค.
Normal Product Images
Error Product Images
๋ฐ์ดํฐ ๋ผ๋ฒจ๋ง ๊ฐ์ด๋
๋ณธ ๋ฐ์ดํฐ ๋ผ๋ฒจ๋ง ๊ฐ์ด๋๋ AnomalyDetection ๊ธฐ๋ฐ ๋ชจ๋ธ ํ์ต์ ์ํด ์์ง๋ ๋ฐ์ดํฐ๋ฅผ ๋ผ๋ฒจ๋งํ๋ ๊ธฐ์ค๊ณผ ํ๋ก์ธ์ค๋ฅผ ๋ช ํํ ์ ์ํฉ๋๋ค. ๋ฐ์ดํฐ๋ ์ฃผ๋ก ์ ์(normal) ๋ฐ์ดํฐ๋ฅผ ์ค์ฌ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ต์ํ์ ๋น์ ์(anomaly) ๋ฐ์ดํฐ๋ฅผ ํฌํจํฉ๋๋ค. ๋ณธ ๊ฐ์ด๋๋ ๋ฐ์ดํฐ์ ํ์ง์ ์ ์งํ๊ณ ๋ชจ๋ธ ํ์ต ๋ฐ ํ ์คํธ๋ฅผ ์ต์ ํํ๋ ๋ฐ ๋ชฉํ๋ฅผ ๋ก๋๋ค.
๋ผ๋ฒจ๋ง ๋ฒ์
์ ์(normal) ๋ฐ์ดํฐ:
- ์ ์ฒด ๋ฐ์ดํฐ์ ์ฝ 95% ์ด์์ ์ฐจ์ง.
- ๋ค์ํ ํ๊ฒฝ ์กฐ๊ฑด์์ ์์ง๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจ (์กฐ๋ช , ๊ฐ๋, ๋ฐฐ๊ฒฝ ๋ฑ).
- ์ ์์ ์ธ ์ํ์ ๊ธ์ ํ๋ฉด, ์ ๋ฐํ ๊ตฌ์กฐ, ๊ท ์ผํ ๊ดํ์ ๊ฐ์ง ๋ฐ์ดํฐ.
๋น์ ์(anomaly) ๋ฐ์ดํฐ:
- ์ ์ฒด ๋ฐ์ดํฐ์ ์ฝ 5% ์ดํ๋ก ์ ํ.
- ๊ฒฐํจ ์ ํ:
- Scratch: ์คํฌ๋์น.
- Contamination: ์ผ๋ฃฉ ๋๋ ์ด๋ฌผ์ง.
- Crack: ํ๋ฉด ๊ท ์ด.
๋ฐ์ดํฐ ๋ผ๋ฒจ๋ง ๊ธฐ์ค
1. ํ์ผ ๋ค์ด๋ฐ ๊ท์น
- ๋ฐ์ดํฐ ๋ฒ์ ๋ณ ํ์ผ๋ช ์ ๋ฒ์ ๋ณ๋ก ์์ดํจ.
- ๊ฐ ๋ฒ์ ์ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ฌธ์ ์ฐธ๊ณ .
- ๋ฐ์ดํฐ ํด๋๋ช
์
<์์ง๋ ์์ผ>_<V๋ฒ์ >_<๊ฐ๋จํ ์ค๋ช >ํ์์ผ๋ก ์์ฑ. - ์์:
20240910_V0_๊ฐ์ด ํ๊ฒฝ ๋ฐ์ดํฐ ์์ง.
2. ๋ผ๋ฒจ ๋ฉํ๋ฐ์ดํฐ
๋ผ๋ฒจ ๋ฉํ๋ฐ์ดํฐ๋ CSV ํ์์ผ๋ก ์ ์ฅํ๋ฉฐ, ๊ฐ ๋ฐ์ดํฐ์ ๋ผ๋ฒจ ๋ฐ ์ค๋ช ์ ํฌํจํฉ๋๋ค.
ํ์ ํ๋:
image_id: ์ด๋ฏธ์ง ํ์ผ๋ช .label: ์ ์(normal) ๋๋ ๋น์ ์(anomaly) ์ฌ๋ถ.description: ์์ธ ์ค๋ช (์: ๊ฒฐํจ ์ ํ).
์์:
{
"image_id": "normal_20241111_001.jpg",
"label": "normal",
"description": "๋งค๋๋ฌ์ด ํ๋ฉด์ ๊ฐ์ง ์ ์์ ์ธ ๊ธ์ ๋ถํ, ๊ดํ์ด ๊ท ์ผํจ."
}
{
"image_id": "abnormal_20241111_002.jpg",
"label": "error",
"description": "ํ๋ฉด์ ์ ํ ์คํฌ๋์น๊ฐ ๋ฐ๊ฒฌ๋จ."
}
AD-CLIP Model Architecture
AD-CLIP ๋ชจ๋ธ์ CLIP (ViT-B-32)์ ๋ฐฑ๋ณธ์ผ๋ก ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง์์ ํน์ง์ ์ถ์ถํ๊ณ , ๋์กฐ ํ์ต์ ํตํด ์ด์์ ํ์งํฉ๋๋ค. ์ต์ข ์ถ๋ ฅ์ ์ด๋ฏธ์ง๊ฐ ๋น์ ์์ธ์ง ์ ์์ธ์ง๋ฅผ ํ๋ณํ๋ ์ด์ ์ ์์ ๊ฐ ํด๋์ค์ ํ๋ฅ ์ ์ ๊ณตํฉ๋๋ค.
CLIP-based Anomaly Detection Model Architecture
๋ชจ๋ธ ๊ตฌ์กฐ
์ ๋ ฅ ๊ณ์ธต (Input Layer):
- ์ ๋ ฅ ์ด๋ฏธ์ง: ๋ชจ๋ธ์ ํฌ๊ธฐ [640, 640, 3]์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ ฅ๋ฐ์ต๋๋ค. ์ฌ๊ธฐ์ 640x640์ ์ด๋ฏธ์ง์ ๊ฐ๋ก์ ์ธ๋ก ํฌ๊ธฐ์ด๋ฉฐ, 3์ RGB ์์์ ์ฑ๋ ์๋ฅผ ๋ํ๋ ๋๋ค.
- ๊ธฐ๋ฅ: ์ด ๊ณ์ธต์ ์ ๋ ฅ๋ ์ด๋ฏธ์ง๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋ชจ๋ธ์ ๋๋จธ์ง ๋ถ๋ถ์ ๋ง๋ ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๋ ์ญํ ์ ํฉ๋๋ค.
Backbone:
- CLIP (ViT-B-32): ๋ชจ๋ธ์ CLIP์ Vision Transformer (ViT-B-32) ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง์์ ํน์ง์ ์ถ์ถํฉ๋๋ค. ViT-B-32๋ ์ด๋ฏธ์ง๋ฅผ ์ดํดํ๋ ๋ฐ ํ์ํ ๊ณ ๊ธ ํน์ฑ์ ์ถ์ถํ ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ํํฐ: ํํฐ ํฌ๊ธฐ [32, 64, 128, 256, 512]๋ ๊ฐ ViT ๋ ์ด์ด์์ ์ฌ์ฉ๋๋ฉฐ, ์ด๋ฏธ์ง์ ๊ฐ ๋ ๋ฒจ์์ ์ค์ํ ์ ๋ณด๋ฅผ ์ถ์ถํ์ฌ ํน์ง์ ํ์ตํฉ๋๋ค.
Neck:
- ์ด์ ํ์ง ๋ชจ๋ (Anomaly Detection Module): ์ด ๋ชจ๋์ CLIP์์ ์ถ์ถ๋ ํน์ง์ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๋ถ์ํ๊ณ ์ด์ ์ฌ๋ถ๋ฅผ ํ๋จํฉ๋๋ค. ์ด ๋จ๊ณ์์๋ ์ด๋ฏธ์ง ๋ด์์ ์ ์๊ณผ ๋น์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ณํ๊ธฐ ์ํ ์ค์ํ ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.
- ๋์กฐ ํ์ต (Contrastive Learning): ๋์กฐ ํ์ต ๋ฐฉ๋ฒ์ ์ ์ ์ด๋ฏธ์ง์ ๋น์ ์ ์ด๋ฏธ์ง ๊ฐ์ ์ฐจ์ด๋ฅผ ํ์ตํ์ฌ, ์ด๋ฏธ์ง์ ์ด์ ์ฌ๋ถ๋ฅผ ๋์ฑ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ ์ ์๊ฒ ๋์์ค๋๋ค.
Head:
- ์ด์ ํ์ง ํค๋ (Anomaly Detection Head): ๋ชจ๋ธ์ ๋ง์ง๋ง ๋ถ๋ถ์ผ๋ก, ์ด ๊ณ์ธต์ ์ด๋ฏธ์ง๊ฐ ๋น์ ์์ ์ธ์ง ์ ์์ ์ธ์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- Outputs:
- ์ด์ ์ ์ (Anomaly Score): ๋ชจ๋ธ์ ์ด๋ฏธ์ง๊ฐ ์ด์์ธ์ง ์๋์ง๋ฅผ ๋ํ๋ด๋ ์ ์(์: 1์ ์ด์, 0์ ์ ์)๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
- ํด๋์ค ํ๋ฅ (Class Probabilities): ๋ชจ๋ธ์ ๊ฐ ํด๋์ค์ ๋ํ ํ๋ฅ ์ ์ถ๋ ฅํ๋ฉฐ, ์ด ํ๋ฅ ์ ํตํด ๊ฒฐํจ์ด ์๋์ง ์๋์ง์ ์ฌ๋ถ๋ฅผ ํ๋จํฉ๋๋ค.
Optimizer and Loss Function
Training
optimizer:
name: AdamW # AdamW ์ตํฐ๋ง์ด์ (๊ฐ์ค์น ๊ฐ์ ํฌํจ)
lr: 0.0001 # ํ์ต๋ฅ
loss:
classification_loss: 1.0 # ๋ถ๋ฅ ์์ค (๊ต์ฐจ ์ํธ๋กํผ)
anomaly_loss: 1.0 # ๊ฒฐํจ ํ์ง ์์ค (์ด์ ํ์ง ๋ชจ๋ธ์ ๋ํ ์์ค)
contrastive_loss: 1.0 # ๋์กฐ ํ์ต ์์ค (์ ์ฌ๋ ๊ธฐ๋ฐ ์์ค)
Metrics
- Precision # ์ ๋ฐ๋ (Precision)
- Recall # ์ฌํ์จ (Recall)
- mAP # ํ๊ท ์ ๋ฐ๋ (Mean Average Precision)
- F1-Score # F1-์ ์ (๊ท ํ ์กํ ํ๊ฐ ์งํ)
Training Parameters
ํ์ดํผํ๋ผ๋ฏธํฐ ์ค์ :
- Learning Rate: 0.001
- Batch Size: 8
- Epochs: 200
Pre-trained CLIP model
Evaluation Parameters
- F1-score: 90% ์ด์ (1๋ ์ฐจ)
- F1-score: 98% ์ด์ (2๋ ์ฐจ)
ํ์ต ์ฑ๋ฅ ๋ฐ ํ ์คํธ ๊ฒฐ๊ณผ
ํ์ต์ฑ๋ฅ ๊ฒฐ๊ณผ ๊ทธ๋ํ
ํ์ต ๊ณผ์ ์์
1์ฐจ ํ์ต ์ฑ๋ฅ
2์ฐจ ํ์ต ์ฑ๋ฅ
3์ฐจ ํ์ต ์ฑ๋ฅ
ํ ์คํธ ๊ฒฐ๊ณผํ
ํ ์คํธ ๊ฒฐ๊ณผ
Anomaly Product
Normal Product
๋ชจ๋ธ ๋ณ๊ฒฝ ์ด๋ ฅ (Model Update History)
AD-CLIP ๊ธฐ๋ฐ ์ด์ํ์ง ๋ชจ๋ธ์ ์ด 3๊ฐ ๋ฒ์ ์ผ๋ก ๊ด๋ฆฌ๋๊ณ ์์ผ๋ฉฐ,
๊ฐ ๋ฒ์ ์ ๋ฐ์ดํฐ ํ์ง ๊ฐ์ ๋ฐ ๋ชจ๋ธ ์ฑ๋ฅ ํฅ์์ ๋ง์ถฐ ์ฒด๊ณ์ ์ผ๋ก ๋ณ๊ฒฝยท์น์ธ๋์๋ค.
๋ชจ๋ ์ด๋ ฅ์ ๋ฐ์ดํฐ ๋ฒ์ , ๋ชจ๋ธ ์ฑ๋ฅ(F1), ์น์ธ์, ๋น๊ณ ์ฌํญ๊ณผ ํจ๊ป ๊ธฐ๋ก๋์ด ์ถ์ ๊ฐ๋ฅํ๋ค.
| ๋ฒ์ | ๋ณ๊ฒฝ์ผ | ์ฃผ์ ๋ณ๊ฒฝ ๋ด์ฉ | ๋ฐ์ดํฐ ๋ฒ์ | ์ฑ๋ฅ (F1) | ์กฐ์น์ | ๊ฒ์์ | ๋น๊ณ |
|---|---|---|---|---|---|---|---|
| v1.0.0 | 2024-09-23 | ์ด๊ธฐ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐ ๋ชจ๋ธ ์ต์ด ํ์ต | 20240910_V0 | 0.91 | ์ค์๋ฏผ | ์ต์ข ํธ | ์ต์ด ๋ฐฐํฌ |
| v1.1.0 | 2024-09-26 | ๋ฐ์ดํฐ ์ฆ๊ฐ(ํ์ ยท์กฐ๋ช ) ๋ฐ Prompt ์์ | 20240920_V1 | 0.94 | ์ค์๋ฏผ | ์ต์ข ํธ | ์ฑ๋ฅ ์์ ํ |
| v2.0.0 | 2025-06-19 | ๋ฐ์ดํฐ 30% ์ฆ๊ฐ, ์ ์ฒด ์ฌํ์ต ์ํ | 20250610_V3 | 0.98 | ์ค์๋ฏผ | ์ต์ข ํธ | 2์ฐจ๋ ๋ ๋ชฉํ ์ถฉ์กฑ (๊ณ ๋ํ ์๋ฃ) |
๋ชจ๋ธ ๋ฒ์ ๊ด๋ฆฌ ์ฒด๊ณ (Model Version Management)
AD-CLIP ๋ชจ๋ธ์ ๋ณ๊ฒฝยท๊ต์ฒด ์์ ์ ๋ฐ์ดํฐ ๋ฒ์ , ์ฝ๋ ๋ฒ์ , ์ฑ๋ฅ ๋ก๊ทธ, ์น์ธ ๊ธฐ๋ก์ด ์ํธ ์ฐ๊ณ๋๋ฉฐ,
์ด๋ฅผ ํตํด ๋ชจ๋ธ ์ ๋ขฐ์ฑ, ์ฌํ์ฑ, ์ถ์ ์ฑ์ ๋์์ ํ๋ณดํ๋ค.
๋ฒ์ ๋ช ๋ช ๊ท์น
| ๊ตฌ๋ถ | ๊ท์น | ์์ |
|---|---|---|
| ๋ฐ์ดํฐ ๋ฒ์ | YYYYMMDD_V# ํ์ |
20240910_V0 |
| ๋ชจ๋ธ ๋ฒ์ | vX.Y.Z ํ์ |
v2.0.0 |
| ์ด์ ๋ก๊ทธ ๋ฒ์ | LOG_YYYYMMDD ํ์ |
LOG_20251027 |
๊ด๋ฆฌ ๊ตฌ์ฑ์์
| ๊ตฌ๋ถ | ๊ด๋ฆฌ ํญ๋ชฉ | ์ค๋ช |
|---|---|---|
| ๋ฐ์ดํฐ ๊ด๋ฆฌ | ์์งยท๋ผ๋ฒจ๋งยท๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ | ํด์(SHA256) ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์ถ์ |
| ๋ชจ๋ธ ๊ด๋ฆฌ | ํ์ตยทํ๊ฐยท์ฌํ์ต ๊ฒฐ๊ณผ ๊ธฐ๋ก | ๊ฐ ๋ฒ์ ๋ณ ์ฒดํฌํฌ์ธํธ ๋ฐ ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ |
| ์ด์ ๊ด๋ฆฌ | ๋ฐฐํฌยท๋ก๊ทธยท์ฑ๋ฅ ์ถ์ | ์ด์ ์ค ProbabilityยทF1 ๋ชจ๋ํฐ๋ง |
| ๋ณด์ ๊ด๋ฆฌ | Adversarial ํ์งยทPoisoning ๋ฐฉ์ง | ๊ณต๊ฒฉ ํ์ง ์ ๋ชจ๋ธ ๊ฒฉ๋ฆฌ ๋ฐ ๋ณต์ ์ํ |
๋ชจ๋ธ ๋ณ๊ฒฝ ์ ์ฐจ ์์ฝ
| ๋จ๊ณ | ์ฃผ์ ํ๋ | ์ฐ์ถ๋ฌผ |
|---|---|---|
| โ ์ฑ๋ฅ ๊ฐ์ | Probability ๋ฐ F1 Score ์๋ ๋ชจ๋ํฐ๋ง | eval_log.json |
| โก ๊ต์ฒด ๊ฒํ | ๊ธฐ์ค ๋ฏธ๋ฌ ์ ์ฌํ์ต ๋ชจ๋ธ ์์ฑ | candidate_model.pth |
| โข ์ฑ๋ฅ ๋น๊ต | ๊ธฐ์กด vs ์ ๊ท ๋ชจ๋ธ ๊ฒ์ฆ | compare_result.xlsx |
| โฃ ์น์ธ | ๊ฒ์์ ์น์ธ ๋ฐ ํ์๋ก ๊ธฐ๋ก | approval_log.json |
| โค ๋ฐฐํฌ | ์ด์ ๋ฐ์ ๋ฐ ๋ก๊ทธ ๋ฑ๋ก | release_note.md |
| โฅ ์ถ์ | ๋ชจ๋ธ ๊ต์ฒด ์ด๋ ฅ ์ ๋ฐ์ดํธ | model_version_log.csv |
๋ชจ๋ธ ๋ฉํ๋ฐ์ดํฐ ์์
{
"model_name": "ADCLIP_v2.0.0",
"data_version": "20250610_V3",
"created_at": "2025-06-19T10:00:00Z",
"f1_score": 0.98,
"precision": 0.977,
"recall": 0.982,
"optimizer": "AdamW",
"framework": "PyTorch 2.0.0",
"base_model": "openai/clip-vit-base-patch32",
"author": "์ค์๋ฏผ ์ฑ
์์ฐ๊ตฌ์",
"reviewer": "์ต์ข
ํธ ์ฑ
์์ฐ๊ตฌ์",
"status": "Active",
"notes": "2์ฐจ๋
๋ ์ ์ฒด ์ฌํ์ต ๋ฐ ์ฑ๋ฅ ๊ณ ๋ํ ๋ฒ์ "
}
์ค์น ๋ฐ ์คํ ๊ฐ์ด๋
์ด ๋ชจ๋ธ์ ์คํํ๋ ค๋ฉด Python๊ณผ ํจ๊ป ๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค:
ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ftfy==6.2.0: ํ ์คํธ ์ ๊ทํ ๋ฐ ์ธ์ฝ๋ฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- matplotlib==3.9.0: ๋ฐ์ดํฐ ์๊ฐํ ๋ฐ ๊ทธ๋ํ ์์ฑ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- numpy==1.24.3: ์์น ์ฐ์ฐ์ ์ํ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- opencv_python==4.9.0.80: ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- pandas==2.2.2: ๋ฐ์ดํฐ ๋ถ์ ๋ฐ ์กฐ์์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Pillow==10.3.0: ์ด๋ฏธ์ง ํ์ผ ์ฒ๋ฆฌ ๋ฐ ๋ณํ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- PyQt5==5.15.10: GUI ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ํ ํ๋ ์์ํฌ
- PyQt5_sip==12.13.0: PyQt5์ Python ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- regex==2024.5.15: ์ ๊ท ํํ์ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- scikit_learn==1.2.2: ๊ธฐ๊ณ ํ์ต ๋ฐ ๋ฐ์ดํฐ ๋ถ์์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- scipy==1.9.1: ๊ณผํ ๋ฐ ๊ธฐ์ ๊ณ์ฐ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- setuptools==59.5.0: Python ํจํค์ง ๋ฐฐํฌ ๋ฐ ์ค์น๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- scikit-image: ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ฐ ๋ถ์์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- tabulate==0.9.0: ํ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- thop==0.1.1.post2209072238: PyTorch ๋ชจ๋ธ์ FLOP ์๋ฅผ ๊ณ์ฐํ๋ ๋๊ตฌ
- timm==0.6.13: ๋ค์ํ ์ต์ ์ด๋ฏธ์ง ๋ถ๋ฅ ๋ชจ๋ธ์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- torch==2.0.0: PyTorch ๋ฅ๋ฌ๋ ํ๋ ์์ํฌ
- torchvision==0.15.1: ์ปดํจํฐ ๋น์ ์์ ์ ์ํ PyTorch ํ์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- tqdm==4.65.0: ์งํ ์ํฉ์ ์๊ฐ์ ์ผ๋ก ํ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- pyautogui: GUI ์๋ํ๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ค์น ๋ช ๋ น์ด
pip install -r requirements.txt
๋ชจ๋ธ ์คํ ๋จ๊ณ
Dataset Configuration
Dataset configuration ์์:
โโโ data/
โ โโโ COMP_1/
โ โ โโโ product_1/
โ โ โ โโโ ground_truth
โ โ โ โ โโโ anomaly_1
โ โ โ โ โโโ anomaly_2
โ โ โ โ
โ โ โ โโโ test/
โ โ โ โ โโโ good
โ โ โ โ โโโ anomaly_1
โ โ โ โ โโโ anomaly_2
โ โ โ โ
โ โ โ โโโ train/
โ โ โ โ โโโ good
โ โ โ โ โโโ anomaly_1
โ โ โ โ โโโ anomaly_2
โ โ
โ โ โโโ product_2/
โ โ
โ โ โโโ meta.json
โ
โ โโโ COMP_2/
JSON ํ์ผ ์์ฑ
๋ฐ์ดํฐ์ ์ ๋ชจ๋ ์ ๋ณด๋ฅผ JSON ํ์ผ(meta_train.json, meta_test.json)๋ก ์ ์ฅ:
cd dataset_config
python dataset_get_json.py
Ground Truth ์์ฑ
์๋์ผ๋ก ๋ชจ๋ ground truth(anomaly mask๋ง) ์์ฑ:
cd dataset_config
python image_ground_truth.py
ํ์ต ๋ฐ ํ ์คํธ์ฉ ๋ฐ์ดํฐ์ ์ค์
cd training_libs
python dataset.py
Dataset ํด๋์ค ๋์ ๋ฐฉ์:
__init__๋ฉ์๋: ๋ฐ์ดํฐ์ ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ, ๋ณํ ํจ์, ๋ฐ์ดํฐ์ ์ด๋ฆ, ๋ชจ๋๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ต๋๋ค- ๋ฉํ ์ ๋ณด๋ฅผ ๋ด์ JSON ํ์ผ (meta_train.json)์ ์ฝ์ด์ ํด๋์ค ์ด๋ฆ ๋ชฉ๋ก๊ณผ ๋ชจ๋ ๋ฐ์ดํฐ ํญ๋ชฉ์ ๋ฆฌ์คํธ์ ์ ์ฅํฉ๋๋ค
generate_class_infoํจ์๋ฅผ ํธ์ถํ์ฌ ํด๋์ค ์ ๋ณด๋ฅผ ์์ฑํ๊ณ ํด๋์ค ์ด๋ฆ์ ํด๋์ค ID์ ๋งคํํฉ๋๋ค__len__๋ฉ์๋: ๋ฐ์ดํฐ์ ์ ์ํ ์๋ฅผ ๋ฐํํฉ๋๋ค__getitem__๋ฉ์๋: ์ฃผ์ด์ง ์ธ๋ฑ์ค์ ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค- ์ด๋ฏธ์ง ๊ฒฝ๋ก๋ฅผ ํตํด ์ด๋ฏธ์ง๋ฅผ ์ฝ๊ณ , ์ด์ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ง์คํฌ ์ด๋ฏธ์ง๋ฅผ ์์ฑํฉ๋๋ค
- ํ์์ ์ด๋ฏธ์ง์ ๋ง์คํฌ์ ๋ณํ ํจ์๋ฅผ ์ ์ฉํฉ๋๋ค
- ์ด๋ฏธ์ง, ๋ง์คํฌ, ํด๋์ค ์ด๋ฆ, ์ด์ ์ฌ๋ถ, ์ด๋ฏธ์ง ๊ฒฝ๋ก, ํด๋์ค ID๋ฅผ ํฌํจํ ๋์ ๋๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค
2. Image Pre-processing (Transformation)
ํ์ต ๋ฐ ํ ์คํธ๋ฅผ ์ํ ์ด๋ฏธ์ง ์ ์ฒ๋ฆฌ:
# training_libs/utils.py
# AnomalyCLIP_lib/transform.py
Data Processing Techniques:
- normalization: ์ด๋ฏธ์ง ํฝ์
๊ฐ์ ํ๊ท ๋ฐ ํ์คํธ์ฐจ๋ก ํ์คํ
- ๋ฐฉ๋ฒ:
'Normalize' from 'torchvision.transforms'
- ๋ฐฉ๋ฒ:
- max_resize: ์ด๋ฏธ์ง์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ ์งํ๋ฉฐ, ๋น์จ์ ๋ง์ถ๊ณ ํจ๋ฉ์ ์ถ๊ฐํ์ฌ ํฌ๊ธฐ ์กฐ์
- ๋ฐฉ๋ฒ:
Custom 'ResizeMaxSize' class
- ๋ฐฉ๋ฒ:
- random_resized_crop: ํ๋ จ ์ค์ ์ด๋ฏธ์ง๋ฅผ ๋๋ค์ผ๋ก ์๋ฅด๊ณ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ์ฌ ๋ณํ์ ์ถ๊ฐ
- ๋ฐฉ๋ฒ:
'RandomResizedCrop' from 'torchvision.transforms'
- ๋ฐฉ๋ฒ:
- resize: ๋ชจ๋ธ ์
๋ ฅ์ ๋ง๊ฒ ์ด๋ฏธ์ง๋ฅผ ๊ณ ์ ๋ ํฌ๊ธฐ๋ก ์กฐ์
- ๋ฐฉ๋ฒ:
'Resize' with BICUBIC interpolation
- ๋ฐฉ๋ฒ:
- center_crop: ์ด๋ฏธ์ง์ ์ค์ ๋ถ๋ถ์ ์ง์ ๋ ํฌ๊ธฐ๋ก ์๋ฅด๊ธฐ
- ๋ฐฉ๋ฒ:
'CenterCrop'
- ๋ฐฉ๋ฒ:
- to_tensor: ์ด๋ฏธ์ง๋ฅผ PyTorch ํ
์๋ก ๋ณํ
- ๋ฐฉ๋ฒ:
'ToTensor'
- ๋ฐฉ๋ฒ:
- augmentation (optional): ๋ฐ์ดํฐ ์ฆ๊ฐ์ ์ํด ๋ค์ํ ๋๋ค ๋ณํ ์ ์ฉ,
'AugmentationCfg'๋ก ์ค์ ๊ฐ๋ฅ- ๋ฐฉ๋ฒ:
Uses 'timm' library if specified
- ๋ฐฉ๋ฒ:
3. Prompt Generating
# training_lib/prompt_ensemble.py
Prompts Built in the Code:
Normal Prompt:
["{}"]- Normal Prompt Example: "object"
Anomaly Prompt:
["damaged {}"]- Anomaly Prompt Example: "damaged object"
Construction Process:
prompts_pos (Normal): Combines the class name with the normal templateprompts_neg (Anomaly): Combines the class name with the anomaly template
4. Initial Setting for Training
ํ์ต ๋ฐ์ดํฐ์ ๊ฒฝ๋ก ๋ฐ ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ ์ ์ฅ ๊ฒฝ๋ก ์ ์:
parser.add_argument("--train_data_path", type=str, default="./data/", help="train dataset path")
parser.add_argument("--dataset", type=str, default='smoke_cloud', help="train dataset name")
parser.add_argument("--save_path", type=str, default='./checkpoint/', help='path to save results')
5. Hyper Parameters Setting
Depth Parameter
ํ๋กฌํํธ ํ์ต ์ค ํ์ตํ ์๋ฒ ๋ฉ์ ๊น์ด๋ฅผ ์ค์ ํฉ๋๋ค. ์ด๋ ๋ชจ๋ธ์ด ๋ฐ์ดํฐ์์ ๋ณต์กํ ํน์ง์ ํ์ตํ๋ ๋ฅ๋ ฅ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค:
parser.add_argument("--depth", type=int, default=9, help="image size")
Image Size
ํ์ต์ ์ฌ์ฉํ ์ ๋ ฅ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค (ํฝ์ ๋จ์):
parser.add_argument("--image_size", type=int, default=518, help="image size")
Training Parameters
ํ์ต ํ๋ผ๋ฏธํฐ ์ค์ :
parser.add_argument("--epoch", type=int, default=500, help="epochs")
parser.add_argument("--learning_rate", type=float, default=0.0001, help="learning rate")
parser.add_argument("--batch_size", type=int, default=8, help="batch size")
DPAM (Deep Prompt Attention Mechanism)
DPAM์ ํฌ๊ธฐ/๊น์ด ํ๋ผ๋ฏธํฐ:
parser.add_argument("--dpam", type=int, default=20, help="dpam size")
DPAM ์ค์ ๊ฐ์ด๋:
- ViT-B/32 and ViT-B/16:
--dpamshould be around 10-13 - ViT-L/14 and ViT-L/14@336px:
--dpamshould be around 20-24
DPAM ์ค๋ช :
- DPAM์ ํนํ Vision Transformers (ViT)์์ ๋ชจ๋ธ์ ํน์ ๋ ์ด์ด๋ฅผ ๊ฐ์ ํ๊ณ ํฅ์์ํค๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค
- Attention ๋ฉ์ปค๋์ฆ์ ํตํด ๋ชจ๋ธ์ด ๊ฐ ๋ ์ด์ด ๋ด์์ ์ค์ํ ํน์ง์ ์ง์คํ ์ ์๋๋ก ๋์์ค๋๋ค
- DPAM์ ์ฌ๋ฌ ๋ ์ด์ด์ ์ ์ฉ๋์ด ๋ ๊น๊ณ ์ธ๋ถ์ ์ธ ํน์ง ์ถ์ถ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค
- DPAM์ด ์ํฅ์ ๋ฏธ์น๋ ๋ ์ด์ด ์๋ ์กฐ์ ๊ฐ๋ฅํฉ๋๋ค (
--dpam), ๋ชจ๋ธ์ ์ผ๋ง๋ fine-tuneํ ์ง ์ ์ดํฉ๋๋ค - ์ ์ฒด ๋ชจ๋ธ์ ๊ฐ์ ํ๋ ค๋ฉด
--dpam์ ๋ชจ๋ธ์ ๋ ์ด์ด ์๋ก ์ค์ ํ ์ ์์ต๋๋ค (์: ViT-B์ ๊ฒฝ์ฐ 12, ViT-L์ ๊ฒฝ์ฐ 24) - ์ต์ข ๋ ์ด์ด(์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ธ์ด ๋ณต์กํ ํน์ง์ ํ์ตํ๋ ๊ณณ)์๋ง ์ง์คํ๋ ค๋ฉด ๋ ์ ์ DPAM ๋ ์ด์ด๋ฅผ ์ ํํ ์ ์์ต๋๋ค
6. Test Process
Load pre-trained and Fine tuned (Checkpoints) models:
Pre-trained model (
./pre-trained model/):- ์ฌ์ ํ์ต๋ ๋ชจ๋ธ (ViT-B, ViT-L, ๋ฑ) ํฌํจ
- CLIP ๋ชจ๋ธ ํ์ต์ ์์์ ์ผ๋ก ์ฌ์ฉ๋จ
- ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ์ด์ ์ ํ์ต๋ ํน์ง์ ํ์ฉํ์ฌ ํ์ต ์๋๋ฅผ ๋์ด๊ณ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค
Fine-tuned models (
./checkpoint/):- ์ด ํด๋์ "epoch_N.pth" ํ์ผ์ fine-tuning ๊ณผ์ ์ค ๋ชจ๋ธ์ ์ํ๋ฅผ ์ ์ฅํฉ๋๋ค
- ๊ฐ ".pth" ํ์ผ์ ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์์ fine-tuned๋ ๋ชจ๋ธ์ ๋ฒ์ ์ ๋ํ๋ ๋๋ค
- ์ด๋ฌํ ์ฒดํฌํฌ์ธํธ๋ fine-tuning ์ฌ๊ฐ, ๋ค์ํ ๋จ๊ณ์์ ๋ชจ๋ธ ํ๊ฐ, ๋๋ ์ฑ๋ฅ์ด ๊ฐ์ฅ ์ข์ ๋ฒ์ ์ ํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค
๋ชจ๋ธ ๊ณต๊ฒฉ ์ทจ์ฝ์ ๋ถ์
๋ณธ ๋ฌธ์๋ AnomalyCLIP ๋ชจ๋ธ์ ์ทจ์ฝ์ ๋ถ์ ๋ฐ ์ ๋์ ๊ณต๊ฒฉ(Adversarial Attacks)์ ๋ํ ๋ฐฉ์ด ๋์ฑ ์ ์ฒด๊ณ์ ์ผ๋ก ์๋ฆฝํ๊ธฐ ์ํด ์์ฑ๋์์ต๋๋ค. ๋ชจ๋ธ์ ์ ๋ขฐ์ฑ๊ณผ ์์ ์ฑ์ ํ๋ณดํ๊ณ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๊ธฐ ์ํด, ๋ฐ์ดํฐ ๋ฐ ๋ชจ๋ธ ์์ค์ ๋ฐฉ์ด ์ ๋ต์ ๊ตฌํํ๊ณ ์ฑ๋ฅ์ ํ๊ฐํ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํฉ๋๋ค.
1. ์ทจ์ฝ์ ๋ถ์
์ ๋์ ๊ณต๊ฒฉ ์๋๋ฆฌ์ค
Adversarial Examples:
- ์ค๋ช : ์ ๋ ฅ ๋ฐ์ดํฐ์ ์์ ๋ ธ์ด์ฆ๋ฅผ ์ถ๊ฐํ์ฌ ๋ชจ๋ธ์ ์์ธก์ ์๊ณกํฉ๋๋ค.
- ์: ์ ์ ์ด๋ฏธ์ง๋ฅผ ๊ฒฐํจ ์ด๋ฏธ์ง๋ก ์์ธกํ๋๋ก ์ ๋ํฉ๋๋ค.
Data Poisoning:
- ์ค๋ช : ํ์ต ๋ฐ์ดํฐ์ ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ์ฌ ๋ชจ๋ธ ํ์ต์ ์๊ณกํฉ๋๋ค.
- ์: ๋น์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ ๋ฐ์ดํฐ๋ก ํ์ต์ํค๋ ๊ฒฝ์ฐ์ ๋๋ค.
Evasion Attacks:
- ์ค๋ช : ์ถ๋ก ์ ๋ชจ๋ธ์ ๋ถ๋ฅ ๊ฒฐ๊ณผ๋ฅผ ์กฐ์ํฉ๋๋ค.
- ์: ๊ฒฐํจ ๋ฐ์ดํฐ๋ฅผ ์ ์์ผ๋ก ์์ธกํ๋๋ก ์ ๋ํฉ๋๋ค.
๋ชจ๋ธ ๋ฐ ๋ฐ์ดํฐ์ ์ํฅ
- ์ฑ๋ฅ ์ ํ: ์ ๋์ ์ํ ์ ๋ ฅ ์ ๋ชจ๋ธ์ ์ ํ๋ ๊ฐ์
- ๋ฌด๊ฒฐ์ฑ ์์: ๋ฐ์ดํฐ ๋ณ์กฐ๋ก ์ธํด ํ์ต๋ ๋ชจ๋ธ์ด ์ค์ ํ๊ฒฝ์์ ์ ๋ขฐ์ฑ์ ์์ค
- ์ ์์ ํ์ฉ ๊ฐ๋ฅ์ฑ: ๋ชจ๋ธ์ ์์ฌ๊ฒฐ์ ์ด ์ค์๋ํ์ฌ ์์ฐ ํ์ง ๊ด๋ฆฌ ์คํจ ๊ฐ๋ฅ์ฑ ์ฆ๊ฐ
2. ๋์ ๋ฐฉ์
๋ฐ์ดํฐ ์์ค ๋ฐฉ์ด ๋์ฑ
๋ฐ์ดํฐ ์ ์ :
- ํ๋ฆฟํ๊ฑฐ๋ ์๋ฆฐ ์ด๋ฏธ์ง ์ ๊ฑฐ
- ๋ฐ์ดํฐ ๋ ธ์ด์ฆ ์ ๊ฑฐ ๋ฐ ๊ฒฐํจ ๋ณต๊ตฌ
- ๊ฒฐ๊ณผ: ๋ฐ์ดํฐ ํ์ง ๊ฐํ๋ก ์ ๋์ ๋ ธ์ด์ฆ ํจ๊ณผ ๊ฐ์
๋ฐ์ดํฐ ์ฆ๊ฐ(Data Augmentation):
- ๋๋ค ํ์ , ํฌ๊ธฐ ์กฐ์ , ๋ฐ๊ธฐ ๋ฐ ๋๋น ์กฐ์
- Gaussian Noise ๋ฐ Salt-and-Pepper Noise ์ถ๊ฐ
- ๊ฒฐ๊ณผ: ๋ฐ์ดํฐ ๋ค์์ฑ ํ๋ณด ๋ฐ ๋ชจ๋ธ ์ผ๋ฐํ ์ฑ๋ฅ ๊ฐํ
๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ:
- ๊ฐ ๋ฐ์ดํฐ ํด์๊ฐ(MD5) ์ ์ฅ ๋ฐ ์๋ณ์กฐ ์ฌ๋ถ ํ์ธ
- ๊ฒฐ๊ณผ: ๋ฐ์ดํฐ์ ์ ๋ขฐ์ฑ ๋ฐ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ
๋ชจ๋ธ ์์ค ๋ฐฉ์ด ๋์ฑ
Adversarial Training:
- FGSM ๊ธฐ๋ฐ์ ์ ๋์ ์ํ์ ํ์ต ๋ฐ์ดํฐ์ ํฌํจ
- ๊ฒฐ๊ณผ: ์ ๋์ ์ํ์์๋ ํ๊ท ์ ํ๋ 5% ํฅ์
Gradient Masking:
- ๊ทธ๋๋์ธํธ๋ฅผ ์จ๊ฒจ ๋ชจ๋ธ์ด ์ ๋์ ๊ณต๊ฒฉ์ ๋ ธ์ถ๋์ง ์๋๋ก ๋ฐฉ์ด
Temperature Scaling:
- ๋ชจ๋ธ์ ์์ธก ํ๋ฅ ์ ์กฐ์ ํ์ฌ ์ ๋์ ์ํ ๋ฏผ๊ฐ๋ ์ํ
์์คํ ์์ค ๋ฐฉ์ด ๋์ฑ
์ค์๊ฐ ํ์ง ๋ฐ ๋์:
- ์ ๋ ฅ ๋ฐ์ดํฐ์ ์ด์ ํจํด์ ์ค์๊ฐ์ผ๋ก ํ์งํ๋ ์์คํ ๊ตฌ์ถ
- ๊ฒฐ๊ณผ: ์ ๋์ ๊ณต๊ฒฉ ๋ฐ์ ์ ์ฆ๊ฐ์ ์ธ ๊ฒฝ๊ณ ๋ฐ ๋์ ๊ฐ๋ฅ
์๋ํ๋ ๋ฐฉ์ด ๋๊ตฌ:
- Adversarial Examples ์์ฑ ๋ฐ ๋ฐฉ์ด ํ ์คํธ ์๋ํ
3. ์คํ ๊ฒฐ๊ณผ
ํ๊ฐ ๋ฐ์ดํฐ
- ์ ์ ๋ฐ์ดํฐ: 110๊ฑด
- ๊ฒฐํจ ๋ฐ์ดํฐ: 10๊ฑด
- ์ ๋์ ๋ฐ์ดํฐ(FGSM ๊ณต๊ฒฉ): 100๊ฑด
์ฃผ์ ์ฑ๋ฅ ์งํ
| ๋ฉํธ๋ฆญ | ๊ธฐ๋ณธ ๋ฐ์ดํฐ | ์ ๋์ ๋ฐ์ดํฐ | ๋ณํ์จ |
|---|---|---|---|
| Accuracy | 98% | 92% | -6% |
| F1 Score | 0.935 | 0.91 | -2.5% |
| False Positive | 2% | 5% | +3% |
| False Negative | 3% | 7% | +4% |
4. ํฅํ ๊ณํ
๋ค์ํ ๊ณต๊ฒฉ ๊ธฐ๋ฒ ํ ์คํธ:
- PGD, DeepFool ๋ฑ ์๋ก์ด ๊ณต๊ฒฉ ๊ธฐ๋ฒ ์ ์ฉ ๋ฐ ํ๊ฐ
๋ชจ๋ธ ๊ฐ์ :
- Contrastive Learning ๋ฐ ์์๋ธ ํ์ต์ ํตํ ๊ฒฌ๊ณ ์ฑ ๊ฐํ
์ค์๊ฐ ๋ฐฉ์ด ์์คํ ๊ตฌ์ถ:
- ๋ชจ๋ธ์ ์ค์๊ฐ ์์ธก ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ์ฌ ์ ๋์ ์ ๋ ฅ ํ์ง ๋ฐ ์ฐจ๋จ
์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ณด์ยท๋ผ์ด์ ์ค ์ํ ๊ด๋ฆฌ ์ฒด๊ณ
๋ณธ ์น์ ์ AnomalyCLIP/AD-CLIP ๊ธฐ๋ฐ ๋ชจ๋ธ ์นด๋์ ๋ณด์ยท๋ผ์ด์ ์ค ๊ฑฐ๋ฒ๋์ค๋ฅผ ์ ์ํฉ๋๋ค.
๋ชฉ์ : ๊ณต๊ธ๋ง(Software Supply Chain) ๋ฆฌ์คํฌ ์ต์ํ, ๋ผ์ด์ ์ค ์๋ฌด ์ค์, ์ฌ๋ฐฐํฌ/์์ฉํ ์ ํฉ์ฑ ํ๋ณด.
1) ๋ฒ์(Scope) & ์์น
- ๋์: ํ์ต/์ถ๋ก ์ฝ๋, ์คํฌ๋ฆฝํธ, ๋๊ตฌ ์ฒด์ธ, ํ์ ์ฐ์ถ๋ฌผ(๊ฐ์ค์นยท์ฒดํฌํฌ์ธํธยทGUI ์คํํ์ผ), ๋ฐฐํฌ ๋ฒ๋ค(whl/zip/docker)
- ์์น:
- ์ต์๊ถํ(Principle of Least Privilege)
- ์ฌํ๊ฐ๋ฅ ๋น๋(Reproducible Build)
- ํฌ๋ช ์ฑ(๋ช ์์ ๋ผ์ด์ ์ค ๊ณ ์ง)
- ์ ์ํ ์ทจ์ฝ์ ํจ์น
- ์์ฉ ๋ฐฐํฌ ์ ๋ชจ๋ OSS ์๋ฌด(์ ์๊ถ/NOTICE/์์ค ์ ๊ณต ๋ฒ์ ๋ฑ) ์ ์ดํ ํ ๋ฐฐํฌ
2) ๋ผ์ด๋ธ๋ฌ๋ฆฌ & ๋ผ์ด์ ์ค ๋งคํธ๋ฆญ์ค
์ค์ ์ฌ์ฉํ๋ ๋ฒ์ /๋ผ์ด์ ์ค๋
pip-licenses/cyclonedx-py์ฐ์ถ๋ฌผ๋ก ์๋์์ฑํ์ฌ ๋ณธ ํ ์ด๋ธ์ ์ ๊ธฐ ์ ๋ฐ์ดํธํฉ๋๋ค.
| ํจํค์ง | ๋ฒ์ (์) | ๋ผ์ด์ ์ค(์) | ํต์ฌ ์๋ฌด |
|---|---|---|---|
| ftfy | 6.2.0 | MIT | ์ ์๊ถ ๊ณ ์ง ์ ์ง |
| matplotlib | 3.9.0 | PSF/MATPL | ์ ์๊ถ ๊ณ ์ง |
| numpy | 1.24.3 | BSD-3 | ์ ์๊ถ/๋ฉด์ฑ ๊ณ ์ง |
| opencv-python | 4.9.0.80 | Apache-2.0 | NOTICE ํฌํจ ๊ถ์ฅ |
| pandas | 2.2.2 | BSD-3 | ์ ์๊ถ/๋ฉด์ฑ ๊ณ ์ง |
| Pillow | 10.3.0 | HPND-PIL | ์ ์๊ถ ๊ณ ์ง |
| PyQt5 / PyQt5-sip | 5.15.10 / 12.13.0 | GPLv3/์์ฉ๋์ผ | ์์ฉ ๋ฐฐํฌยท์ ์ ๋งํฌ ์ฃผ์ |
| regex | 2024.5.15 | PSF | ์ ์๊ถ ๊ณ ์ง |
| scikit-learn | 1.2.2 | BSD-3 | ์ ์๊ถ ๊ณ ์ง |
| scipy | 1.9.1 | BSD-3 | ์ ์๊ถ ๊ณ ์ง |
| setuptools | 59.5.0 | MIT | ์ ์๊ถ ๊ณ ์ง |
| scikit-image | ์ต์ | BSD-3 | ์ ์๊ถ ๊ณ ์ง |
| tabulate | 0.9.0 | MIT | ์ ์๊ถ ๊ณ ์ง |
| thop | 0.1.1.post... | MIT | ์ ์๊ถ ๊ณ ์ง |
| timm | 0.6.13 | Apache-2.0 | NOTICE ํฌํจ ๊ถ์ฅ |
| torch | 2.0.0 | BSD-3 | ์ ์๊ถ ๊ณ ์ง |
| torchvision | 0.15.1 | BSD-3 | ์ ์๊ถ ๊ณ ์ง |
| tqdm | 4.65.0 | MPL-2.0 | ์์ ๋ฐฐํฌ ์ ์์ค ๊ณต๊ฐ ์๊ฑด ํ์ธ |
| pyautogui | ์ต์ | BSD-3 | ์ ์๊ถ ๊ณ ์ง |
| CLIP ๊ฐ์ค์น(ViT-B/32 ๋ฑ) | ๋งํฌ ์ฐธ์กฐ | OpenAI Terms(๋ชจ๋ธ ๊ฐ์ค์น) | ์์ ์ ์ด์ฉ ๊ฐ๋ฅ ์ฌ๋ถ/์ฌ๋ฐฐํฌ ์ ํ ์ฌํญ์ ๊ฐ๋ณ ์ฝ๊ด์ผ๋ก ์ฌํ์ธ ํ์ |
โ ๏ธ ์ฃผ์: PyQt5๋ GPLv3(๋๋ ์์ฉ ๋ผ์ด์ ์ค)๋ก ๋ฐฐํฌ๋ฉ๋๋ค. ์์ฉ ๋ฐฐํฌ/์ ์ ๋งํฌ ์ ์ฝ๋ ๊ณต๊ฐ ์๋ฌด๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก, ํ์ ์ ์์ฉ ๋ผ์ด์ ์ค ๊ตฌ๋งค ๋๋ Qt์ ๋์ฒด GUI(์: PySide6 LGPL, ์น ํ๋ก ํธ์๋) ๊ฒํ ๊ฐ ํ์ํฉ๋๋ค.
โ ๏ธ OpenAI CLIP ๊ฐ์ค์น๋ OpenAI ์ ๊ณต ์ฝ๊ด์ ๋ฐ๋์ ํ์ธํด ์ฌ๋ฐฐํฌ/์์ ์ ์ฌ์ฉ ๋ฒ์๋ฅผ ๊ฒ์ฆํ์ธ์.
3) ๋ฐฐํฌ ์ ํ์ ๊ณ ์ง(Attribution) & NOTICE
- ์ ์ฅ์ ๋ฃจํธ์
LICENSE,NOTICE,THIRD_PARTY_LICENSES/์ ์ง - ํจํค์ง๋ณ ์ ์๊ถยท๋ฉด์ฑ ๊ณ ์ง ํฌํจ(์๋์์ง ์ฐ์ถ๋ฌผ ๋ณํฉ)
- ๋ชจ๋ธ ๊ฐ์ค์น/๋ฐ์ดํฐ์ ์ ์์ ์์ยท์ฝ๊ด์ README์ ๋ช ์
4) ์ทจ์ฝ์ ๊ด๋ฆฌ ํ๋ก์ธ์ค (CVE/SBOM)
๋๊ตฌ ์ฒด์ธ(๊ถ์ฅ):
- SBOM:
cyclonedx-py/pipdeptreeโbom.json/bom.xml - ๋ผ์ด์ ์ค:
pip-licenses --format=json - ์ทจ์ฝ์ :
pip-audit,safety, (์ปจํ ์ด๋)trivy
์ ์ฑ :
- ์ฃผ๊ธฐ์ ์ค์บ: ๋ฉ์ธ ๋ธ๋์น ์ฃผ 1ํ, ๋ฆด๋ฆฌ์ค ์ง์ 1ํ
- ์๊ณ์น: High/CRITICAL ๋ฐ๊ฒฌ ์ ๋ฆด๋ฆฌ์ค ์ค๋จ, ํจ์น/์ฐํ๋ฒ์ ํ๊ฐ
- ๋ณ๊ฒฝ๊ด๋ฆฌ: ํจ์น ํ ํ๊ท ํ ์คํธ, ์ฑ๋ฅ ์ํฅ ๋ณด๊ณ
- ์ถ์ :
SECURITY.md์ CVE, ์ํฅ๋ฒ์, ๋์์ํ ๊ธฐ๋ก
์์ ์ปค๋งจ๋:
# SBOM
python -m pip install cyclonedx-bom pipdeptree pip-licenses pip-audit safety
cyclonedx-py -o sbom.json
pipdeptree --json-tree > deps.json
pip-licenses --format=json --with-license-file > THIRD_PARTY_LICENSES/licenses.json
# ์ทจ์ฝ์
pip-audit # PyPI ์์ฝ์์คํ
์ทจ์ฝ์ ์ค์บ
safety check # ์์ ์ฑ DB ๊ธฐ๋ฐ ์ค์บ
# ์ปจํ
์ด๋(์์ ๊ฒฝ์ฐ)
trivy fs . # ์์ค/์ข
์์ฑ ์ค์บ
5. ๊ฐ๋ฐยท๋น๋ ๋ณด์ (Development & Build Security)
์์ ํ๊ณ ์ฌํ ๊ฐ๋ฅํ ๋น๋ ํ์ดํ๋ผ์ธ์ ์ ์งํ์ฌ ๊ณต๊ธ๋ง ๋ฆฌ์คํฌ๋ฅผ ์ต์ํํฉ๋๋ค.
๊ถ์ฅ ์ค์ :
- ์ ๊ธํ์ผ(
requirements.txt/constraints.txt)์ ์ ํํ ๋ฒ์ (pin) ๋ช ์ pip-tools๋ฅผ ์ฌ์ฉํด ์์กด์ฑ ๋๊ฒฐ (pip-compile)- CI/CD์์
--require-hashes์ต์ ์ผ๋ก ํด์ ๊ฒ์ฆ - ๋ฐฐํฌ ์ํฐํฉํธ์ SHA256 ํด์ ๋ฐ SBOM ํฌํจ
- API Key / Token์ ์ฝ๋์ ์ ๋ ํฌํจ ๊ธ์ง (ํ๊ฒฝ๋ณ์ ๋๋ Secret Manager ์ฌ์ฉ)
- ์๋ช /๋ฌด๊ฒฐ์ฑ ๊ด๋ฆฌ: ํด์ ๊ฒ์ฆ ๋ฐ SBOM ๋์ ๋ฐฐํฌ
- ๊ถํ ๋ถ๋ฆฌ: ํ์ต/์ถ๋ก ์๋ฒ๋ ์ต์ ๊ถํ์ผ๋ก ์คํ
์ค์น ์์:
pip install pip-tools
pip install cyclonedx-bom pipdeptree pip-licenses pip-audit safety
๋น๋/๊ฒ์ฆ ๋ช ๋ น์ด:
# ์์กด์ฑ ๋๊ฒฐ
pip-compile requirements.in --output-file requirements.txt
# SBOM ์์ฑ
cyclonedx-py -o sbom.json
# ๋ผ์ด์ ์ค ๋ฐ ์์กด์ฑ ๋ฆฌ์คํธ
pip-licenses --format=json --with-license-file > THIRD_PARTY_LICENSES/licenses.json
# ์ทจ์ฝ์ ์ ๊ฒ
pip-audit
safety check
6. ๋ฐ์ดํฐยท๋ชจ๋ธ ์ํฐํฉํธ ๋ณด์ (Data & Model Artifact Security)
๋ชจ๋ธ๊ณผ ๋ฐ์ดํฐ๋ AI ๊ณต๊ธ๋ง์ ํต์ฌ ์์ฐ์ ๋๋ค.
์๋ ์ง์นจ์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ๋ชจ๋ธ์ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ์ต์ ๋ณด์ ๊ธฐ์ค์ ์ ์ํฉ๋๋ค.
ํต์ฌ ๋ชฉํ:
- ํ์ต ๋ฐ ํ๊ฐ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ(Integrity) ๋ณด์ฅ
- ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ(.pth ๋ฑ)์ ์๋ณ์กฐ ๋ฐฉ์ง ๋ฐ ์ถ์ ์ฑ ํ๋ณด
- ์ ๋์ ๊ณต๊ฒฉ(Adversarial Attack) ๋ฐ ๋ฐ์ดํฐ ์ค์ผ(Data Poisoning) ๋์
- ํ์ต ์ฌํ์ฑ(Reproducibility) ๋ณด์ฅ
๋ฐ์ดํฐ ๋ณด์ ๊ด๋ฆฌ ์ ์ฐจ:
| ๋จ๊ณ | ์ค๋ช | ๋๊ตฌ / ์คํ ์์ |
|---|---|---|
| โ ์์ง | ์๋ณธ ๋ฐ์ดํฐ ์์ง ํ MD5/SHA256 ํด์ ๊ธฐ๋ก | sha256sum dataset.zip > dataset.sha256 |
| โก ๊ฒ์ฆ | ๋ฐ์ดํฐ ๋ก๋ฉ ์ ํด์ ์ผ์น ์ฌ๋ถ ํ์ธ | sha256sum -c dataset.sha256 |
| โข ๋ผ๋ฒจ ๊ด๋ฆฌ | ๋ผ๋ฒจ๋ง ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ณ๋ JSON/CSV๋ก ๋ถ๋ฆฌ ๊ด๋ฆฌ | meta_train.json, meta_test.json |
| โฃ ์ ๊ทผ ์ ์ด | ๋ฐ์ดํฐ ํด๋ ๊ถํ ์ต์ํ (r-- ๊ถํ์ผ๋ก ๊ณต์ ) | chmod 440 data/* |
| โค ๋ฒ์ ๊ด๋ฆฌ | ๋ณ๊ฒฝ ์์ ๋ง๋ค ๋ฒ์ ๋ช
๊ธฐ๋ก (์: 20241002_V2) |
Git tag ๋๋ DVC ์ฌ์ฉ |
๋ชจ๋ธ ์ํฐํฉํธ ๊ด๋ฆฌ:
| ํญ๋ชฉ | ๊ด๋ฆฌ ๋ฐฉ๋ฒ | ์ฃผ์์ฌํญ |
|---|---|---|
| ๋ชจ๋ธ ๊ฐ์ค์น (.pth) | ์ฒดํฌํฌ์ธํธ ํ์ผ๋ง๋ค SHA256 ์์ฑ ๋ฐ ๋ณด๊ด | ํ์ผ๋ช
์ Epoch, ๋ฒ์ , ๋ ์ง ํฌํจ (adclip_e120_v2.pth) |
| ํ์ต ๋ก๊ทธ | TensorBoard ๋๋ CSV ํฌ๋งท์ผ๋ก ๊ธฐ๋ก | ์์ค ๊ณก์ ๋ฐ ์ฑ๋ฅ ์งํ ํฌํจ |
| ๋ชจ๋ธ ์ค์ ๊ฐ (Config) | config.yaml ํ์ผ๊ณผ ํจ๊ป ์ ์ฅ |
ํ์ดํผํ๋ผ๋ฏธํฐ ๋ณ๊ฒฝ ์ ๋ฒ์ ๋ณ๊ฒฝ ํ์ |
| ์ถ์ ์ฑ ํ๋ณด | MLflow / W&B ๋๋ ๋ก์ปฌ DB ์ฌ์ฉ | run_id, commit_id, data_version ์ฐ๋ |
| ๋น๊ณต๊ฐ ์ ์ฅ์ ๊ด๋ฆฌ | ๋ด๋ถ NAS ๋๋ S3 Private Bucket ํ์ฉ | ๊ณต๊ฐ ์ ์ฅ์ ์ ๋ก๋ ๊ธ์ง (ํนํ ๊ณ ๊ฐ ์ด๋ฏธ์ง ํฌํจ ์) |
์ฒดํฌํฌ์ธํธ ๋ฉํ๋ฐ์ดํฐ ๊ตฌ์กฐ (์์):
{
"model_name": "ad_clip_epoch_120.pth",
"sha256": "3f83c2a0aef2d7d9c2225b18d9ea435d...",
"data_version": "20241002_V2",
"created_at": "2024-10-12T09:30:00Z",
"train_command": "python train.py --config config.yaml --epochs 200",
"framework": "PyTorch 2.0.0",
"base_model": "openai/clip-vit-base-patch32",
"f1_score": 0.91,
"author": "์ค์๋ฏผ",
"organization": "SOLUWINS Co., Ltd."
}
์ ๋์ ๊ณต๊ฒฉ(Adversarial Attack) ๋ฐฉ์ด ๊ฐํ:
| ๊ณต๊ฒฉ ์ ํ | ์ค๋ช | ๋์ ๋ฐฉ์ |
|---|---|---|
| FGSM (Fast Gradient Sign Method) | ์ ๋ ฅ ์ด๋ฏธ์ง์ ์์ ๋ ธ์ด์ฆ ์ถ๊ฐ | ํ์ต ์ FGSM ์ํ ํฌํจ (Adversarial Training) |
| PGD (Projected Gradient Descent) | ๋ฐ๋ณต์ ์ผ๋ก ๋ ธ์ด์ฆ ์ต์ ํ | torchattacks ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฐ ๋ฐฉ์ด ํ
์คํธ |
| Data Poisoning | ํ์ต ๋ฐ์ดํฐ์ ์ ์ฑ ๋ฐ์ดํฐ ์ฝ์ | ๋ฐ์ดํฐ ์ ์ ๋ฐ ํด์ ๊ธฐ๋ฐ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ |
| Evasion Attack | ์ถ๋ก ์ ์ ๋ ฅ ์กฐ์ | ํ๋ฅ ์๊ณ๊ฐ ์กฐ์ + Gradient Masking |
๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ ์๋ํ ์คํฌ๋ฆฝํธ (์์):
#!/bin/bash
echo "[INFO] Starting dataset integrity check..."
for file in $(cat dataset.sha256 | awk '{print $2}'); do
sha256sum -c dataset.sha256 --status $file
if [ $? -eq 0 ]; then
echo "[OK] $file integrity verified."
else
echo "[ERROR] $file integrity mismatch!"
exit 1
fi
done
echo "[INFO] Dataset integrity check completed successfully."
๊ถ์ฅ ๋๊ตฌ:
| ๋ชฉ์ | ๋๊ตฌ | ๋น๊ณ |
|---|---|---|
| ๋ฐ์ดํฐ ๋ฒ์ ๊ด๋ฆฌ | DVC (Data Version Control) | Git ์ฐ๋ ๊ฐ๋ฅ |
| ๋ชจ๋ธ ์คํ ์ถ์ | MLflow / W&B | ํ์ดํผํ๋ผ๋ฏธํฐ ๋ฐ ๊ฒฐ๊ณผ ์ถ์ |
| ๋ณด์ ์ค์บ | trivy, safety, pip-audit | ์์กด์ฑ ์ทจ์ฝ์ ์ ๊ฒ |
| ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ | sha256sum / openssl dgst | ํด์ ๊ธฐ๋ฐ ๊ฒ์ฆ |
์์ ์ํฌํ๋ก์ฐ (๋ชจ๋ธ ์์นด์ด๋ธ ์์ฑ):
# 1. ํด์ ์์ฑ
sha256sum ad_clip_epoch_120.pth > ad_clip_epoch_120.pth.sha256
# 2. ๋ฉํ๋ฐ์ดํฐ ์์ฑ
python gen_metadata.py --model ad_clip_epoch_120.pth --out model_info.json
# 3. ์์นด์ด๋ธ ํจํค์ง
tar -czvf adclip_model_v2.tar.gz ad_clip_epoch_120.pth model_info.json
# 4. ์
๋ก๋ ์ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ
sha256sum -c ad_clip_epoch_120.pth.sha256
๋ฌธ์ํ ์์:
/security/model_security/README.mdํ์ผ ๋ด ํฌํจ ๊ถ์ฅ
# Model Artifact Security Policy
- ๋ชจ๋ ๋ชจ๋ธ ๊ฐ์ค์น๋ SHA256 ๊ธฐ๋ฐ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ ํ ์
๋ก๋๋ฉ๋๋ค.
- ๊ฐ ๋ชจ๋ธ์๋ ํ์ต ํ๊ฒฝ, ๋ฐ์ดํฐ ๋ฒ์ , ํ์ดํผํ๋ผ๋ฏธํฐ๊ฐ ๋ช
์๋ `model_info.json`์ด ํฌํจ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ์
๋ฐ ๋ชจ๋ธ ๋ณ๊ฒฝ ์, ์๋ก์ด ๋ฒ์ ํ๊ทธ(`_Vx.x`)๋ฅผ ๋ถ์ฌํ๊ณ SBOM์ ์ฌ์์ฑํฉ๋๋ค.
7. ์ฌ๋ฐฐํฌยท์์ ํ ๊ฐ์ด๋ (Redistribution & Commercialization)
์คํ์์ค ๋ผ์ด์ ์ค ๋ฐ ๋ฐ์ดํฐ์ ยท๋ชจ๋ธ ์ฝ๊ด์ ์ค์ํ์ฌ ๋ฒ์ ๋ฆฌ์คํฌ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
์์น:
| ๋ผ์ด์ ์ค | ์ฌ์ฉ ๊ฐ๋ฅ์ฑ | ์ฃผ์์ฌํญ |
|---|---|---|
| MIT / BSD / Apache-2.0 | ์์ ๋ก์ด ์์ ์ ์ฌ์ฉ ๊ฐ๋ฅ | ์ ์๊ถ, NOTICE ํ์ผ ์ ์ง |
| GPL / MPL ๋ฑ ์นดํผ๋ ํํธ | ์กฐ๊ฑด๋ถ ํ์ฉ | ๋งํฌ ๋ฐฉ์์ ๋ฐ๋ผ ์์ค ๊ณต๊ฐ ์๋ฌด ๋ฐ์ |
| OpenAI CLIP ๊ฐ์ค์น | ์ ํ์ | ์์ ์ ์ด์ฉ ์ฝ๊ด ๋ณ๋ ํ์ธ ํ์ |
| HuggingFace Dataset | ์ถ์ฒ๋ณ ํ์ธ | ๋ฐ์ดํฐ ์ ๊ณต์ ์ฝ๊ด ์ค์ ํ์ |
์ฒดํฌ๋ฆฌ์คํธ:
-
THIRD_PARTY_LICENSES/์ต์ ํ - PyQt5 ๋ฑ GPL ๊ณ์ด ์์กด์ฑ ๊ฒํ
- CLIP ๊ฐ์ค์น ์ฝ๊ด ๋ฌธ์ ์ฒจ๋ถ
- SBOM + ํด์ ํฌํจํ์ฌ ๋ฐฐํฌ
8. ๋ด๋ถ ์น์ธยทRACI (Internal Approval & RACI)
ํ๋ก์ธ์ค ์ ์ฑ ์๊ณผ ๊ถํ์ ๋ช ํํ ์ ์ํฉ๋๋ค.
| ํ๋ | Responsible | Consulted | Accountable |
|---|---|---|---|
| ์ ๊ท OSS ๋์ ๊ฒํ | ๊ฐ๋ฐํ | ๋ณด์ํ, ๋ฒ๋ฌด | ๋ณด์ํ์ฅ |
| SBOM/๋ผ์ด์ ์ค ์ค์บ | ๊ฐ๋ฐํ | ๋ณด์ํ | ๋ณด์ํ์ฅ |
| ์ทจ์ฝ์ ํจ์น ์ ์ฉ | ๊ฐ๋ฐํ | ๋ณด์ํ | ๊ฐ๋ฐํ์ฅ |
| ๋ฆด๋ฆฌ์ค ์น์ธ | ๊ฐ๋ฐํ | ๋ณด์ยท๋ฒ๋ฌด | ์ ํ ์ฑ ์์(PO) |
9. PR ์ฒดํฌ๋ฆฌ์คํธ (Pull Request Checklist)
๋ฆด๋ฆฌ์ค/๋ณํฉ ์ ๋ณด์ยท๋ฒ์ ์ค์๋ฅผ ์ํ ์ ๊ฒ ํญ๋ชฉ์ ๋๋ค.
- [ ] requirements.txt ๋ฒ์ ํ ๋ฐ ํด์ ํฌํจ
- [ ] pip-audit / safety: HighยทCritical ์ทจ์ฝ์ ์์
- [ ] SBOM(cyclonedx-py) ์์ฑ ๋ฐ ์ปค๋ฐ
- [ ] THIRD_PARTY_LICENSES/ ๊ฐฑ์ ์๋ฃ
- [ ] NOTICE ๋ฐ LICENSE ์ต์ ํ
- [ ] ๋ชจ๋ธ ๊ฐ์ค์นยท๋ฐ์ดํฐ์
์ฝ๊ด ๊ฒ์ฆ ๋ฌธ์ ์ฒจ๋ถ
- [ ] GUI ํ๋ ์์ํฌ(PyQt5 ๋ฑ) ์์ฉ์ฑ ๊ฒํ ๊ฒฐ๊ณผ ์ฒจ๋ถ
- [ ] CI ๋น๋ยทํ
์คํธ ํต๊ณผ
References
- AnomalyCLIP: Object-agnostic Prompt Learning for Zero-shot Anomaly Detection [github]
Model tree for quandao92/clip-based-anomaly-detection
Base model
openai/clip-vit-base-patch32