Inspiration

Romance scams are one of the fastest-growing categories of online fraud, and they almost always start with a photo. A scammer builds fake profiles around faces that never existed and fosters emotional connection and trust before defrauding victims. The face is the entry point for their entire scheme, and is what makes a stranger feel safe enough to let their guard down. Today, AI image generators have gotten realistic enough to power large-scale catfishing. A scammer can now simply generate a brand-new, untraceable face for every fake profile instead of relying on stolen photos that could sometimes be caught through reverse image search.

We also noticed a gap in how AI-image detectors are usually tested. Most detection tools and research benchmarks are only evaluated on clean, high-resolution images produced straight from a generator. Yet in the real world, profile pictures go through a lot before anyone sees them. When uploaded to a dating app, they get resized into thumbnails, re-compressed, or sometimes cropped or filtered to fit a profile frame. Every one of those steps can change the pixel-level details a detector might be relying on. We believe honesty is what would actually matter to a platform or a person genuinely trying to use a tool like this to stay safe. As such, we wanted to build something that is accurate about where it breaks and not just how well it performs under ideal conditions.

What it does

ProfileGuard takes an image (or folder of images) and outputs a confidence score estimating how likely it is to be AI-generated.

  • Core detection: binary real vs. AI-generated classification on face images, with JSON output containing per-image confidence score.
  • Robustness-first evaluation: specifically trained and tested against 14 real-world image degradation conditions that happen naturally when photos move through real platforms: JPEG compression, blur, downscaling, noise, colour adjustment, and cropping.

How we built it

Datasets: 140k Real and Fake Faces dataset from Kaggle, containing 70,000 real human faces and 70,000 StyleGAN-generated faces. Robustness test conditions were self-generated by applying the exact transform parameters from the challenge brief to held-out test images.

Training: We used transfer learning on EfficientNet-B0, pretrained on ImageNet, with roughly 5.3 million parameters, well under the 2 billion parameter limit. We first trained a baseline model on clean images, then ran a second robustness-focused fine-tuning pass applying randomised real-world corruptions, JPEG compression at varying quality levels, Gaussian blur, resize-and-upscale, Gaussian noise, colour jitter, and centre cropping, to training images on the fly. This forced the model to learn features that survive these transformations rather than fragile pixel-level artefacts.

Stack: Google Colab, PyTorch, timm, torchvision, OpenCV, and Pillow.

Results

Our baseline model scored 99.4% on clean images, but collapsed to as low as 46.8% (essentially random guessing) under heavy blur, aggressive downscaling, and strong noise, which are exactly the conditions real profile pictures encounter. After robustness training, the same conditions recovered to 92-99% accuracy, a gain of up to +49.8 percentage points, while clean-image accuracy stayed at 99-100%.

Challenges we ran into

  • Colab instability: Free-tier Colab sessions disconnect unpredictably, which cost us training progress early on until we started checkpointing to Google Drive after every epoch.
  • Layer-freezing tuning: We also had to be deliberate about which layers to unfreeze during fine-tuning. Freezing too much of the network left us with an accuracy stuck around 80%. Our final approach, freezing only early layers and fine-tuning the later blocks, then got us into the high 90s.
  • GPU quota limits: We also hit Google Colab's free-tier GPU usage limits partway through, which ultimately forced us to fall back to CPU for inference.

Accomplishments we're proud of

We quantified the actual size of the robustness gap, a roughly 50-point real-world performance cliff that would be invisible from clean-image benchmarks alone, and closed most of that gap with a lightweight, beginner-accessible training approach, entirely on free compute. We also went beyond aggregate accuracy to uncover directional error patterns, such as blur specifically causing false negatives, and potential fairness signals, rather than reporting a single flat accuracy number.

What we learned

Clean-benchmark accuracy can be dangerously misleading for a detector meant to operate in the real world, and even simple, cheap-to-implement data augmentation can close most of that gap.

We also learned to look critically at where a model fails, not just how often. Our error analysis surfaced potential fairness concerns. For example, apparent differences in error rates appeared to correlate with gender in a small sample and with subjects wearing glasses that we would not have caught by only looking at aggregate accuracy. Error types also were not always uniform across corruption types, which taught us that a single accuracy number can hide very different failure modes underneath it.

Note: Detailed robustness evaluation results and error analysis, including performance across individual corruption conditions and failure modes, are available in our GitHub README.

What's next for ProfileGuard

  • Broader generator coverage: Expanding training data to include diffusion-model-generated faces (not just GAN-generated) to test generalisation to newer generators.
  • Confidence calibration: Route uncertain predictions to human review instead of auto-deciding.
  • Fairness audit: Validate the gender and glasses error-rate patterns at a scale with proper demographic labels before considering any real deployment.

Built With

Share this project:

Updates

Submission history