Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
7e437bd
feat(nn): group_norm affine 과 2D reflect 패딩 헬퍼
Aug 12, 2026
b4a2af3
feat(cli): g2c 생성 arch 를 이름으로 찾아 실행하는 레지스트리
Aug 12, 2026
1f5a034
fix(build): libvisioncpp 경로를 `--build` 인자로 받는다
Aug 12, 2026
791aa68
fix(gguf): GGML_MAX_NAME override 를 걷어내고 ggml 기본값(64)을 쓴다
Aug 13, 2026
3a61385
docs(tools): draw_boxes.py 추가 — 가이드가 참조하는데 빠져 있었다
Aug 13, 2026
e4ca033
fix(cli): 입력 크기와 전처리 정규화를 등록 정보로 옮긴다
Aug 13, 2026
f63f907
Merge branch 'feat/arch-registry' into tmp/merged-check
Aug 13, 2026
c7f0eae
Merge branch 'fix/build-script-arg' into tmp/merged-check
Aug 13, 2026
995a116
Merge branch 'feat/drop-max-name-override' into tmp/merged-check
Aug 13, 2026
6435737
feat(mmdet): dense head 를 C++ 부품으로 조립한다 (100계열 중 79)
Aug 13, 2026
47f5834
fix(mmdet): append_head_weights 출력을 영문으로
Aug 13, 2026
c591f6a
docs(mmdet): 저장소 안내 문서와 README 항목
Aug 13, 2026
604add0
Merge branch 'feat/arch-registry' into staging/main-plus-prs
Aug 13, 2026
365af84
Merge branch 'fix/build-script-arg' into staging/main-plus-prs
Aug 13, 2026
31ee48e
Merge branch 'feat/drop-max-name-override' into staging/main-plus-prs
Aug 13, 2026
5181979
Merge branch 'feat/mmdet-head-assembly' into staging/main-plus-prs
Aug 13, 2026
a725e6b
fix(tools): install_arch 메시지를 영문으로
Aug 13, 2026
0d75e91
docs(mmdet): --build 플래그로 통일하고 reg_stacked_convs 를 표에 넣는다
Aug 13, 2026
855a0d7
docs: 컴파일된 모델 경로를 README 에서 찾을 수 있게
Aug 13, 2026
8fee8dc
docs(mmdet): 명령 블록이 실제로 돌게 고치고 가이드 링크를 단다
Aug 13, 2026
bc9690c
feat(cli): 검출 좌표를 찍는다
Aug 13, 2026
55161d6
docs(mmdet): 기본값을 고른 이유 대신 무엇이 나오는지만 적는다
Aug 13, 2026
3ffb347
docs(mmdet): 4차 독립 리뷰에서 확정된 것들
Aug 14, 2026
8b8c8ee
fix(tools): build_frcnn_cpp.sh 가 실제로 돈다 — 문서에 실린 채 한 번도 실행된 적 없었다
Aug 14, 2026
fbbdfc7
docs(tools): 낡은 커버리지 수치를 현행으로
Aug 14, 2026
0480479
fix(detect): test_cfg 임계값을 싣고, centerness 를 score factor 로 곱한다
Aug 14, 2026
5f3dca9
feat(detect): 거리 기반 계열을 디코드한다 (fcos·gfl·vfnet)
Aug 14, 2026
db8ad38
feat(detect): DETR 계열을 디코드한다 (4/5 검증)
Aug 14, 2026
388298c
feat(verify): two-stage 러너가 최종 박스까지 낸다
Aug 14, 2026
22e91ba
feat(decode): YOLOX 를 detect_yolox 로 보낸다
Aug 14, 2026
f9c1e07
feat(decode): RPN 을 레벨별 NMS 경로로 보내고, 대조 하네스의 짝짓기를 고친다
Aug 14, 2026
a0d1be0
docs: 어떤 계열이 박스까지 나오는지 실측표로 적는다
Aug 14, 2026
2e26afe
fix(frontend): 공유 conv 에 BN 을 두 번 접고 있었다
Aug 14, 2026
7db6c37
docs: 실측표를 18계열로 갱신하고, 안 되는 이유를 다시 가른다
Aug 14, 2026
c189dc9
feat(verify): two-stage 계열의 최종 박스를 mmdet 과 대조한다
Aug 14, 2026
a20d088
docs: 실패 원인 묶음을 실제 config 로 다시 가른다
Aug 17, 2026
29d2266
fix(roi): 레벨은 키우기 전 박스로 고른다 + 캐스케이드는 단계별 점수를 평균한다
Aug 17, 2026
23e6561
fix(frcnn): 중첩 JSON 배열을 첫 안쪽 대괄호에서 끊어 읽고 있었다
Aug 17, 2026
55819be
feat(verify): --skip-pass 로 이미 통과한 계열을 다시 굽지 않는다
Aug 18, 2026
61ab601
docs: two-stage 실측표를 18계열로 갱신하고 실패를 다섯 갈래로 다시 가른다
Aug 18, 2026
431455c
docs: two-stage 20계열 (carafe·libra_rcnn 추가)
Aug 18, 2026
92e3e9a
fix(verify): one-stage 하네스가 전 계열을 WEIGHTS_FAIL 로 떨어뜨리고 있었다
Aug 18, 2026
21f34f6
docs: one-stage 실측표 재측정본으로 교체 (nas_fcos 추가 · pvt 제외)
Aug 18, 2026
7489ee4
docs: pvt(PVT-Tiny) 0.55px · ld 0.30px 추가 — one-stage 19계열
Aug 18, 2026
3ff0e40
docs: gcnet 0.14px 추가 — two-stage 21계열, 미확인 없음
Aug 18, 2026
2104346
feat(detect): FoveaBox 디코드 (212px → 0.40px)
Aug 18, 2026
dcd36ad
feat(detect): YOLOF 디코드 (박스 0건 → 0.12px)
Aug 18, 2026
ff04d19
docs: foveabox 0.40px · yolof 0.12px 추가 — one-stage 21계열
Aug 18, 2026
1ad0a7e
feat(detect): RepPoints 디코드 (박스 0건 → 0.25px)
Aug 18, 2026
d9789cb
fix(detect): 격자 오프셋을 head kind 로 박지 말고 프론트엔드 값을 쓴다 (autoassign 64px →…
Aug 18, 2026
30eaf25
docs: reppoints 0.25px · autoassign 0.30px 추가 — one-stage 23계열
Aug 18, 2026
7df5107
feat(verify): 개수차가 임계값 경계 아티팩트인지 같이 알려준다
Aug 18, 2026
1be1573
feat(detect): YOLOv3 디코드 (박스 0건 → 0.23px)
Aug 18, 2026
80af938
docs: yolo 0.23px 추가 — one-stage 24계열
Aug 18, 2026
5f62f2a
feat(detect): SABL 디코드 (측정 불가 → 0.55px)
Aug 18, 2026
e8bae52
docs: sabl 0.55px 추가 — one-stage 25계열
Aug 18, 2026
b9439a3
feat(htc): 시맨틱 갈래 융합 (94px → 0.12px) + swin 마스크 수정 적용
Aug 18, 2026
7ccc4bd
docs: htc 0.12px · swin 0.22px 추가 — two-stage 23계열
Aug 18, 2026
a075adf
feat(scnet): 전역 컨텍스트 융합 (16.32px → 0.18px)
Aug 18, 2026
fdc8695
docs: scnet 0.18px 추가 — two-stage 24계열
Aug 18, 2026
82364e1
fix(sac): DetectoRS 의 dilation-3 deform conv 를 오프셋 이동으로 등가 변환 (27px →…
Aug 18, 2026
b7768ba
docs: detectors 0.03px 추가 — two-stage 25계열
Aug 18, 2026
f4f3fc6
feat(ddq): 최종 박스 디코드 (덤프만 하고 끝나던 것) + 상대경로 버그
Aug 18, 2026
631eb69
docs: ddq 0.06px 추가 — one-stage 26계열
Aug 18, 2026
976a8fb
docs: 실패 분석 산문을 전수 회귀 결과로 갱신
Aug 18, 2026
ae4c675
feat(ms_rcnn): 마스크 IoU 재점수화 — 박스 0.07px · 점수 0.0015 · 개수차 0
Aug 18, 2026
82f8f9f
fix(convT): padding 지원 + 하네스의 stale 산출물 구멍 세 곳
Aug 18, 2026
bbbc4fb
feat(seesaw·crowddet): 두 계열 통과 — 0.09px · 0.07px
Aug 18, 2026
e567af3
fix(verify): unwrap 경로가 형제 저장소를 가리켜 조용히 꺼져 있었다
Aug 18, 2026
c018559
docs: two-stage 27계열 — crowddet·ms_rcnn·seesaw 추가, panoptic_fpn 은 미확인…
Aug 18, 2026
6c4adfe
docs: 사용자 가이드 4종 흡수 (staging 에 없던 것)
Aug 18, 2026
d483e29
feat(one-stage): 계열 전용 디코더 6종 — fsaf·paa·lad·ssd·cornernet(협업) + cent…
Aug 18, 2026
6e5f629
docs: one-stage 32계열 — 59계열 확정
Aug 18, 2026
542bdba
feat(grid_rcnn): grouped conv_transpose 분해 — 0.15px
Aug 18, 2026
92a6a37
docs: grid_rcnn 0.15px — 60계열
Aug 18, 2026
a208e2b
feat(tridentnet): C4 계열 두 겹 — 0.09px (박스 0건이던 마지막 미분류 계열)
Aug 18, 2026
0ee67aa
docs: tridentnet 0.09px — 61계열, 미분류 항목 비었다
Aug 18, 2026
6ca9eaf
docs: condinst 0.19px — 62계열
Aug 18, 2026
22cd3ce
docs: tood 0.63px · deformable_detr 0.26px — 64계열, dyhead 는 디코더로 좁혔다
Aug 18, 2026
82d329e
docs: boxinst 0.25px — 65계열
Aug 18, 2026
a04e739
docs: panoptic_fpn 0.04px — 66계열, 옛 숫자가 맞았다
Aug 18, 2026
7a3f9bb
feat(wrapper): 래퍼 계열 풀기 — soft_teacher 0.42px (67계열)
Aug 19, 2026
f26192f
feat(wrapper): 트래커 7계열 — 74계열. data_preprocessor 가 래퍼에만 있다
Aug 19, 2026
79d37d5
fix(anchor): 앵커 중심의 base_size 는 stride 다 — dyhead 112px → 0.21px (75계열)
Aug 19, 2026
4fad651
feat(no-box): 박스를 안 내는 5계열 — kind: no-box (80계열)
Aug 19, 2026
fe2a450
feat(fast_rcnn): 외부 proposal 경로 — 0.01px (81계열)
Aug 19, 2026
510411c
feat(groie): GenericRoIExtractor 경로 — 남은 벽은 렌더러의 5D broadcast
Aug 19, 2026
3bb837c
feat(proposal): 비표준 RPN 두 계열 — guided_anchoring 0.02px / cascade_rpn …
Aug 19, 2026
92fc69c
fix(refusal): 미지원 계열이 다시 이유를 말하게 — 내가 만든 퇴보를 되돌린다
Aug 19, 2026
8dcec80
feat(sparse): SPARSE_SubB 래퍼 — DIIHead 가 실제로 컴파일된다
Aug 19, 2026
514dca0
wip(sparse): SparseR-CNN 6단계 파이프라인이 끝까지 돈다 — 남은 것은 그래프 수치
Aug 19, 2026
df97dc1
feat(text): 텍스트 조건부 3계열 — transformers 설치 + no-box 경로 (86계열)
Aug 19, 2026
629d8a2
wip(sparse): 원인을 컴파일된 그래프로 확정 — 배관·가중치·fp16 은 무죄
Aug 19, 2026
be02ac5
fix(verify): 빌드 산출물이 없으면 링커 대신 하네스가 이유를 말한다
Aug 20, 2026
f5c3682
docs(mmdet): swin 의 이름 길이는 ggml 이 아니라 이름을 줄여 해결한다
Aug 20, 2026
0030100
docs: 공개 헤더·헤더 확장자·계열 수 내역·모델 파일명 정정
Aug 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 5 additions & 7 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -136,13 +136,11 @@ if(VISP_CI)
endforeach()
endif()
endif()
# ggml 기본 텐서명 한도 64자는 state_dict 키를 그대로 gguf 텐서명으로 쓰는 모델에 부족하다
# (mmdet HourglassNet: 68자). 넘으면 로드가 `tensor name is too long: 65 >= 64` 로 거부한다.
# ★ **ggml 자체 컴파일에도 닿아야 한다** — `ggml_tensor.name[GGML_MAX_NAME]` 이 구조체
# 레이아웃이라 라이브러리와 헤더의 값이 다르면 ABI 가 갈린다. 그래서 여기(서브디렉터리
# 추가 **전**)와 `visp/ml.h` 양쪽에 둔다. ml.h 쪽은 CMake 를 안 쓰는 소비자(손수 짠 g++)용.
# upstream ggml.h 는 `#ifndef` 가드라 이 정의가 우선한다 — llama 포크 수정 불필요.
add_compile_definitions(GGML_MAX_NAME=128)
# 텐서명 한도는 ggml 기본값(64) 을 그대로 쓴다. 그보다 긴 `state_dict` 키는 컴파일러가
# 줄인다(g2c `shared/compile/tensor_names.py`).
# 예전엔 여기서 128 로 올렸는데 그건 미루기였다 — 더 깊은 모델이면 또 넘고, **링크되는
# 모든 소비자가 같은 값을 써야** 해서 손으로 짠 g++ 한 줄만 빠져도 `ggml_tensor` 크기가
# 갈린다(`char name[GGML_MAX_NAME]` 이 구조체 레이아웃이다).

add_subdirectory(depend/llama/ggml)
set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_SAVED})
Expand Down
8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ Computer Vision ML inference in C++

