FAQ
Common questions about ForgeFind and image forgery detection.
What is image forgery?

Image forgery is any deliberate manipulation of a photo to misrepresent what it shows. The two most common types are splicing (pasting part of one image into another) and copy-move (duplicating a region within the same image to hide or create objects).

What types of manipulation does ForgeFind detect?

ForgeFind targets two specific forgery types. The splicing detector (a U-Net neural network) finds regions that were pasted in from a different image. The copy-move detector (an OpenCV SIFT pipeline) finds regions that were cloned within the same image.

It does not currently detect things like brightness/contrast edits, color grading, AI-generated images, or face swaps.

Is ForgeFind free to use?

Yes. ForgeFind is open source under the MIT license. You can use it, modify it, or build on top of it.

How accurate is it?

The U-Net model was trained on the CASIA dataset and performs well on clear splicing cases. The SIFT copy-move pipeline is reliable for duplicated regions that have distinct features (textures, edges, objects).

That said, no detection tool is perfect. Heavily compressed images, very small edits, or manipulations followed by re-saving can reduce accuracy. ForgeFind includes multiple post-processing steps (blob filtering, mask ratio limits, homography checks) specifically to reduce false positives.

What does the confidence score mean?

For splicing, the confidence score is the average probability the model assigned to all pixels it flagged as tampered. A score of 85% means the model is, on average, 85% sure about the regions it highlighted.

For copy-move, detection is more binary. If the SIFT pipeline finds a verified clone (passing the ratio test, spatial separation, RANSAC, and overlap checks), it reports 98%. Otherwise it reports 0%.

The overall score shown at the top takes whichever is higher.

Why did it flag my image as manipulated when it's not?

False positives can happen. Images with lots of repeated patterns (text, tiles, fences) sometimes trigger the copy-move detector. The splicing model can also flag regions on images that were saved with heavy JPEG compression, since compression artifacts can look similar to splice boundaries.

ForgeFind already applies several filters to reduce these (minimum blob area, mask ratio limits, confidence-scaled thresholds), but edge cases exist.

Why did it miss a manipulation I know is there?

A few reasons this can happen. Very small edits might produce mask regions below the minimum blob threshold and get filtered out. Heavily recompressed images lose the artifacts that the model relies on. And the copy-move detector needs at least 6 geometrically consistent feature matches to confirm a clone, so textureless or blurry duplicated regions can slip through.

What happens to my uploaded image?

Your image is saved temporarily on the server so the detection engines can process it and so the browser can display the results. A cleanup task runs every 10 minutes and deletes all uploads older than 10 minutes. Nothing is stored permanently or shared with anyone.

What file formats are supported?

PNG, JPEG, and WebP. The backend validates file type by reading the binary signature (magic bytes) of the uploaded file, not the file extension. If the bytes don't match a supported image format, the upload is rejected with a 415 error.

Is there a file size limit?

There's no hard limit enforced in the app, but very large images will take longer since the U-Net still processes at 256x256 internally and the SIFT detector scales with the number of keypoints. Anything under 10MB should work without issues.

What's the tech stack?

The backend is Python with FastAPI, running PyTorch (U-Net via segmentation-models-pytorch) and OpenCV for detection. It's containerized with Docker and hosted on HuggingFace Spaces. The frontend is vanilla HTML, CSS, and JavaScript, hosted on Netlify.

Can I run it locally?

Yes. Clone the repo, install the Python dependencies from requirements.txt, and run the FastAPI server with uvicorn main:app. The model weights download automatically on first run. You'll need to update the API URL in the frontend's api.js to point to localhost.