摄影曾经是他的爱好,后来变成了工作。爱好还在,只是没那么好玩了。他想要一个能让自己重新觉得摄影有趣的东西,于是做了 ShutterHunt——一个摄影任务游戏,逼你走出家门,动起来。
这是一个原生 Kotlin 安卓应用,本地跑 Gemma 3n 做图像和文字评判。视觉风格是赛博朋克,玩法是接摄影任务,比如拍一张镜像对称的照片。拍完交给裁判 Gemma 3n,它会根据任务提示词打分。
AI怎么当裁判
每个任务里,Gemma 3n 会从三个不同维度来评判。以对称/镜像照片为例,这套标准给了 AI 一个清晰的结构,让它知道看一张照片时该看什么。
它不只是打分,还会对每张照片给出建设性批评,告诉你这张照片是怎么拍出来的、下一张怎么才能更好一点。这一点挺关键——评判之外还带学习反馈。
本地模型,3GB,手机跑
整个项目最硬的部分是找到合适的量化 Gemma 模型,能在手机上本地跑还不崩溃。借助 GitHub Copilot,他集成了 Gemma 3n int4 LiteRT-LM 的安卓版本。
这是一个 3GB 的轻量模型,本地运行在安卓手机上,从三星 Galaxy Ultra S23 起步的机型都可以。他自己用的是 Google Pixel 10,也是这次的测试平台。
安装完 demo APK 后,第一步是进 Status 标签页,Step 2 下面有个链接指向 Hugging Face 上的 Gemma 3n 模型,需要你本地下载。下载完,在同一个标签页里把应用指向那个模型文件。指向之后,游戏就完全可玩了。
给裁判一点时间,它有时候会慢,尤其是第一次启动的时候。
从翻车到跑通
这个应用经历了好几个迭代。第一阶段是先让本地应用跑起来,还不带 Gemma,把相机正确调起、正确拍照。一开始照片方向有问题,拍出来总是横的,从来不会保持竖直。这个问题直到 Gemma 加进来才暴露——它导致评判出问题,AI 只看到了方向错误的第二张照片。
第一阶段跑通、相机正常、相册能存照片之后,才进入集成 Gemma 的部分。说实话,这是整个开发过程中最难的一步。
第一次跑评判,他对着水壶上那个 Under Armour 标志拍了张照,然后等。等。再等。本地 AI 确实不是最快的裁判。第一次返回的是一个错误,不光他看不懂,AI 也看不懂。
于是有了第一个更新:一个 JSON 调试器应用,用来显示 AI 当时抛出的所有问题。这次不用重装,直接更新 APK 就行。再跑一次评判,输出大了很多,问题也清楚了——JSON 格式错误,长度是其中一部分原因。
把这个问题连同详细说明交给 Copilot,它一次性解决了。之后才开始看到真正的评判长什么样。方向修好了,AI 也能正确评判了。
风格这件事
但那个轻量版风格不是他想要的。他想要确保下一个提示词能一次到位。基于他之前做过的网站,Gemini 给出了一版风格方案,他挺满意。
问题是,这个风格能不能在迁移到 Kotlin 和应用里之后保留下来。把图片交给 Copilot 之后,结果他说满意,但本可以匹配得更好。
后面还有两个阶段在开发中。第三阶段是隐藏的地理位置事件——在特定地点拍照可以拿到隐藏徽章,还有徽章和奖杯系统的整合。第四阶段是打磨后的正式发布版,有扩展关卡、更多挑战,以及一个面向正式发布 beta 的东西。
他花了一周做这个,因为摄影对他意义重大。
热门跟贴