# 模型水印验证 提供模型训练嵌入白盒水印和从已经嵌入白盒水印的模型中提取水印的功能 ## 分支说明 - `master`分支使用onnx权重文件进行水印提取流程 - `om`分支使用昇腾平台专用om权重文件格式进行水印提取流程 ## 水印提取流程说明 - 黑盒水印提取流程 1. 初始化参数和参数检查(模型绝对路径、触发集位置、触发集水印标记文件qrcode_positions.txt、公钥文件public.key) 2. 使用权重文件对触发集进行推理(使用[inference](watermark_verify%2Finference)模块进行推理):模型文件、输入 -> 输出 1. inference推理流程:参数,模型文件,图片路径 -> 输出:推理结果 1. 对输入图片进行预处理,将其转化为模型输入所需类型 2. 使用onnx模型文件对处理完成的输入进行推理,获取推理结果 3. 对推理结果进行后处理(例如目标检测模型需要对输出结果进行非极大抑制等) 3. 对模型推理结果进行标签检测 4. 模型推理结果判断标签存在,使用触发集进行标签提取 5. 对提取的密码标签进行验签 6. 验签通过,模型水印提取检测成功 - 白盒水印提取流程 1. 初始化参数和参数检查(模型绝对路径、公钥文件public.key、投影矩阵导出文件key.npy、嵌入水印的卷积层位置) 2. 获取指定卷积层,通过运算,提取密码标签 3. 对提取的密码标签进行验签 4. 验签通过,模型水印提取检测成功 ## 代码说明 ```shell model_watermark_detect ├── MANIFEST.in # 打包描述文件 ├── README.md # 项目说明文档 ├── setup.py # 打包配置文件 ├── tests │   ├── README.md │   ├── classification_performance_loss_test.py # 图像分类模型性能测试脚本 │   ├── detection_performance_loss_test.py # 目标检测模型性能测试脚本 │   ├── inference_test.py # 模型推理模块测试脚本 │   ├── prune_tool.py # onnx文件剪枝工具 │   ├── models # 待测模型 │   ├── verify_tool_accuracy_test.py # 模型水印检测成功率测试脚本 │   └── verify_tool_test.py # 模型水印检测测试 └── watermark_verify # 模型水印提取验证工具 ├── __init__.py ├── inference # 模型推理流程 │   ├── __init__.py │   ├── classification_inference.py │   ├── rcnn_inference.py │   ├── ssd_inference.py │   └── yolox_inference.py ├── process # 各种模型水印提取验证流程、每个文件代表指定类型模型提取验证流程 │   ├── __init__.py │   ├── classification_all_whitebox_process.py │   ├── classification_pytorch_blackbox_process.py │   ├── classification_tensorflow_blackbox_process.py │   ├── faster_rcnn_pytorch_blackbox_process.py │   ├── faster_rcnn_pytorch_whitebox_process.py │   ├── general_process_define.py │   ├── googlenet_all_whitebox_process.py │   ├── ssd_pytorch_blackbox_process.py │   ├── ssd_pytorch_whitebox_process.py │   ├── yolox_pytorch_blackbox_process.py │   └── yolox_pytorch_whitebox_process.py ├── tools # 工具脚本目录 │   ├── __init__.py │   ├── evaluate_tool.py │   ├── general_tool.py │   ├── parse_qrcode_label_file.py │   ├── qrcode_tool.py │   ├── secret_label_func.py │   └── sign_verify.py ├── utils # 目标检测模型推理所需工具代码 │   ├── anchors.py │   └── utils_bbox.py └── verify_tool.py # 验证工具接口 ``` ## inference目录下文件说明 inference保存各种模型onnx权重文件的推理流程,可根据模型类型选择指定文件使用onnx权重进行推理 - [classification_inference.py](watermark_verify%2Finference%2Fclassification_inference.py) :图像分类模型推理流程 - [yolox_inference.py](watermark_verify%2Finference%2Fyolox_inference.py) :YOLOX模型推理流程 - [ssd_inference.py](watermark_verify%2Finference%2Fssd_inference.py) :SSD模型推理流程 - [rcnn_inference.py](watermark_verify%2Finference%2Frcnn_inference.py) :Faster-RCNN模型推理流程 #### 使用方式(以使用Faster-RCNN模型进行推理举例): ```python from watermark_verify.inference.rcnn_inference import FasterRCNNInference from watermark_verify.inference.ssd_inference import SSDInference from watermark_verify.inference.yolox_inference import YOLOXInference if __name__ == '__main__': # 模型文件位置 model_filename = "/mnt/e/DevTools/workspace/model_watermark_detect/tests/models/origin/faster-rcnn/model.onnx" # 图片位置 image_path = 'VOC2007/JPEGImages/000001.jpg' dets = FasterRCNNInference(model_filename).predict(image_path) # 使用Faster-RCNN进行推理,获取模型输出结果 # dets = SSDInference(model_filename).predict(image_path) # 使用SSD进行推理,获取模型输出结果 # dets = YOLOXInference(model_filename).predict(image_path) # 使用YOLOX进行推理,获取模型输出结果 print(f"dets: {dets}") ``` ## process目录下文件说明 process保存各种模型黑盒水印或白盒水印提取验证流程,文件名定义如下: ```text [模型名称]_[支持深度学习框架]_[模型水印类型]_process.py ``` - 模型名称:classification:所有图像分类模型,detection:所有目标检测模型,alexnet、vgg、googlenet、resnet、yolox、ssd、faster-rcnn:分别指代指定模型 - 支持深度学习框架:all:支持所有框架,pytorch、tensorflow、keras - 模型水印类型:whitebox:白盒水印、blackbox:黑盒水印 ## 模块打包 ```shell python setup.py sdist ``` 项目目录会生成`dist`目录,其中`watermark_detector-1.0.tar.gz`即为发布包 ## 安装模块 ```shell pip install watermark_detector-1.0.tar.gz ```