InsightFace Server 授权体系解析:MIT 源码、非商用模型授权与 MODEL.LICENSE 机制
【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface
InsightFace Server 仓库通过 server/LICENSING.md 明确了项目内两类资产的授权边界:服务器源码与 Python SDK 采用 MIT 协议,而开源模型包仅限非商用学术研究用途,商用需另行获取授权。本文以该文档为核心,结合仓库内的模型许可证实现、默认模型授权文件与清单生成脚本,说明 Server 在代码层面如何落实"模型授权可验证"这一约束,帮助自托管部署者正确判断自己的使用场景是否合规。
一、授权范围总览:代码 MIT,模型非商用
LICENSING.md 给出了三条授权声明:
- InsightFace Server 的源代码及其 Python SDK 采用 MIT 协议——即
server/目录下的后端、前端、Docker 部署与 server/sdk/python 下的 SDK 均可自由使用; - InsightFace 开源模型包仅授权用于非商用学术研究,商用需通过 insightface.ai 获取商业授权;
- Server 加载的每个模型目录都包含一份
MODEL.LICENSE文件,用于描述该模型的授权状态。
第三条是整个 Server 授权体系的落地点:授权不是停留在文档声明层面,而是以随包分发的结构化 JSON 文件形式存在,并在服务器启动/加载模型时被校验。这一点在 server/pyproject.toml 中也能得到印证——打包时通过license-files = ["LICENSING.md"]将本文件纳入发布物,并将各默认模型的授权文件作为包数据一并分发:
[tool.setuptools.package-data] "insightface_server.licensing" = [ "trusted_keys/*.pem", "defaults/*/MODEL.LICENSE", ]也就是说,安装insightface-server(server/pyproject.toml 中项目名为insightface-server,版本0.2.0)后,包内自带默认模型的MODEL.LICENSE与用于离线验签的 Ed25519 公钥。
二、默认模型的非商用授权文件:MODEL.LICENSE 的真实内容
仓库在 server/backend/insightface_server/licensing/defaults/ 下内置了四组默认模型的授权文件:
defaults/buffalo_l/MODEL.LICENSEdefaults/buffalo_m/MODEL.LICENSEdefaults/buffalo_sc/MODEL.LICENSEdefaults/antelopev2/MODEL.LICENSE
以 buffalo_l 的 MODEL.LICENSE 为例,其完整内容为:
{ "license_version": 1, "license_id": "buffalo_l-public-v1", "issuer": "InsightFace", "model_id": "buffalo_l", "grant": "non-commercial", "valid_from": "2021-09-22T00:00:00Z", "signature": "mkF_zjs_gw5lzWlN6DXlBWPY6ZK7diTGoSORdp33ISLegqxSrL930a--bHEGOOiUO4n-W9kX5qQc6kbEkGnUBQ" }这份文件即 LICENSING.md 中"每个模型目录包含 MODEL.LICENSE"的具体形态,核心字段含义为:
| 字段 | 示例值 | 含义 |
|---|---|---|
license_version | 1 | 许可证格式版本,当前仅支持1 |
license_id | buffalo_l-public-v1 | 许可证唯一标识 |
issuer | InsightFace | 签发方,校验时必须精确等于InsightFace |
model_id | buffalo_l | 该许可证绑定的逻辑模型 ID |
grant | non-commercial | 授权类型,取值为non-commercial或commercial |
valid_from | 2021-09-22T00:00:00Z | 生效时间(UTC,必须带Z后缀) |
valid_until | (可选) | 过期时间;缺省表示长期有效 |
customer/reference | (可选) | 商用许可证必须填写customer指明授权客户 |
signature | base64url 字符串 | 对除签名外全部字段的 Ed25519 签名(64 字节,无填充 base64url 编码) |
其中grant: non-commercial正是 LICENSING.md 中"开源模型包仅限非商用学术研究"这一条款在模型级别的机器可读表达:内置的默认模型全部是non-commercial授权;若某部署使用了grant: "commercial"的许可证,则代表该模型已通过商业渠道获得授权。
三、离线校验实现:model_license.py 的验签流程
Server 对MODEL.LICENSE的校验实现在 server/backend/insightface_server/licensing/model_license.py,核心入口为verify_model_license(path, expected_model_id, ...)。其校验链路可以概括为五个步骤:
- 文件与格式约束:文件必须存在、大小在 1~64 KiB(
MAX_LICENSE_BYTES = 64 * 1024)之间、是合法 JSON 对象,且解析时通过object_pairs_hook拒绝重复键(_reject_duplicate_keys); - 字段白名单校验:必需字段为
license_version、license_id、issuer、model_id、grant、valid_from、signature,可选字段仅有customer、reference、valid_until,出现任何其他字段(unknown)会直接报错;model_id必须匹配^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$,grant必须属于{non-commercial, commercial}; - 签名验证:用 RFC 8785 的 JSON Canonicalization(
rfc8785.dumps)对去除signature字段后的全部字段做规范化,再用内置的 Ed25519 可信公钥逐一验签。可信公钥从licensing/trusted_keys/*.pem加载,当前仓库内置 insightface-model-license-public-ed25519.pem; - 模型范围绑定:
model_id必须等于调用方传入的expected_model_id,防止用 A 模型的许可证去授权 B 模型;商用授权还强制要求customer非空; - 有效期判断:以 UTC 时间比较
valid_from/valid_until,未生效或已过期均抛出ModelLicenseError。
两个值得注意的设计细节,均出自该文件顶部 docstring 与实现代码:
- 许可证不与 ONNX 文件摘要绑定。源码注释明确写道,它是"针对逻辑
model_id的合规凭证,刻意不绑定 ONNX 摘要",这意味着运维方可以自行将模型转换为 FP16、INT8 或 TensorRT 等优化派生版本而无需重新申请授权——授权绑定的是逻辑模型而非具体二进制文件; - 商用判断有统一出口。
ModelLicense.commercial_use_permitted属性直接返回grant == "commercial",服务端其余模块可以据此决定商用能力是否开放,而不需要各自解析字段。
关于密钥管理,trusted_keys/README.md 说明了当前公钥的状态(active,含 DER SHA-256 指纹),并强调私有签发密钥必须保存在 Git 忽略的.private/license-issuer/目录中,绝不进入源码归档或容器镜像——这正是离线校验模式能成立的前提:公钥随包分发可被信任地验签,而签名能力只掌握在签发方手中。
四、清单生成链路:manifest 中的 license 字段
LICENSING.md 的"每个模型目录包含 MODEL.LICENSE"与模型清单机制衔接,体现在 server/scripts/create_model_manifest.py 中。该脚本用于生成 Server 期望的 v1 格式manifest.json,其命令行参数包括:
python create_model_manifest.py \ --models-dir /path/to/models \ --detector det_10g.onnx \ --recognizer w600k_r50.onnx \ --model-id buffalo_l \ --model-version v0.7 \ --display-name Buffalo_L \ --license MODEL.LICENSE \ --output manifest.json参数要点:
--models-dir(必填):模型目录,detector、recognizer、license三个文件都必须直接位于该目录下,脚本会解析绝对路径并检查package_file.parent == root,防止引用目录外的文件;--detector/--recognizer:默认分别为det_10g.onnx与w600k_r50.onnx;--model-id/--model-version/--display-name:默认buffalo_l/v0.7/Buffalo_L;--license:默认为MODEL.LICENSE,即 LICENSING.md 所要求的授权文件名;- 生成的 manifest 包含
manifest_version: 1、文件映射、recognition元数据(input_size: [112, 112]、embedding_dimension: 512、preprocessing: insightface-arcface-1)以及"license"字段,指向模型目录内的授权文件。
也就是说,清单生成、清单加载与许可证校验构成了同一条链路:manifest 声明模型目录里有哪份MODEL.LICENSE,Server 在加载该模型包时按 model_license.py 的流程完成验签,任何一步失败都会以ModelLicenseError阻止模型投入使用。相关行为由 server/tests/unit/test_model_license.py、server/tests/unit/test_inference_manifest.py 等单元测试覆盖。
五、合规边界小结
结合 LICENSING.md 与上述实现,自托管 InsightFace Server 时的授权判断可以归纳为:
| 资产 | 授权 | 依据 |
|---|---|---|
Server 后端/前端源码、Python SDK(server/sdk/python) | MIT | server/LICENSING.md、server/pyproject.toml 的license-files |
| 内置默认模型包(buffalo_l / buffalo_m / buffalo_sc / antelopev2) | 非商用学术研究 | 各defaults/*/MODEL.LICENSE中grant: non-commercial |
| 商业部署所需的模型使用 | 需grant: commercial的许可证 | model_license.py 对customer的强制要求;商用授权获取途径见 LICENSING.md 指向的官方渠道 |
需要注意的限制:非商用限制适用于模型包而非 Server 代码本身——MIT 协议允许你自由使用、修改和分发代码,但代码中加载的开源模型仍受MODEL.LICENSE约束;生产环境若计划商用,应替换为携带grant: "commercial"许可证的模型包,Server 会通过内置公钥离线完成验签而无需访问外部网络。
【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考