model_decoder.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. """
  2. Created on 2024/5/8
  3. @author: <NAME>
  4. @version: 1.0
  5. @file: model_decoder.py
  6. @brief 白盒水印解码器
  7. """
  8. from typing import List
  9. import numpy as np
  10. from mindspore import nn, Tensor
  11. from watermark_codec.tool.str_convertor import bin2string
  12. from watermark_codec.tool.tensor_deal import load_tensor, flatten_parameters, get_prob
  13. class ModelDecoder:
  14. def __init__(self, layers: List[nn.Conv2d] = None, weights: List[Tensor] = None, key_path: str = None):
  15. """
  16. 初始化白盒模型解码器
  17. :param layers: 模型嵌入白盒水印的加密层
  18. :param weights: 模型嵌入白盒水印的加密层的权重,当weights不为None时,layers参数无效
  19. :param key_path: 投影矩阵导出文件位置,加载投影矩阵使用
  20. """
  21. # 判断传入的层是否全部为卷积层
  22. if layers is None and weights is None:
  23. raise RuntimeError('layers和weights不可同时为空')
  24. if weights is None:
  25. for layer in layers:
  26. if not isinstance(layer, nn.Conv2d):
  27. raise TypeError('传入参数不是卷积层')
  28. weights = [x.weight for x in layers] # 获取所有卷积层权重
  29. self.w = flatten_parameters(weights)
  30. self.x_random = load_tensor(key_path)
  31. self.model = None
  32. def decode(self):
  33. prob = get_prob(self.x_random, self.w)
  34. prob = prob.asnumpy()
  35. decode = np.where(prob > 0.5, 1, 0)
  36. code_string = ''.join([str(x) for x in decode.tolist()])
  37. code_string = bin2string(code_string)
  38. return code_string