Bitadr / DeepSigns

22 stars 5 forks source link

How to install deepsigns? #2

Open guohaoqiang opened 4 years ago

guohaoqiang commented 4 years ago

Hi,

Can you release the source code of DeepSigns? Otherwise, we cannot run your examples (cannot import deepsigns package) and do further work.

Thanks

BigBang019 commented 2 years ago

Hi, @guohaoqiang. Have you solve the problem? If you did, could you please share the solution to me?

guohaoqiang commented 2 years ago

No, it seems they didn't release the main part of their code.

skp-github commented 2 years ago

@BigBang019 there you go buddy :)

from __future__ import print_function
import keras.utils.np_utils as kutils, keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import SGD
import keras.backend as K, numpy as np
from keras.datasets import mnist
from multinomial_distribution import get_theta_multinomial
from scipy.special import comb

def compute_mismatch_threshold(C=10, Kp=50, p=0.05):
    prob_sum = 0
    p_err = 1 - 1.0 / C
    for i in range(Kp):
        cur_prob = comb(Kp, i, exact=False) * np.power(p_err, i) * np.power(1 - p_err, Kp - i)
        prob_sum = prob_sum + cur_prob
        if prob_sum > p:
            theta = i
            break

    return theta

def key_generation(x_train, y_train, marked_model, desired_key_len, num_classes=10, embed_epoch=20, modulation_strength=60000):
    key_len = np.dot(40, desired_key_len)
    batch_size = 128
    num_classes = 10
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    x_train = x_train.reshape(60000, 784)
    x_test = x_test.reshape(10000, 784)
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    x_train /= 255
    x_test /= 255
    y_train = kutils.to_categorical(y_train, num_classes)
    y_test = kutils.to_categorical(y_test, num_classes)
    key_gen_flag = 1
    while key_gen_flag:
        np.random.seed()
        x_retrain_rand = np.random.randint(256, size=(key_len, 784))
        x_retrain_rand = x_retrain_rand / 255.0
        np.random.seed()
        y_retrain_rand_vec = np.random.randint(10, size=(key_len, 1))
        y_retrain_rand = kutils.to_categorical(y_retrain_rand_vec, num_classes)
        x_train_subset = x_train[0:modulation_strength, :]
        y_train_subset = y_train[0:modulation_strength, :]
        x_retrain = np.vstack((x_train_subset, x_retrain_rand))
        y_retrain = np.vstack((y_train_subset, y_retrain_rand))
        unmarked_score = marked_model.evaluate(x_test, y_test, verbose=0)
        prediction_random_key = marked_model.predict(x_retrain_rand, batch_size=batch_size)
        preds = np.argmax(prediction_random_key, axis=1)
        preds = np.reshape(preds, (key_len, 1))
        mismatched_result = (preds != y_retrain_rand_vec) * 1
        random_unmarkMismatched_idx = np.argwhere(mismatched_result)
        random_unmarkMismatched_idx = random_unmarkMismatched_idx[:, 0]
        history = marked_model.fit(x_retrain, y_retrain, batch_size=batch_size, nb_epoch=embed_epoch, shuffle=True, verbose=1, validation_data=(x_test, y_test))
        score = marked_model.evaluate(x_test, y_test, verbose=0)
        score = marked_model.evaluate(x_retrain_rand, y_retrain_rand, verbose=0)
        Perr_marked = 1 - score[1]
        mark_NN_err = int(Perr_marked * key_len)
        prediction_random_key = marked_model.predict(x_retrain_rand, batch_size=batch_size)
        preds = np.argmax(prediction_random_key, axis=1)
        preds = np.reshape(preds, (key_len, 1))
        matched_result = (preds == y_retrain_rand_vec) * 1
        matched_result = np.reshape(matched_result, (matched_result.shape[0], 1))
        random_MarkMatched_idx = np.argwhere(matched_result)
        random_MarkMatched_idx = random_MarkMatched_idx[:, 0]
        selected_key_idx = np.intersect1d(random_MarkMatched_idx, random_unmarkMismatched_idx)
        selected_keys = x_retrain_rand[np.array(selected_key_idx).astype(int), :]
        selected_keys_labels = y_retrain_rand[np.array(selected_key_idx).astype(int)]
        usable_key_len = selected_keys.shape[0]
        print('usable key len is: ', usable_key_len)
        if usable_key_len < desired_key_len:
            key_gen_flag = 1
            print(' Desire key length is {}, Need longer key, skip this test. '.format(desired_key_len))
        else:
            key_gen_flag = 0
            selected_keys = selected_keys[0:desired_key_len, :]
            selected_keys_labels = selected_keys_labels[0:desired_key_len]
            np.save('result/keyRandomImage' + '_keyLength' + str(desired_key_len) + '.npy', selected_keys)
            np.savetxt('result/keyRandomLabel' + '_keyLength' + str() + '.txt', selected_keys_labels, fmt='%i', delimiter=',')
            actual_key_len = selected_keys.shape[0]
            marked_model.save_weights('result/markedWeights' + '.h5')
            print('WM key generation finished. Save watermarked model. ')
            break

    return (
     selected_keys, selected_keys_labels)

def count_response_mismatch(Y_preds, Y_key):
    num_mismatch = np.sum((Y_preds == Y_key) * 1)
    return num_mismatch

Code was always there : Read This

BigBang019 commented 2 years ago

@skp-github thanks a lot. : )