示例#1
0
def weight_train_predict(size, rate, raw_dataset, matrix, train_test_rate,
                         epoch_num, batchsize):
    M = int(size * size * rate)
    imgab = size * size
    if matrix == 'SparseRandom':
        H2 = SparseRandom(M, imgab, 66)
    elif matrix == 'Bernoulli':
        H2 = Bernoulli(M, imgab, 66)
    elif matrix == 'PartHadamard':
        H2 = PartHadamard(M, imgab, 66)
    elif matrix == 'Toeplitz':
        H2 = Toeplitz(M, imgab, 66)
    print(H2)

    i = 0
    files = os.listdir(raw_dataset)
    print(len(files))
    files.sort()
    pix = np.zeros(shape=(len(files), size, size))
    for file in files:
        filename = raw_dataset + '/' + file
        img = np.array(Image.open(filename).convert('L'))
        pia = img[int((img.shape[0] - size) /
                      2):int((img.shape[0] - size) / 2 + size)]
        pib = pia[:,
                  int((img.shape[1] - size) /
                      2):int((img.shape[1] - size) / 2 + size)]
        pix[i] = pib
        i = i + 1

    x_train = np.zeros(shape=(int(len(files) * (1 - train_test_rate)), size,
                              size))
    x_test = np.zeros(shape=(int(len(files) * (train_test_rate)), size, size))
    x_train_input = np.zeros([int(len(files) * (1 - train_test_rate)), M])
    x_test_input = np.zeros([int(len(files) * (train_test_rate)), M])

    for i in range(int(len(files) * (1 - train_test_rate))):
        x_train[i] = pix[i]
        x_train_input[i] = np.matmul(H2, x_train[i].reshape((imgab, )))
    for i in range(int(len(files) * (train_test_rate))):
        x_test[i] = pix[i + int(len(files) * (1 - train_test_rate))]
        x_test_input[i] = np.matmul(H2, x_test[i].reshape((imgab, )))

    x_train = x_train.astype('float32') / 255.
    x_test = x_test.astype('float32') / 255.
    x_train = np.reshape(x_train, (len(x_train), size, size, 1))
    x_test = np.reshape(x_test, (len(x_test), size, size, 1))

    print(x_train.shape)
    print(x_test.shape)

    input_img = Input(shape=(M, ))
    #######################################################################
    x = Dense(size * size, activation='relu')(input_img)
    x = Reshape((size, size))(x)
    x = LSTM(units=12)(x)
    x = Dense(size * size, activation='relu')(x)
    x = Reshape((size, size, 1))(x)
    x = Convolution2D(32, (2, 2), activation='relu', padding='same')(x)
    x = Convolution2D(16, (2, 2), activation='relu', padding='same')(x)
    decoded = Convolution2D(1, (2, 2), activation='sigmoid', padding='same')(x)
    ######################################################################
    autoencoder = Model(inputs=input_img, outputs=decoded)
    autoencoder.compile(optimizer='RMSprop', loss='binary_crossentropy')
    # 打开一个终端并启动TensorBoard,终端中输入 tensorboard --logdir ./autoencoder
    autoencoder.fit(
        x_train_input,
        x_train,
        epochs=epoch_num,
        batch_size=batchsize,
    )
    recovery_start = time.time()
    decoded_imgs = autoencoder.predict(x_test_input)
    recovery_end = time.time()

    n = 10  # how many digits we will display
    plt.figure(figsize=(20, 4))
    for i in range(n):
        ax = plt.subplot(2, n, i + 1)
        plt.imshow(x_test[i].reshape(size, size))
        plt.gray()
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)

        ax = plt.subplot(2, n, i + 1 + n)
        plt.imshow(decoded_imgs[i].reshape(size, size))
        plt.gray()
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)
    plt.show()
    mse = np.zeros(int(len(files) * (train_test_rate)))
    psnr = np.zeros(int(len(files) * (train_test_rate)))
    ssim = np.zeros(int(len(files) * (train_test_rate)))
    x_axis = np.arange(int(len(files) * (train_test_rate)))
    for i in range(int(len(files) * (train_test_rate))):
        array1 = x_test[i].reshape(size, size)
        array1 = array1 * 255  #
        array2 = decoded_imgs[i].reshape(size, size)
        array2 = array2 * 255  #
        mse[i], psnr[i], ssim[i] = ievalue.cal_mse_psnr_ssim(array1, array2)
    return np.mean(mse), np.mean(psnr), np.mean(ssim), (
        recovery_end - recovery_start) / int(len(files) * (train_test_rate))
