Quick start
- Drag images or a whole folder anywhere onto the page, or click the drop box to pick files. Non-image files are skipped, and so is any file with the same name and size as one already loaded. Use formats your browser can display, such as JPEG, PNG and WebP. If the detection models are still loading, the batch waits for them and then starts.
- Each image lands in Faces Detected or No Faces Detected as soon as it is scanned. Each batch has a progress line with a Cancel button.
- If the split looks wrong, open Advanced settings and move How sure must it be? (the score threshold). The buckets re-sort instantly.
- Use the Faces chips (1, 2, 3, 4, 5+) to narrow the Faces Detected bucket. Turn on Sort by expression if you also want expression labels.
- Check the images you want to keep and click ๐ฆ Download Selected.
Everything in Faces Detected starts checked and everything in No Faces Detected starts unchecked, so an immediate download gives you just the images where a face was found. Click a thumbnail to toggle it, or use ๐ View to see it full size.
Settings and good starting values
| Setting | Range | Default | What it changes | After changing |
|---|---|---|---|---|
| Detection size (Advanced) | 128โ768, steps of 64 | 512 | The resolution the detector works at | Pictures are analyzed again when you release the slider |
| How sure must it be? (Advanced) | 0.10โ0.90, steps of 0.05 | 0.30 | Minimum confidence for a detection to count as a face | Re-sorts instantly |
| Sort by expression | on / off | off | Runs the expression model on every detected face | Pictures are analyzed again when you switch it on |
| Show face boxes | on / off | off | Draws green boxes on thumbnails around each counted face | Instant |
Detection size
The detector scales each image so its longer side equals the input size, so what matters is how big a face is after scaling: face width ร input size รท the image's longer side. A 1024-pixel training image with a face 300 pixels wide still has a 150-pixel face at 512, which is easy to find. A distant face in a full-size camera photo can shrink to 10 or 20 pixels, and faces that small are where this detector struggles.
Keep 512 for most photo folders. Use 640 or 768 for group photos and wide shots (768 processes about 2.25 times as many pixels as 512). For close-up portraits, 256โ320 is usually enough and faster.
How sure must it be? (score threshold)
This setting trades missed faces against false alarms. The sorter always detects at 0.1 internally and keeps every candidate, which is why the slider can re-sort without rescanning. Start at 0.30. If patterns or pets land in Faces Detected, raise it to 0.5, which is face-api.js's own default. If obvious faces are missed, try 0.2 and review the extra hits.
Input Size, Score Threshold, the emotion toggle, the per-emotion sliders and your filter chips are remembered in your browser for next time. The face box toggle is not.
Filtering by face count
The Faces Detected header has five chips: 1, 2, 3, 4 and 5+. An image stays visible only if its face count matches a highlighted chip. All five are on by default, and turning them all off switches the filter off. The count is the number of detections above your score threshold, so raising the threshold can move an image from "2" to "1".
These chips only affect Faces Detected. Each bucket header shows (selected/visible) for what is currently on screen.
Sorting by expression
Turn on Sort by expression. The pictures are analyzed again automatically. Any image scanned while it was off shows "๐ซฅ not analyzed" until that finishes. The expression model scores seven expressions for each face: ๐ neutral, ๐ happy, ๐ข sad, ๐ก angry, ๐ฒ surprised, ๐จ fearful and ๐คข disgusted.
Each expression has its own slider (0.10โ0.99, default 0.60). A label appears under the thumbnail, with its percentage (for example ๐ 87%), only when the score reaches that slider. The seven scores for a face always add up to 1. With every slider at 0.60, a face can therefore get at most one label. Set two sliders below 0.5 and a mixed expression can carry both. Labels come from one face per image, the detection with the highest score.
The emoji chips in the bucket header filter by these labels. Highlighted chips combine with "or": ๐ plus ๐ฒ shows images labeled happy or surprised. Two extra chips catch the rest. ๐ถ shows images that were analyzed but where no expression passed its slider, and ๐ซฅ shows images that were not analyzed. Expression and face-count chips work together, so ๐ plus the 1 chip shows single, smiling faces.
Downloading your selection
๐ฆ Download Selected saves every checked image as face_sorted.zip. The files are your originals, byte for byte, with their original names. Nothing is re-encoded, and face boxes are never drawn on them. The ZIP is flat, with no folder per bucket.
The download includes checked images that a filter is hiding. The Selected Images counter at the top counts them too, while the bucket counts only include what is visible. To download just a filtered set, make every image visible and untick the bucket's header checkbox. Then set your filters and tick the header checkbox again. It selects only the visible images. Check the counter, then download.
What the detector can and can't see
The sorter uses face-api.js's TinyFaceDetector, a model of about 190 KB built for speed. Its documentation says it does slightly worse on small faces than the library's larger detector. Expect it to miss, or score low:
- small or distant faces, especially in high-resolution photos at low input sizes;
- faces in profile, turned away, steeply tilted or cut off by the frame;
- faces partly covered by hands, masks, hair, hats or deep shadow;
- stylized faces: anime, cartoons, paintings, sculptures and 3D renders.
The last point matters for illustration datasets. face-api.js was built for photos of real people, and drawn faces have very different proportions and shading. Some are detected and many are not, and results swing with the art style. For anime-style images, the auto tagger's solo, multiple_girls and no_humans tags are usually a better guide to how many characters are present.
Treat expression labels as a rough signal. The model is small and reads one cropped face at a time. Its README also notes that glasses can reduce accuracy.
Good uses and responsible use
The sorter is built for tidying collections. You can pull the people shots out of a mixed photo dump, separate landscapes from portraits, or filter a training set down to images with exactly one clear face before you caption it. Running the duplicate finder first means fewer images to review. The face detection curation guide has step-by-step recipes.
The tool detects faces; it does not recognize them. It has no idea who anyone is, and it cannot match a face across photos. face-api.js does include a separate face recognition model, but this tool never loads it. Please don't use the sorter to single out or profile people, and don't treat expression labels as evidence of anyone's mood or character. If the photos show other people, make sure you have the right to use them for what you are building.
Privacy
Your images never leave your device: the browser opens them from your disk, and face-api.js analyzes them inside the tab. Besides the code libraries and ads, the page downloads the weights for two small models (the detector and the expression model) from the face-api.js project's GitHub Pages site when it opens. Closing or reloading the tab discards the images and results. Read more in our guide to in-browser AI and privacy and in our privacy policy.
Frequently asked questions
Can I download each face-count group into its own folder?
Not in one step, because the ZIP is flat. Make one selection per group and download each separately. For example, select the 1-face images and download, then select the group shots and download again. Rename each face_sorted.zip as it arrives so you can tell them apart.
Why did my checkmarks reset?
Moving the "How sure must it be?" slider, or analyzing again (which happens when you change the detection size or switch on expression sorting), rebuilds both buckets. Selections go back to the defaults: faces checked, no faces unchecked. Settle the threshold and input size first, then make your selections.
How many images can I load at once?
There is no fixed limit. Every image stays in memory while the tab is open, so your device's memory is the practical ceiling. For thousands of large photos, work in batches and use โ Remove All Images between them.
Do I need to stay online while it works?
The page needs a connection when it opens, to load face-api.js and its two models. After that, scanning and sorting happen on your device and don't send anything anywhere.