Este va a ser el primer post de varios explicando mi proyecto final del Máster en Inteligencia Artificial en el que quiero explicar en detalle desde la idea hasta las conclusiones del proyecto, donde enseñare todo el código de la solución dada.
Pero que mejor forma de empezar que haciendo un resumen rápido para ver si realmente os puede interesar..
El código de todo el proyecto aunque no de forma totalmente ordenada se encuentra en UrbanCNNProject. Cualquier duda preguntarme.
Idea
En el proyecto del Atlas of Urban Expansion se requería de gran cantidad de mano de obra para obtener datos que permitieran evaluar la calidad de las tramas urbanas en 200 ciudades alrededor del mundo. Uno de las tareas era la clasificación de tramas urbanas.
El objetivo es crear una red convolucional (nada como DOTCSV para explicar qué es esto) que se encargue de clasificar de manera automática estas parcelas según su tipo.
Mi propuesta para este proyecto era aprovechar los avances en IA para abordar esta parte en concreto del proyecto y ver si es potencialmente posible realizar una solución de este tipo.
Datos
Se realizar mediante parcelas cogidas de Cartociudad + Catastro y se etiquetan en gvSIG Desktop de manera manual para poder entrenar la red apoyándonos en imágenes del PNOA.
Se realizan recortes de estas parcelas sobre el PNOA y se agrupan en carpetas. Esto también con un script sobre gvSIG Desktop.
Red y entrenamiento
Se crea una red convolucional usando Python + Keras.
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(200, (3,3), activation='relu', input_shape=(image_size, image_size, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),#, input_shape=(image_size, image_size, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'), # input_shape=(image_size, image_size, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(200, activation='relu'),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(4, activation='softmax')
])
Model: "sequential"
Layer (type) Output Shape Param #
conv2d (Conv2D) (None, 222, 222, 200) 5600
max_pooling2d (MaxPooling2D) (None, 111, 111, 200) 0
conv2d_1 (Conv2D) (None, 109, 109, 128) 230528
max_pooling2d_1 (MaxPooling2 (None, 54, 54, 128) 0
conv2d_2 (Conv2D) (None, 52, 52, 64) 73792
max_pooling2d_2 (MaxPooling2 (None, 26, 26, 64) 0
conv2d_3 (Conv2D) (None, 24, 24, 32) 18464
max_pooling2d_3 (MaxPooling2 (None, 12, 12, 32) 0
____________________________________________
flatten (Flatten) (None, 4608) 0
dropout (Dropout) (None, 4608) 0
____________________________________________
dense (Dense) (None, 200) 921800
dense_1 (Dense) (None, 128) 25728
dense_2 (Dense) (None, 64) 8256
dense_3 (Dense) (None, 4) 260
============================================
Total params: 1,284,428
Trainable params: 1,284,428
Non-trainable params: 0
Se puede ver el código completo en su notebook.
Se alimenta la red con las muestras extraídas anteriormente.
Resultados
Se obtienen resultados con precisiones de acierto para muestras de parcelas que no han formado parte del entrenamiento del 86%. La validación se realiza con muestras que han sido etiquetadas pero no han formado parte del entrenamiento, por lo que son, a efectos prácticos, nuevas para la red. Es posible que las precisiones se pudieran aumentar teniendo un mayor cuidado con las muestras utilizadas para su entrenamiento.
Discusión
Este modelo se utiliza para realizar diferentes análisis:
Predecir muestras de una misma ciudad pero que no habían sido etiquetadas lo que permite completar una ciudad.

Se producen errores en zonas que pueden ser confusas de definir según las categorías de este proyecto pero que podrían producirse las mismas dudas si fuesen etiquetadas por un humano. La realidad es compleja de definir.

Conclusión
Es posible automatizar procesos de etiquetado del tramado urbano o similares con tasas altas de acierto, 86%, lo que abre puertas a realizar proyectos que de otra forma hace unos años no podrían ser abordados por faltas de recursos.
Y esto es todo por ahora, este proyecto entra en mucho más en detalle en cada apartado, desgranando de mayor manera las ideas, problemas, soluciones y conclusiones.. Pero eso será en otros post dedicados en exclusiva a ello y que nos permitirán abordar y abrir otros temas e irnos por las ramas.
Agradecer a mi tutor Roberto Casado por su ayuda y a la UNIR por otorgarme Matrícula de Honor por el proyecto.