def weight_train_predict(size,rate,raw_dataset,train_test_rate,epoch_num,batchsize):
    
    i = 0
    files = os.listdir(raw_dataset)  
    print(len(files))
    files.sort()
    pix = np.zeros(shape=(len(files),size,size))
    for file in files:
        filename = raw_dataset + '/'  + file
        img=np.array(Image.open(filename).convert('L'))
        pia = img[int((img.shape[0]-size)/2):int((img.shape[0]-size)/2+size)]
        pib = pia[:,int((img.shape[1]-size)/2):int((img.shape[1]-size)/2+size)]
        pix[i]=pib
        i = i + 1

    x_train = np.zeros(shape=(int(len(files) * (1-train_test_rate)),size,size))
    x_test = np.zeros(shape=(int(len(files) * (train_test_rate)),size,size))

    for i in range(int(len(files) * (1-train_test_rate))):
        x_train[i] = pix[i]
    for i in range(int(len(files) * (train_test_rate))):
        x_test[i] = pix[i+int(len(files) * (1-train_test_rate))]

    x_train = x_train.astype('float32') / 255.
    x_test = x_test.astype('float32') / 255.
    x_train = np.reshape(x_train, (len(x_train), size,size, 1))
    x_test = np.reshape(x_test, (len(x_test),size,size, 1))

    print(x_train.shape)
    print(x_test.shape)

    M =int(size*size*rate)

    input_img = Input(shape=(size,size,1))
    xx = Reshape((size * size,), input_shape=(size,size,1))(input_img)
    #if the weight > 0, weight = 1, otherwise weight = 0
    encoded = Dense(M,activation='relu',use_bias = False, kernel_constraint = two_value())(xx)
    encoder = Model(inputs=input_img, outputs=encoded)
    #######################################################################
    x = Dense(size*size,activation='sigmoid')(encoded)
    x = Dense(size*size*2,activation='sigmoid')(x)
    x = Dense(size*size*8,activation='sigmoid')(x)
    x = Dense(size*size*2,activation='sigmoid')(x)
    x = Dense(size*size,activation='sigmoid')(x)
    decoded = Reshape((size,size,1))(x)
    ######################################################################
    autoencoder = Model(inputs=input_img, outputs=decoded)
    autoencoder.compile(optimizer='RMSprop', loss='binary_crossentropy')
    # 打开一个终端并启动TensorBoard,终端中输入 tensorboard --logdir ./autoencoder
    autoencoder.fit(x_train, x_train, epochs=epoch_num, batch_size=batchsize,)
    recovery_start = time.time()
    decoded_imgs = autoencoder.predict(x_test)
    recovery_end = time.time()

    n = 10  # how many digits we will display
    plt.figure(figsize=(20, 4))
    for i in range(n):
        ax = plt.subplot(2, n, i + 1)
        plt.imshow(x_test[i].reshape(size,size))
        plt.gray()
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)
 
        ax = plt.subplot(2, n, i + 1 + n)
        plt.imshow(decoded_imgs[i].reshape(size,size))
        plt.gray()
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)
    plt.show()
    mse = np.zeros(int(len(files) * (train_test_rate)))
    psnr = np.zeros(int(len(files) * (train_test_rate)))
    ssim = np.zeros(int(len(files) * (train_test_rate)))
    x_axis = np.arange(int(len(files) * (train_test_rate)))
    for i in range(int(len(files) * (train_test_rate))):
        array1 = x_test[i].reshape(size,size)
        array1 = array1*255    #  
        array2 = decoded_imgs[i].reshape(size,size)
        array2 = array2*255    #   
        mse[i],psnr[i],ssim[i] = ievalue.cal_mse_psnr_ssim(array1,array2)  
    return np.mean(mse),np.mean(psnr),np.mean(ssim),(recovery_end-recovery_start)/int(len(files) * (train_test_rate))
