Step one: finding the faces
The tool uses face-api.js, an open-source library that runs face models inside your web browser. When you add a photo, it is first downscaled on your device. Then the library looks for a face. For each face it finds, it returns three things we use.
If no face is found in a photo, the tool stops and tells you. There is no score in that case. We would rather show nothing than make a number up. If a photo has several faces, such as a group shot, you can pick the face you mean with the face picker.
- 68 landmark points around the jaw, brows, nose, eyes and mouth.
- Seven expression probabilities: neutral, happy, sad, angry, fearful, disgusted and surprised.
- A face descriptor: a list of 128 numbers that a recognition model uses to tell faces apart.
Signal 1: face resemblance (25% of the blend)
Each face descriptor is a point in a 128-dimension space. Faces that the model thinks belong to the same person land close together. We measure the straight-line distance between the two points.
A distance of 0.4 or less counts as 100. A distance of 0.9 or more counts as 0. Anything in between is scaled in a straight line. For reference, two photos of the same person usually land around 0.3 to 0.45, and two strangers usually land around 0.6 to 0.8.
What it means: the recognition model sees some overlap in the features it was trained to use. What it does not mean: that you are related, that you are a good match, or that a person would say you look alike. The model was built to identify people, not to judge chemistry.
Signal 2: mood match (40% of the blend)
The expression model gives each face seven probabilities that add up to about 1. A big smile might read as 0.95 happy. A calm face might read as mostly neutral. We treat each set of seven numbers as a direction and measure how closely the two directions point the same way. This is called cosine similarity. Same mood gives close to 100. Very different moods give a low number.
Mood carries the most weight because it is the part you control. It reflects the moment the photos were taken, not who you are. Two people grinning in a photo booth will match well. The same two people, one laughing and one mid-sneeze, will not.
Signal 3: proportion match (35% of the blend)
From the 68 landmarks we work out five ratios. Ratios are used instead of raw positions, so the size and crop of the photo do not matter.
For each ratio we take the relative difference between the two faces, then average the five. The match is 100 minus that average times 250, kept between 0 and 100. So an average gap of 10% gives about 75.
- Face shape: face width divided by height (brow line to chin).
- Eye gap: distance between the eye centres divided by face width.
- Nose length: bridge to tip, divided by face height.
- Mouth width: corner to corner, divided by face width.
- Eye to mouth: distance from the eyes to the mouth, divided by face height.
The exact formula, and why the score is 55 to 100
blend = 0.40 × mood + 0.35 × proportion + 0.25 × resemblance. Then fun score = round(55 + 0.45 × blend). A blend of 0 gives 55 and a blend of 100 gives 100.
The floor of 55 is a design choice, and we are open about it. This is a game people play with someone they care about. A score of 12% would feel like a verdict, and it would not be a fair one, because none of these signals measure anything that matters in a relationship. Keeping the range kind keeps the game fun.
If one signal cannot be measured, for example if the recognition model fails to load, it is left out and the other weights are scaled up to fill the gap. The result screen shows which signals were actually measured.
Match types and score bands
Each result also gets one of four match types. Looks count as similar when resemblance or proportion is 60 or more, or resemblance alone is 50 or more. Mood counts as similar when mood match is 60 or more. Mirror Match is similar looks and similar mood. Same Wavelength is different looks but the same mood. Look-alikes, Different Moods is the reverse. Opposites Attract is different on both.
The score bands are just labels: 90 and up is Off the charts, 80 to 89 is Big match energy, 70 to 79 is Sweet match, and 55 to 69 is A spark to build on.
Same photos, same score
There is no random number anywhere in the method. The models are fixed, the maths is fixed, and the weights are fixed. Run the same two photos again and you get the same result. Swap which photo goes on the left and you still get the same result, because every signal is symmetric.
A different photo of the same people will give a different score. That is expected. Expression and head angle change from shot to shot, and so do the measurements.
One photo, two photos or a whole group
The same method runs whichever way you add photos. With Two photos, each person has their own picture. With One photo together, a couple selfie or any photo with both people in it, the two largest faces are picked and you tap the thumbnails to set who is who. Both faces then go through exactly the same three signals.
With Group ranking you add one group photo. Up to eight faces are used (the eight largest if there are more), and every possible pair is scored with the same formula, so four people make 6 pairs and eight make 28. The pairs are sorted by score, and the pair with the highest mood match and the pair with the highest face resemblance get their own call-outs.
What else the result shows
Under the three signals you get the detail behind them. Feature by feature shows a bar for each of the five ratios, with how far apart the two faces are in percent, the closest feature and the most different one. Expressions side by side lists the top three expression scores for each face. Why this number points at any signal under 70 and gives a plain tip for a retake, because the score follows the photos, not the relationship.
You can save the result as an image in post (4:5), story (9:16) or square (1:1) size, or copy a result link. The link holds the mode, the names and the four numbers only. When someone opens it, the numbers are checked again and the match type is worked out from them, so a link cannot carry anything else.
Privacy: what is downloaded and what stays with you
The only things your browser downloads are the page and the face model files from altftool.com/models. Your photos are read from your device, shrunk locally and analysed locally. They are never uploaded to our servers or anyone else's.
Recent results are saved in your browser's local storage so you can look back at them. They store the scores and names, not the photos. A clear-all button removes them. The share card is made on your device too, and photos are left off it by default. You choose whether to include them. The laptop Camera button draws one frame on a local canvas and stops the camera as soon as you capture or close it.
Limitations, honestly
Face models are sensitive to lighting, head angle, blur, glasses and heavy filters. A turned head squashes some of the ratios. Dim light can make the expression model guess.
Face models trained on public photo datasets are known to work less evenly across ages, skin tones and other groups, because those datasets are not evenly balanced. That can affect how well faces are found and how the numbers come out. It is one more reason to treat the score as play.
Most important: the score is not a measure of attraction, love, personality or whether a relationship will work. It compares two photos. It cannot know anything about the two people in them. If you want more ways to have fun with photos, the other image tools on AltFTool run in your browser in the same private way.