Views
No views yet
Puker_Judge 是基于
HuggingFaceTB/SmolVLM2-2.2B-Instruct
微调的两阶段扑克牌拼接候选判断模型。binary_adapter/:判断一张已经拼好的候选牌面是 VALID 还是 INVALID。rank_adapter/:从同一组碎片产生的 2–4 个几何可行候选中选择图案最连贯的一个。processor/:训练时使用的 SmolVLM2 processor 和 tokenizer。binary_adapter,做多候选选择时加载
rank_adapter。binary_adapter 判断其图案是否合理;rank_adapter 选择最佳候选;binary_adapter 逐张筛选到 Top-4,再交给
rank_adapter。1python -m venv .venv
2source .venv/bin/activate
3pip install -r requirements.txtpip install -r requirements-int4.txtrank_adapter。实测中,rank adapter 在Joker三候选顺序
轮换上保持了BF16的判断;但 binary adapter 的一个测试集VALID样本在INT4下翻转
成了INVALID。因此单候选二分类默认应使用BF16,除非已经在自己的数据上重新验证
INT4准确率。600×360 像素,对应物理尺寸比例 100:60;1280×820;2、3或4,不能超过4;600×360;1, 2, 3, 4,放在候选图外部;infer_rank.py 可以接收2–4张候选图并自动生成符合训练格式的 board。Judge whether this geometrically assembled playing card has coherent rank, suit, border, portrait, symbols, and continuous artwork. A whole-card 180-degree rotation is valid. Answer VALID or INVALID only.VALIDINVALID{labels} 要根据选项数生成,例如3个候选就是 1, 2, 3:All displayed candidates are geometrically valid reconstructions made from the same playing-card pieces. Select the candidate whose rank, suit, outer border, portrait, symbols, and line artwork form one coherent original playing card. A whole-card 180-degree rotation is equivalent. The available labels are {labels}. Answer with one label only.python infer_binary.py candidate.jpgpython infer_binary.py candidate.jpg --int41{
2 "prediction": "VALID",
3 "raw_output": "VALID",
4 "quantization": "int4-nf4"
5}candidate_board.jpg:1python infer_rank.py \
2 candidate_1.jpg \
3 candidate_2.jpg \
4 candidate_3.jpg \
5 --board-output candidate_board.jpg \
6 --int41{
2 "selected_label": 2,
3 "selected_file": "/path/to/candidate_2.jpg",
4 "candidate_count": 3
5}1python infer_rank.py \
2 --board-image candidate_board.jpg \
3 --candidate-count 3 \
4 --int41from pathlib import Path
2
3import torch
4from huggingface_hub import snapshot_download
5from peft import PeftModel
6from transformers import AutoModelForImageTextToText, AutoProcessor
7
8repo_dir = Path(snapshot_download("TuWaveGod/Puker_Judge"))
9processor = AutoProcessor.from_pretrained(repo_dir / "processor")
10base = AutoModelForImageTextToText.from_pretrained(
11 "HuggingFaceTB/SmolVLM2-2.2B-Instruct",
12 torch_dtype=torch.bfloat16,
13).to("cuda")
14model = PeftModel.from_pretrained(
15 base,
16 repo_dir / "rank_adapter",
17).eval()