def f6(size, rate, raw_dataset, train_test_rate, epoch_num, batchsize):
    files = os.listdir(raw_dataset)
    test_num = len(files)
    pix = np.zeros(shape=(len(files), size, size))
    count = 0
    for file in files:
        filename = raw_dataset + '/' + file
        img = np.array(Image.open(filename).convert('L'))
        pia = img[int((img.shape[0] - size) /
                      2):int((img.shape[0] - size) / 2 + size)]
        pib = pia[:,
                  int((img.shape[1] - size) /
                      2):int((img.shape[1] - size) / 2 + size)]
        pix[count] = pib
        count = count + 1
    sp_result = np.zeros((test_num, size, size))

    #SP算法函数
    def cs_sp(y, D):
        K = math.floor(y.shape[0] / 3)
        pos_last = np.array([], dtype=np.int64)
        result = np.zeros((size))

        product = np.fabs(np.dot(D.T, y))
        pos_temp = product.argsort()
        pos_temp = pos_temp[::-1]  #反向,得到前面L个大的位置
        pos_current = pos_temp[0:K]  #初始化索引集 对应初始化步骤1
        residual_current = y - np.dot(D[:, pos_current],
                                      np.dot(np.linalg.pinv(D[:, pos_current]),
                                             y))  #初始化残差 对应初始化步骤2

        while True:  #迭代次数
            product = np.fabs(np.dot(D.T, residual_current))
            pos_temp = np.argsort(product)
            pos_temp = pos_temp[::-1]  #反向,得到前面L个大的位置
            pos = np.union1d(pos_current, pos_temp[0:K])  #对应步骤1
            pos_temp = np.argsort(np.fabs(np.dot(np.linalg.pinv(D[:, pos]),
                                                 y)))  #对应步骤2
            pos_temp = pos_temp[::-1]
            pos_last = pos_temp[0:K]  #对应步骤3
            residual_last = y - np.dot(D[:, pos_last],
                                       np.dot(np.linalg.pinv(D[:, pos_last]),
                                              y))  #更新残差 #对应步骤4
            if np.linalg.norm(residual_last) >= np.linalg.norm(
                    residual_current):  #对应步骤5
                pos_last = pos_current
                break
            residual_current = residual_last
            pos_current = pos_last
        result[pos_last[0:K]] = np.dot(np.linalg.pinv(D[:, pos_last[0:K]]),
                                       y)  #对应输出步骤
        return result

    #生成高斯随机测量矩阵

    Phi = np.random.randn(int(size * rate), size)

    #生成稀疏基DCT矩阵
    mat_dct_1d = np.zeros((size, size))
    v = range(size)
    for k in range(0, size):
        dct_1d = np.cos(np.dot(v, k * math.pi / size))
        if k > 0:
            dct_1d = dct_1d - np.mean(dct_1d)
        mat_dct_1d[:, k] = dct_1d / np.linalg.norm(dct_1d)
    recovery_time = np.zeros(test_num)
    for j in range(test_num):
        print("the %s th image\n" % j)
        #随机测量
        im = pix[j]
        start = time.clock()
        img_cs_1d = np.dot(Phi, im)
        recovery_start = time.time()
        #重建
        sparse_rec_1d = np.zeros((size, size))  # 初始化稀疏系数矩阵
        Theta_1d = np.dot(Phi, mat_dct_1d)  #测量矩阵乘上基矩阵
        for i in range(size):

            column_rec = cs_sp(img_cs_1d[:, i], Theta_1d)  #利用OMP算法计算稀疏系数
            sparse_rec_1d[:, i] = column_rec
        img_rec = np.dot(mat_dct_1d, sparse_rec_1d)  #稀疏系数乘上基矩阵
        sp_result[j] = img_rec
        recovery_end = time.time()
        #显示重建后的图片
        recovery_time[j] = recovery_end - recovery_start
    n = 10  # how many digits we will display
    plt.figure(figsize=(20, 4))
    for i in range(n):
        ax = plt.subplot(2, n, i + 1)
        plt.imshow(pix[i])

        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)

        ax = plt.subplot(2, n, i + 1 + n)
        plt.imshow(sp_result[i])

        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)
    # plt.show()
    mse = np.zeros(test_num)
    psnr = np.zeros(test_num)
    ssim = np.zeros(test_num)
    nouse = 0
    for i in range(test_num):
        array1 = pix[i].reshape(size, size)
        array1 = array1  #
        array2 = sp_result[i].reshape(size, size)
        array2 = array2  #
        m, p, s = ievalue.cal_mse_psnr_ssim(array1, array2)
        if m == 0:
            print('----------', i)
            nouse = nouse + 1
            continue
        mse[i], psnr[i], ssim[i] = m, p, s
    return np.sum(mse) / (test_num - nouse), np.sum(psnr) / (
        test_num - nouse), np.sum(ssim) / (
            test_num - nouse), np.sum(recovery_time) / (test_num - nouse)
