<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[TryFaceSearch Blog]]></title><description><![CDATA[TryFaceSearch Blog]]></description><link>https://tryfacesearch.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sun, 01 Nov 2026 13:08:51 GMT</lastBuildDate><atom:link href="https://tryfacesearch.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Pixels vs. Faces: How Face Search Works (and Why Perceptual Hashing Misses Cropped Photos)]]></title><description><![CDATA[Drop a screenshot of a profile picture into a classic reverse image search and you'll often get nothing back. That's not a bug. It's a consequence of what…]]></description><link>https://tryfacesearch.hashnode.dev/pixels-vs-faces-how-face-search-works-and-why-perceptual-hashing-misses-cropped-photos</link><guid isPermaLink="true">https://tryfacesearch.hashnode.dev/pixels-vs-faces-how-face-search-works-and-why-perceptual-hashing-misses-cropped-photos</guid><category><![CDATA[Machine Learning]]></category><category><![CDATA[Computer Vision]]></category><category><![CDATA[privacy]]></category><category><![CDATA[AI]]></category><category><![CDATA[image processing]]></category><dc:creator><![CDATA[TryFaceSearch]]></dc:creator><pubDate>Mon, 26 Oct 2026 10:56:34 GMT</pubDate><content:encoded><![CDATA[<h2>The Empty Results Problem</h2>
<p>Drop a screenshot of a profile picture into a classic reverse image search and you'll often get nothing back. That's not a bug. It's a consequence of what those engines are designed to match: images, not people.</p>
<p>If you're building anything that deals with user photos, verification or trust and safety, it's worth understanding why the two approaches behave so differently.</p>
<h2>Approach 1: Perceptual Hashing</h2>
<p>Most traditional reverse image search starts from some form of <a href="https://en.wikipedia.org/wiki/Perceptual_hashing">perceptual hashing</a>. Unlike a cryptographic hash, a perceptual hash is designed so that visually similar images produce similar fingerprints.</p>
<h3>How it works</h3>
<p>A typical pipeline, such as aHash, dHash or pHash, looks like this:</p>
<ul>
<li>Downscale the image to a tiny grid, for example 32x32</li>
<li>Convert it to greyscale</li>
<li>Optionally apply a DCT and keep the low-frequency coefficients</li>
<li>Threshold the values into a 64-bit fingerprint</li>
<li>Compare fingerprints with Hamming distance</li>
</ul>
<h3>Where it breaks</h3>
<p>Perceptual hashes tolerate compression and minor resizing well. They struggle with:</p>
<ul>
<li><strong>Aggressive crops:</strong> the global structure changes</li>
<li><strong>Mirroring and rotation:</strong> most simple hashes are not invariant to them</li>
<li><strong>Heavy filters or overlays:</strong> shifts in tone and added UI elements</li>
<li><strong>A different photo of the same person:</strong> a completely different fingerprint</li>
</ul>
<p>That last case is fundamental. A hash describes an image, so two different photos of one person are, by design, unrelated.</p>
<h2>Approach 2: Face Search</h2>
<p>Face search changes the unit of comparison from the image to the face. When you search by face, the pipeline usually has four stages.</p>
<h3>1. Detection</h3>
<p>A detector (RetinaFace, MTCNN or similar) finds faces and returns bounding boxes plus landmarks: eyes, nose, mouth corners. Everything outside the box is discarded, which immediately removes borders, backgrounds and screenshot chrome.</p>
<h3>2. Alignment</h3>
<p>Using the landmarks, each face is warped with an affine transform to a canonical pose and size, typically 112x112 with the eyes at fixed coordinates. This makes the next stage far less sensitive to tilt, scale and framing.</p>
<h3>3. Embedding</h3>
<p>A CNN or vision transformer trained with a margin-based loss (ArcFace-style objectives are common) maps the aligned face to a vector, often 512 dimensions, L2-normalised. The training objective pulls embeddings of the same identity together and pushes different identities apart, so cosine similarity becomes a proxy for "same person".</p>
<h3>4. ANN vector search</h3>
<p>Exact nearest-neighbour search over millions of vectors is too slow, so production systems use approximate nearest neighbour indexes:</p>
<ul>
<li><strong>HNSW</strong> graphs for low-latency, high-recall queries</li>
<li><strong>IVF</strong> partitioning combined with product quantisation to save memory</li>
<li>A similarity threshold to drop weak matches before ranking</li>
</ul>
<p>The result is a ranked list of faces, from indexed public sources, closest to the query.</p>
<h2>Why This Matters in Practice</h2>
<p>Because comparison happens in embedding space, the cases that break hashing often survive: a cropped selfie, a mirrored image, a filtered profile picture, even a different photo of the same person. That's why a tool that lets you <strong><a href="https://tryfacesearch.com/reverse-face-search">search by face</a></strong> can spot a dating profile using borrowed photos, or a fake account impersonating someone, when a hash-based lookup returns nothing.</p>
<h3>Trade-offs to keep in mind</h3>
<ul>
<li><strong>False positives:</strong> lookalikes exist; thresholds need tuning</li>
<li><strong>Quality sensitivity:</strong> blur, occlusion and extreme angles degrade embeddings</li>
<li><strong>Bias:</strong> model accuracy can vary across demographic groups, so evaluate on diverse data</li>
</ul>
<h2>The Responsible-Use Part</h2>
<p>Face embeddings are biometric data. If you build or use this kind of system:</p>
<ul>
<li>Index only publicly available sources</li>
<li>Avoid retaining uploaded images longer than necessary</li>
<li>Design for verification and safety use cases: catfish checks, impersonation reports, searching your own face</li>
<li>Never support tracking or exposing private individuals</li>
</ul>
<h2>Takeaway</h2>
<p>Hashes answer "where is this image?". Embeddings answer "where is this face?". Pick the one that matches the question you're actually asking.</p>
]]></content:encoded></item></channel></rss>