为了账号安全,请及时绑定邮箱和手机立即绑定

为CNN编写训练模型

为CNN编写训练模型

HUWWW 2021-11-09 15:02:22
我正在为TwoStream-IQA编写训练代码,它是一个双流卷积神经网络。该模型通过网络的两个流预测正在评估的补丁的质量分数。在下面的培训中,我使用了上面 GitHub 链接中提供的测试数据集。训练代码如下:import osimport timeimport numpy as npimport argparseimport chainerchainer.global_config.train=Truefrom chainer import cudafrom chainer import serializersfrom chainer import optimizersfrom chainer import iteratorsfrom chainer import training from chainer.training import extensionsfrom PIL import Imagefrom sklearn.feature_extraction.image import extract_patchesfrom model import Modelparser = argparse.ArgumentParser(description='train.py')parser.add_argument('--model', '-m', default='',                     help='path to the trained model')parser.add_argument('--gpu', '-g', default=0, type=int, help='GPU ID')args = parser.parse_args()model = Model()cuda.cudnn_enabled = Truecuda.check_cuda_available()xp = cuda.cupymodel.to_gpu()## prepare training data test_label_path = 'data_list/test.txt'test_img_path = 'data/live/'test_Graimg_path = 'data/live_grad/'save_model_path = '/models/nr_sana_2stream.model'patches_per_img = 256patchSize = 32print('-------------Load data-------------')final_train_set = []with open(test_label_path, 'rt') as f:    for l in f:        line, la = l.strip().split()  # for debug        tic = time.time()        full_path = os.path.join(test_img_path, line)        Grafull_path = os.path.join(test_Graimg_path, line)        inputImage = Image.open(full_path)        Graf = Image.open(Grafull_path)        img = np.asarray(inputImage, dtype=np.float32)        Gra = np.asarray(Graf, dtype=np.float32)        img = img.transpose(2, 0, 1)        Gra = Gra.transpose(2, 0, 1)        img1 = np.zeros((1, 3, Gra.shape[1], Gra.shape[2]))        img1[0, :, :, :] = img        Gra1 = np.zeros((1, 3, Gra.shape[1], Gra.shape[2]))        Gra1[0, :, :, :] = Gra
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

简而言之,您不恰当地调用numpy.asarray:numpy.asarray不连接两个cupy.ndarrays,而连接两个numpy.ndarrays。


您的代码简介:


import numpy, cupy


final_train_set = []


N_PATCH_PER_IMAGE = 8


for i in range(10):

    label = 0


    temp_slice_1 = [numpy.zeros((3, 3)) for j in range(N_PATCH_PER_IMAGE)]

    temp_slice_2 = [numpy.zeros((3, 3)) for j in range(N_PATCH_PER_IMAGE)]


    for j in range(N_PATCH_PER_IMAGE):

        temp_slice_1[j] = cupy.array(temp_slice_1[j])

        temp_slice_2[j] = cupy.array(temp_slice_2[j])

        final_train_set.append(

            [

                # attempting to concatenate two cupy arrays by numpy.asarray 

                numpy.asarray([temp_slice_1[j], temp_slice_2[j]]),

                label

            ]

        )

错误


import numpy as np

import cupy as cp


print("two numpy arrays")

print(np.asarray([np.zeros(shape=(1,)), np.zeros(shape=(1,))]))

print(np.asarray([np.zeros(shape=(1,)), np.zeros(shape=(1,))]).dtype)


print()


print("two cupy arrays")

print(np.asarray([cp.zeros(shape=(1,)), cp.zeros(shape=(1,))]))

print(np.asarray([cp.zeros(shape=(1,)), cp.zeros(shape=(1,))]).dtype)

two numpy arrays

[[0.]

 [0.]]

float64


two cupy arrays

[[array(0.)]

 [array(0.)]]

object

解决方法:注释掉两行


import numpy  # not import cupy here


for i in range(10):

    label = 0


    temp_slice_1 = [numpy.zeros((3, 3)) for j in range(N_PATCH_PER_IMAGE)]

    temp_slice_2 = [numpy.zeros((3, 3)) for j in range(N_PATCH_PER_IMAGE)]


    for j in range(N_PATCH_PER_IMAGE):

        # temp_slice_1[j] = cupy.array(temp_slice_1[j]) <- comment out!

        # temp_slice_2[j] = cupy.array(temp_slice_2[j]) <- comment out!

        final_train_set.append(

            [

                # concatenate two numpy arrays: usually cupy should not be used in dataset

                numpy.asarray([temp_slice_1[j], temp_slice_2[j]]),

                label

            ]

        )