def f7(size, rate, raw_dataset, train_test_rate, epoch_num, batchsize):
    files = os.listdir(raw_dataset)
    test_num = len(files)
    pix = np.zeros(shape=(len(files), size, size))
    count = 0
    for file in files:
        filename = raw_dataset + '/' + file
        img = np.array(Image.open(filename).convert('L'))
        pia = img[int((img.shape[0] - size) /
                      2):int((img.shape[0] - size) / 2 + size)]
        pib = pia[:,
                  int((img.shape[1] - size) /
                      2):int((img.shape[1] - size) / 2 + size)]
        pix[count] = pib
        count = count + 1
    irls_result = np.zeros((test_num, size, size))

    #IRLS算法函数
    def cs_irls(y, T_Mat):
        L = math.floor((y.shape[0]) / 4)
        # print('----------------',L)
        hat_x_tp = np.dot(T_Mat.T, y)
        epsilong = 1
        p = 1  # solution for l-norm p
        times = 1
        while (epsilong > 10e-9) and (times < L):  #迭代次数
            weight = (hat_x_tp**2 + epsilong)**(p / 2 - 1)
            Q_Mat = np.diag(1 / weight)
            #hat_x=Q_Mat*T_Mat'*inv(T_Mat*Q_Mat*T_Mat')*y
            temp = np.dot(np.dot(T_Mat, Q_Mat), T_Mat.T)
            temp = np.dot(np.dot(Q_Mat, T_Mat.T), np.linalg.inv(temp))
            hat_x = np.dot(temp, y)
            if (np.linalg.norm(hat_x - hat_x_tp, 2) < np.sqrt(epsilong) / 100):
                epsilong = epsilong / 10
            hat_x_tp = hat_x
            times = times + 1
        return hat_x

    #生成高斯随机测量s矩阵

    # Phi=np.random.randn(int(size*sampleRate),size)
    Phi = np.random.randn(size, size)
    u, s, vh = np.linalg.svd(Phi)
    Phi = u[:int(size * rate), ]  #将测量矩阵正交化

    #生成稀疏基DCT矩阵
    mat_dct_1d = np.zeros((size, size))
    v = range(size)
    for k in range(0, size):
        dct_1d = np.cos(np.dot(v, k * math.pi / size))
        if k > 0:
            dct_1d = dct_1d - np.mean(dct_1d)
        mat_dct_1d[:, k] = dct_1d / np.linalg.norm(dct_1d)
    recovery_time = np.zeros(test_num)
    for j in range(test_num):
        print("the %s th image\n" % j)
        #随机测量
        im = pix[j]
        start = time.clock()
        img_cs_1d = np.dot(Phi, im)
        recovery_start = time.time()
        #重建
        sparse_rec_1d = np.zeros((size, size))  # 初始化稀疏系数矩阵
        Theta_1d = np.dot(Phi, mat_dct_1d)  #测量矩阵乘上基矩阵
        for i in range(size):
            # print('正在重建第',i,'列。')
            column_rec = cs_irls(img_cs_1d[:, i], Theta_1d)  #利用IRLS算法计算稀疏系数
            sparse_rec_1d[:, i] = column_rec
        img_rec = np.dot(mat_dct_1d, sparse_rec_1d)  #稀疏系数乘上基矩阵
        irls_result[j] = img_rec
        recovery_end = time.time()
        recovery_time[j] = recovery_end - recovery_start

    n = 10  # how many digits we will display
    plt.figure(figsize=(20, 4))
    for i in range(n):
        ax = plt.subplot(2, n, i + 1)
        plt.imshow(pix[i])

        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)

        ax = plt.subplot(2, n, i + 1 + n)
        plt.imshow(irls_result[i])

        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)
    # plt.show()
    mse = np.zeros(test_num)
    psnr = np.zeros(test_num)
    ssim = np.zeros(test_num)
    nouse = 0
    for i in range(test_num):
        array1 = pix[i].reshape(size, size)
        array1 = array1  #
        array2 = irls_result[i].reshape(size, size)
        array2 = array2  #
        m, p, s = ievalue.cal_mse_psnr_ssim(array1, array2)
        if m == 0:
            print('----------', i)
            nouse = nouse + 1
            continue
        mse[i], psnr[i], ssim[i] = m, p, s
    return np.sum(mse) / (test_num - nouse), np.sum(psnr) / (
        test_num - nouse), np.sum(ssim) / (
            test_num - nouse), np.sum(recovery_time) / (test_num - nouse)
