-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
144 lines (128 loc) · 7.67 KB
/
Copy pathMakefile
File metadata and controls
144 lines (128 loc) · 7.67 KB
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# ──────────────────────────────────────────────────────────────────────────────
# Faces — model training
#
# Usage:
# make pretrained # skip training — use InsightFace pretrained weights
# make train # auto: downloads both, trains on all present
# DATASET=digiface make train # DigiFace-1M only
# DATASET=glint make train # Glint360K only (must have .rec already)
#
# Individual steps:
# make setup # create venv + install deps
# make download # download dataset (DigiFace only)
# make prepare # align / validate images
# make fit # run training
# make export # ONNX → CoreML + TFLite
# make validate # LFW accuracy (needs model/data/lfw_aligned)
# make clean # wipe model/data/, model/checkpoints/, model/model.onnx
# ──────────────────────────────────────────────────────────────────────────────
DATASET ?= auto
GLINT_REC ?= $(MODEL)/data/raw_glint/train.rec
MODEL := model
PYTHON := $(MODEL)/.venv/bin/python
PIP := $(MODEL)/.venv/bin/pip
# ── per-dataset knobs ──────────────────────────────────────────────────────────
ifeq ($(DATASET),digiface)
EPOCHS := 40
BATCH := 128
FINAL_CKPT := $(MODEL)/checkpoints/epoch_040.pt
else
# glint / combined / auto — assume large-scale data
EPOCHS := 30
BATCH := 256
FINAL_CKPT := $(MODEL)/checkpoints/epoch_030.pt
endif
.DEFAULT_GOAL := help
# ── venv ───────────────────────────────────────────────────────────────────────
$(MODEL)/.venv: $(MODEL)/requirements.txt
python3.11 -m venv $(MODEL)/.venv
$(PIP) install --upgrade pip -q
$(PIP) install -r $(MODEL)/requirements.txt -q
ifneq ($(DATASET),digiface)
$(PIP) install libtorrent -q || true
endif
setup: $(MODEL)/.venv ## Create venv and install deps
# ── download ───────────────────────────────────────────────────────────────────
download: $(MODEL)/.venv ## Download datasets (skips what is already present)
ifeq ($(DATASET),digiface)
$(PYTHON) $(MODEL)/dataset/download_synthetic.py --dst $(MODEL)/data/raw
else ifeq ($(DATASET),glint)
$(PYTHON) $(MODEL)/dataset/download_glint.py --dst $(MODEL)/data/raw_glint
else
# auto / combined — download both; each script skips if already present
$(PYTHON) $(MODEL)/dataset/download_synthetic.py --dst $(MODEL)/data/raw
$(PYTHON) $(MODEL)/dataset/download_glint.py --dst $(MODEL)/data/raw_glint
endif
# ── prepare ────────────────────────────────────────────────────────────────────
prepare: $(MODEL)/.venv ## Validate images and merge datasets (auto-detects what is present)
ifeq ($(DATASET),digiface)
$(PYTHON) $(MODEL)/dataset/prepare_synthetic.py \
--src $(MODEL)/data/raw --dst $(MODEL)/data/aligned
else ifeq ($(DATASET),glint)
$(PYTHON) $(MODEL)/dataset/convert_mxnet.py \
--rec $(GLINT_REC) --dst $(MODEL)/data/raw_glint_converted
$(PYTHON) $(MODEL)/dataset/prepare_synthetic.py \
--src $(MODEL)/data/raw_glint_converted --dst $(MODEL)/data/aligned
else
# auto / combined — detect what is present and prepare accordingly
$(PYTHON) $(MODEL)/dataset/prepare_auto.py --base $(MODEL)/data
endif
# ── train ──────────────────────────────────────────────────────────────────────
fit: $(MODEL)/.venv ## Run model training
$(PYTHON) $(MODEL)/train.py \
--data $(MODEL)/data/aligned \
--epochs $(EPOCHS) \
--batch $(BATCH) \
--output $(MODEL)/checkpoints/
# ── export ─────────────────────────────────────────────────────────────────────
export: $(MODEL)/.venv $(FINAL_CKPT) ## Export ONNX → CoreML + TFLite
$(PYTHON) $(MODEL)/export/to_onnx.py \
--checkpoint $(FINAL_CKPT) \
--output $(MODEL)/model.onnx
$(PYTHON) $(MODEL)/export/to_coreml.py \
--onnx $(MODEL)/model.onnx \
--output ios/Sources/FacesKit/Resources/MobileFaceNet.mlpackage
$(PYTHON) $(MODEL)/export/to_tflite.py \
--onnx $(MODEL)/model.onnx \
--output android/faceskit/src/main/assets/mobilefacenet.tflite
# ── validate (LFW) ─────────────────────────────────────────────────────────────
# Download LFW first:
# curl -O http://vis-www.cs.umass.edu/lfw/lfw-funneled.tgz
# tar xzf lfw-funneled.tgz -C model/data/lfw_aligned/
# curl -O http://vis-www.cs.umass.edu/lfw/pairs.txt -o model/data/lfw_pairs.txt
validate: $(MODEL)/.venv $(FINAL_CKPT) ## LFW accuracy check
$(PYTHON) $(MODEL)/validate.py \
--checkpoint $(FINAL_CKPT) \
--lfw $(MODEL)/data/lfw_aligned
# ── full pipeline ──────────────────────────────────────────────────────────────
train: $(MODEL)/.venv ## Full pipeline: download → prepare → fit → export
ifeq ($(DATASET),glint)
@test -f $(GLINT_REC) || \
(printf "\nERROR: $(GLINT_REC) not found. Download Glint360K from InsightFace.\n\n" && exit 1)
$(MAKE) prepare DATASET=glint
else
$(MAKE) download DATASET=$(DATASET)
$(MAKE) prepare DATASET=$(DATASET)
endif
$(MAKE) fit DATASET=$(DATASET)
$(MAKE) export DATASET=$(DATASET)
@echo ""
@echo " Done. Models written to:"
@echo " ios/Sources/FacesKit/Resources/MobileFaceNet.mlpackage"
@echo " android/faceskit/src/main/assets/mobilefacenet.tflite"
@echo ""
# ── pretrained shortcut ────────────────────────────────────────────────────────
pretrained: $(MODEL)/.venv ## Download InsightFace pretrained weights and export (skips training)
$(PYTHON) $(MODEL)/download_pretrained.py --output $(MODEL)/model.onnx
$(PYTHON) $(MODEL)/export/to_coreml.py \
--onnx $(MODEL)/model.onnx \
--output ios/Sources/FacesKit/Resources/MobileFaceNet.mlpackage
$(PYTHON) $(MODEL)/export/to_tflite.py \
--onnx $(MODEL)/model.onnx \
--output android/faceskit/src/main/assets/mobilefacenet.tflite
# ── clean ──────────────────────────────────────────────────────────────────────
clean: ## Wipe data, checkpoints, and model.onnx
rm -rf $(MODEL)/data $(MODEL)/checkpoints $(MODEL)/model.onnx
.PHONY: help setup download prepare fit export validate train pretrained clean
help: ## Show this help
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-12s\033[0m %s\n", $$1, $$2}'