Nodes/ComfyUI-MiVolo-V2/MiVOLO Predictor (from Crops)
ComfyUI Node

MiVOLO Predictor (from Crops)

Bring your own face and body, get an age and gender

By vdeng-ai·Created 10 months ago·Updated 20 days ago· 26
MiVOLO Predictor (from Crops)
  • mivolo_model
  • face_image
  • body_image
  • prediction_text
  • age
  • gender

The from-crops predictor is the "you already did the hard part" node. If you've got a face crop - from Impact Pack, a bbox detector, an ADetailer-style pass, or just a manually cropped image - you don't need the pack's YOLO detector at all. You feed MiVOLO the crops directly and read the prediction off the other side. Canvas name: MiVOLO Predictor (from Crops), class MiVOLOAgeGenderPredictorFromCrops.

Why crops, and why "face and body"

Here's the thing that makes MiVOLO different from the age classifiers you've seen before: it's a multi-input model. It was trained to look at a face and a body jointly, and the body genuinely helps. Faces alone are ambiguous at the edges (a 16-year-old and a 26-year-old can read nearly identical in a close-up), but body cues like physique and clothing nudge the prediction toward the right decade. So the rule of thumb is simple: give it both if you can.

If you only have one, it still works - the model accepts either alone. But you need at least one wired in; run it with both inputs disconnected and the node raises a clear error rather than silently doing nothing.

The inputs that matter

  • mivolo_model (required) - from the Load MiVOLO Model node. Every run needs it.
  • face_image (optional) - a cropped face, as a standard ComfyUI IMAGE.
  • body_image (optional) - a cropped body or full person. Wire this in whenever you've got it; it's the accuracy booster, not an afterthought.

The three outputs

All three are STRING, which trips people up more than it should:

  • prediction_text - the human-readable line, like a 34 year old male. This is the one you'd display or drop into a text node.
  • age - the predicted age as a string (34, not 34.0, and not an integer). If you want to do numeric comparisons - "block anything predicted under 18," say - you'll need a Convert-to-INT or string-to-number step in between.
  • gender - a string like male or female.

Where you'd actually use this

Two real use cases. The first is quality control on AI portraits: generate a face, crop it, run the predictor, and you have a checkable "is this person reading as the age I asked for" signal instead of eyeballing it. The second is screening - the community has quietly been using MiVOLO-class models as age gates on generated content, with the honest caveat that it's not a perfect filter and occasionally misjudges. It's a heuristic, not a courtroom. Keep your expectations there.

Setup and gotchas

Install is the standard pack story - ComfyUI Manager, search ComfyUI-MiVolo-V2; or git clone https://github.com/deng-wei/ComfyUI-MiVolo-V2.git into custom_nodes/ plus pip install -r requirements.txt. The model auto-downloads on first run.

Two behavioral quirks to remember:

  • Only the first image of a batch is processed. Feed it a batched IMAGE and it takes [0] and drops the rest, with a warning in the console. For crops you'll usually be feeding single images anyway.
  • BGR conversion is the hidden step. ComfyUI IMAGE tensors are RGB; the node flips to BGR before running. You don't do anything with this, but it's why a crop straight off a standard node works and why you shouldn't pre-rotate or pre-process crops in ways that assume color channels.

One more trap: crops that are tiny or heavily upscaled from tiny make age estimation worse. Feed a reasonably sized, in-focus crop and the model does its job; feed a mushy 40×40 thumbnail and you'll get confident-sounding nonsense.

CategoryMiVOLO/AgeGender

Inputs (3)

NameTypeDefaultDescription
mivolo_modelMIVOLO_MODEL
face_imageoptIMAGE
body_imageoptIMAGE

Outputs (3)

NameTypeDescription
prediction_textSTRING
ageSTRING
genderSTRING