# 密码标签获取,数据集嵌入黑盒水印源码及打包项目 ## 功能列表 - [x] 密码标签生成 - [x] 密码标签自检(测试) - [x] 密码标签验证 - [x] 日志模板 - [x] 日志记录 - [x] 密码标签分段并生成二维码 - [x] 处理训练集 - [x] 生成触发集 ~~图像嵌入密码标签~~ ~~图像提取密码标签~~ ~~图像处理功能自检~~ - [ ] 黑盒水印验证流程 - [x] 验证模型文件与触发集图片签名值(http,接口) - [x] 对比预测准确率(http,接口) - [x] 从触发集提取组装密码标签,进行验签,返回验签结果(http,接口) ## 分支说明 - `master`分支只包含项目打包配置和密码标签获取,数据集嵌入黑盒水印源码 ## 安装依赖 ```shell pip install -r requirements.txt ``` ## 文件组成 ```text watermark_generate_pkg ├── MANIFEST.in # 打包过滤文件 ├── README.md # 描述文件 ├── setup.py # 打包配置文件 ├── tests # 测试目录 │ ├── test_gen_qrcodes.py # 测试密码标签二维码生成,处理训练集,生成触发集,触发集提取密码标签 │ └── test_secret_func.py # 测试密码标签生成,密码标签验证 └── watermark_generate ├── __init__.py ├── controller # 服务接口目录 │ ├── __init__.py │ ├── log_controller.py # 日志控制接口,支持控制日志级别,控制日志输出大小 │ ├── secret_controller.py # 密码标签生成接口,包括密码标签生成、密码标签验证、密码标签功能自检 │ └── verify_model_controller.py # 模型验证接口,包括从触发集提取密码标签,验证预测结果 ├── domain │ ├── __init__.py │ ├── dataset_domain.py # 接口格式定义 │ └── secret_domain.py # 接口格式定义 ├── requirements.txt # 项目依赖文件,安装依赖使用 ├── run.py # 服务运行脚本 └── tools #工具脚本目录 ├── __init__.py ├── dataset_process.py # 数据集处理脚本 ├── gen_qrcodes.py # 密码标签生成二维码,从图片中提取二维码 ├── logger_tool.py # 日志工具脚本 └── secret_func.py # 密码标签生成与验证工具,需要根据密码机实际提供接口进行修改,目前只有模拟实现 ``` ## 代码集成 1. 根据密码标签生成密码标签二维码 ```python from watermark_generate.tools.gen_qrcodes import generate_qrcodes result = generate_qrcodes(key=secret, watermarking_dir=watermarking_dir, variants=4) if not result: print('生成失败') else: print('生成成功') ``` 2. 处理训练集 ```python from watermark_generate.tools.dataset_process import process_train_dataset src_img_path = './dataset/VOC2007/JPEGImages/' label_path = './dataset/VOC2007/labels/' watermark_gen_dir = './dataset/watermarking' process_train_dataset(watermarking_dir=watermark_gen_dir, src_img_dir=src_img_path, label_file_dir=label_path) ``` 3. 生成触发集 ```python from watermark_generate.tools.dataset_process import generate_trigger_dataset src_img_path = './dataset/VOC2007/JPEGImages/' trigger_dataset_dir = './dataset/trigger' watermark_gen_dir = './dataset/watermarking' generate_trigger_dataset(watermarking_dir=watermark_gen_dir, src_img_dir=src_img_path, trigger_dataset_dir=trigger_dataset_dir, percentage=1) ``` 4. 从触发集提取密码标签 ```python from watermark_generate.tools.dataset_process import extract_crypto_label_from_trigger trigger_upload_dir = '../watermark_generate/extracted/' label = extract_crypto_label_from_trigger(trigger_upload_dir) ``` 5. 验证预测结果 ```python from watermark_generate.tools.dataset_process import compare_pred_result result = compare_pred_result(result_file='./upload/006643.txt',pre_result_file='./resource/results/006643.txt') if result: print('验证成功') else: print('验证失败') ``` ## http接口定义 # AI水印黑盒水印HTTP接口 ## POST 日志调整接口 POST /znwr/jit/ai/v1/log_setting > Body 请求参数 ```json { "level": "string", "size": 0 } ``` ### 请求参数 |名称|位置|类型|必选|中文名|说明| |---|---|---|---|---|---| |body|body|object| 否 ||none| |» level|body|string| 是 | 输出日志级别|debug、info、warning、error| |» size|body|number| 是 | 日志最大大小限制|单位KB| > 返回示例 > 200 Response ```json { "code": 0, "msg": "string" } ``` ### 返回结果 |状态码|状态码含义|说明|数据模型| |---|---|---|---| |200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[VerifyLabelResp](#schemaverifylabelresp)| # 模型密码标签生成模块 ## POST 密码标签生成 POST /znwr/jit/ai/v1/crypto-label > Body 请求参数 ```json { "info": { "owner": { "name": "string", "id": "string" }, "model": { "name": "string", "id": "string", "version": "string", "date": "2019-08-24T14:15:22Z" } } } ``` ### 请求参数 |名称|位置|类型|必选|中文名|说明| |---|---|---|---|---|---| |body|body|[GenLabelForm](#schemagenlabelform)| 否 ||none| > 返回示例 > 200 Response ```json { "code": 0, "msg": "string", "label": "string", "cert": "string" } ``` ### 返回结果 |状态码|状态码含义|说明|数据模型| |---|---|---|---| |200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[GenLabelResp](#schemagenlabelresp)| ## POST 密码标签功能自检 POST /znwr/jit/ai/v1/crypto-check > 返回示例 > 200 Response ```json { "code": 0, "msg": "string" } ``` ### 返回结果 |状态码|状态码含义|说明|数据模型| |---|---|---|---| |200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[VerifyLabelResp](#schemaverifylabelresp)| # 模型密码标签验证模块 ## POST 密码标签验证 POST /znwr/jit/ai/v1/verify-label > Body 请求参数 ```json { "label": "string", "info": "string", "cert": "string" } ``` ### 请求参数 |名称|位置|类型|必选|中文名|说明| |---|---|---|---|---|---| |body|body|[VerifyLabelForm](#schemaverifylabelform)| 否 ||none| > 返回示例 > 200 Response ```json { "code": 0, "msg": "string" } ``` ### 返回结果 |状态码|状态码含义|说明|数据模型| |---|---|---|---| |200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[VerifyLabelResp](#schemaverifylabelresp)| ## POST 密码机验签接口 POST /znwr/jit/ai/v1/verify-sign > Body 请求参数 ```json { "original": "string", "signature": "string", "cert": "string" } ``` ### 请求参数 |名称|位置|类型|必选|中文名|说明| |---|---|---|---|---|---| |body|body|[VerifySignatureForm](#schemaverifysignatureform)| 否 ||none| > 返回示例 > 200 Response ```json { "code": 0, "msg": "string" } ``` ### 返回结果 |状态码|状态码含义|说明|数据模型| |---|---|---|---| |200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[VerifyLabelResp](#schemaverifylabelresp)| ## POST 触发集提取密码标签 POST /znwr/jit/ai/v1/extract_crypto_label > Body 请求参数 ### 请求参数 |名称|位置|类型|必选|中文名|说明| |---|---|---|---|---|---| |body|body|object| 否 ||none| |» file|body|(binary)| 否 ||触发集压缩为zip格式压缩文件| > 返回示例 > 200 Response ```json { "code": 0, "msg": "string" } ``` ### 返回结果 |状态码|状态码含义|说明|数据模型| |---|---|---|---| |200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[VerifyLabelResp](#schemaverifylabelresp)| ## POST 验证模型准确率 POST /znwr/jit/ai/v1/verify_precision > Body 请求参数 |名称|位置|类型|必选|中文名|说明| |---|---|---|---|---|---| |body|body|object| 否 ||none| |» file|body|(binary)| 否 ||模型预测结果输出文件| > 返回示例 > 200 Response ```json { "code": 0, "msg": "string" } ``` ### 返回结果 |状态码|状态码含义|说明|数据模型| |---|---|---|---| |200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[VerifyLabelResp](#schemaverifylabelresp)| # 数据模型