Conversation
`용어` + `: 설명` 은 mkdocs 확장이라 GitHub 이 못 읽는다. 콜론이 글자로 보이고, 4칸 들여쓴 본문은 **코드 블록**으로 그려진다. 두 문서의 표·목록이 통째로 회색 상자였다. `**용어**` + 빈 줄 + **2칸** 들여쓴 본문으로 바꿨다. CommonMark 는 3칸까지 들여쓰기를 무시하므로 GitHub 에서는 평범한 문단이고, g2c 쪽 렌더러는 그 2칸으로 정의 본문의 경계를 안다. 4칸으로 두면 다시 코드 블록이 된다. 내용은 한 글자도 안 바꿨다 — 문법만 옮겼다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F51AjmrpMdboKF4BPPRdy9
정제 루프가 `st + 1 < NS` 라 마지막 단계를 건너뛴다. 캐스케이드는 그 단계의 delta 를 `detect_roi` 가 디코드하므로 맞는데, SparseR-CNN·QueryInst 는 NMS 경로를 안 타서 **아무도 디코드하지 않았다.** 증상이 고약하다 — 점수는 마지막 단계 cls 라 **정확하고**(0.0009) 라벨·개수도 맞는데 박스만 한 단계 뒤처진다. 크래시도 경고도 없다. C++ 박스가 마지막 단계 **입력** 박스와 `0.000px` 로 같은 것을 확인해 확정했다(mmdet 최종과는 4.023px). top-k 앞에서 마지막 단계 delta 를 같은 식으로 디코드한다(단계별 stds·means, dw/dh ±|log(16/1000)| 클램프, clip_border=False 존중). class_agnostic 이 아니면 건너뛰고 그 사실을 stderr 에 찍는다 — 조용히 넘어가지 않는다. 실측 (fp16, 800px, 학습 체크포인트, cat-and-hat.jpg): sparse_rcnn 4.41px → **0.45px** PASS (4/4건, 점수 0.0009) queryinst 3.39px → **0.07px** PASS (5/5건, 점수 0.0014) 회귀: faster_rcnn 0.10 · cascade_rcnn 0.09 · mask_rcnn 0.06 · htc 0.12px 모두 PASS. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F51AjmrpMdboKF4BPPRdy9
이름 블록리스트(`GeneralizedAttention` 전체)는 실제 한계보다 넓었다 —
`empirical_attention` 이 같은 op 을 `attention_type='0010'` 로 써서 진작 통과하고 있었고,
막힌 것은 `[1]/[3]`(기하 갈래)뿐이다.
착수해 보니 벽이 하나가 아니라 셋이었다. 둘은 g2c 쪽에서 고쳤고(5D repeat 접기 ·
`aten::div_` 등록) 그 결과 생성물의 `unhandled op` 이 0 이 됐다. 남은 둘을 사유로 적는다:
① 비균일 상수가 GGUF 에 안 실린다 — `render_const` 는 균일 스칼라만 채우고 나머지는
`ggml_new_tensor`(no_alloc → 미초기화). groie 의 `dim_mat`(64원소)이 그 자리다
② `div` 가 양방향 broadcast 를 못 한다 — `(1,7,4,1) / (64,1,1)` 은 좌변을 넓혀야 하는데
ggml 은 우변만 반복한다 → `GGML_ASSERT(ggml_can_repeat)` 로 러너가 죽는다
①이 ②보다 위험하다 — 크래시 없이 값만 틀린다. ②를 먼저 고치면 ①이 숨은 채 돈다.
⚠️ 거절을 지운 채로 두면 **이유 있는 실패가 코어 덤프로 나빠진다.** 둘 다 고쳐지면 지운다.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F51AjmrpMdboKF4BPPRdy9
비균일 상수·div 양방향 broadcast·>4D fill 은 g2c 에서 해결했다. 남은 것은 energy(6D)와 위치항(5D)이 서로 다른 개수의 축을 접어 broadcast 가 안 맞는 것 — 이 op 전용 로우어링이 필요하다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F51AjmrpMdboKF4BPPRdy9
op 이름 블록리스트를 지운다. 5D 접기·`div_`·비균일 상수·div broadcast·>4D fill· 출력 기준 접기까지 g2c 에서 해결됐고, 남은 것은 `linspace` 인자(=`h-1`, 상수 subgraph) 하나다. 그건 이름이 아니라 **생성물의 `unhandled op` 표시**가 말한다 — 컴파일이 거기서 멈추므로 러너 크래시로 흘러가지 않는다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F51AjmrpMdboKF4BPPRdy9
`verify_postproc_roi.py` 가 `paste_mask` 전 로짓을 mmdet 과 rel L1 로 대조한다. 판정(`MASK_GATE`)은 `groie` 만 걸고 나머지 계열은 **수치만** 찍는다 — 마스크는 더 재는 축이지 문턱이 아니다. 이진 IoU 는 적되 판정에 쓰지 않는다(0.5 이진화는 절벽이라 fp16 타이 플립이 그대로 점수에 실린다).⚠️ **못 잰 것을 실패로 적지 않는다.** 로짓이 없거나 기준값이 안 나오면 「못 잼」이라 쓰고 통과로 둔다. 게이트는 수치가 나왔는데 넘었을 때만 걸린다. SubC 컴파일 실패도 박스 판정을 바꾸지 않는다(Mask Scoring R-CNN 은 예외 — 점수를 마스크가 다시 매긴다). `frcnn_wrap`: `mask_head_single`(ModuleList 인 HTC·SCNet 은 SubC 를 못 굽는다) · `mask_groie_levels`(마스크 추출기가 `GenericRoIExtractor` 면 레벨을 안 고른다) 를 싣고, `MaskRCNN_SubC` 에 generic 추출기(pre→레벨합산→post)를 통째로 태운다. `run_frcnn.cpp`: `ARCH_C` 를 `ARCH_D` 와 분리해 SubD 없이도 마스크 head 를 돌린다. groie 면 레벨 L 개에 각각 RoIAlign 을 걸어 **배치로 쌓아** SubC 에 넣는다 — 레벨 하나만 넣으면 크래시 없이 로짓 크기가 통째로 작아진다(실측 |x| 0.45 vs 2.00). 실측(`groie`, 800px, 학습 체크포인트, fp16): 마스크 rel L1 1.56e-02 · IoU 0.989 · 17건. `mask_rcnn` 은 같은 코드로 5.25e-04 · IoU 1.000 · 20건(수치만). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019wYbQfnwZnZXWYFC14sWQH
`verify_postproc.py` 를 계열별로 부르는 얇은 드라이버다. 판정 규약도 짝 결정도 새로 만들지 않는다 — 전부 하네스 것을 그대로 쓴다. 왜 지금 만드나. **같은 이름의 스크립트가 2026-08-25 에 44계열을 돌렸는데 `/tmp` 에만 있었고 같이 사라졌다.** 산출물(`<계열>/out/run_mmdet`)은 멀쩡히 남아 있었는데도 부를 방법이 없어 one-stage 전수를 **한 번도 재현 못 했다.** 파일에 안 적힌 것은 다음 세션에 존재하지 않는다 — 그래서 `/tmp` 가 아니라 여기에 둔다.⚠️ **짝은 `used.json` 에서 받는다.** 래퍼 계열(KD·트래커)은 언랩한 config 를 `cfg.py` 로 덤프해 굽기 때문에, mmdet 원본 config 를 주면 「짝이 다르다」 경고가 **항상** 뜨고 기준값도 다른 모델에서 나온다. `ld`·`strongsort` 가 그래서 「값 못 냄」으로 잘못 적혔다 — 이 드라이버로 재니 **둘 다 통과**다(0.30px · 0.25px, 경고도 안 뜬다).⚠️ **빌드는 안 한다.** `run_mmdet` 이 없으면 `BUILD_NONE` 으로 적고 넘어간다. 굽는 것은 `verify_heads.py` 몫이다 — 두 도구가 각자 구우면 어느 산출물을 쟀는지 알 수 없게 된다.⚠️ **못 잰 것과 실패한 것을 한 칸에 세지 않는다.** `PASS n/잰 것` 을 내고 `BUILD_NONE`· `PAIR_NONE`·`EMPTY` 는 따로 적는다. 박스가 수백 개인 계열은 **분포를 같이 싣는다** — `rpn` 은 최대 133px 이지만 중앙값 0.09px · 182/185건이 1px 이내다. 검증(기존 산출물 4계열): `ld` 0.30px PASS · `strongsort` 0.25px PASS · `rpn` 133.23px/중앙값 0.09px FAIL · `yolact` 0.74px·개수차 1 FAIL — 위키에 기록된 수치를 전부 재현한다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019wYbQfnwZnZXWYFC14sWQH
외부 proposal 경로는 이미 다 갖춰져 있었다(`external_proposals` · 고정 격자 생성 · 러너의 `FRCNN_PROPOSALS` 읽기). 그런데 `frcnn_cfg()` 의 `num_proposals` 한 줄만 `det.rpn_head` 를 **직접** 읽어서, 그 앞에서 `AttributeError: 'FastRCNN' object has no attribute 'rpn_head'` 로 죽었다. 같은 함수가 위에서 이미 `rh = getattr(det, "rpn_head", None)` 로 안전하게 받아 뒀는데 여기만 빠져 있었다. `rh` 를 쓴다. **fast_rcnn PASS — 박스 0.01px · 점수 0.0000 · 라벨 0 · 개수차 0 · 1/1건.**⚠️ 「미지원」으로 적혀 있던 계열이 실은 **한 줄 때문에 안 돈 것**이었다. 계획서는 이걸 0.5일짜리 하네스 신설로 잡고 있었다 — 실제로는 이미 있는 경로가 한 줄에 막혀 있었다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019wYbQfnwZnZXWYFC14sWQH
g2c 의 `generate_gguf` 는 `GTX_GGUF_F32=1` 이면 fp32 로 굽는데, 나중에 head 가중치를 덧붙이는 이 스크립트만 **fp16 을 하드코딩**하고 있었다. 한 gguf 안에 두 정밀도가 섞이면 러너가 진입 직후 **SIGSEGV** 로 죽는다(실측: fp32 로 구운 yolact·rpn). 그래서 「정밀도냐 버그냐」를 가르는 fp32 대조가 **one-stage 계열에서 통째로 막혀 있었다.** two-stage 는 head 를 덧붙이지 않아 안 걸렸고(`double_heads` 는 fp32 로 잘 돌았다), 그래서 아무도 못 봤다. 고친 뒤 fp32 텐서 축: `rpn` L1 2.32e-06 · `yolact` L1 1.67e-06 (fp16 에선 1e-3 대).⚠️ fp16 경로는 **한 바이트도 안 바뀐다** — 환경변수가 있을 때만 갈린다. 이 수정으로 갈린 것: - `rpn` 개수차 1 → **0** (fp16 이었다). 남은 박스 차이는 NMS 순서 — 514/527 이 IoU>0.99 로 짝지어지고 그 안에서 박스차 최대 0.60px 다. 겹친 proposal 무리에서 생존자가 갈린다 - `yolact` 개수차 1 → **1 그대로**. 같은 검출이 mmdet 0.301262 vs C++ 0.295416(차 0.0058)로 fp16 때(0.0062)와 **거의 같다** — 가중치 정밀도가 아니라 커널 산술 차이다 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019wYbQfnwZnZXWYFC14sWQH
one-stage 하네스가 jpg 경로를 러너와 기준값에 각각 넘겼다. 기준값은 PIL
`BILINEAR`(축소 때 안티에일리어싱이 들어간다)로 줄이고, 러너는 자기 리사이즈를 쓴다.
**같은 사진인데 픽셀이 다르다** — 그러면 백엔드가 아니라 리사이즈 구현을 재게 된다.
이 파일의 docstring 이 이미 그러지 말라고 적고 있었다("양쪽에 같은 픽셀을 준다").
two-stage 하네스는 `in.bin` 을 한 번 만들어 양쪽에 주는데 여기만 빠져 있었다.
러너는 `.bin`(전처리된 CWHN f32)을 이미 받을 수 있다 — 텐서 하네스가 그렇게 쓴다.
기준값이 만든 픽셀을 `_postproc_in.bin` 으로 떨구고 러너에게 그걸 준다.
**one-stage 전수 39/43 → 41/43. 42계열 중 38계열의 수치가 좋아졌다.**
| 계열 | 전 | 후 |
|---|---|---|
| `centripetalnet` | 3.80px | **0.00px** |
| `free_anchor` | 0.35px · 개수차 1 | **0.02px · 0** |
| `yolact` | 0.74px · 개수차 1 | **0.04px · 0** |
| `detr` | 1.85px | 0.26px |
| `rpn` | 133.23px · 개수차 1 | 21.21px · **개수차 0** |
⚠️ **「fp16 한계」로 적혀 있던 것 중 셋이 정밀도가 아니었다.** `centripetalnet`(3.80px)은
「fp16 코너 타이 플립」으로, `free_anchor`(0.35px)는 「fp16 경계 아티팩트로 **확인됨**」으로
위키에 적혀 있었다. 둘 다 픽셀 차이였다. 픽셀이 계통적으로 5e-04~9e-04 의 점수차를
만들었고, 그 크기면 컷(0.30) 언저리의 검출 하나가 갈려 개수차 1 이 난다.
⚠️ **순서를 바꾸지 마라.** 기준값이 먼저 돌아야 픽셀 파일이 생긴다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019wYbQfnwZnZXWYFC14sWQH
40계열 전수가 순차로 36분이다. 계열이 독립인데 이 하네스에만 병렬이 없었다 (dense_head 하네스에는 `--workers` 가 있다). - 기본값 **1** — 지금 동작을 안 바꾼다 - 상한 **3**. 넘기면 거부하고 이유를 찍는다 - **가용 메모리를 읽어 자동으로 낮춘다** — 플래그를 그대로 믿지 않는다. 이 기계는 세션이 여럿 떠 있어 여유가 그때그때 다르다. 어제 `--workers 3` 이 됐다고 오늘 되는 게 아니다 - 완료 순서로 오는 결과를 **다시 정렬**한다. 안 하면 실행마다 줄 순서가 달라져 두 실행을 `diff` 로 못 댄다 — 회귀를 눈으로 보는 길이 막힌다⚠️ **왜 상한이 3인가.** 계열 하나의 피크 RSS 가 **3.26GB** 다(실측, 최대 기여는 `ref.py` 의 `init_detector` + 800px 추론). WSL 은 13GB 상한이라 2가 안전선이고 3을 넘으면 swap 으로 밀려 **오히려 느려진다.**⚠️ **OOM 을 내면 WSL 이 통째로 죽는다.** 이 저장소는 이미 겪었다(2026-08-10: OOM 0건인데 크래시 덤프 626회로 C: 가 찼다). `.wslconfig` 의 `maxCrashDumpCount=0` 이 그 대응이니 되돌리지 마라. 검증: `--workers 2` 로 5계열(double_heads·dynamic_rcnn·pafpn·res2net·panoptic_fpn)을 돌려 순차와 **소수점까지 같은 판정**을 확인했다 — 0.16px·개수차1 · 10.24px · 8.77px · 6.81px · EXPORT_FAIL. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019wYbQfnwZnZXWYFC14sWQH
`MMDetTextCond` — 캡션이 고정이면 텍스트 임베딩은 입력과 무관한 **상수**다. 버퍼로 구우면
그래프 입력이 이미지 하나가 되어 단일입력 codegen·러너를 그대로 쓴다(DETR 의 `pos_embed`,
Deformable 의 `enc_proposals` 를 굽는 것과 같은 수법).
그렇게 안 하면 융합헤드는 입력이 6개(feat×5 + embedded)인데 codegen 이 **모든 input 노드를
같은 `x` 에 묶어** 크래시 없이 전부 이미지가 들어간다.
그 결과 `_no_box` 경로의 "그래프 출력 대조" 가 곧 **헤드 검증**이 된다:
glip O PASS L1 1.94e-03 · L2 1.70e-03 · kind no-box · 출력 15 (게이트 5e-02)
출력 15 = FPN 5레벨 × {정렬점수 (1,HW,256) · 박스 (1,4,H,W) · centerness (1,1,H,W)}.
기준선(08-25)은 출력 5(백본+넥)였다 — **같은 PASS 라도 재는 범위가 다르다.**
⚠️ 이 래퍼로 재는 것은 **이미지 가지 + 융합헤드**지 BERT 가 아니다 — 구운 임베딩은 torch 가
계산한 값이다(BERT 자체는 2026-08-26 에 따로 쟀다: C++ rel L2 7.60e-03).
- `is_text_conditional()` 이 **GLIP 만** 받는다. GroundingDINO 계열은 head 가 DETR 꼴이라
같은 래퍼로 감싸면 인자 개수에서 죽는다 — 명시적으로 갈라 뒀다.
- `--caption` 으로 문구를 바꿀 수 있다. 바꾸면 GGUF 를 다시 구워야 한다.
- transformers 5.x 에서 삭제된 `batch_encode_plus` 를 `__call__` 로 이어 준다
(mmdet 3.3.0 은 4.x API 를 기대한다).
- `verify_heads.py` 의 텍스트 조건부 분기 주석을 고쳤다 — **계열마다 컴파일 범위가 달라서**
같은 숫자를 같은 뜻으로 읽으면 안 된다(`glip` 은 헤드까지, GDINO 는 아직 백본+넥).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KemYBBrd2EwddQx8sPMrxu
mmdet 밖으로 포팅 범위를 넓힌다. mmseg 는 **앵커도 NMS 도 박스 디코드도 없어서**
`backbone → (neck) → decode_head` 를 한 그래프로 컴파일하고 출력 텐서를 그대로 대조하면
끝난다 — head 를 C++ 로 조립할 이유가 없다(GLIP 융합헤드에서 통한 경로를 그대로 쓴다).
fcn_r50-d8 PASS rel L1 1.76e-03
deeplabv3plus_r50-d8 PASS rel L1 1.73e-03
pspnet_r50-d8 PASS rel L1 1.02e-03 (8.82e-02 에서 고침)
## 신규
- `tools/frontend/mmseg/mmseg_wrap.py` — `MMSegWrap`. 30줄이다. 출력은 **resize 전**
seg_logits — 입력 크기 복원은 후처리라 그래프 밖에 둔다(넣으면 크기마다 다시 구워야 한다).
`auxiliary_head` 는 학습 전용이라 뺀다. mmcv trace 패치는 mmdet 프론트엔드 것을 재사용한다.
- `tools/verify/seg/verify_seg.py` — 계열 목록을 **metafile 에서 읽는다**(손으로 적으면
거기 없는 계열이 존재하지 않는 것처럼 보인다 — mmdet 에서 `pisa`·`rpn` 이 그랬다).
`--fetch` 로 체크포인트를 받고, 없으면 `CKPT_NONE` 으로 남긴다 — **못 잰 것이지 통과가
아니다.** `unhandled op` 이 있으면 PASS 옆에 개수를 찍는다(그 연산이 사라진 채 우연히
맞았을 수 있다). 입력은 **고정 시드**다 — mmdet 의 no-box 계열이 시드 없이 뽑아 실행마다
1~5% 흔들렸고 회귀 대조가 그만큼 흐려졌다.
## `conv_2d_depthwise` 가 dilation 을 못 받았다
시그니처에 아예 없었다(`ggml_conv_2d_dw_direct` 는 받는데 `1,1` 로 박혀 있었다). 호출자가
padding 만 넘기면 출력이 `in + 2p - (k-1)` 로 **커진 채** 나온다:
dilation 12/24/36 → 64x64 가 86/110/134
크래시는 **concat** 에서 난다 — 원인 지점이 아니다. mmseg DeepLabV3+ 는
`DepthwiseSeparableASPPModule` 이라 여기 걸렸고, mmdet 의 depthwise 는 전부 dilation 1 이라
여태 안 드러났다. 기본값 1 이라 기존 호출자는 그대로다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KemYBBrd2EwddQx8sPMrxu
세 번째 modality. mmseg 와 같은 자로 잰다 — `backbone → (neck) → head.forward` 를 한
그래프로 굽고 출력 텐서를 대조한다. 디코드(히트맵 argmax·소수점 보정, SimCC 의 1D argmax)는
후처리라 그래프 밖이다.
aic (HRNet-w32 topdown heatmap) PASS rel L1 2.50e-03 · L2 1.86e-03 · 192x256
## 신규
- `tools/frontend/mmpose/mmpose_wrap.py` — `MMPoseWrap`. `head.forward` 를 부른다
(`predict` 는 flip TTA·디코드가 붙어 있다 — 그건 후처리다).
- `tools/verify/pose/verify_pose.py` — 계열 목록을 metafile 에서 읽는다(35계열).
## 러너가 비정방 입력을 받는다
`run_dump.cpp` 는 크기를 하나만 받아 **정방으로 굳어 있었다.** topdown 은 사람 박스를
`codec.input_size`(대개 192x256, WxH)로 잘라 넣는다 — 정방으로 재면 히트맵 크기가 config 와
달라져 **다른 것을 재게 된다.** `[W] [H]` 로 받고 `H` 를 안 주면 예전처럼 정방이다.
⚠️ `codec.input_size` 는 `(W, H)` 순서다 — torch 와 **반대**다. 뒤집어 쓰면 정사각이 아닌
경우엔 shape 에서 죽고, 정사각이면 조용히 틀린다.
## 환경 — 모델을 로드하려면 넘어야 하는 것 셋
`init_model` 이 레지스트리를 채우려고 `mmpose.datasets` 를 통째로 import 한다. **우리는
데이터셋을 안 쓰는데** 그 import 들이 줄줄이 걸린다.
- `xtcocotools` 는 C 확장이라 이 환경에서 빌드가 실패한다(gcc exit 1) → `pycocotools` 로
잇는다. ⚠️ **평가지표를 계산하려 들면 이 심으로는 안 된다** — xtcocotools 는
crowdpose/wholebody 용으로 API 가 더 넓다. 심은 **import 시점**에 건다: `torch.load` 로
래퍼를 되살리는 g2c 서브프로세스는 피클이 이 모듈을 먼저 import 하는데, 함수 안에서만
걸면 그 경로가 심을 못 본다.
- dataset metainfo 경로가 **cwd 기준 상대경로**다(`configs/_base_/datasets/aic.py`).
폴백은 `mmpose/.mim/configs/` 인데 editable 설치엔 그 폴더가 없다 → 레포 루트에서
`init_model` 을 부르고 되돌린다.
- `munkres`·`json_tricks` 는 순수 파이썬이라 그냥 넣으면 되고, `pkg_resources` 는
setuptools 81 부터 빠졌다 → `setuptools<81`.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KemYBBrd2EwddQx8sPMrxu
## ① 입력 크기를 512² 로 고정하고 있었다 — 잰 것이 그 모델이 아니었다
mmseg 는 계열마다 crop 이 다르다: cityscapes 512x1024 · ade20k 512x512 ·
`beit` 640x640 · `cgnet` 680x680 · `bisenetv2` 1024x1024.
`data_preprocessor.size` 를 읽어 그 크기로 잰다.
ViT 계열은 조용히 넘어가지도 않았다 — `pos_embed` 토큰 수가 입력에 묶여 있어
`The size of tensor a (1025) must match ...` 로 죽는다(512/16 → 1024+1 vs 640/16 → 1600+1).
`beit` REF_FAIL 의 정체가 이거였다.
fcn 512x512 → **1024x512**(config crop) 로 재고 PASS (rel L1 1.74e-03)
## ② 메모리 가드 — WSL 이 통째로 죽었다
mmdet 하네스에는 `min_free_mb` 게이트가 이미 있었는데 **새로 쓴 seg·pose 하네스에는
안 따라왔다.** 대책이 파일 단위라서다.
2026-08-27 실측(OOM 8건): 폭주한 프로세스가 없었다 — 검증 스윕 3.6GB + 다른 python 2.25GB
+ VS Code 3.4GB + claude 세션 5개 1.5GB 가 13GB 상한을 넘겼다.
- `_wait_for_memory()` — 계열 시작 전 `MemAvailable` < 2.5GB 면 기다린다(`VISP_MIN_FREE_MB`)
- `RLIMIT_AS` = 8GB(`preexec_fn`) — 폭주하면 **그놈만** 죽고 VM 은 산다(`VISP_MAX_SUBPROC_GB`)
- `MALLOC_ARENA_MAX=2` — glibc 이 스레드마다 arena 를 잡아 RSS 가 부푼다
위키 `wsl-계속-터짐` 참조. 같은 크래시의 다른 층(훅이 저장소 밖을 인덱싱)은 다른 세션이 고쳤다.
## ③ `--list` 가 `--fetch` 를 삼켰다
`--list` 가 먼저 return 해서 `--fetch --list` 로는 아무것도 안 받았다. 순서를 바꿨다.
## ④ GLIP 박스 디코드 — 호스트(numpy) 참조 구현
`glip_decode.py` + `verify_glip_box.py`. **두 단계로 나눠 잰다** — 한 번에 재면 틀렸을 때
디코드 탓인지 그래프 탓인지 못 가른다.
① 디코드만 : torch 15텐서 → 우리 디코드 vs torch 15텐서 → mmdet 디코드
② 전체 : C++ 15텐서 → 우리 디코드 vs torch 15텐서 → mmdet 디코드
앵커 생성은 mmdet `AnchorGenerator` 와 **최대차 0** 으로 대조 완료(5레벨 전부).
나머지(점수 집계·delta 디코드·NMS)는 **아직 안 돌렸다** — 미확인(방향모름).
⚠️ 세 곳이 일반 검출기와 다르다:
- 점수가 클래스가 아니라 **토큰**이다 → `positive_map` 으로 문구 평균. 호스트가 넘긴다
- `DeltaXYWHBBoxCoderForGLIP` 에 `-1`/`+1` 이 네 군데(중심·복원·클립·마지막 `x2,y2+=1`)
- 점수는 곱이 아니라 **`sqrt(cls * centerness)`** — 곱으로 두면 개수차로 나타난다
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KemYBBrd2EwddQx8sPMrxu
3x3 을 3x1·1x3 으로 쪼개는 백본(ERFNet NonBottleneck1d)은 padding 이 (1,0)·(0,1), dilation 이 (d,1)·(1,d) 로 축마다 다르다. `conv_2d_impl` 이 int 하나만 받아 H 쪽을 통째로 버리고 있었다 — 크래시는 한참 뒤 residual add 의 `ggml_can_repeat` 에서 났다. ggml 은 원래 축별로 받는다(`ggml_conv_2d(…, s0, s1, p0, p1, d0, d1)`, s0=W). 묶어 넘기던 래퍼만 풀고 `conv_2d_ex` 를 새로 낸다. 기존 대칭 호출부는 그대로다. 같이 고친 것: - `conv_transpose_2d` 에 `output_padding`. torch 출력 인덱스 j 는 `_p0` 버퍼의 j+pad 라 **덜 자르면** 된다. `output_padding > pad` 인 만큼만 0 으로 채운다. - 1x1 fast path 가 padding 을 안 태우면서 pad 를 검사하지 않았다 → `pw==0 && ph==0` 추가. erfnet RUN_FAIL → PASS rel L1 2.87e-04. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011wUT5txVfZdA4zckAHtWs4
`frontend/` 는 mmdet·mmseg·mmpose 로 갈렸는데 `verify/` 는 **mmdet 내부 모듈 이름**
(backbone·dense_head·roi)으로 갈려 있었다. 축이 둘이라 어긋난 자리가 둘:
- `verify/seg/` 안에 mmdet instance seg(`run_maskrcnn.cpp`)와 mmseg semantic seg
(`verify_seg.py`)가 **같이** 있었다. 같은 "seg" 인데 다른 생태계다.
- `run_dump.cpp` 은 mmdet·mmseg·mmpose 셋 다 쓰는데 `verify/backbone/` 밑에 있었다.
mmocr·mmpretrain 을 붙이면 `verify/ocr/`·`verify/cls/` 가 또 생태계 축으로 들어와 더 섞인다.
지금 18개일 때가 제일 싸다.
verify/common/ run_dump.cpp · draw_boxes.py ← 생태계 무관
verify/mmdet/ backbone/ dense_head/ roi/ inst_seg/ tracking/
verify/mmseg/ verify_seg.py
verify/mmpose/ verify_pose.py
`verify/mmdet/` 밑에서만 mmdet 내부 모듈로 갈린다. 축을 섞지 않는다.
⚠️ 옮기며 **조용히 깨질 뻔한 것 하나**: `verify.toml` 의 상대경로는 `vconfig.py` 위치
기준인데 그 파일이 한 단계 깊어졌다. `g2c = "../../../.."` 가 g2c 루트가 아니라
vision.cpp 를 가리켰고, **경로가 존재하긴 해서 검사에 안 걸린다.** `..` 하나씩 늘렸다.
경로 참조 전수 감사 통과(옛 경로 잔여 0). mmdet·mmseg·mmpose 하네스 셋 다 기동 확인.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011wUT5txVfZdA4zckAHtWs4
`verify_seg.py` 는 최종 출력 하나만 봐서 FAIL 이 나도 **어느 층인지**를 모른다. 백본 4단계와 head 내부를 한 그래프의 출력으로 같이 내보내 단계마다 댄다. `~/work/seg/seg_probe.py`(추적 안 되던 중복본)를 옮기며 둘 고쳤다: - 512² 고정 → `crop_size()` (verify_seg 와 같은 곳에서 온다) - 손목록 3계열 → metafile 열거 · 체크포인트 없으면 **안 돌린다** 원본에서 지키는 것 둘(둘 다 실측으로 얻은 것이다): - head 를 **한 번만** 태운다. 펼쳐 부른 뒤 `h(f)` 도 부르면 같은 서브모듈이 그래프에 두 번 들어가 가중치 바인딩이 어긋난다 — rel L1 1.94 라는 가짜 실패를 만들었다. - `PPM.forward` 는 pool→conv→**resize** 까지 한다. 가지를 따로 부르면 concat 이 깨진다.⚠️ 위 두 변경 뒤 아직 안 돌려봤다. docstring 의 status 줄에 적어 뒀다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011wUT5txVfZdA4zckAHtWs4
`ggml_leaky_relu(m, x, 0.25f)` 로 근사하고 있었다. 0.25 는 torch `nn.PReLU` 의 **기본 초기값**이라 랜덤 초기화 모델에서는 근사가 **정확히 맞아떨어져 PASS 가 난다.** 학습된 가중치에서만 틀린다 — **검증을 랜덤으로 하면 정의상 못 잡는 부류**다. cgnet 512² 랜덤 PASS 1.91e-04 ← 근사가 맞아떨어짐 cgnet 512² 학습 FAIL 5.09e+00 cgnet 680² 학습 FAIL 5.36e+00 → PASS 1.86e-03 (이 커밋) 기울기 텐서는 gguf 에 **이미 실려 있었다**(`…activate.weight`) — 생성 코드가 참조만 안 했다. 렌더러가 `ctx.weight()` 를 부르지 않으면 manifest 에도 안 올라간다. y = max(0,x) + w*min(0,x) = relu(x) + w*(x - relu(x)) 채널 브로드캐스트가 cwhn/whcn 마다 달라 헬퍼로 뺐다(`add_bias_2d` 와 같은 규칙). `num_parameters=1` 도 같은 식이 그대로 성립한다. 곁들여 `verify_seg.py --size` 를 살렸다 — 설정만 되고 **아무 데도 안 쓰이던 죽은 옵션**이라 헤더에 `size=512` 라 찍히면서 실제로는 crop 으로 쟀다. 이번 「크기 탓인가 가중치 탓인가」를 가르는 데 필요해서 고쳤고, 기본값은 계열별 crop 그대로다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011wUT5txVfZdA4zckAHtWs4
`CascadeEncoderDecoder` 의 `decode_head` 는 `nn.ModuleList` 다. 그냥 부르면 `NotImplementedError: Module [ModuleList] is missing the required forward` 로 죽고, 판정이 REF_FAIL(=범위 밖)로 남는다. **torch 가 못 도는 게 아니라 우리가 잘못 부른 것이다.** 단계 규약은 mmseg `cascade_encoder_decoder.py:78` 과 같다 — 0단계 `forward(x)`, 이후 `forward(x, prev)`. 마지막 단계의 `predict` 는 `forward(x, prev)` 뒤 resize 만 하는데 resize 는 그래프 밖이라 뺀다. ocrnet REF_FAIL → PASS 6.23e-04 (1024x512, 학습 가중치)⚠️ `point_rend` 는 이걸로 안 된다. `PointHead.predict` 가 **값에 따라 점을 고르고** (topk 불확실도) 파이썬 루프로 반복 세분화한다 — mmdet 의 NMS 와 같은 **호스트 글루** 영역이지 래퍼 문제가 아니다. 「범위 밖」이 아니라 「호스트 후처리 필요」로 분류한다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011wUT5txVfZdA4zckAHtWs4
실측 내역(fcn, 41초): torch 모델 빌드(python+torch+mmseg import) 12s torch forward(기준값) 7s g2c 컴파일 13s g++ 빌드 2s ggml 실행 6s ← 추론은 여기뿐 **느린 건 추론이 아니라 앞의 32초**다. 계열끼리 독립이므로 병렬화가 유일하게 큰 레버다. mmdet 하네스는 이미 `workers = 3` 으로 돈다 — 여기만 직렬이었다. `--workers`(기본 2). 일은 전부 서브프로세스가 하므로 스레드로 충분하다. 52계열 기준 45분 → 약 25분(2워커).⚠️ `_wait_for_memory` 를 **락으로 감쌌다.** 워커가 여럿이면 둘이 동시에 검사를 통과한 뒤 둘 다 할당해 가드가 무의미해진다. 서브프로세스는 `ulimit -v 8GB` 로 묶여 있어 폭주해도 그 계열만 죽는다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011wUT5txVfZdA4zckAHtWs4
- MMSegWrap: head.forward 가 batch_data_samples 를 요구하는 계열(maskformer·
mask2former)은 predict(x, batch_img_metas, test_cfg) 로 부른다. REF_FAIL 해소.
- VISP_SEG_PROBE={cs,pe,mask} 로 head 내부를 층별로 내보낸다.
⚠️ 배치축(dim=0)에 붙이면 하네스가 t[0] 로 벗겨 절반만 비교된다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152AkQ9vaJFDbsCsxyw1pcV
프로브를 계열마다 짜지 않으려고 mmseg_wrap 에 백본/넥 절단면을 둔다. verify_pose 의 게이트는 락이 없어 워커 둘이 동시에 통과했다 — verify_seg 와 같게 맞춘다.
- tools/verify/mmseg/mmseg_families.py 신설. mmdet _OVERRIDE_LIST 와 같은 구조로 metafile 의 틀린 줄만 덮어쓴다(열거는 그대로 metafile 이 한다). emanet: configs/emanet/metafile.yaml:22 이 'eemanet_...'(e 둘) 오타라 CONFIG_NONE 이었다. 실제 파일은 존재한다 → PASS (L1 1.79e-03 / L2 1.85e-03, 1024x512). - MMSegWrap: seg.backbone 을 무조건 집던 것을 고쳤다. MultimodalEncoderDecoder(san)는 image_encoder+text_encoder 라 AttributeError 로 죽었다. encode_decode 와 같은 순서의 _forward_multimodal 경로를 새 분기로 추가. - MMSegWrap: cascade 마지막 단계가 PointHead(point_rend)면 forward 가 아니라 predict 다. mmseg encode_decode 규약대로 0..n-2 는 forward, n-1 은 predict 로 부른다. ocrnet 등 기존 cascade 경로는 그대로다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017gW1GZTXMzE1zWYVb2ozXy
nn.h as_f32(m,x): ggml 이항 연산은 정수 타입을 모른다(binary-ops.cpp:139 abort).
이미 f32 면 그대로 돌려주므로 무조건 감싸도 비용이 없다. 런타임 판별이라
IR dtype 표기에 안 의존한다 — 정적 판별은 실제로 실패했다.
mmdet_compat:
_patch_pointrend_coords 좌표 슬라이스 대입이 trace 에서 탈락해 zeros 가 흘렀다
(8196개 점이 전부 같은 자리를 샘플링). stack 으로 재작성, width/height 는 int 로.
_patch_san_attn_bias 어텐션 마스크 대입 4회 중 3개는 상수, 1개만 입력 의존.
블록으로 갈라 cat 으로 조립.
_ScalarAffine Linear(1,1) 을 matmul 없이. 크기-1 축에 matmul 을 걸면
reduce_to_4d 가 그 축을 버려 ggml_mul_mat 이 죽는다.
⚠️ 모듈 스코프에 둔다 — 함수 안이면 torch.save 가 pickle 을 못 한다.
verify_seg: 계열 안의 단계(ref/컴파일/빌드/실행)를 찍는다. 계열 하나가 끝나야
한 줄 나오던 구조라 「멈춤」과 「진행 중」이 구분이 안 됐다. VISP_SEG_PHASE=0 로 끈다.
박스 전수에서 12계열이 RUN_FAIL 로 나왔는데 셋 다 하네스 결함이었다. 모델은 멀쩡했다. 1. verify_postproc.py — frontend/mmdet 상대경로의 .. 가 하나 모자라 import 가 조용히 실패했다. allow_mmengine_checkpoint_globals() 가 안 걸려 DETR 계열 8개가 torch 2.6 weights_only 에서 죽었다. 2. box_all.py — used.json 의 절대경로가 08-28 홈 재편으로 죽자 원본 mmdet config 로 조용히 떨어졌다. 래퍼 4계열이 남의 짝으로 재고 실패처럼 보였다. gen_root 기준 리베이스 + 폴백 제거. 짝을 못 찾으면 이유를 찍고 멈춘다. 3. mmdet_families._IMG_DIR — .. 가 하나 모자라 tests/input 을 못 찾고 계열별 이미지 매핑이 통째로 무효였다. 트래커를 사람 없는 이미지로 재서 양쪽 0건이 나왔다. 실측 2026-09-01 one-stage 전수: PASS 30 -> 42/44, 못 잼 12 -> 0. 남은 FAIL 둘은 진짜다 (nas_fpn 개수차 1 · rpn 21.21px, 중앙값 0.02px).
two-stage 전수가 첫 줄에서 죽었다 — DH 가 tools/verify/dense_head 를 가리켰는데 실제는 tools/verify/mmdet/dense_head 다. ModuleNotFoundError. example_mmdet.sh 에도 같은 게 있었다. 이번엔 isdir assert 를 붙였다. fpg 는 P5 아래로 레벨을 더 쌓아 800·512 에서 안 나눠떨어진다(25 vs 26). 2026-08-18 에 「1024 로 재측정」으로 해결됐는데 그 해결이 위키에만 있고 코드엔 없어서, 전수를 돌릴 때마다 EXPORT_FAIL 로 다시 찍혔다(08-25, 09-01). _SIZE 표와 test_size() 를 만들어 계열별 이미지 표와 같은 구조로 박았다. 머리글이 a.size 만 찍어 1024 로 재고도 size=800 이라고 적혔다. 계열별로 올라간 값을 같이 적는다. 실측 2026-09-01: two-stage 전수 PASS 38 -> 40/45 (groie·fast_rcnn 이 08-25 에 닫힌 뒤 처음 돌린 전수). fpg 는 1024 에서 0.28px PASS — 08-18 기록과 소수점까지 동일. 남은 4는 전부 fp16 이고 수치도 동일.⚠️ mmseg_wrap.py 48줄은 이 작업이 아니다 — 이전 세션이 작업트리에 남긴 mask2former 디버그 프로브(pix·pix_ms·am*)다. 추가만 있고 기존 경로는 안 건드리므로 같이 커밋한다. 검증은 안 했다.
배포 경로(vision-cli)가 정사각 리사이즈만 했다. 비정사각 모델을 주면
크래시 없이 조용히 틀린 출력을 낸다 — mmseg cityscapes(512x1024)를 넣으면
512x512 로 줄어 출력 원소가 155,648 -> 77,824 로 절반만 나왔다.
mmpose 는 전부 256x192 라 배포 경로로 한 계열도 못 돌았다.
근원은 install_arch.py 의 traced_size 였다. 비정사각을 **알아채고 경고까지
찍으면서** 세로만 등록하고 가로를 버렸다. 경고 대신 둘 다 싣는다.
- postproc: preprocess(out_size) -> preprocess(dst_w, dst_h).
정사각 오버로드를 남겨 기존 호출부는 무수정
- arch_registry: input_w/input_h 신설. 0 이면 옛 input_size 를 정사각으로 쓴다
- cli: 그래프 입력을 {3, IW, IH, 1} 로
- install_arch: traced_size 가 (h, w) 를 돌려주고 둘 다 등록
실측 2026-09-01:
- 정사각 회귀 — YOLO26 박스 3개, 좌표가 README 와 소수점까지 동일
- 비정사각 — mmseg fcn_r50-d8 cityscapes 가 155,648 원소(19x64x128)로 복구
가이드 4단계를 fresh clone 에서 실제로 밟다가 셋을 잡았다. 문서에 경고를 붙이는 대신 코드를 고쳤다. 1. save() 헬퍼 신설 — .pt 와 **그걸 여는 데 필요한 모듈 전부**를 같이 쓴다. torch.save 만 부르면 컴파일이 ModuleNotFoundError: mmseg_wrap 에서 멈췄다. g2c 는 .pt 의 디렉터리를 sys.path 에 넣으므로 옆에 있기만 하면 열린다 — mmdet 이 이미 쓰던 규약이다. PYTHONPATH 가 필요 없어졌다. 2. forward() 가 항상 튜플을 돌려준다. 출력이 하나면 벌거벗은 Tensor 였는데 build() 는 shape 을 늘 리스트로 알려줘서, 호출자가 outs[0][0] 으로 두 겹 벗기면 19장짜리 클래스 맵이 1장이 됐다. 형태를 고정해 사고를 없앤다. 3. install_loader_modules 가 자기 폴더에만 모듈이 있다고 봤다. mmseg_wrap 은 형제 폴더라 FileNotFoundError. 이미 import 된 모듈의 실제 위치를 쓴다. 실측 2026-09-01, fresh clone + PYTHONPATH 없이: copied: mmseg_wrap.py mmdet_wrap.py mmdet_compat.py 반환형 tuple len 1 | (1,19,64,128) export -> compile -> install -> build -> vision-cli 전부 exit 0 출력 155,648 원소 = 19x64x128, PyTorch 기준값과 일치
detect_shapes() 가 <cls>.weights.txt 에서 정규식 'cv3.*\[(\d+),' 로 클래스 수를 찾았는데, 그 파일에는 shape 대괄호가 없다 — 순수 텐서 이름뿐이다. 정규식이 매칭될 수 없어 **언제나 80 으로 조용히 폴백**했다. COCO 모델은 우연히 맞았고 커스텀 클래스 수 모델은 조용히 틀렸다. --classes 를 안 주면 사용자가 알 방법이 없다. 생성 <cls>.py 의 'Detect[...]' 안 마지막 cv3 conv 의 out_channels 를 읽는다. 못 읽으면 80 으로 두되 **경고를 찍는다** — 조용히 넘어가지 않는다. 실측 2026-09-01: Yolo26m 이 폴백이 아니라 실제로 80 을 읽는다. 검토 서브에이전트가 잡았다.
손으로 밟을 때 빠뜨리는 검사 둘을 스크립트가 막는다: gguf 가 안 나와도 종료 코드 0 이라 파일 유무로 판정하고, unhandled op 이 있으면 세서 멈춘다. wheel 로 깐 배포판과 소스 체크아웃 양쪽에서 g2c 를 찾는다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017gW1GZTXMzE1zWYVb2ozXy
mean/std·검출기 종류·클래스 수는 gguf 에 없어서 매번 손으로 넘겨야 했다. 컴파일 시점에는 원본 모델이 있으니 g2c 가 아는 것만 <Arch>.meta.json 에 남기고 여기서 기본값으로 쓴다. 명령줄로 준 값이 언제나 이긴다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017gW1GZTXMzE1zWYVb2ozXy
This reverts commit 2eccc05.
This reverts commit 0700eb5.
v8·v9·v11·v12 는 디코드를 그래프 안에서 끝내고 박스와 확률을 한 텐서로 붙여서 낸다(cat(dbox, cls.sigmoid()) -> 4+nc 채널). 지금까지는 4채널과 nc채널 출력을 따로 찾다가 못 찾고 'Could not find box/score outputs' 로 멈췄다. detect_yolo_dense 에 넘기면 안 된다 - stride 와 sigmoid 를 두 번 먹는다. 자르기 + 임계값 + NMS 만 하는 경로를 따로 뒀다. 실측(cat-and-hat.jpg, ultralytics 8.4.61 대조): v8 박스 2/2 클래스 일치, 좌표 최대차 0.28px, 점수차 0.0022 v11 박스 3/3 클래스 일치, 좌표 최대차 0.84px, 점수차 0.016 부수 효과: 위키에 적힌 'out_5 -> out_0 손패치가 매번 필요'가 사라진다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017gW1GZTXMzE1zWYVb2ozXy
지금까지는 가로·세로 배율을 따로 써서 종횡비를 뭉갰다. 정사각 시험 이미지 (512x512)로만 재서 안 드러났다. 비정사각에서 재면 벌어진다. wardrobe(452x627) handbag 0.8723 -> 0.9443 (torch 0.9386) vase-and-bowl(320x290) 중복 박스 0.6031 소멸, bowl 0.7032 -> 0.9257 (torch 0.9254) ultralytics 가 리사이즈 결과를 uint8 로 되돌리는 것도 맞췄다 - 안 맞추면 픽셀 12%가 1~3 레벨 달라지고 컷 근처 점수가 흔들린다. 분할·자세는 직접 리사이즈가 맞으므로 arch_task.letterbox 기본 false, install_arch.py 가 --detect-yolo 일 때만 켠다. 회귀: 분류기 resnet18 상대 L1 0.0030448 (변화 없음). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017gW1GZTXMzE1zWYVb2ozXy
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
develop32커밋. 배포 경로(vision-cli)로 mmdet·mmseg·mmpose 가 전부 돈다.왜 지금인가
가이드를 fresh clone 에서 문서대로 밟아보니 코드가 넷 틀려 있었다. 하네스로는 다 통과하는데
사용자가 쓸 경로는 아무도 안 밟았기 때문이다.
러너 — 비정사각 입력 (
c2ff2ea)vision-cli가 정사각 리사이즈만 했다. 비정사각 모델을 주면 크래시 없이 조용히 틀린다.근원은
install_arch.py의traced_size— 비정사각을 경고까지 찍으면서 가로를 버렸다.preprocess(out_size)→preprocess(dst_w, dst_h). 정사각 오버로드를 남겨 기존 호출부 무수정arch_registry에input_w/input_h. 0 이면 옛input_size— 완전 호환프론트엔드 규약 (
7f611da)mmseg_wrap.save()/mmpose_wrap.save()—.pt와 그걸 여는 모듈 전부를 같이 쓴다.PYTHONPATH가 필요 없어졌다 (mmdet 이 이미 쓰던 규약)forward()가 항상 튜플. 출력 하나면 벌거벗은 Tensor 였는데build()는 shape 을 늘리스트로 줘서, 호출자가
outs[0][0]로 두 겹 벗기면 19채널이 1채널이 됐다install_loader_modules가 형제 폴더 모듈을 못 찾던 것검증 하네스 (
eb772bb,727dfd4,b135765)못 잰 것을 실패로 적던 자리 다섯. 전부 하네스 결함이고 모델은 멀쩡했다.
verify_postproc.py상대경로..2→3used.json죽은 절대경로 + 조용한 폴백_IMG_DIR..3→4DH에mmdet누락detect_shapes()정규식이 파일 포맷과 불일치실측 (2026-09-01, fresh clone)
fpg는 1024 에서 0.28px남은 계열은 전부 fp16 정밀도이고 fp32 로는 통과한다. 컴파일러 결함 0.