提前声明
本人是程序员,有两年经验(ai+后端),虽然开发过程全是问ai,代码全部ai生成,但是很多ai出错的时候也是需要对程序有一些了解才能纠偏。完全不了解的可能有些困难。
网址:涉及诱导外链,这里看下怎么放 privbgcut.pocketjoy.fun 仅供交流学习使用,app功能比较简单,如果想要体验直接下载自动可以前七天体验所有功能,已经足够,不需要也不要付费。(网页无中文版,app有,下载链接重定向的github的,所以下载比较慢或者需要科学上网,访问网址不用) (如网址不可用或非本文内容,说明域名未续费,则不要继续访问这个地址)
(网站可看可不看,看你们需要,下面也有图,不然审核会以为我在引流,不用在意,可以理解,就是感觉有点机械哈 哈哈)
下面所有不懂的技术实现或者其他问题都可以问ai,但是除了技术实现或者cloudflare等网站使用之类,其他的请谨慎采纳
重点注意
ai有的时候会说有些问题解决不了,说只能采用付费方案,这个时候你可以自行搜索,或者开一次新对话可以解决,大部分是存在免费方案的,我暂时没有遇到要钱的,除了域名购买(这个是我在之前其他项目购买的,不过也可以算在这个项目,因为是必须的,但是你可以买个一块钱的域名,也是一年使用期),其实域名购买这个也可以绕过,如果不太正式,也可以用cloudflare的,cloudflare会为每个workers&pages分配两个域名。哈哈当时没有绕过也是不知道有这种情况哈哈
尽量不要全信ai,要有自己的判断,特别是涉及付费的。比如它开始说既然部署在cloudflare,推荐就在这里注册,结果一看会贵很多,它给的很多比较便宜的域名注册方案都不是很便宜,所以涉及付费的内容还是要自己多加考虑,应该是存在免费方案的,不要被付费卡住了,我很多时候就是,后面多追究探讨或者自己搜索什么的发现存在免费方案
总的来说就是,ai说的要付费或者其他难点,不一定存在,要自己多思考下,大部分问题是不存在的,被卡住可以多思考,涉及付费更要慎重,不要轻易花钱。
简单流程梳理
deepseek生成app代码,app后端参考cutout;完全离线不需要服务器,免费
安装包放在github,免费
网页代码ai生成,部署在cloudflare,免费;购买域名需要一定费用
支付接口,代码ai生成,代码部署在cloudflare,发送邮件用resend,免费;三方支付平台,免费
背景&技术栈&费用等
背景:搞钱
技术栈:deepseek网页版
耗时:半个月全职
使用资金:12块(购买域名)
其他全部使用各平台免费额度(完全够用):
app:完全离线 运行在用户本地 不需要服务器
安装包:放在github
网站:腾讯云购买域名,cloudflare负责dns解析,也在cloudflare的workers上面部署静态页面(html、css、js)
支付流程:代码部署在cloudflare的workers
代码生成:全部由deepseek网页版生成
logo:豆包网页版(png)、deepseek网页版(svg)
邮件发送:resend
技术栈相关注意事项
- ai能力已经很强,但是对于超长文本处理能力还不是很好,所以如果对话超过15轮,或者你觉得字数已经比较多,就需要开新一轮对话
- 整理一个project.txt文件,里面是一些项目介绍、一些历史修改和可能存在的一些问题等项目相关内容,让ai生成,和ai对话达到一定字数或者修改比较多的时候,让ai更新下,下一轮对话用的上
- 整理一个prompt.txt文件,按照常规提示词模板来,这个可以不用经常修改
- 超长文本的问题,如果让ai每次生成全量代码文件,或者需要修改的代码文件的完整文件,多轮对话后会导致文本过长,而且不好操作,并且ai生成文本在单轮对话过程也可能会影响效果(猜测,感觉又不会,因为单轮多轮我理解原理都是一样的,多轮未达限制的情况下单轮一应该不会出问题),所以保存一个临时的change.py脚本文件,让ai不用每次给完整文件,只要给修改脚本就行了,这个脚本可以一直是这个名字。至于代码备份什么的,ai会自动给你在脚本里做的,如果没有和ai说就行。关于只给修改脚本的事,可以直接加到提示词中。
- 对话过程中,可能遇到一些ai说的不合理的地方,比如你多问它一遍,它就会质疑自己的决定,然后可能有些修改就会被ai自己舍弃,这些相关的你可以遇到了加到提示词中,也可以让ai自己总结
- 每轮开始将所有代码文件和上面提到的两个文件给到ai,避免ai因为信息缺失导致回答不好
- 当然,上面的内容可以自动化,听说最近有什么skill,可能类似吧,大致就是,将流程自动化,尽量减少人工参与,比如change脚本的执行,等等,但是我用的是网页版,没有购买token,所以对当前情况,这样就行。当然如果需要,也可以多几次,总结后,将流程加到提示词中,说一步一步怎么做,比如先确认是否需要修改,先不给代码,经过你确认之后再生成修改脚本和效果描述什么的。简单自动化
app
简介:完全离线本地运行的抠图软件
代码相关
编程语言:前端html、css、js;后端rust
框架:tauri、cargo
选择原因:
看过同类竞品localbg,发现它的页面看着不太清楚 而且是用python写和打包的大致500MB,我之前用python打包过二进制,发现可能会比较臃肿;
加上看到一个开源的同类软件,cutout,许可证属于MIT,可以直接用它的后端,当然还需要扩展一些。cutout用的是tauri,可以实现网页看着是什么样app就是什么样,实测还不错,而且打包需要的依赖加一起只有29MB左右。
当然半个月后开发完毕,发现localbg的安装包已经变成300MB,暂未详细分析
解释:
网页看着是什么样app就是什么样:是指打开代码中的html文件,浏览器中显示什么样子,app中看到的就是什么样子,所以开发的时候可以先不管后端,先用浏览器调好前端,再对接后端。
依赖只有29MB的原因:前端渲染-webview2运行时 在windows11和一些windows10系统版本已经预装,相关的使用例子是 edge
依赖还有一点:在没有预装webview2的机器上面 如果所在机器联网,会在安装时下载170MB左右的webview2运行时,如果不联网就会无法运行(理论上我这边未实测)。所以本身就是完全离线可用,所以就直接在安装包里面打包进去了,依赖多了170MB。后续可能会分两个版本,当前是只有这个依赖多一些的版本。(哈哈这样最后一实测看着比localbg的大小差不多了)
开发流程:
前端页面
让ai给个建议,出个基础版本,它会告诉你可以直接在浏览器查看,后端可以先不管,点击报错就报错,没影响。然后如果觉得需要后端配合才能比较好观察,也可以直接用 npm run tauri dev ,运行后 前端修改马上生效,后端则需要重新编译,会自动检查后端修改然后重新编译,就是看机器,编译需要一些时间。
后面看着有哪些ui不完善的,可以让ai修改
注意:参考前面的技术栈注意事项
后端
看下需要加什么功能,之前后端是用的cutout的,当时没有找到换背景的功能(好像后面有了还是我之前没有找到),就直接让ai做,也可以先做前端,再做后端,这些功能都比较简单,有一个我认为会比较难的是调色板,就是自定义颜色,结果ai知道直接调用系统的一些库实现了,加上ai实现compare和页面照片放缩,我就觉得ai还是挺牛的,很多已经有人做过的功能,它可以很快给出代码,并且融入当前项目。
当然做功能比较简单,需要考虑的是做什么功能,还有边界条件的问题,
边界条件的问题,比如模型跑不了或者会导致卡死,需要设置阈值,先判断内存是否够用,先提醒用户,如果还是要用,让ai思考有什么办法延长时间而尽量不卡死什么的。还有图片如果被修改后缀导致损坏,为什么可以显示但是运行才报错等问题,还有如果找到可能报错并且转换成用户可以理解的语言等,这些还是要些时间,主要是改后端,需要重新编译才能运行看效果,比较耗时
功能的问题,简单的抠图,得到透明背景这个是核心能力,除非训练自己的模型,不然当前只能用开源的模型,所以先看下其他附加功能,比如批量处理、批量处理的中断、不同用途模型、效果图对比、图片放缩查看细节效果、状态显示、是否预加载模型等等。只要提出来了ai还是基本可以实现的。
模型相关
开源模型也有优劣,不同模型效果不一样,同一款模型因为导出方式的不同,运行速度也会有差异。
模型算是这款软件的核心功能,所以选型方面还是费了很多功夫。
之前ai推荐了五类模型,极速-u2netp、通用-birefnet-lite、人像专用-modnet、精细结构-isnet、动漫专用-toonout
实测发现后面几种大部分效果和 biefnet-lite效果相差不大,后面探索了一些时间,就留了三种 极速、通用、人像(人像的换成了百度的pp-matting)
后面又发现通用模型在我的机器上面运行比较慢,我的机子是入门款,可以理解,但是我还是想要优化下的,看下能不能提高下效率。机缘巧合之下,发现一个非固定输入版本的onnx效率有提升四倍,内存消耗也少很多,牛逼的厉害,可以参考我另一篇博客。https://huggingface.co/senty-au/BiRefNet_lite-ONNX-dynamic
同时不同图片尺寸,处理耗时不一样,就将通用的拆分成两种情况,一种比较快,将图片放缩到512*512处理,一种比较慢,放缩到1024*1024处理。当然效果会有一些差异,我看比较轻微,1024的更好。
通用的拆分成两个,我也想将人像的拆成两个,pp-matting本身是支持非固定输入,只是导出的时候非固定尺寸转换成onnx格式会失败,定位发现是onnx不支持部分算子,非固定输入情况下,一些自适应层onnx无法表达 可以参考我的另一篇博客,可以继续探索,应该是可以解决的,但是在这一块耗时有点久了,先跳过,pp-matting就固定输入。
付费相关
参考同类竞品,有免费版本,支持单张处理,批量处理付费;我一开始也想搞免费版本,但是哪些功能需要限制是个问题,总共也没有什么功能,而且比较麻烦,但是没有免费版,如何吸引用户,就加了一个前七天所有功能免费,下载自动生效,这个前七天免费是自动生效,本地验证,不联网。而且不收费搞广告的话,又和离线背离了。
付费情况,需要考虑是完全离线,更新查看,license验证都离线,完全没有联网部分,所以通过获取处理得到一个machineid,付费时在官网同步提交,后台处理后返回一个license,app本地验证,不联网。所以做买断,但是买断我又感觉是不是有点贵,因为我也没有相关经验,所以就又加了一个单月有效期的license。
遇到的问题
- 之前提到的超长文本的问题,已规避
- 代码修改多次紊乱,修改比较麻烦,容易出错,重构的问题,让ai处理
- 测试不同模型过程中,不同模型的预处理和输入大小有差异,同类模型大部分是一致的,这里的同类是指同为birefnet-lite模型,不同onnx。不同类别模型直接替换权重测试的话会报错,改后端代码的话又需要重新编译,耗时且繁琐,这个也不算问题,就是比较繁琐
展示图
页面详细介绍
安装包
APP安装包github地址 用于展示 不是点击直接下载 点击看到的是 release相关页面 仅供学习(为啥叠这么多,尽量避免那个什么审核引导到外部链接,就是避免被认为是引流):
https://github.com/James-boy/PrivBgCut-Releases/releases/tag/app-v0.1.0
大小
因为完全离线的特性,需要将所有必要依赖加上,所以考虑到可能有的机器没有安装webview2,所以生成安装包的时候直接将webview2运行时也带上,加上三个模型一共460MB,其中模型约270MB,其他依赖约30MB,webview2运行时约160MB。所以后续可能会做不带webview2的版本,大致300MB大小
位置&原因
因为如果放置在云端,存储和下载的流量都是要收费的,更何况是几百兆,这样费用比较多(免费额度不够),而且我的目的也是尽量用免费方案,所以采用放在github,而且不是上传本地的安装包,是在github平台编译得到
过程
因为私有仓无法将release版本单独公开,不允许所有人下载,所以需要将安装包放到公开仓
这里说明几点
- github仓库允许用户上传代码的同时带上toml文件,然后运行toml文件对应的工作流(点击之后会自动运行,运行流程和环境由github保障),然后得到或者保存对应产物(保存为release的草稿而不是直接发布)。而对应的运行时间是有限制的,资源不清楚有没有,运行时间好像私有的每月2000分钟,公共的没有限制,这个运行时间指的是开始运行到得到产物的时间哈,和其他的没有关系。具体的限制额度可以看官方,我也是ai告诉我的
- 需要新建一个公开仓库,将安装包发布,用户才能下载得到,这个公开仓库需要有初始化或者一次提交,可以只是一句话,但是需要有,因为没有的话,release的版本无法对应任何一次提交,就无法release
- 建议从提交github代码到私有仓,到运行工作流得到安装包,到发布到公共仓,可以自动化,也好维护一些。可以在同一个toml,得到安装包,然后发到公共仓。如果担心过程中失败导致安装包也没有保存的话,也可以分成两个toml,分两个工作流,一个得到安装包,一个发到公共仓,可以顺序执行,有这样的参数,就是感知到前一个执行完成,然后执行当前工作流的。我这边因为刚开始,所以是一步一步来的。
- 因为github有文件大小的限制,所以模型文件无法上传,可以直接给下载链接,保存到对应文件中,生成安装包的时候会自动下载的。
结果图片
网站
选择域名
域名后缀的选择
因为不同后缀域名,在搜索引擎的权重不一样(ai告诉我的),顶级域名说权重更高啥的,比如.com啥的,但是比较贵。其实想买1块的,但是ai说不行,感觉这方面可以不管ai,因为我问它为啥贪吃蛇网站域名后缀是io,它说因为已经有知名度了。不管了,还好也没花多少,顶级的不是很便宜,买了.fun后缀的,这个域名续费比较贵,如果网站没有运营起来,可能后面就不续费了。
域名的选择
乱码的便宜,但是感觉如果想认真做,我觉得可能还是需要一个好一点的域名(可能我觉得不对哈哈),所以看了ai的一些参考,选择了这个。
哦对,忘了解释了,privbgcut是产品名称,pocketjoy是主域名,我开始是计划做页游啥的,但是稀奇古怪的就开始做工具了,但是选择pocketjoy的时候也考虑到了后续做的种类可能比较多。
域名注册
哪家都差不多,本来想选阿里云,但是已经在腾讯云备案啥的,就腾讯云
配置域名
等后面网站页面生成完成之后,在cloudflare上面workers&pages,将静态页面部署上去,然后将域名配置在这个workers&pages上面就行,这里还涉及一个dns解析的问题,需要在腾讯云那里修改两个地址什么的,要改成cloudflare的,具体原因和如何操作可以问ai
网站页面
页面生成
直接让ai参考你的app代码或者project.txt来就行,有app代码尽量给代码,这样了解的信息多一些,前端的风格啥的,也可以和app的统一
ai生成之后,你觉得不合理的就让ai改就行
因为之前没怎么搞过前端,开始还以为前端的那些淡入淡出什么色调什么的,是比较高级的应用,需要用什么vue来,结果ai给的看着很厉害,牛逼的
因为之前app已经跑通了,如果需要可以在app中,在激活license的时候加一个跳转链接,跳到网站的支付页面,同时带上machineid。这个支付页面(不是支付接口)也可以让ai做
页面部署
将前一步生成的html、css、js代码,部署在cloudflare的workers&pages上面,然后将选择好的域名 privbgcut.pocketjoy.fun 配置到这个workers&pages。
页面部署的时候要注意,每次部署都需要提供全量相关文件,不可以只提供修改了的文件,因为实测每次会将本次提供的文件全量覆盖之前的,而不是只替换本次提交的。
如果部署未生效,可以在cloudflare上面清理缓存,这个和清理本地浏览器缓存不一样,具体可以问ai。
效果图
下载接口
因为会有不同的版本,所以需要一个中转处理的,返回合理的下载地址,理论上可以直接用latest的,不知道为啥没用来着,可能当时有其他考虑,最后是查询github那边的一个接口啥的,具体实现可以问ai。
还有一点这个接口也是部署在cloudflare,配置的子域名 download.pocketjoy.fun
为什么用子域名,是为了后续扩展方便一些,功能区分什么的
配置收件邮箱
就是收用户意见反馈和退款申请的邮箱,挂在cloudflare上面,上面可以设置指定邮箱(对应域名后缀)和自己的qq邮箱什么的对应,比如 support@privbgcut.pocketjoy.fun 和 xxx@qq.com 对应,到时候用户发给support的就会转发给xxx,这个是cloudflare的能力和后面的resend没有关系,但是这个只能接收,无法主动发送
支付接口
流程
网站支付页发起请求 同时提供machineid -> 信息提供给接口1 请求三方支付平台 ->
三方支付平台返回付款链接 -> 三方支付平台将链接返回接口1 ->
接口1将链接返回网站 -> 网站跳转到三方支付平台对应支付场景 ->
用户支付成功/失败 -> 三方支付平台将信息返回接口2 ->
接口2根据接收到的信息判断是否发送license给对应用户邮箱 这个邮箱由三方支付平台收集
三方支付平台
支付功能会用到,选择的waffo,还不错,有测试模式和生产模式
这里要申请的话,需要网站基础功能可用,还有pricy、term等页面,具体的可以看要求或者问ai,页面也可以直接交给ai生成,但是需要过一遍是否合理。
申请审核挺快的,中午申请下午就下来了,一两个小时吧。
支付接口代码
让ai生产,过程中如果遇到问题实在解决不了,需要给waffo对应文档,ai搜索到的可能过时,具体文档可以在waffo网站找下
可能遇到的问题
- 不知道waffo接口返回的参数名字是什么,之前测试遇到这个问题,不知道哪个参数表示用户邮箱,解决方案是直接让它打印整个返回内容
- 不知道标明流程的唯一key是什么,让ai看文档解决
- 因为代码部署在cloudflare上面,而这个不知道为什么看不到日志,配置了需要的参数也不行,就很奇怪,后面在setting最上面跳出更多的参数配置了才生效。Observability上面的live实时日志,需要开通科学上网才能启动,也比较奇怪。而且上面的日志看不太懂,最后还是将需要打印的内容通过邮箱返回才可以观察(测试环境哈,生产的不能这样搞)
发件邮箱
需要通过邮箱发送license,通过网页用户可能需要自己单独保存,所以此处通过邮箱
使用的是resend,免费额度每天上限100封,还有一个每天上限300网站的我没用,当时因为一点其他情况没有用那个
具体如何接入使用resend可以问ai
部署支付接口代码
部署cloudflare的workers&pages,本来想要直接用privbgcut这个子域名的,但是发现会有冲突,因为之前已经部署了静态页面,那个pages关联了这个子域名,再用这个子域名,尽管后面接的是静态页面不存在的接口,也会冲突,所以又单独搞了个子域名,pay.pocketjoy.fun 咨询过ai,子域名可以有无限个,所以无影响哈哈,看来12块还不错
这里有几点需要注意:
- 因为涉及三方支付平台,有一些依赖,直接将代码粘贴在workers&pages上面会无法运行,所以需要用 npx wrangler 什么的命令,这个是cloudflare的一些命令,可以先在本地运行,好了之后再上传部署到workers&pages,如果对应项目名字不存在,它会自动创建,而且一些之前提到的实现log打印的参数、配置子域名也是本地配置,然后上传自动生效
- 上面提到的代码可能无法本地测,就是可以运行,但是无法测试,当然如果网页端也是本地部署,改下对于链接可能可以测试。
- npx wrangler的一些命令支持远程链接cloudflare,就是已经部署在上面,然后远程链接,log在本地打印,但是我这边实测显示无法链接,科学上网好像也没用,这个pass
- npx wrangler的一些命令支持域名映射,就是给你一个域名,映射你本地服务,这样就可以通过访问域名来访问你本地的服务,但是这样感觉不太安全,我这边跑了几秒就关了。这里发现powershell竟然可以显示二维码,牛逼坏了
- 最后如果涉及一些调试信息,就是waffo参数什么的打印,我的办法就是通过邮件发送(测试环境哈)
SEO
就是让搜索引擎展示多一些,可以问ai怎么做,比如在bing和google的专门的网站提交链接什么的,还有做一些用户可能关注比较多的内容,比如在线抠图和离线抠图对比 https://privbgcut.pocketjoy.fun/offline-vs-online
作为内联链接,内联信息什么的,还有FAQ等前端页面涉及的一些专门的标签什么的
关于对比的一些信息,还是尽量严谨客观一些,不要引起争议,也尽量不要踩别人(当然只是我个人理解,我也还没做起来,所以参考性不高)
下一步计划
app
- 左下角显示的还是模型本来的名称,要改下
- 右上角有个点击跳转官网的按钮,我觉得要再加一个确认,或者弹窗,里面是一个点击跳转地址,不能直接跳转,直接跳转感觉有点突兀
- 加鼠标放在中间栏变成小抓手,可以移动图片的功能
- 找其他类别的模型
安装包
- 做一个不包含webview2的安装包,小一些,不然470MB,感觉有点大,而且用户无法自己选择
- 跑通github得到安装包后自动上传到公开仓的流程,当前上传临时写了个toml
网站
- 暂无
支付接口
- 暂无
SEO
- 在根域名加一些技术博客,或者什么其他的,看引流还是怎么样
总结
ai牛逼