Based on [ggml](https://github.com/ggml-org/ggml) similar to the [llama.cpp](https://github.com/ggml-org/llama.cpp) project.

New here? [**Getting started**](docs/getting-started.md) walks through a first run in five minutes.

**Docs:** [Getting started](docs/getting-started.md) · [Overview](docs/overview.md) · [Command line](docs/using-the-cli.md) · [Library API](docs/using-the-library.md) · [Implementing a model](docs/model-implementation-guide.md) · [MMDetection models](docs/mmdet-detectors.md)

### Features

| Model | Task | Backends |
Expand All @@ -20,6 +24,8 @@ Based on [ggml](https://github.com/ggml-org/ggml) similar to the [llama.cpp](htt
| [**MI-GAN**](#mi-gan) | Inpainting | CPU, Vulkan |
| [**ESRGAN**](#real-esrgan) | Super-resolution | CPU, Vulkan |
| [**YOLOv9t**](#yolov9t) | Object detection | CPU |
| [**MMDetection** models](docs/mmdet-detectors.md) | Object detection, segmentation, tracking | CPU |
| [**Compiled PyTorch models**](docs/mmdet-detectors.md#models-whose-head-survives-tracing) | Any traceable `nn.Module` — ultralytics YOLO, torchvision · full guide in the compiler checkout, `docs/vision-cpp-mmdet-guide-en.md` | CPU |
| [_Implement a model [**Guide**]_](docs/model-implementation-guide.md) | | |

**Backbones:** SWIN (v1), DINO (v2), TinyViT
Expand Down Expand Up @@ -123,7 +129,7 @@ vision-cli migan -m MIGAN-512-places2-F16.gguf -i image.png mask.png -o output.p
[Model download](https://huggingface.co/Acly/Real-ESRGAN-GGUF) | [Paper (arXiv)](https://arxiv.org/abs/2107.10833) | [Repository (GitHub)](https://github.com/xinntao/Real-ESRGAN) | License: BSD-3-Clause

```sh
vision-cli esrgan -m ESRGAN-4x-foolhardy_Remacri-F16.gguf -i input.png -o output.png
vision-cli esrgan -m RealESRGAN-x4plus_anime-6B-F16.gguf -i input.png -o output.png
```

#### YOLOv9t
Expand Down
101 changes: 101 additions & 0 deletions docs/getting-started.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# Getting Started

In this tutorial you will cut an object out of a photo using vision.cpp. It takes about five
minutes and needs nothing but the release package, one model file and one image — no build, no
Python, no conversion.

At the end you will have this:

| | |
| :--- | :--- |
| `mask.png` | a black-and-white mask of the object |
| `object.png` | the original photo with the background dimmed away |

## Step 1 — Get the executable

Download a [release package](https://github.com/Acly/vision.cpp/releases) and extract it. You
will find `vision-cli` in the `bin` folder.

Check that it runs:

```sh
vision-cli --help
```

You should see a list of commands: `sam`, `birefnet`, `depthany`, `migan`, `esrgan`.

> If you would rather build from source, follow [Building](../README.md#building) first, then
> come back here. `vision-cli` ends up in `build/bin`.

## Step 2 — Get a model and an image

The executable contains the network structure, but not the weights. Download them:

```sh
curl -L -O https://huggingface.co/Acly/BiRefNet-GGUF/resolve/main/BiRefNet-lite-F16.gguf
```

This is BiRefNet, a model that separates a subject from its background. The file is a
[GGUF](https://github.com/ggml-org/ggml/blob/master/docs/gguf.md) — the weights and nothing else.

For the input, use any photo with a clear subject. If you cloned the repository, there is one
at `docs/media/input.jpg`. Put it next to the model file and call it `input.jpg`.

## Step 3 — Run it

```sh
vision-cli birefnet -m BiRefNet-lite-F16.gguf -i input.jpg -o mask.png --composite object.png
```

The output tells you what it is doing:

```
Initializing backend... done (1.1 ms)
- device: CPU - Intel(R) Core(TM) i3-14100
Loading model weights from 'BiRefNet-lite-F16.gguf'... done (151.3 ms)
- float type: f16
- tensor layout: cwhn
- model image size: 1024
- inference image size: 1024x1024
- flash attention: off
Running inference... complete (5372.6 ms)
-> mask saved to mask.png
-> image composited and saved to object.png
```

Inference takes a few seconds on a desktop CPU. Loading the weights takes a fraction of a
second — that number is the point of the project, and it is the same on any machine.

## Step 4 — Look at the result

Open `object.png`. The subject is untouched and the background has faded away.

`mask.png` is what the model actually produced: white where the subject is, black elsewhere.
Everything in `object.png` was computed from it.

That is the whole loop. An executable that already knows the network, a `.gguf` that carries
the weights, an image in, a result out.

## Try one more

The same executable runs the other built-in models. Only the command and the weights change:

```sh
curl -L -O https://huggingface.co/Acly/Real-ESRGAN-GGUF/resolve/main/RealESRGAN-x4plus_anime-6B-F16.gguf

vision-cli esrgan -m RealESRGAN-x4plus_anime-6B-F16.gguf -i input.jpg -o upscaled.png
```

This one upscales the image four times. It works on tiles and takes noticeably longer — you will
see it count them off.

## Where to go next

- [Overview](overview.md) — what the library is and why weights and structure are separate.
- [Using the command line](using-the-cli.md) — every option, every built-in model.
- [Using the library](using-the-library.md) — the same models from your own code.
- [README](../README.md#features) — the other built-in models, and what each one does.
- [Model implementation guide](model-implementation-guide.md) — when the model you want is not
in the list, and you want to add it.
- [MMDetection detectors](mmdet-detectors.md) — running detectors whose structure is generated
rather than hand-written.
Loading
Loading