Load SMIRK
The face specialist — small, MIT, and drives a non-commercial engine
- model
Load SMIRK is the loader for the face-expression path in this pack - the answer to "why does my estimated body have a blank stare?" SMIRK (Retsinas et al., CVPR 2024) is a dedicated face expression encoder: you give it a face crop, it regresses FLAME expression and jaw pose, and this pack converts those into SMPL-X expression coefficients and jaw_pose. Feed the result into a body estimator's smplx_face input and your neutral face gets actual expression.
It's the smallest, most self-contained loader in the pack. No smplx_model input required - SMIRK is face-only - and the code license is MIT, which is the permissive bright spot in a pack full of non-commercial walls. The asterisk: SMIRK drives FLAME, and FLAME is MPI non-commercial. So the code is MIT while the model it's built around isn't. Same research-only bottom line as everything here, just with friendlier code.
What you set
- model_source -
local(default) orhuggingface. - model_path -
ComfyUI/models/smirk/, expectingSMIRK_em1.ptfrom the georgeretsi/smirk repo. - hf_token - gated/private repos only.
- device -
auto/cuda/cpu.
Output is a model connection (type SMIRK_MODEL) feeding Face: SMIRK.
Installing
Same pack install as the rest - ComfyUI Manager, search SMPLx Estimator, install, restart - or:
cd ComfyUI/custom_nodes
git clone https://github.com/ameliacode/ComfyUI-SMPLx-Estimator.git
cd ComfyUI-SMPLx-Estimator
pip install -r requirements.txt
python install.py
install.py clones the SMIRK source into vendor/smirk (override with SMIRK_DIR). No special extra dependencies beyond the pack baseline for this one - SMIRK rides on torch and torchvision. The only manual download is SMIRK_em1.pt (plus, if you're using the body path, the registration-walled SMPL-X file - see the Load SMPLx article).
Gotchas
- It's a single weight file, easy to miss. The loader raises a clear
FileNotFoundErrortelling you the exact path it wants whenSMIRK_em1.ptisn't inmodels/smirk/. Check that before assuming something deeper is broken. - Quality depends on your crop, not the loader. The real tuning happens on Face: SMIRK, which wants a roughly centered head-region crop (resized to 224×224 internally). Garbage crop in, garbage expression out.
- Expression, not identity. SMIRK gives you jaw and expression - the movement of the face. It doesn't recover identity/shape of the head; that comes from the body estimator's own prediction.
If you want your SMPL-X results to have actual facial expression, this is the cleanest way to get it. It's also the friendliest loader in the pack to get working - one file, no registration, no heavy side-deps.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| model_source | COMBO | local | 2 options: local, huggingface |
| model_path | STRING | /tmp/ComfyUI/models/smirk | local: folder holding the weight file(s). huggingface: leave model_path; set hf_token for gated/private repos. |
| hf_token | STRING | HuggingFace access token. | |
| device | COMBO | auto | 3 options: auto, cuda, cpu |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | SMIRK_MODEL | — |