Converta o modelo Apple NeuralHash para detecção de CSAM em ONNX.
A Apple NeuralHash é um método de hash perceptivo para imagens baseadas em redes neurais. Pode tolerar redimensionamento da imagem e compressão. As etapas do hash são as seguintes:
360x360 .[-1, 1] intervalo.96x128 com o vetor resultante de 128 carros alegóricos.Neste projeto, convertemos o modelo NeuralHash da Apple em formato ONNX. Um script de demonstração para testar o modelo também está incluído.
MacOS e Linux funcionarão. Nas seções a seguir, o Debian é usado para o exemplo do Linux.
brew install lzfse .Python 3.6 e acima deve funcionar. Instale as seguintes dependências:
pip install onnx coremltoolsVocê precisará de 4 arquivos de uma compilação recente do MacOS ou iOS:
Opção 1: do MacOS ou do dispositivo iOS de jailbreak (recomendado)
Se você tiver uma versão recente do MacOS (11,4+) ou do iOS Jailbroken (14.7+) instalado, basta pegar esses arquivos de /System/Library/Frameworks/Vision.framework/Resources/ (no macOS) ou /System/Library/Frameworks/Vision.framework/ (no ios).
.ipsw de uma construção recente do iOS (14.7+) do IPSW.ME. cd /path/to/ipsw/file
mkdir unpacked_ipsw
cd unpacked_ipsw
unzip ../ * .ipswls -lh O que você precisa é o maior arquivo .dmg , por exemplo, 018-63036-003.dmg .
# Build and install apfs-fuse
sudo apt install fuse libfuse3-dev bzip2 libbz2-dev cmake g++ git libattr1-dev zlib1g-dev
git clone https://github.com/sgan81/apfs-fuse.git
cd apfs-fuse
git submodule init
git submodule update
mkdir build
cd build
cmake ..
make
sudo make install
sudo ln -s /bin/fusermount /bin/fusermount3
# Mount image
mkdir rootfs
apfs-fuse 018-63036-003.dmg rootfs Os arquivos necessários estão abaixo /System/Library/Frameworks/Vision.framework/ no caminho montado.
Coloque -os no mesmo diretório:
mkdir NeuralHash
cd NeuralHash
cp /System/Library/Frameworks/Vision.framework/Resources/NeuralHashv3b-current.espresso. * .
cp /System/Library/Frameworks/Vision.framework/Resources/neuralhash_128x96_seed1.dat . Os modelos de núcleo ML normalmente compilados armazenam a estrutura em model.espresso.net e formas em model.espresso.shape , ambos em JSON. É o mesmo para o modelo NeuralHash, mas compactado com Lzfse.
dd if=NeuralHashv3b-current.espresso.net bs=4 skip=7 | lzfse -decode -o model.espresso.net
dd if=NeuralHashv3b-current.espresso.shape bs=4 skip=7 | lzfse -decode -o model.espresso.shape
cp NeuralHashv3b-current.espresso.weights model.espresso.weights cd ..
git clone https://github.com/AsuharietYgvar/TNN.git
cd TNN
python3 tools/onnx2tnn/onnx-coreml/coreml2onnx.py ../NeuralHash O modelo resultante é NeuralHash/model.onnx .
Netron é uma ferramenta perfeita para esse fim.
pip install onnxruntime pillownnhash.py em uma imagem: python3 nnhash.py /path/to/model.onnx /path/to/neuralhash_128x96_seed1.dat image.jpgExemplo de saída:
ab14febaa837b6c1484c35e6
Nota: O hash neural gerado aqui pode ser alguns bits de um gerado em um dispositivo iOS. Isso é esperado, pois diferentes dispositivos iOS geram hashes ligeiramente diferentes de qualquer maneira. O motivo é que as redes neurais são baseadas em cálculos de ponto flutuante. A precisão é altamente dependente do hardware. Para redes menores, não fará nenhuma diferença. Mas o NeuralHash tem mais de 200 camadas, resultando em erros cumulativos significativos.
| Dispositivo | Hash |
|---|---|
| iPad Pro 10,5 polegadas | 2b186faa6b36ffcc4c4635e1 |
| M1 Mac | 2b5c6faa6bb7bdcc4c4731a1 |
| simulador iOS | 2b5c6faa6bb6bdcc4c4731a1 |
| Onnx Runtime | 2b5c6faa6bb6bdcc4c4735a1 |