脚注

  1. 在您提供的代码中,xp未指定,因此您无法从任何人那里得到答案。如果您无法分离问题,请发布您的代码的整体,包括模型。

  2. 我猜您可能由于其他原因无法运行训练代码。在这段代码中,数据首先在final_train_set. 但是如果图像数量很大,主内存就会耗尽并被MemoryError抬高。(换句话说,如果图像数量很少,并且您的内存足够大,则不会发生错误)在这种情况下,以下参考资料(Chainer at glassDataset Abstraction)会有所帮助。


查看完整回答
反对 回复 2021-11-09
?
千巷猫影

TA贡献1829条经验 获得超7个赞

我使用 OpenCV、Scipy 和其他一些用于质量评估的模块找到了这个Github 存储库。这是代码:


# Python code for BRISQUE model

# Original paper title: No-Reference Image Quality Assessment in the Spatial Domain

# Link: http://ieeexplore.ieee.org/document/6272356/

import cv2

import numpy as np

from scipy import ndimage

import math


def get_gaussian_filter():

    [m,n] = [(ss - 1.0) / 2.0 for ss in (shape,shape)]

    [y,x] = np.ogrid[-m:m+1,-n:n+1]

    window = np.exp( -(x*x + y*y) / (2.0*sigma*sigma) )

    window[window < np.finfo(window.dtype).eps*window.max() ] = 0

    sum_window = window.sum()

    if sum_window != 0:

        window = np.divide(window, sum_window)

    return window


def lmom(X):

    (rows, cols)  = X.shape

    if cols == 1:

        X = X.reshape(1,rows)

    n = rows

    X.sort()    

    b = np.zeros(3)    

    b0 = X.mean()    

    for r in range(1,4):        

        Num = np.prod(np.tile(np.arange(r+1,n+1), (r,1))-np.tile(np.arange(1,r+1).reshape(r,1),(1,n-r)),0)        

        Num = Num.astype(np.float)                

        Den = np.prod(np.tile(n, (1, r)) - np.arange(1,r+1), 1)        

        b[r-1] = 1.0/n * sum(Num/Den * X[0,r:])

    L = np.zeros(4)

    L[0] = b0

    L[1] = 2*b[0] - b0

    L[2] = 6*b[1] - 6*b[0] + b0

    L[3] = 20*b[2] - 30*b[1] + 12*b[0] - b0

    return L


def compute_features(im):

    im = im.astype(np.float)

    window = get_gaussian_filter()

    scalenum = 2

    feat = []

    for itr_scale in range(scalenum):

        mu = cv2.filter2D(im, cv2.CV_64F, window, borderType=cv2.BORDER_CONSTANT)

        mu_sq = mu * mu

        sigma = np.sqrt(abs(cv2.filter2D(im*im, cv2.CV_64F, window, borderType=cv2.BORDER_CONSTANT) - mu_sq))        

        structdis = (im-mu)/(sigma+1)

        structdis_col_vector = np.reshape(structdis.transpose(), (structdis.size,1))

        L = lmom(structdis.reshape(structdis.size,1))

        feat = np.append(feat,[L[1], L[3]])

        shifts = [[0,1], [1,0], [1,1], [-1,1]]

        for itr_shift in shifts:

            shifted_structdis = np.roll(structdis, itr_shift[0], axis=0)

            shifted_structdis = np.roll(shifted_structdis, itr_shift[1], axis=1)


            shifted_structdis_col_vector = np.reshape(shifted_structdis.T, (shifted_structdis.size,1))

            pair = structdis_col_vector * shifted_structdis_col_vector

            L = lmom(pair.reshape(pair.size,1))

            feat = np.append(feat, L)

        im = cv2.resize(im, (0,0), fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)

    return feat



im = ndimage.imread('example.bmp', flatten=True)

feat = compute_features(im)

print feat



查看完整回答
反对 回复 2021-11-09
  • 2 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号