Объединение трехмерного массива с единым результатом теста - PullRequest
0 голосов
/ 10 июля 2020

Я ищу функцию (если возможно), которая способна объединить массив 3D-изображений МРТ с соответствующим результатом теста пациента, а затем передать его в сеть CNN

Например, если я должны были иметь следующее:

# each 3D array is an MRI image converted into array format
image_array = [[3D array 1], [3D array 2], [3D array 3]]
test_score = [100, 50, 75] # in seconds

как я могу убедиться, что каждая оценка теста будет «связана» с правильным массивом изображений (3D-массив 1 имеет оценку 100 секунд, 3D массив 2 имеет оценку 50 секунд, трехмерный массив 3 имеет оценку 75 секунд) и иметь возможность передавать это в сеть CNN (другими словами, убедитесь, что массив все еще имеет 3 измерения)?

Выходные данные сети CNN должны быть числовым числом, представляющим прогнозируемую оценку теста МРТ-изображения. Пример: модель предсказывает, что этот массив изображений имеет тестовую оценку 62 секунды.

Вот код для создания моих изображений и этикеток:

# Where the file is located
path = r'C:\Users\jesse\OneDrive\Desktop\Research\PD\decline'
folder = os.listdir(path)

target_size = (96, 96, 96)

# creating x - converting images to array
mri = []
for i in range(len(folder)):
    files = os.listdir(path + '\\' + folder[i])
    for j in range(len(files)):
        image = np.array(nib.load(path + '\\' + folder[i] + '\\' + files[j]).get_fdata())
        image = np.resize(image, target_size)
        image = np.expand_dims(image, axis=3)
        image /= 255.
        mri.append(image)


# creating y - one hot encoder
excel_file = r'C:\Users\jesse\OneDrive\Desktop\Research\PD\decline_label.xlsx'
excel_read = pd.read_excel(excel_file)
excel_array = np.array(excel_read['Label'])
label = LabelEncoder().fit_transform(excel_array)
label = label.reshape(len(label), 1)
onehot = OneHotEncoder(sparse=False).fit_transform(label)


# Splitting image train/test
x = np.asarray(mri)
y = np.asarray(onehot)
#x_split, x_test, y_split, y_test = train_test_split(x, y, test_size=.2, stratify=y)
#x_train, x_val, y_train, y_val = train_test_split(x_split, y_split, test_size=.25, stratify=y_split)
#print(x_train.shape, x_val.shape, x_test.shape, y_train.shape, y_val.shape, y_test.shape)

Вот код для создания моих результаты тестов:

mri_path = r'C:\Users\jesse\OneDrive\Desktop\Research\PD\get_skullstrip'
category = os.listdir(mri_path)

subject_id = []
for i in range(len(category)):
    ppmi_files = os.listdir(mri_path + '\\' + category[i])
    for j in range(len(ppmi_files)):
        num = ppmi_files[j][5:9]
        subject_id.append(num)
        
test_path = r'C:\Users\jesse\OneDrive\Desktop\Research\PD\Trail_Making_A_and_B.csv'

scores = []
csv_read = pd.read_csv(test_path)
patno = np.array(csv_read['PATNO'])
tmtasec = np.array(csv_read['TMTASEC'])
for i in range(len(subject_id)):
    for j in range(len(patno)):
        split = len(subject_id) - len(files)
        if subject_id[i] == str(patno[j]):
            if math.isnan(tmtasec[j]) != True:
                scores.append(tmtasec[j])
                break
            else:
                if i < split:
                    scores.append(0.)
                    break
                elif i >= split:
                    scores.append(200.)
                    break
        elif subject_id[i] not in str(patno):
            if i < split:
                scores.append(0.)
            elif i >= split:
                scores.append(200.)
            break

Примечание: у некоторых испытуемых не было результатов теста, поэтому мне пришлось заменить их на 0 и 200

Примечание 2: все массивы в порядке (это означает, что мрт [0], onehot [0] и оценки [0] получены от одного и того же человека)

Как мне go объединить массив изображений 3D МРТ с соответствующими результатами тестов? Должен ли я train_test_split до или после их объединения? Повлияет ли это на то, как я могу передать это в сеть CNN?

Любая помощь приветствуется и спасибо!

...