Atacando redes neuronales (ataques adversarios)

Una Red Neuronal Artificial (RNA) es un modelo matemático inspirado en el comportamiento biológico de las neuronas y en cómo se organizan formando la estructura del cerebro.

Últimamente están en auge, incorporándose a gran numero de aplicaciones, encomendándoles funciones tales como el reconocimiento facial, la conducción de vehículos autónomos de una manera muy óptima.

Esto abre una gran incógnita en mi biológica y retorcida red neuronal...O_o

¿Podemos hackear estos sistemas conexionistas?

Basta con navegar un poco por Internet para responder lo que en nuestras mentes era un si.

Hoy os propongo un ejercicio sencillo para salir de dudas, siempre desde la práctica.

El objetivo para nuestro pequeño lab : crear un una app de visión artificial, capaz de reconocer el objeto que contenga la foto que le pasemos..(un modelo pre-entrenado de Inception-v3)

Inception-v3 es un modelo de red neuronal convolucional que está capacitado para el gran desafío de Reconocimiento Visual con los datos de ImageNet 2012.

Es un estándar en visión artificial, donde los modelos intentan clasificar imágenes completas en 1000 clases , como "Zebra", "Dálmata" y "Lavavajillas". 
Por ejemplo, aquí están los resultados de AlexNet clasificando algunas imágenes:
 

Montando nuestra app de vision artificial: 

Para montar nuestra pequeña app, será necesario montar un entorno de desarrollo para python.

Para los que utilicéis windows podéis seguir este tuto (estoy estudiando programación multiplataforma por lo que he salido de mi fundamentalismo de Linux a la fuerza).

Para los que queréis seguir este ejemplo en Linux basta con sudo apt install python3.6

Otra buena manera de conseguir nuestro entorno, para las dos plataformas; es instalar la Suite de Anaconda que nos facilitará la tarea de instalar el ambiente e incluirá las Jupyter Notebooks, que nos ayudará a hacer ejercicios en futuros tutoriales de Machine Learning.

Esta Suite es multiplataforma y se puede utilizar para Windows, Linux y Macintosh.

Instalar Librerías para Deep Learning:

pip install scikit-learn
pip install virtualenv
pip install h5py==2.8.0rc1
pip install tensorflow
pip install keras

Desde anaconda:

conda update conda
conda update anaconda
conda update scikit-learn
conda install -c conda-forge tensorflow

Listo...

El funcionamiento de nuestra pequeña app lo describo en los comentarios del código, por favor si algo no queda claro, ser libres de preguntar.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#importo librerias sys y argparse

import sys 
import argparse

# preparo lo que va a ser la linea de comando y argumentos de este 

parser = argparse.ArgumentParser()
print(" ")
print("MOK 2018 hackplayers........enjoy :P")
parser.add_argument("-v", "--verbose", help="Mostrar información de depuración", action="store_true")
parser.add_argument("-f", "--file", help="Nombre de archivo a procesar")
args = parser.parse_args()

# Aquí procesamos lo que se tiene que hacer con cada argumento

if args.verbose:
    print ("depuración activada!!!")
 
if args.file:
    print ("Procesando archivo..... "), args.file

# si el comando no tiene ruta hacia la imagen exit

else:
        print("debes indicar ruta archivo de imagen") 
        sys.exit()
        pass

#  importo librerias tensorflow como tfw y keras

import tensorflow as tfw
import keras
from keras.applications.inception_v3 import InceptionV3, decode_predictions
from keras import backend 
from keras.preprocessing import image

#acondiciono el tamaño de la imagen para ict3  la cargo desde la ruta del agumento de linea de comandos y la meto en un array en la variable x

x= image.img_to_array(image.load_img(args.file , target_size=(299,299)))

#acondiciono x segun las indicaciones de tensorflow para poder trabajar con ella

x/=255
x-=0.5
x*=2

#añado otro parametro a la matriz para albelgar el tensor segun la documentacion

x =x.reshape([1, x.shape[0], x.shape[1], x.shape[2]])

#cargo el modelo preentrenado de ict3 si no esta en el ordenador se descargara

ict3 = InceptionV3()

y= ict3.predict(x)

#imprimo por pantalla resultado de la predición

print(decode_predictions(y))

Para lanzar el script basta con pasarle el un argumento, la ruta absoluta de la imagen que queremos que mire...

python iaredneu.py -f /home/manuel/Imágenes/perro.jpeg

En mi caso le paso esta foto de un lindo cachorrito:

 
La primera vez que ejecutamos el script nos instalará el modelo pre-entrenado si no lo tenemos...


Echándole un ojo al resultado del script nos damos cuenta que funciona alas mil maravillas incluso acertando la raza del perro.


(si no lo curráramos un poquito tendríamos una red neuronal capaz de clasificar nuestras fotos según su contenido).

Pero que si cambiamos la imagen por esta:


Nuestra red neuronal tiene bastante claro de que se trata de una útil tostadora en vez de nuestro bonito golden:


¿A qué se debe esto?

Los ataques adversarios son entradas para los modelos de aprendizaje automático que un atacante ha diseñado intencionalmente para provocar que el modelo cometa un error; son como ilusiones ópticas para máquinas.

Y por lo tanto algo muy peligroso una bonita mañana, en la que vas con tu coche autónomo y de repente te encuentras una señal de stop ligeramente modificada.


Da escalofrios pensar que tu coche pueda tomar una señal de stop por una de limite de velocidad 65km/h

Desde luego ya van saliendo medidas de seguridad para minimizar este vector de ataque....pero aun queda mucho trabajo por hacer.

Bueno visto el tema, más o menos toca la práctica, la cual creo que voy a emplazar a una nueva entrada para que no os canséis de mí.

En el siguiente post veremos como generar un ataque para confundir a nuestra pequeña app....

un saludo y no olviden supervitaminarse y mineralizarse!!!!!!

Comentarios

  1. qué bueno que te volvemos a tener por aquí Manuel! gracias por esta entra tan interesante :) deseando ver los siguientes posts de la serie

    ResponderEliminar
    Respuestas
    1. sabes que siempre que tengo algo de tiempo vuelvo al redil.;D

      Eliminar
  2. Igual modificando señales consigo que un tesla aparque en mi casa... ;)

    ResponderEliminar

Publicar un comentario