批量 AI 抠图 · 部署说明(零外部依赖)

    # ps 批量 AI 抠图 · 部署说明

    > 适用版本:本地完全离线版(库 + 推理引擎 + AI 模型全部打包在 `vendor/`,页面零外部依赖)

    > 最后更新:2026-08-04

    ScreenShot_2026-08-05_085637_274.jpg

    ---

    ## 一、部署文件清单

    **必须上传(3 项):**

    | 文件/目录 | 大小 | 说明 |

    |-----------|------|------|

    | `index.html` | 约 30 KB | 主页面(上传区 / 参数区 / 任务队列 / 悬浮操作栏) |

    | `vendor/` | 约 212 MB | 全部运行依赖:AI 库、onnxruntime-web 推理引擎、AI 模型(U²-Net)、JSZip |

    | `.htaccess` | 约 0.6 KB | Apache 环境必带:`.mjs` MIME 类型 + COOP/COEP 跨域隔离头(Nginx 环境需改用配置,见第五节) |

    > `vendor/imgly/model/` 约 211 MB,包含 AI 模型分块(small + medium),是体积大头,属正常。

    **上传后目录结构(示例):**

    /path/to/site/

    ├── index.html

    ├── .htaccess            ← 仅 Apache 需要

    └── vendor/

        ├── imgly/model/     ← AI 模型(资源清单 + 分块)

        ├── lib/             ← 抠图库

        ├── onnxruntime-web/ ← 推理引擎

        ├── jszip/           ← ZIP 打包

        └── 若干 .mjs 依赖

    ---

    ## 二、可以不上传的文件(本地保留即可)

    以下文件与运行无关,**无需上传**,避免浪费空间和带宽:

    | 文件 | 说明 |

    |------|------|

    | `background-removal-data-1.4.5/` | 原始模型下载包,`vendor/imgly/model/` 已包含其内容 |

    | `ps.rar` / `p1s.rar` | 本地压缩包备份 |

    | `参考.html` | 抠抠图参考页面 |

    | `*.bak-*` | 历史修改备份 |

    ---

    ## 三、环境要求

    1. **必须 HTTPS**(或本机 localhost)

       - 页面依赖 COEP 跨域隔离启用 WASM 多线程,这要求"安全上下文"(secure context)。

       - 纯 HTTP 线上部署会退回单线程推理,速度明显变慢,控制台出现 `numThreads ... crossOriginIsolated` 警告。

    2. **必须经 HTTP(S) 访问,不能 file:// 直接打开**——浏览器会因 CORS 拒绝加载模型分块。

    3. **不支持 IE**,请使用 Chrome / Edge / Firefox / Safari 等现代浏览器。

    ---

    ## 四、Apache 环境配置

    Apache 环境下,随包上传的 `.htaccess` 即可生效,其内容为:

    ```apache

    # 本地 AI 抠图工具:确保 ES 模块(.mjs)与 wasm 以正确 MIME 提供

    # 浏览器对 <script type="module"> 强制校验 JavaScript MIME,否则拒绝执行

    AddType text/javascript .mjs

    AddType application/javascript .mjs

    AddType application/wasm .wasm

    # 启用 Cross-Origin Isolation,允许 onnxruntime-web 使用多线程 WASM

    # 所有子资源必须来自同域或带有 CORP 头;本页所有资源均为同域,无外部依赖

    <IfModule mod_headers.c>

      Header set Cross-Origin-Opener-Policy "same-origin"

      Header set Cross-Origin-Embedder-Policy "require-corp"

    </IfModule>

    **需要确认的两点:**

    1. **`mod_headers` 模块已启用**

       ```bash

       # Debian/Ubuntu

       sudo a2enmod headers

       sudo systemctl reload apache2

    2. **目录允许 `.htaccess` 覆盖**(`AllowOverride` 不能是 `None`):

       ```apache

       <Directory "/path/to/site">

           AllowOverride All

           Require all granted

       </Directory>

    > 若无法启用 `AllowOverride`,也可直接把上述 `Header set` 与 `AddType` 写进 Apache 主配置的 `<VirtualHost>` 或 `<Directory>` 块内。

    ---

    ## 五、Nginx 环境配置

    Nginx **不识别 `.htaccess`**,需在站点配置(`server` 块)中手动添加:

    server {

        listen 443 ssl http2;

        server_name 你的域名;

        # HTTPS 证书配置(必须,跨域隔离需要安全上下文)

        ssl_certificate     /path/to/cert.pem;

        ssl_certificate_key /path/to/key.pem;

        root /path/to/site;

        index index.html;

        # 1) ES 模块 .mjs 必须按 JavaScript 提供,否则浏览器拒绝执行

        location ~ \.mjs$ {

            add_header Content-Type "text/javascript" always;

            try_files $uri =404;

        }

        # 2) 跨域隔离头:让 onnxruntime 多线程 WASM 生效

        add_header Cross-Origin-Opener-Policy "same-origin" always;

        add_header Cross-Origin-Embedder-Policy "require-corp" always;

        # 3) 静态资源缓存(可选,加速二次加载)

        location /vendor/ {

            add_header Cache-Control "public, max-age=31536000, immutable";

        }

        location / {

            try_files $uri $uri/ /index.html;

        }

    }

    **要点:**

    - `.mjs` 的 `Content-Type` 必须为 `application/javascript`(或 `text/javascript`),浏览器对 ES 模块强制校验 MIME。

    - COOP / COEP 头要加在**所有响应**上(`always`),包括 index.html 和 vendor 下的资源。

    - 若静态资源托管在 CDN 上,CDN 需放行并透传这些响应头。

    ---

    ## 六、部署后验证

    1. 打开 `https://你的域名/`,F12 → Network 面板:

       - `vendor/lib/index.mjs` → 状态 200,`Content-Type: application/javascript`

       - `vendor/imgly/model/resources.json` → 状态 200

       - 模型分块文件 → 状态 200(约 4 MB / 个)

    2. F12 → Console:

       - 无 `numThreads ... crossOriginIsolated` 警告 → 跨域隔离生效

       - 无红色报错 → 依赖加载正常

    3. 上传 1 张图点"开始批量抠图",观察:

       - 首次会下载模型(small 约 44 MB / medium 约 88 MB),页面显示"正在加载 AI 抠图引擎"

       - 单张出图后卡片状态变"已完成",可下载 / ZIP 打包

    ---

    ## 七、常见问题 FAQ

    **Q1:打开页面一片空白 / 控制台报 `Failed to load module script`**

    - `.mjs` MIME 未配置(Apache 检查 `.htaccess` 是否生效;Nginx 检查 `location ~ \.mjs$`)。

    - 确认是通过 `http(s)://` 访问,而不是 `file://`。

    **Q2:控制台报 `numThreads is set to ... but this will not work unless crossOriginIsolated`**

    - COOP / COEP 头未生效或站点不是 HTTPS。

    - 按第四节 / 第五节补上头,并用 HTTPS 访问。

    **Q3:处理速度慢(单张 30s+)**

    - 大概率是跨域隔离没生效(退回单线程)。先按 Q2 排查。

    - 确认 Chrome/Edge 里 `chrome://gpu` 的 WebGL/WebGPU 正常;CPU 机器上批量并发会自动降为 1。

    **Q4:个别图有阴影 / 主体被切**

    - 参数区可调:去白边(spill)默认 4,阴影残留可拉到 5;边缘收缩默认 0,深阴影可调 1~2,主体被切则调回 0。

    **Q5:模型精度下拉为什么只有一项?**

    - 已移除 small(极速)模型选项:小模型预测边缘粗糙、阴影更多。如需恢复,在 `index.html` 的 `<select id="model">` 内加回 `<option value="small">极速(体积小)</option>` 即可。

    **Q6:212 MB 太大,能否瘦身?**

    - 模型分块中 small + medium 是分开的。若确定只用高精度(medium),可参照 `vendor/imgly/model/resources.json` 确认分块归属后删除 small 相关分块;此操作风险较高,建议保留全量。

    ---

    > 部署即交付,全部为静态文件,无需数据库、无需 PHP、无需构建,上传即用。