def f5(size, rate, raw_dataset, train_test_rate, epoch_num, batchsize):
    files = os.listdir(raw_dataset)
    test_num = len(files)
    pix = np.zeros(shape=(len(files), size, size))
    count = 0
    for file in files:
        filename = raw_dataset + '/' + file
        img = np.array(Image.open(filename).convert('L'))
        pia = img[int((img.shape[0] - size) /
                      2):int((img.shape[0] - size) / 2 + size)]
        pib = pia[:,
                  int((img.shape[1] - size) /
                      2):int((img.shape[1] - size) / 2 + size)]
        pix[count] = pib
        count = count + 1
    omp_result = np.zeros((test_num, size, size))

    #OMP算法函数
    def cs_omp(y, D):
        L = math.floor(3 * (y.shape[0]) / 4)
        residual = y  #初始化残差
        index = np.zeros(size, dtype=int)
        for i in range(size):
            index[i] = -1
        result = np.zeros((size))
        for j in range(L):  #迭代次数
            product = np.fabs(np.dot(D.T, residual))
            pos = np.argmax(product)  #最大投影系数对应的位置

            index[j] = pos

            my = np.linalg.pinv(D[:, index >= 0])  #最小二乘,看参考文献1

            a = np.dot(my, y)  #最小二乘,看参考文献1
            residual = y - np.dot(D[:, index >= 0], a)
        result[index >= 0] = a
        return result

    #生成高斯随机测量矩阵
    # Phi=np.random.randn(int(size*sampleRate),size)
    Phi = np.random.randn(size, size)
    u, s, vh = np.linalg.svd(Phi)
    Phi = u[:int(size * rate), ]  #将测量矩阵正交化

    #生成稀疏基DCT矩阵
    mat_dct_1d = np.zeros((size, size))
    v = range(size)
    for k in range(0, size):
        dct_1d = np.cos(np.dot(v, k * math.pi / size))
        if k > 0:
            dct_1d = dct_1d - np.mean(dct_1d)
        mat_dct_1d[:, k] = dct_1d / np.linalg.norm(dct_1d)

    recovery_time = np.zeros(test_num)

    for j in range(test_num):
        print("the %s th image\n" % j)
        #随机测量
        im = pix[j]
        img_cs_1d = np.dot(Phi, im)
        recovery_start = time.time()
        #重建
        sparse_rec_1d = np.zeros((size, size))  # 初始化稀疏系数矩阵
        Theta_1d = np.dot(Phi, mat_dct_1d)  #测量矩阵乘上基矩阵
        for i in range(size):
            # print('正在重建第',i,'列。')
            column_rec = cs_omp(img_cs_1d[:, i], Theta_1d)  #利用OMP算法计算稀疏系数
            sparse_rec_1d[:, i] = column_rec
        img_rec = np.dot(mat_dct_1d, sparse_rec_1d)  #稀疏系数乘上基矩阵
        omp_result[j] = img_rec
        recovery_end = time.time()
        recovery_time[j] = recovery_end - recovery_start

    n = 10  # how many digits we will display
    plt.figure(figsize=(20, 4))
    for i in range(n):
        ax = plt.subplot(2, n, i + 1)
        plt.imshow(pix[i])
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)

        ax = plt.subplot(2, n, i + 1 + n)
        plt.imshow(omp_result[i])

        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)
    # plt.show()
    mse = np.zeros(test_num)
    psnr = np.zeros(test_num)
    ssim = np.zeros(test_num)
    nouse = 0
    for i in range(test_num):
        array1 = pix[i].reshape(size, size)
        array1 = array1  #
        array2 = omp_result[i].reshape(size, size)
        array2 = array2  #
        m, p, s = ievalue.cal_mse_psnr_ssim(array1, array2)
        if m == 0:
            print('----------', i)
            nouse = nouse + 1
            continue
        mse[i], psnr[i], ssim[i] = m, p, s
    return np.sum(mse) / (test_num - nouse), np.sum(psnr) / (
        test_num - nouse), np.sum(ssim) / (
            test_num - nouse), np.sum(recovery_time) / (test_num - nouse)