这次我们看的不是模型,也不是框架,而是一个让图片真假难辨的视觉玩法:Cake or Real?。项目本身是一个结合了蛋糕拟真图与真实物对比的趣味视觉识别挑战,核心解决的是“AI 生成的食物图像已经能骗过眼睛”的问题。它最值得关注的点有三个:一是用高仿真蛋糕图片制造视觉错觉,二是把“识别真假”变成可交互的测试流程,三是整套玩法可以作为图像生成、图像分类、提示词工程和前端交互的练手素材。
换句话说,这个项目表面上是“猜蛋糕还是真物”,实际上一套完整的图像生成 + 人机比对 + 结果反馈链路。适合对 AI 图像生成、Stable Diffusion / Midjourney 出图、视觉评测感兴趣的人,也适合想做趣味 H5、互动网页或开源 Demo 的开发者。
这篇文章会带你先梳理项目的能力范围和边界,再给出环境准备、本地启动方式、功能测试流程、结果判定逻辑,以及如果把它改造成自己的“真真假假”挑战赛,需要关注哪些技术细节。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 项目类型 | AI 图像趣味识别 / 真假对比挑战 |
| 核心玩法 | 展示一张图片,判断它是蛋糕实物还是真实物品 |
| 主要素材 | 高仿真蛋糕图、真实物体图、AIGC 生成图 |
| 关键技术点 | 图像生成、提示词控制、图像分类或人工判定、前后端交互 |
| 硬件门槛 | 纯前端展示可低门槛运行;AI 生成环节需按实际推理环境评估 |
| 显存占用 | 不确定,取决于生成模型和推理参数,需按实际环境测试 |
| 启动方式 | 取决于是否有本地模型,可用静态网页、Node 服务或 Python 服务启动 |
| 是否支持 API | 取决于是否接入生成模型或分类模型,可自定义封装 |
| 是否支持批量任务 | 适合批量生成比对素材,需要额外写批处理脚本 |
| 适合场景 | 趣味测试、图像生成效果评测、AIGC 内容展示、前端交互练手 |
从材料看,这个项目并没有给死某个技术栈。你可以把它当作一个纯 Web 展示项目,也可以把它扩展成接入本地 SD / ComfyUI / API 生成引擎的完整图像实验工具。关键看你想拿它做什么。
2. 适用场景与使用边界
这个项目适合三类人。
第一类是想评测 AI 图像真实感的人。你可以用同一组提示词生成蛋糕图、面包图、甜点图,再和真实拍摄图混在一起,观察 AI 图是否已经达到“人眼无法快速分辨”的程度。这类测试对提示词质量、模型版本、采样步数、高清修复策略都有很高要求。
第二类是想做互动娱乐产品的开发者。把“Cake or Real?”包装成一个每日挑战、排行榜、计分页面,可以在朋友圈、公司内部活动、内容社区里做传播。前端只需要一张图 + 两个按钮 + 结果反馈,开发量不大。
第三类是对图像分类和视觉检测感兴趣的人。你可以不让人来猜,而是用 CLIP、BLIP、ResNet 之类的模型做自动分类,让 AI 判断“这是蛋糕还是真实物”,然后和人类判断做对比。这时候项目就从娱乐工具变成了一个小型多模态评测集。
使用边界要注意几个问题。
版权方面,如果使用真实拍摄图,需要确认图片来源和授权;如果使用 AI 生成图,要保留生成记录、模型版本和提示词。隐私方面,不要把带人物面部、可识别身份信息的图片放进挑战素材。安全方面,如果项目接入外部生成 API,注意密钥不要提交到公开仓库,接口访问要加限流,避免被刷。合规方面,不要在素材里加入品牌 Logo、敏感商品、医疗食品宣传等内容。
3. 环境准备与前置条件
不管你是只跑前端页面,还是带 AI 生成和自动分类,先按下面清单准备环境。
3.1 基础运行环境
- 操作系统:Windows 10/11、macOS、Ubuntu 20.04+ 均可。
- Node.js:建议 18 或 20 版本,用于跑前端服务和简单脚本。
- Python:建议 3.10 或 3.11,如果要接 PyTorch 或 AI 模型。
- Git:用于拉取项目代码。
- 浏览器:Chrome / Edge 最新版。
如果是纯静态网页玩法,不需要 GPU,也不需要安装 CUDA。
3.2 AI 生成环节环境
如果要用 Stable Diffusion 或 ComfyUI 生成更多“以假乱真”的蛋糕图,需要额外准备:
- NVIDIA 显卡,建议 8G 显存以上,16G 更稳。
- CUDA 和 PyTorch 环境,具体版本以模型要求为准。
- 磁盘空间:一个 SD 模型通常 2G 到 7G,加上 VAE、LoRA、ControlNet,建议预留 30G 以上。
- 如果使用在线生成 API,只需要准备 API Key 和网络环境,不对本地硬件有要求。
3.3 自动分类环节环境
如果要做 CLIP 自动判断,建议:
- Python 3.10+。
- PyTorch,CPU 可跑但速度慢,GPU 更快。
- 安装
transformers、open_clip或其他多模态模型库。
这块是可选项,不是必须。
4. 安装部署与启动方式
整个项目可以按三种方式启动。第一种是纯静态页面,第二种是 Node 服务,第三种是 Python 服务。下面分别给出一套可用模板。
4.1 纯静态页面启动
如果你只需要一个本地可打开的 HTML 页面,直接创建index.html,然后双击打开。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Cake or Real?</title> <style> body { background: #111; color: #fff; font-family: "Microsoft YaHei", sans-serif; text-align: center; padding: 40px; } img { max-width: 600px; width: 100%; border-radius: 16px; } button { padding: 12px 28px; font-size: 18px; margin: 12px; border: none; border-radius: 8px; cursor: pointer; } .cake { background: #ffcc00; color: #111; } .real { background: #66ccff; color: #111; } </style> </head> <body> <h1>Cake or Real?</h1> <p>猜猜看,下面这张图是真实物品还是高仿真蛋糕?</p> <img id="demoImage" src="./images/demo1.jpg" alt="测试图" /> <br><br> <button class="cake" onclick="answer('cake')">这个像蛋糕</button> <button class="real" onclick="answer('real')">这是真实物</button> <p id="result"></p> <script> function answer(choice) { const correct = 'real'; if (choice === correct) { document.getElementById('result').innerHTML = '回答正确,这张图是真实物。'; } else { document.getElementById('result').innerHTML = '猜错了,这张图其实是真实物。'; } } </script> </body> </html>请确保images/demo1.jpg存在。如果想做成多题模式,就把图片路径和答案存成数组。
4.2 Node 服务启动
如果你需要从本地服务器加载图片素材,避免浏览器的本地文件限制,用 Node 更省事。
# 在项目根目录初始化 npm init -y# 安装一个最简单的静态服务 npm install express --save新建server.js:
const express = require('express'); const path = require('path'); const app = express(); const PORT = 3000; app.use(express.static(path.join(__dirname, 'public'))); app.listen(PORT, () => { console.log(`Cake or Real service is running at http://127.0.0.1:${PORT}`); });启动方式:
node server.js然后把 HTML 文件放到public目录,素材图放到public/images目录,浏览器访问http://127.0.0.1:3000即可。
4.3 Python 服务启动
如果你更习惯 Python,可以用一行命令启动静态服务。
# 在项目根目录执行,默认端口 8000 python -m http.server 8000然后浏览器访问http://127.0.0.1:8000。
如果项目里已经有 Flask 或 FastAPI 代码,也可以直接用 uvicorn 或 flask run 启动。
# app.py 最小 Flask 示例,需先执行 pip install flask from flask import Flask, render_template app = Flask(__name__) @app.route("/") def index(): return render_template("index.html") if __name__ == "__main__": app.run(host="127.0.0.1", port=5000, debug=True)5. 功能测试与效果验证
纯前端页面启动后,需要验证几个核心模块:图片加载、答案判断、计分逻辑、素材是否容易过曝或加载失败。
5.1 图片展示测试
测试目的:确认服务能正确加载规则目录下的素材图片。
操作步骤:
- 创建
images目录。 - 放入高仿真蛋糕图一张、真实物体图一张。
- 启动服务并访问页面。
- 按 F12 打开控制台,切到 Network 面板。
- 刷新页面,观察图片请求状态码。
预期结果:图片返回 200,页面能正常显示图片。
失败排查:
- 图片路径大小写是否和文件名一致。
- 文件格式是否被浏览器支持,建议用
.jpg、.png、.webp。 - 图片尺寸不要太夸张,建议压缩到 1MB 以内,否则大图加载慢。
5.2 答案判断与反馈测试
测试目的:确认点击按钮后,结果区能显示对应反馈。
操作步骤:
- 点击右侧“这是真实物”按钮。
- 点击左侧“这个像蛋糕”按钮。
- 观察两个按钮分别出现的结果文案。
预期结果:按钮点击后页面出现结果文案,且不会跳转或报错。
如果是多题模式,还需要验证:
- 每题答案是否独立。
- 最后一题结束后是否显示总分。
- 点击后是否锁定,避免用户反复点击刷分。
5.3 AI 生成素材测试
如果你准备用本地模型生成蛋糕图,建议从 Stable Diffusion 或 ComfyUI 入手。
推荐测试提示词模板:
hyper-realistic birthday cake, strawberry cream cake, photorealistic, food photography, studio lighting, 8k, high detail, fake cake desk decoration可以加负面提示词:
blurry, cartoon, painting, drawing, oversaturated, distorted, low quality生成之后,把图导入项目素材库,和真实拍摄图混在一起,进行“人眼识别测试”。
从材料看,这个项目的乐趣正好在于“AI 图是否已经足够真实”,所以素材生成质量决定了整个项目是否好玩。更稳妥的判断是:用当前主流文生图模型生成的一组蛋糕图,在缩略图场景下已经能骗过不少人,但在放大细节、看阴影、看奶油质感、看物体比例时仍然有破绽。
5.4 真假图像分类测试
如果你想用模型自动判断图像真假,可以接入 CLIP 模型。
# 示例:使用 CLIP 判断图片更接近蛋糕还是真实物 # 需要安装:pip install torch torchvision open_clip_torch pillow import torch import open_clip model, _, preprocess = open_clip.create_model_and_transforms( "ViT-B-32", pretrained="laion2b_s34b_b79k" ) tokenizer = open_clip.get_tokenizer("ViT-B-32") texts = ["a real object photo", "a realistic cake", "a desktop decoration"] tokenized_texts = tokenizer(texts) image_input = preprocess(Image.open("test.jpg")).unsqueeze(0) with torch.no_grad(): image_features = model.encode_image(image_input) text_features = model.encode_text(tokenized_texts) probs = (image_features @ text_features.T).softmax(dim=-1) print(probs)这里的输出是一个概率排序,并不代表“绝对正确”。更稳妥的做法是把 CLIP 作为辅助判断,再结合人眼投票。
5.5 结果判定逻辑优化
简单项目可以用“答案固定 + 点击判断”的方式,但是如果要长期复用,建议把题库做成 JSON 结构:
{ "questions": [ { "image": "images/demo1.jpg", "answer": "real", "hint": "注意观察边缘阴影和反光", "source": "real_camera_photo" }, { "image": "images/demo2.jpg", "answer": "cake", "hint": "奶油纹理过于规整", "source": "sd_generated" }, { "image": "images/demo3.jpg", "answer": "real", "hint": "背景虚化和实物光影一致", "source": "real_camera_photo" } ] }这样前端可以通过 fetch 加载题库,后端也不用频繁改页面代码。
6. 接口 API 与批量任务
纯展示类的“Cake or Real?”并不需要 API,但如果你想把它产品化,或者做成持续更新题库的工具,API 就很有必要。
6.1 接口设计建议
推荐设计两个接口:
- 获取题目列表:
GET /api/questions - 提交答案并返回结果:
POST /api/answer
{ "question_id": "q001", "image_url": "http://127.0.0.1:3000/images/demo1.jpg", "answer": "real" }返回结果:
{ "success": true, "is_correct": true, "score": 1, "total_score": 3 }这样前端只需要负责展示图片和按钮,所有题目数据、答案校验、计分逻辑都集中在服务端,后续接排行榜和用户系统会方便很多。
6.2 批量生成题目素材
如果你希望每日更新题库,可以写一个脚本批量生成 AI 蛋糕图。
# 伪代码示例,实际调用方式取决于你使用的生成 API 或本地 ComfyUI import os import requests prompts = [ "hyper realistic burger cake, fake meat dessert", "strawberry cake looks like ordinary objects", "bread loaf fake cake decor prop" ] save_dir = "images/generated" os.makedirs(save_dir, exist_ok=True) for idx, prompt in enumerate(prompts): # 此处为示意,实际请替换成你的生成接口 payload = {"prompt": prompt, "negative_prompt": "lowres, bad anatomy"} resp = requests.post("http://127.0.0.1:8188/prompt", json=payload, timeout=60) print(idx, prompt, resp.status_code)批量生成时,要注意以下问题:
- 生成接口是否支持并发请求。
- 输出文件命名是否避免冲突。
- 生成失败后是否需要重试。
- 每一步生成图是否需要人工筛选。
最稳妥的做法是先生成 50 张,再人工挑出画质好、容易混淆的 10 张进题库,这样可以保证趣味性。
6.3 批量任务队列思路
如果素材量大,建议加一个任务队列,不要一次性把所有题目发到前端。前端每次只拉 10 题,答完再请求下一组。
# 简单批量生成思路 task_list = [ {"id": 1, "prompt": "...", "status": "pending"}, {"id": 2, "prompt": "...", "status": "pending"}, ] for task in task_list: if task["status"] == "pending": task["status"] = "running" # 调用生成模型 # 保存图片并更新题目 JSON task["status"] = "done"这种方式在本地测试时足够用,真正要上生产环境,建议换 Celery 或消息队列,但这个小项目完全没有必要。
7. 资源占用与性能观察
如果你只跑前端,资源占用可以忽略。重点说 AI 生成和模型判断环节。
7.1 如何观察 GPU 占用
在本地跑文生图模型时,可以用 nvidia-smi 观察显存。
nvidia-smi -l 2这条命令每 2 秒刷新一次显存和 GPU 利用率。
从常见部署经验看,主流文生图模型生成一张 512x512 图片的显存占用通常在 4G 到 8G 之间;生成 768x768 或更高的分辨率时,占用会继续上升。但具体数字要以本机模型版本、采样步数和是否开启高清修复为准,不能一概而论。
如果你想降低显存压力,可以:
- 使用 512x512 作为默认出图尺寸。
- 减少采样步数,比如从 30 降到 20。
- 关闭面部修复或高清修复。
- 使用
--medvram或--lowvram这类参数来降低显存占用。
7.2 CPU 推理和 GPU 推理的差异
CLIP 或图像分类模型可以在 CPU 上跑,但速度会慢不少。如果只是测试单张图片,CPU 完全够用;如果要对几十张图片批量预测,建议用 GPU。
判断一张图通常只需要一次前向传播,CPU 可能在几百毫秒到几秒内完成,GPU 会更快。实际速度受模型体积、输入分辨率和硬件影响。
7.3 分辨率与图片体积对加载的影响
前端展示的图片不建议直接用原始大图。生成图或相机原图动辄几 MB,网页加载会明显变慢。建议按以下流程处理:
- 限制长边,建议最长边 1024。
- 压缩为
.jpg或.webp,质量 80 左右。 - 图片体积控制在 300KB 到 800KB。
这样可以保证页面打开速度快,也不容易卡顿。
8. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 页面打开了但图片不显示 | 图片路径错误或文件名不一致 | 检查 Network 面板 | 修正路径,确认文件名和大小写 |
| 点击按钮没反应 | JavaScript 报错 | 打开控制台查看 Error | 检查getElementById的 ID 是否一致 |
| 图片加载很快但模糊 | 原图分辨率太低 | 查看图片原始尺寸 | 换用高分辨率素材 |
| 生成蛋糕图效果不够真实 | 模型版本旧或提示词不够详细 | 对比多组提示词 | 使用更高版本的 SD 模型并加强负面提示词 |
| 本地模型跑不动 | 显存不足 | nvidia-smi观察显存 | 降低分辨率、减少步数或换轻量模型 |
| 批量生成图片重名 | 文件名未做唯一处理 | 查看输出目录 | 文件名加时间戳或 UUID |
| API 调用超时 | 生成接口处理时间过长 | 检查后端日志 | 增大超时时间或加异步任务 |
| 题库答案错误 | 人工标记错误或 JSON 写错 | 检查 JSON 数据 | 统一用脚本管理答案 |
| 端口被占用 | 3000 或 8000 已被使用 | 报错中查看占用端口 | 换端口启动,例如node server.js --port 3001 |
| 自动分类结果不稳定 | CLIP 对图片内容混淆 | 打印概率值 | 换成更大模型或加入提示词模板 |
9. 最佳实践与使用建议
如果你只是想快速复现这个玩法,第一次建议只做纯前端版本。上一组图、两个按钮、一个判定逻辑,半小时内就能完成。不要在第一步就接入模型生成和自动分类,否则会把简单问题复杂化。
如果你想把项目做成可展示的作品,建议按下面这套流程做:
- 素材目录严格区分“真实图”和“AI 生成图”,命名前缀区分开。
- 题库 JSON 和前端页面分离。
- 每题添加来源信息和提示信息,方便以后回溯。
- 用户答案提交后锁定按钮,防止反复点击。
- 增加“查看结果”页面,展示已答对数量、总用时。
对于生成素材,建议同一组提示词生成多张,再人工挑选。AI 生成图经常会出现文字扭曲、边缘畸变、物体比例异常,这些破绽会影响挑战质量。挑选时优先选细节完整、光线正常、主体突出、没有明显 AI 痕迹的图。
对于需要使用人脸、特定物品、品牌素材的情况,务必确认授权。这里不是项目能不能用的问题,而是商用和公开发布时的合规问题。涉及肖像的要取得本人同意,涉及品牌 Logo 的不要用真实标识,尽量用生成素材替代。
如果要接入外部 API,注意不要把密钥写在 HTML 页面里。正确做法是把密钥放到后端环境变量,由服务器转发请求。
# 环境变量示例 export API_KEY=your_api_key_here接口服务还需要考虑访问范围。如果只在本地测试,监听127.0.0.1就够;如果需要局域网访问,要设置防火墙和访问控制,避免别人任意调用你的生成接口。
10. 总结与下一步
“Cake or Real?”最大的价值不是算法复杂度,而是它把 AI 图像生成、人眼感知和互动验证串成了一条容易上手的链路。你不需要特别强的工程能力,就能跑起来一个让周围人觉得惊艳的趣味项目。
建议第一次动手时先验证三件事:
- 一套素材能不能在本地服务里正常展示。
- 题目答案和计分逻辑是否稳定。
- AI 生成图和真实图的混淆程度是否足够。
跑通这三件事之后,再考虑扩展自动分类、排行榜、每日题库、批量生成这些功能。最容易翻车的地方是素材管理和答案标记,如果能用 JSON 题库统一管理,会省下很多返工时间。
如果你已经有本地文生图模型或 ComfyUI 环境,下一步可以尝试用程序批量生成 50 张测试图,然后人工筛出 10 张组成“高难度盲测题集”,这个流程本身就是一套完整的图像生成效果评测方案。
后面的扩展方向可以有很多:接一个每日换题接口,增加社区投票功能,或者加入“AI 判断 vs 人类判断”的对比模块。把玩具做深,也是不错的练手路径。建议收藏备用,先跑通纯前端版本,再逐步加 AI 能力。