Campamento de verano de DatawhaleAI: comprensión básica de la dirección de CV

Campamento de verano de DatawhaleAI: comprensión básica de la dirección de CV

El objetivo de este campamento de verano es completar una tarea de competencia en la dirección de CV, por favor escribe un poco sobre tu experiencia.
Enlace de competencia: desafío de predicción de enfermedades y análisis de imágenes PET cerebrales.
La línea de base dada por el organizador se divide en los siguientes pasos. Hay una sensación de "un pequeño gorrión con todos los órganos internos", que involucra los datos que cada modelo de IA necesita para resolver, modelar y optimizar problemas.
1. Preparación y preprocesamiento de datos (datos)
2. Extracción de características y entrenamiento de modelos (modelo, optimización)
A continuación, presentaré mi experiencia de aprendizaje y experiencia desde dos aspectos.

Preparación y preprocesamiento de datos (datos)

En términos de preprocesamiento de datos, use glob.glob()la función para leer la ruta del archivo y luego use np.random.shuffle()la función para codificar la ruta de lectura.

En este estudio, estuve expuesto al procesamiento de imágenes médicas por primera vez y obtuve una comprensión preliminar de la biblioteca Nibabel y las imágenes en formato .nii.

Cuando lea una imagen en formato .nii, use el siguiente formato:

import nibabel as nib
img = nib.load(path)

Después de leer img, imprima su contenido para obtener la siguiente información:

<class 'nibabel.nifti1.Nifti1Image'>
data shape (128, 128, 63, 1)
affine: 
[[  2.05940509   0.           0.         128.        ]
 [  0.           2.05940509   0.         128.        ]
 [  0.           0.           2.42500019  63.        ]
 [  0.           0.           0.           1.        ]]
metadata:
<class 'nibabel.nifti1.Nifti1Header'> object, endian='>'
sizeof_hdr      : 348
data_type       : b''
db_name         : b'041_S_1425'
extents         : 16384
session_error   : 0
regular         : b'r'
dim_info        : 0
dim             : [  4 128 128  63   1   0   0   0]
intent_p1       : 0.0
intent_p2       : 0.0
intent_p3       : 0.0
intent_code     : none
datatype        : uint16
bitpix          : 16
slice_start     : 0
pixdim          : [1.        2.059405  2.059405  2.4250002 0.        0.        0.
 0.       ]
vox_offset      : 0.0
scl_slope       : nan
scl_inter       : nan
slice_end       : 0
slice_code      : unknown
xyzt_units      : 2
cal_max         : 0.0
cal_min         : 0.0
slice_duration  : 0.0
toffset         : 0.0
glmax           : 32767
glmin           : 0
descrip         : b''
aux_file        : b''
qform_code      : scanner
sform_code      : unknown
quatern_b       : 0.0
quatern_c       : 0.0
quatern_d       : 0.0
qoffset_x       : 128.0
qoffset_y       : 128.0
qoffset_z       : 63.0
srow_x          : [0. 0. 0. 0.]
srow_y          : [0. 0. 0. 0.]
srow_z          : [0. 0. 0. 0.]
intent_name     : b''
magic           : b'n+1'

Se puede ver que la cantidad de información contenida en el formato de archivo .nii es muy grande. Entre ellos, lo más relevante para nuestro experimento es data shapela información y los datos en sí, de los primeros podemos conocer la información de la dimensión de los datos, es decir, 128*128*63*1, las cuatro dimensiones representan la longitud, ancho y número de canales respectivamente Línea base Información sobre cómo leer los datos en sí, es decir img.dataobj(oa través de img.get_data()una función) para la adquisición de datos.

Extracción de características y entrenamiento de modelos (entrenamiento de modelos)

En el aprendizaje automático tradicional, la calidad de la información extraída durante la extracción de características a menudo afecta el resultado final del modelo.La línea de base proporciona algunas características de píxeles extraídas de las imágenes para el entrenamiento del modelo. Las siguientes características se dan para el cálculo:

feat = [
        (random_img != 0).sum(),               # 非零像素的数量
        (random_img == 0).sum(),               # 零像素的数量
        random_img.mean(),                     # 平均值
        random_img.std(),                      # 标准差
        len(np.where(random_img.mean(0))[0]),  # 在列方向上平均值不为零的数量
        len(np.where(random_img.mean(1))[0]),  # 在行方向上平均值不为零的数量
        random_img.mean(0).max(),              # 列方向上的最大平均值
        random_img.mean(1).max()               # 行方向上的最大平均值
    ]

Después de la función, se agrega la categoría de datos a la que pertenece la imagen actual.Creo que vale la pena aprender esta técnica.
El código dado es el siguiente:

 # 根据路径判断样本类别('NC'表示正常,'MCI'表示异常)
    if 'NC' in path:
        return feat + ['NC']
    else:
        return feat + ['MCI']

Entre ellos feat + ['NC'], dicho método puede agregar un elemento de lista después de la función original, de modo que la longitud de la lista sea +1 y la lista se convierta en el [..., ..., ... , 'NC']formato después de la adición. Esta es la primera vez que aprendo que las listas se pueden usar de esta manera.

En el entrenamiento de modelos, utilizando sklearneste paquete clásico de aprendizaje automático, solo necesitamos definir el modelo modely luego realizar el ajuste de datos y la predicción en el conjunto de prueba respectivamente por model.fit()y model.predict()para obtener el resultado de la predicción del modelo, que es muy útil para los principiantes.
El modelo de regresión logística se utiliza para el entrenamiento en la línea base, y su código es el siguiente:

from sklearn.linear_model import LogisticRegression
m = LogisticRegression(max_iter=1000)
m.fit(
    np.array(train_feat)[:, :-1].astype(np.float32),  # 特征
    np.array(train_feat)[:, -1]                       # 类别
)

Al mismo tiempo, utilicé el clasificador de bosque aleatorio para comparar y descubrí que con el n_estimatorsaumento de parámetros, el rendimiento del modelo ha mejorado hasta cierto punto.

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=2000,max_depth=20, n_jobs=-1, oob_score=True, random_state=10)

model.fit(
    np.array(train_feat)[:, :-1].astype(np.float32),  # 特征
    np.array(train_feat)[:, -1]                       # 类别
    )

Por supuesto, dado que las características de línea de base y diseño son relativamente básicas, los resultados de predicción que obtenemos son relativamente generales e incluso no tan altos como la precisión del lanzamiento de una moneda. Mejorará gradualmente en la siguiente práctica.

Supongo que te gusta

Origin blog.csdn.net/code_zhao/article/details/131865784
Recomendado
Clasificación