File size: 4,409 Bytes
06a7680 1563787 06a7680 1563787 06a7680 1563787 06a7680 1563787 06a7680 1563787 06a7680 1563787 06a7680 1563787 06a7680 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | ---
tags:
- robotics
- image-classification
- openarm-sciedu
---
# leaf_kind_dinov2_logreg
OpenArm SciEdu ๋๋ญ์ ๋ถ๋ฅ ์คํ์์, ์ค ์์ ์ ์ ์นด๋๊ฐ ๋ณต์ฝ(compound)์ธ์ง ๋จ์ฝ(simple)์ธ์ง ํ์ ํ๋ค. ์นด๋๊ฐ ์๊ฑฐ๋ ๊ฐ๋ ค์ก์ผ๋ฉด none์ด๋ค(2026-10-04 ๋์งธ ํ, ์
์งธ ๋ถ๋ฅ ์ถ๊ฐ).
๋ก๋ด PC ๋ํ์ธต์ ํ์ ๊ธฐ ์๋ฆฌ์ ์ด๋ค. ํ์ ๊ฒฐ๊ณผ์ ๊ท์น์ ์ ์ฉํด ์ผ์ชฝ/์ค๋ฅธ์ชฝ์ ์ ํ๊ณ , ๊ทธ ์ชฝ ๋ฌธ์ฅ์ pi0.5(`leapshared/SciEdu_pauses_3exp_210epi_leafdir_pi05`)์ ๋ณด๋ธ๋ค.
## ๊ตฌ์ฑ
- **ํน์ง:** `facebook/dinov2-base`์ `pooler_output`(์ต์ข
layernorm ๋ค CLS ํ ํฐ, 768)
- **๋ถ๋ฅ๊ธฐ:** ํ์คํ(mean, std) ๋ค 3๋ถ๋ฅ ์ํํธ๋งฅ์ค ํ๊ท(W 3ร768, b 3). ๋ถ๋ฅ๋ `classes` = [compound, simple, none]์ด๋ค. `classifier.json`์ ์ซ์ 3,843๊ฐ๊ฐ ์๋ค.
- **์ ์ฒ๋ฆฌ:** `AutoImageProcessor(facebook/dinov2-base)`. ์งง์ ๋ณ 256์ผ๋ก bicubic ์ค์ด๊ธฐ, ๊ฐ์ด๋ฐ 224 ์๋ฅด๊ธฐ, /255, ImageNet mean/std, RGB
- **์
๋ ฅ:** `follower_d455f` 640ร480 RGB ํ๋ ์์์ ์์ (x0, y0, x1, y1) = (150, 100, 490, 440)์ ์๋ฅธ๋ค.
- **์ฐ๋ ๋:** ์นด๋๊ฐ ์ค ์์ ํผ์ ์ ์๊ณ ๋ ํ์ด ์ฌ๊ณ ์์ ๋. ํ์ต ์ฌ์ง์ ์นด๋๋ฅผ ์ฎ๊ธด ํ์ด ์ถ๋ฐํ๊ธฐ 5ํ๋ ์ ์ ์ด๋ค.
## ์ฐ๋ ๋ฒ
```python
from leaf_kind import LeafKind
clf = LeafKind() # CPU. classifier.json๊ณผ dinov2-base๋ฅผ ๋ฐ๋๋ค
r = clf.judge([f1, f2, f3]) # ๊ฐ์ ๋ ์ฐ์ ํ๋ ์ ๋ช ์ฅ (H x W x 3 RGB uint8)
# r["kind"]: "compound" | "simple" โ ์ฎ๊ธด๋ค
# "none" โ ์นด๋๊ฐ ์๊ฑฐ๋ ๊ฐ๋ ค์ก๋ค(ํ ํ๋ ์์ด๋ผ๋ none์ด๋ฉด). ํ์ ํ์ง ์๊ณ 1์ด ๋ค ๋ค์ ๋ณธ๋ค
# None โ ์นด๋๋ ์๋๋ฐ ํ๋ ์ ๋ต์ด ๊ฐ๋ ธ๊ฑฐ๋ ํ๊ท ํ์ ์ด 0.9๋ณด๋ค ๋ฎ๋ค. ์ ์๋์๊ฒ ๋ฌป๋๋ค
# r["probs"]: ํ๋ ์ ํ๊ท {compound, simple, none}, r["votes"]: ํ๋ ์๋ณ ํ์
```
## ๊ฒ์ฆ (2026-10-04, H200)
- ์นด๋ ์ฌ์ง: `Leaf_rules_60epi_labeled` 0~59๋ฒ(ํฉ๋ณธ ๋๋ญ์ 0~59๋ฒ)
- ๋ก๋ด PC probe 142์ฅ + H200์ด ๊ทธ๋ฆฌํผ๋ก ์ฐพ์ 314์ฅ
- H200 ๊ฒ์ถ์์ ์นด๋๊ฐ ๊ฐ๋ ค์ก๊ฑฐ๋ ๋์ด๊ธฐ ์ ์ธ 20์ฅ(๋์ผ๋ก ํ์ธ)์ ๋บ๋ค.
- ์ ๋ต์ ์ํผ์๋ ๊ท์น(๋ณต์ฝ ์ผ์ชฝ / ๋ณต์ฝ ์ค๋ฅธ์ชฝ) ร ์นด๋๋ฅผ ์ฎ๊ธด ํ์ด๋ค.
- none ์ฌ์ง 795์ฅ
- A ์ํผ์๋ ๋ ๋น ์ค 120
- B ๊ทธ๋ฆฌํผ๊ฐ ์นด๋๋ฅผ ์ฅ ์งํ(๊ฐ๋ฆผ) 338
- C ์ฅ ๋ค 1.5์ด(์นด๋๋ฅผ ์ฎ๊ธฐ๋ ์ค์ด๊ฑฐ๋ ๋น ์ค) 337. ์ฌ๋ ์์ด ์นด๋๋ฅผ ๋๋ 1์ฅ์ ๋บ๋ค.
- ํ์ต์ ๋ถ๋ฅ ๊ท ํ ๊ฐ์ค์น๋ก ํ๋ค.
๊ฒ์ฆ ์ํผ์๋ 6ยท7ยท46ยท47์ ๋นผ๊ณ ํ์ตํด ๊ทธ ์ํผ์๋๋ก ์ฐ ๊ฒฐ๊ณผ(ํ: ์ ๋ต, ์ด: ํ์ ):
| ์ ๋ต \ ํ์ | compound | simple | none |
|---|---|---|---|
| compound | 21 | 0 | 0 |
| simple | 0 | 22 | 0 |
| none | 0 | 0 | 52 |
์ํผ์๋ ๋จ์ 10๊ฒน(1,251์ฅ):
| ์ ๋ต \ ํ์ | compound | simple | none |
|---|---|---|---|
| compound | 238 | 0 | 1 |
| simple | 0 | 216 | 1 |
| none | 0 | 0 | 795 |
- none์ ์นด๋๋ก ๋ณธ ๊ฒ(์๋ ์นด๋๋ฅผ ์ง์ผ๋ฌ ๊ฐ๋ ์ค์)์ 0์ด๋ค.
- ์นด๋๋ฅผ none์ผ๋ก ๋ณธ 2์ฅ์ 1์ด ๋ค ๋ค์ ๋ณด๋ ์ชฝ ์คํจ๋ค.
- ์ฒ์ ๋ณด๋ ์นด๋ ๋์์ธ์์์ ๋ณต์ฝ/๋จ์ฝ ์ ํ๋๋ ์ฒซ ํ(2๋ถ๋ฅ)์ผ๋ก ์ฐ ๋๋ต๊ฐ์ด 92~94%๋ค.
- ํ์ต ์ฌ์ง์ AV1๋ก ๋
นํํ ์์์ ํ์ด ์ด ๊ฒ์ด๋ค. ์ค๊ธฐ ์นด๋ฉ๋ผ ํ๋ ์์์๋ ๋ช ์ฅ์ผ๋ก ํ์ธํ๊ธฐ๋ฅผ ๊ถํ๋ค.
## ํ๊ณ
- none์ ๋
นํ์ ์๋ ์ฅ๋ฉด(๋น ์ค, ๊ทธ๋ฆฌํผ ๊ฐ๋ฆผ, ์นด๋๋ฅผ ์ฎ๊ธฐ๋ ์ค)์ผ๋ก๋ง ๋ฐฐ์ ๋ค. ์ฌ๋ ์์ด ์นด๋๋ฅผ ๋๋ ์ค์ธ ์ฌ์ง์ ๋ฐ๋ก ๋ฐฐ์ฐ์ง ์์๋ค.
- ๊ฐ์ ๋ ์ฐ์ ํ๋ ์ ์ค ํ๋๋ผ๋ none์ด๋ฉด none์ ๋ธ๋ค. ์๋ ์นด๋๋ฅผ ์ง์ผ๋ฌ ๊ฐ์ง ์๋ ์ชฝ์ผ๋ก ์ ํ๋ค.
- ์ผ์ชฝ/์ค๋ฅธ์ชฝ์ ์ด ํ์ ๊ธฐ๊ฐ ์๋๋ผ ๋ํ์ธต์ด ํ์ ๊ท์น์ผ๋ก ์ ํ๋ค.
## CPU ์๋ (H200 ์๋ฒ CPU, x86_64 24์ฝ์ด. ๋ก๋ด PC์์๋ ๋ค๋ฅผ ์ ์๋ค)
| ์ค๋ ๋ | 1์ฅ | 3์ฅ ํ ๋ฒ์ |
|---|---|---|
| 1 | 339 ms | 967 ms |
| 4 | 97 ms | 285 ms |
| 8 | 58 ms | 152 ms |
๋์งธ ํ `judge` 3์ฅ์ CPU 8์ค๋ ๋๋ก 181 ms์๋ค(์ํํธ๋งฅ์ค๋ ๋ฌด์ํ ๋งํผ ๊ฐ๋ณ๋ค).
## ํ์ผ
- `classifier.json`: ์ซ์(mean, std, W, b), ๋ถ๋ฅ, ์๋ฅด๊ธฐ ์์, ์ ์ฒ๋ฆฌ ์ค๋ช
, ๊ฒ์ฆ ๊ฒฐ๊ณผ(ํผ๋ ํ๋ ฌ)
- `leaf_kind.py`: ํ์ ๊ธฐ(`LeafKind`)
- ํ์ตยทํ๊ฐ ์ฝ๋์ ๊ฒฐ๊ณผ(H200): `scripts/leaf_kind/`, `logs/leaf_kind_local/`
|