Pop

Tutorial dialogFlow. Como crear un chatbot con inteligencia artificial(1/3)

1. Como crear un chatbot con inteligencia artificial

  • Hola a todos.En esta ocasión empezamos a trabajar con Dialogflow. Se trata de un paquete para crear interfaces de conversación en sitios web, aplicaciones de dispositivos móviles, plataformas populares de mensajería y dispositivos de IoT. 
  • Nosotros crearemos un chatbot para atender las reservas de un restaurante.Nos servirá de ejemplo para entender su potencia y para aprender a utilizar esta herramienta que nos brinda google. Para empezar a utilizarla solamente necesitamos tener una cuenta de gmail e ir a esta página https://dialogflow.com/.
  • Una vez registrados podemos probar la herramienta.En este primer vídeo empezaremos a crear nuestro agente.Es un robot que nos permitirá atender las múltiples reservas de  nuestro restaurante imaginario:


Tensorflow. Identificación facial con inteligencia artificial (2/2)

2. Reconocimiento facial con inteligencia artificial (2)

  • Hola a todos.Una vez finalizado el curso de google, vamos a entrenar un modelo para hacer un ejemplo de identificación facial.Este ejemplo lo dividiremos en dos vídeos, que estructuraremos de la siguiente manera.
  • En este segundo vídeo vemos un ejemplo en tiempo real donde mi pc me identifica capturando una imagen vía webcam.
  • Os dejo el código visto en el vídeo:
#creamos nuestro reconocedor de imagenes
face_recognizer = cv2.face.LBPHFaceRecognizer_create()

#entrenamos nuestro reconocedor 
face_recognizer.train(caras, np.array(labels))

#función para dibujar un rectángulo en la imagen según coordenadas
def pintarRectangulo(img, rect):
    (x, y, w, h) = rect
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
    
#función que escibe el nombre
def escribirTexto(img, text, x, y):
    cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 255, 0),

# esta función reconoce a la persona en la imagen pasada
#y dibuja un rectángulo alrededor de la cara detectada con el nombre 
def predecir(imagenTest):
    #copia de la imagen original
    img = imagenTest.copy()
    #detectamos cara en la imagen
    cara, rect = dameCaras(img)

    #Predecir la imagen utilizando nuestro reconocedor facial.
    label= face_recognizer.predict(cara)
    #obtenemos nombre de la imagen
    if label is not None:
        label_text = personas[label[0]]
        #dibujar un rectángulo alrededor de la cara detectada
        pintarRectangulo(img, rect)
        #escribir nombre
        escribirTexto(img, label_text, rect[0], rect[1]-5)
    
    return img

#Cargando imagenes de test
testImg0 = cv2.imread("test-data/test0.jpg")
testImg1 = cv2.imread("test-data/test1.jpg")
testImg2 = cv2.imread("test-data/test2.jpg")

#realizar predicción
prediccionImg0 = predecir(testImg0)
prediccionImg1 = predecir(testImg1)
prediccionImg2 = predecir(testImg2)
print("Predicción completa")

#display both images
cv2.imshow(personas[0], prediccionImg0)
cv2.imshow(personas[1], prediccionImg1)
cv2.imshow(personas[2], prediccionImg2)
cv2.waitKey(0)
cv2.destroyAllWindows()

import cv2
import time 
from keras.models import load_model
def laptop_camera_go():
    # Crear instancia de captura de video.
    cv2.namedWindow("Deteccion facial")
    vc = cv2.VideoCapture(0)

    # capturamos el primer fotograma.
    if vc.isOpened(): 
        rval, frame = vc.read()
    else:
        rval = False
    
    # mantener el flujo de video abierto
    while rval:
        # trazar la imagen de la cámara con detecciones marcadas
        frame = predecir(frame)
        cv2.imshow("Deteccion facial activada", frame)
        
        # Funcionalidad de salida: presione cualquier tecla para salir del video de 
        #la computadora portátil 
        key = cv2.waitKey(20)
        if key > 0: # exit by pressing any key
            cv2.destroyAllWindows()
            for i in range (1,5):
                cv2.waitKey(1)
            return
        
        # obtener siguinete frame
        time.sleep(0.05)             # controlamos framerate
        rval, frame = vc.read()


laptop_camera_go()

Tensorflow. Identificación facial con inteligencia artificial (1/2)

1. Reconocimiento facial con inteligencia artificial (1)

  • Hola a todos.Una vez finalizado el curso de google, vamos a entrenar un modelo para hacer un ejemplo de identificación facial.Este ejemplo lo dividiremos en dos vídeos, que estructuraremos de la siguiente manera.

  • En este primer vídeo  preparamos la estructura del proyectos y los datos de entrenamiento de nuestro ejemplo:


  
  • Os dejo el código visto en el vídeo:
import cv2 #importamos modulo OpenCV 
import os #importamos módulo de lectura de directorio de datos de formación y rutas
import numpy as np

#Listado de personas a identificar
personas = ["Zidane","JAP SOFTWARE", "Will Smith"]

#funcion para detectar caras
def dameCaras(img):
    #convertimos imagen a la escala de grises
    gris = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # cargo el detector de caras de OpenCV 
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')

    # detectemos la multiescala (algunas imágenes pueden estar más cerca de la cámara que #otras)
    caras = face_cascade.detectMultiScale(gris, scaleFactor=1.2, minNeighbors=5);
    
    #Si no detectamos caras en la imagen devuelvo esto
    if (len(caras) == 0):
        return None, None
    
    #Extraemos el area donde esta la cara
    (x, y, w, h) = caras[0]
    
    #devuelvo la parte de la iamgen donde esta la cara
    return gris[y:y+w, x:x+h], caras[0]

# esta función leerá las imágenes de entrenamiento de todas las personas, detectará la cara 
#de cada imagen  y devolverá dos listas del mismo tamaño, una lista
# de caras y otra lista de etiquetas para cada cara
def prepararDatosEntrenamiento(ruta):
    
    #Obtengo la lista de directorios
    directorios = os.listdir(ruta)
    
    #lista para las caras
    caras = []
    #lista para los nombres
    labels = []
    
    #Recorremos la lista de directorios
    for nombreDire in directorios:
        
        #cada nombre de directorio debe ser un número que identifique a 
        #a la persona
        label = int(nombreDire)
        
        #construimos la ruta del directorio de cada persona
        rutaDirectorioPersona = ruta + "/" + nombreDire
        
        #obtenemos las imagens de cada sujeto
        listaImagenesPersona = os.listdir(rutaDirectorioPersona)

        #recorremos las imágenes de cada carpeta
        for nombreImagen in listaImagenesPersona:
            rutaImagen = rutaDirectorioPersona + "/" + nombreImagen
            #leer imagen
            imagen = cv2.imread(rutaImagen)
            
            #mostramos la imagen
            cv2.imshow("Entrenando............", imagen)
            cv2.waitKey(100)
            
            #detectar cara
            face, rect = dameCaras(imagen)
            
            #agregamos las caras detectadas a las lista de imagens y de etiquetas
            if face is not None:
                caras.append(face)
                labels.append(label)
            
    cv2.destroyAllWindows()
    cv2.waitKey(1)
    cv2.destroyAllWindows()
    
    return caras, labels

#obtenemos la listas con las caras y con su nombre
print("Preparandos datos...")
caras, labels = prepararDatosEntrenamiento("training-data")
print("Datos preparados")
print("Total caras: ", len(caras))
print("Total labels: ", len(labels))

Patrones de diseño software 10. Patrón estructural Bridge

10. Patrón estructural  Bridge

  • Hola a todos.Seguimos con  nuestro  curso dedicado a los patrones de diseño software.Los patrones de diseño son unas técnicas para resolver problemas comunes en el desarrollo de software y otros ámbitos  referentes al diseño de interacción o interfaces.
  • En esta ocasión veremos el patrón de diseño  Bridge que es un patrón parecido al patrón Adapter. Es útil cuando tenemos la necesidad de que la implementación de una abstracción sea modificada en tiempo de ejecución. Lo podemos aplicar cuando  queremos que los cambios en la implementación de una abstracción no afecten al cliente ó necesitamos que la implementación de una característica sea compartida entre múltiples objetos.
  • El modelo de clases que utilizaremos para el ejemplo es el siguiente:


  • En el siguiente  vídeo tenéis un ejemplo de este patrón de diseño.
  • Os dejo el código de las diferentes clases vistas en el vídeo:
    • InterfaceEnvio:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Bridge
{
    public interface InterfaceEnvio
    {
       string poocesarPedido();
       string enviar();
       string Entregar();
    }
}
    • Clases EnvioEspaña , EnvioMexico y EnvioPortugal:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Bridge
{
    class EnvioEspaña:InterfaceEnvio
    {
        public EnvioEspaña()
        {

        }
        public string poocesarPedido()
        {
            return "Pedido procesado España";
        }

        public string enviar()
        {
            return "Pedido enviado España";
        }
        public string Entregar()
        {
            return "Pedido entregado España";
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Bridge
{
    class EnvioMexico:InterfaceEnvio
    {
        public string poocesarPedido()
        {
            return "Pedido procesado Mexico";
        }

        public string enviar()
        {
            return "Pedido enviado Mexico";
        }
        public string Entregar()
        {
            return "Pedido entregado Mexico";
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Bridge
{
    class Envioportugal:InterfaceEnvio
    {
        public string poocesarPedido()
        {
            return "Pedido procesado Portugal";
        }

        public string enviar()
        {
            return "Pedido enviado Portugal";
        }
        public string Entregar()
        {
            return "Pedido entregado Portugal";
        }
    }
}


    • Clase Amazon:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Bridge
{
    public abstract class Amazon
    {
        protected InterfaceEnvio interfaceEnvio;
        public Amazon(InterfaceEnvio envio)
        {
           interfaceEnvio = envio;
        }
        public string  poocesarPedido()
        {
           return  interfaceEnvio.poocesarPedido();

        }

        public string enviarPaquete()
        {
            return interfaceEnvio.enviar();
        }

        public string entregarPaquete()
        {
            return interfaceEnvio.Entregar();
        }
        public void asignarEnvio(InterfaceEnvio envio)
        {
            interfaceEnvio = envio;
        }
        public InterfaceEnvio obtenerEnvio()
        {
            return interfaceEnvio;
        }
    }
}
    • Clase RepartoAmazon:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Bridge
{
    class RepartoAmazon:Amazon
    {
        private String numPedido;
        
        public RepartoAmazon(String idPedido):base(new EnvioEspaña())
        {
                   this.numPedido = idPedido;
        }

        public RepartoAmazon(String idPedido, InterfaceEnvio envio):base(envio)
        {
            this.numPedido = idPedido;

        }
        public string  idPedido()
        {
            return "Nuestro pedido es " + this.numPedido;

        }
}
}

    • Clase Program:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Bridge
{
    class Program
    {
        static void Main(string[] args)
        {

            // En primer lugar crearemos el objeto que representa a la emrpesa de mensajerio
            RepartoAmazon reparto  = new RepartoAmazon("123456");

            // Enviaremos el paquete a España por defecto
            Console.WriteLine(reparto.poocesarPedido());
            Console.WriteLine(reparto.enviarPaquete()); 
            Console.WriteLine(reparto.entregarPaquete());
            Console.ReadLine();
            //// Ahora queremos enviar a Mexico
            reparto.asignarEnvio(new EnvioMexico());
            Console.WriteLine(reparto.poocesarPedido());
            Console.WriteLine(reparto.enviarPaquete());
            Console.WriteLine(reparto.entregarPaquete());

            Console.ReadLine();
        }
    }
}


Patrones de diseño software 9. Patrón estructural Proxy

9. Patrón estructural  Proxy

  • Hola a todos.Seguimos con  nuestro  curso dedicado a los patrones de diseño software.Los patrones de diseño son unas técnicas para resolver problemas comunes en el desarrollo de software y otros ámbitos  referentes al diseño de interacción o interfaces.
  • En esta ocasión veremos el patrón de diseño  Proxy.  El patrón Proxy proporciona un objeto intermediario entre el cliente y el objeto a utilizar, que permite configurar ciertas características (como el acceso) sin necesidad de modificar la clase original. Podríamos definir a un Proxy como una clase o componentes que hace el papel de intermediario entre la clase que queremos utilizar el cliente que la esta utilizando.
  • Vamos a ver un ejemplo típico que consistirá en control de acceso mediante un proxy de protección.  Para ello vamos a imaginar un escenario en el que se desea realizar la descarga de cierto material que, pese a estar disponible públicamente,  no está permitida su posesión en el país del cliente.
  • El modelo de clases que utilizaremos para el ejemplo es el siguiente:

  • En el siguiente  vídeo tenéis un ejemplo de este patrón de diseño.
  • Os dejo el código de las diferentes clases vistas en el vídeo:
    • Clases Servidor, ProxyMiServidor y MiServidor:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Proxy
{
    public abstract class Servidor
    {
        public abstract string descargar(String url);
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Proxy
{
    public abstract class Servidor
    {
        public abstract string descargar(String url);
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Proxy
{
    class ProxyMiServidor:Servidor
    {
        MiServidor miServidor;
        private int puerto;
        private String host;
        public ProxyMiServidor(int p, String h)
        {
            puerto = p;
            host = h;
            miServidor = null;
        }
        public override string descargar(String url)
        {
            string resultado = String.Empty;
            if (restringido(url))
            {
                if (miServidor == null)
                    miServidor = new MiServidor(puerto, host);

                resultado= miServidor.descargar(url);
                
            }
            else
              resultado=  "Desde esta ubicación no puedes descargar.";

        

        return resultado; 
        }



        public Boolean restringido(string ruta)
        {
            Boolean descargaPermitida = false;
            if (ruta == "descargaPermitida")
                descargaPermitida = true;
            return descargaPermitida;
        }
    }
}

  • Clases Program:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Proxy
{
    class Program
    {
        static void Main(string[] args)
        {
            // Creamos el proxy a la página de descargas
            Servidor servidor = new ProxyMiServidor(20, "https://cursoprogramacioncsharptutoriales.blogspot.com/");
            // Descargamos un archivo permitido
            Console.ForegroundColor = ConsoleColor.Green;
           Console.WriteLine(  servidor.descargar("descargaPermitida"));
           Console.ReadLine();
            // Vamos a probar ahora con una descarga restringida
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(servidor.descargar("descargaDenegada"));
            Console.ReadLine();
        }
    }
}


Patrones de diseño software 8. Patrón estructural Facade

8. Patrón estructural  Facade

  • Hola a todos.Seguimos con  nuestro  curso dedicado a los patrones de diseño software.Los patrones de diseño son unas técnicas para resolver problemas comunes en el desarrollo de software y otros ámbitos  referentes al diseño de interacción o interfaces.
  • En esta ocasión veremos el patrón de diseño  Facade. Este patrón busca simplificar el sistema, desde el punto de vista del cliente, proporcionando una interfaz unificada para un conjunto de subsistemas.  Se debe utilizar cuando:
    • Se quiera proporcionar una interfaz sencilla para un subsistema complejo.
    • Se quiera desacoplar un subsistema de sus clientes y de otros subsistemas, haciéndolo más independiente y portable.
  • El modelo de clases que utilizaremos para el ejemplo es el siguiente:

  • En el siguiente  vídeo tenéis un ejemplo de este patrón de diseño.
    • Os dejo el código de las diferentes clases vistas en el vídeo:
      • Clases persona, Desarrollador, comercial y comprador:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace Facade
    {
        public abstract class Persona
        {
        }

        class Desarrollador:Persona
        {
        }

        class Comercial:Persona
        {
        }

        class Comprador:Persona
        {
        }
    }

      • Clase Quejas:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace Facade
    {
        class Quejas
        {
            public  string quejas(Comprador comprador)
            {
                return ("Escuchando quejas comprador");
            }
            public string quejas(Comercial comercial)
            {
                return ("Escuchando quejas comercial");
            }

            public string quejas(Desarrollador desarrollador)
            {
                return ("Escuchando quejas desarrollador");
            }
        }
    }

      • Clase Pedidos:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace Facade
    {
        class Pedidos
        {
            public int precioProducto(Comprador comprador)
            {
                return 10;
            }
            public int comisionPedido(Comercial comercial)
            {
                return 5;
            }
        }
    }

      • Clase Empresa:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace Facade
    {
        class Empresa
        {
            public  Quejas q;
            public Pedidos p;

               
            public Empresa()
            {
            
                q = new Quejas();
                p = new Pedidos();
            }

            private string quejas(Comprador comprador)
            {
                return q.quejas(comprador);
            }
            private string quejas(Comercial comercial)
            {
                return q.quejas(comercial);
            }

            private string quejas(Desarrollador desarrollador)
            {
                return q.quejas(desarrollador);
            }

            public void EscucharQuejas(Persona p)
            {
                if (p is Comprador)
                    quejas((Comprador)p);
                else if (p is Desarrollador)
                    quejas((Desarrollador)p);
                else
                    quejas((Comercial)p);
            }

            public int  hacerPedido(Comercial comercial, Comprador cliente)
            {
                return p.comisionPedido(comercial)+ p.precioProducto(cliente);
            }

            


        }
    }

      • Clase Program:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace Facade
    {
        class Program
        {
            static void Main(string[] args)
            {
                Desarrollador programador = new Desarrollador();
                Comprador cliente = new Comprador();
                Comercial comercial = new Comercial();

        
                //SIN FACADE 
                Quejas queja = new Quejas();
                queja.quejas(comercial);
                queja.quejas(programador);
                queja.quejas(cliente);
                Pedidos pedido = new Pedidos();
                int totalPrecioPedido = 0;
                totalPrecioPedido = pedido.comisionPedido(comercial);
                totalPrecioPedido += pedido.precioProducto(cliente);

                //CON FACADE
                Empresa empresa = new Empresa();
                empresa.EscucharQuejas(programador);
                empresa.EscucharQuejas(comercial);
                empresa.EscucharQuejas(programador);
                totalPrecioPedido= empresa.hacerPedido(comercial, cliente);
        

            }
        }
    }





    Tensorflow. Reconocimiento facial con inteligencia artificial (3/3)

    23. Reconocimiento facial con inteligencia artificial (3)

    • Hola a todos.Una vez finalizado el curso de google, vamos a entrenar un modelo para hacer un ejemplo de reconocimiento facial.Este ejemplo lo dividiremos en tres vídeos, que estructuraremos de la siguiente manera.
    • En el tercer y último  vídeo que podéis ver a continuación practicamos el reconocimiento facial a través de la imagen de la webcam. También veremos el código necesario para este propósito.
    • Os dejo el código visto en el vídeo y un enlace de descarga con el proyecto completo:
    # Abajo mostramos el rectángulo delimitado (adivinado) para los ojos debajo de las gafas de sol
    # Usaremos el rectángulo delimitador para averiguar cómo asignar los lentes en los puntos clave 
    # glasses_triangle_vertices = np.array ([(280,220), (2800,220), (280,600)]). astype (np.float32)
    thug_glasses_triangle_vertices = np.array([(65,10), (490,10), (65,70)]).astype(np.float32)

    def thug_image(image):
        faces = dameCaras(image)
        image_info = obtenerPuntosClave(image, faces)
        
        sunglasses = cv2.imread("imagenes/gafas.png", cv2.IMREAD_UNCHANGED)    
        alpha_channel = sunglasses[:,:,3]
        
        for (face, keypoints) in image_info:
        
            # We keep only the keypoints related to eyes (from 0 to 9)
            eye_keypoints = keypoints[:10]

            # Compute the bounding rectangle for the eyes
            eye_boundingRect = cv2.boundingRect(np.array(eye_keypoints).astype(np.float32))
            # Build the triangle vertices needed by cv2.getAffineTransform()
            eyes_triangle_vertices = np.array([(eye_boundingRect[0],eye_boundingRect[1]), 
                                               (eye_boundingRect[0]+eye_boundingRect[2],eye_boundingRect[1]), 
                                               (eye_boundingRect[0],eye_boundingRect[1]+eye_boundingRect[3])]).astype(np.float32)
            # Compute the affine transform matrix from the two sets of three points (glasses and eyes)
            map_matrix = cv2.getAffineTransform(thug_glasses_triangle_vertices, eyes_triangle_vertices)
            # Apply the affine transformation to the glasses
            transformed_sunglasses = cv2.warpAffine(sunglasses, map_matrix, (image.shape[1], image.shape[0]))
            # Build a binary mask of the pixels where the sunglasses are
            transformed_sunglasses_mask = transformed_sunglasses[:,:,3] > 0
            # Overwrite pixels in the original image with sunglasses pixels using their mask
            image[:,:,:][transformed_sunglasses_mask] = transformed_sunglasses[:,:,0:3][transformed_sunglasses_mask]
        
        return image   
    import cv2
    import time 
    from keras.models import load_model
    def laptop_camera_go():
        # Crear instancia de captura de video.
        cv2.namedWindow("Deteccion facial")
        vc = cv2.VideoCapture(0)

        # capturamos el primer fotograma.
        if vc.isOpened(): 
            rval, frame = vc.read()
        else:
            rval = False
        
        # mantener el flujo de video abierto
        while rval:
            # trazar la imagen de la cámara con detecciones marcadas
            frame = thug_image(frame)
            cv2.imshow("Deteccion facial activada", frame)
            
            # Funcionalidad de salida: presione cualquier tecla para salir del video de 
            #la computadora portátil
            key = cv2.waitKey(20)
            if key > 0: # exit by pressing any key
                cv2.destroyAllWindows()
                
                for i in range (1,5):
                    cv2.waitKey(1)
                return
            
            # obtener siguinete frame
            time.sleep(0.05)             # controlamos framerate
            rval, frame = vc.read()


    laptop_camera_go()



    Patrones de diseño software 7. Patrón estructural Adapter

    7. Patrón estructural  Adapter

    • Hola a todos.Seguimos con  nuestro  curso dedicado a los patrones de diseño software.Los patrones de diseño son unas técnicas para resolver problemas comunes en el desarrollo de software y otros ámbitos  referentes al diseño de interacción o interfaces.
    • En esta ocasión veremos el patrón de diseño  Adapter. Este patrón permite la cooperación entre clases para extender sus funcionalidades a clases de diferentes tipos, que no pueden usarlas por mecanismos comunes como la herencia. El patrón Adapter  permite establecer un puente entre la clase incompatible con el resto de las clases que quieren usar su funcionalidad,  adaptando dichas funcionalidades con este sistema.
      • En el siguiente  vídeo tenéis un ejemplo de este patrón de diseño.
      • Os dejo el código de las diferentes clases vistas en el vídeo:
        • Código de las clases Bombilla, BombillaClasica y BombillaModerna

      Bombilla:

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;

      namespace Adapter
      {
          abstract class  Bombilla
          {
              public abstract string encender();
              public abstract string aumentarIntensidad();
              public abstract  string apagar();
          }
      }

      BombillaClasica :
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;

      namespace Adapter
      {
          class BombillaClasica:Bombilla
          {
              public override string encender()
              {
                  return ("Encendido clásico");
              }
              public override string aumentarIntensidad()
              {
                  return ("Aumentando intensidad clasico");
              }
              public override string apagar()
              {
                  return ("Apagado clásico");
              }
          }
      }

      BombillaModerna:

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;

      namespace Adapter
      {
          class BombillaModerna:Bombilla
          {
              public override  string encender()
              {
                  return ("Encendido moderno");
              }
              public override string aumentarIntensidad()
              {
                  return ("Aumentando intensidad moderno");
              }
              public override string apagar()
              {
                  return ("Apagado moderno");
              }
          }
      }
        • Código de las clases Vela y BombillaAdapter:
      Vela:
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;

      namespace Adapter
      {
          class Vela
          {
              public string PrenderFuego()
              {
                  return ("Encendemos llama");
              }
              public string SoplarParaApagar()
              {
                  return ("Soplamos para apagar");
              }
              public string EcharCCombustible()
              {
                  return ("Echamos gasolina");
              }

          }
      }

      BombillaAdapter: 

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;

      namespace Adapter
      {
          class BombillaAdapter: Bombilla
          {
              private Vela v = new Vela();
              public override string encender()
              {
                  return v.PrenderFuego(); ;
              }
              public override string aumentarIntensidad()
              {
                  return v.EcharCCombustible();
              }
              public override string apagar()
              {
                  return v.SoplarParaApagar();
              }
          }
      }
        • Clase program:
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;

      namespace Adapter
      {
          class Program

          {
              static void Main(string[] args)
              {
                  BombillaClasica bombilla = new BombillaClasica();
                  Console.WriteLine(bombilla.encender());
                  Console.WriteLine(bombilla.aumentarIntensidad());
                  Console.WriteLine(bombilla.apagar());


                  Console.ReadLine();

                  BombillaModerna moderna = new BombillaModerna();
                  Console.WriteLine(moderna.encender());
                  Console.WriteLine(moderna.aumentarIntensidad());
                  Console.WriteLine(moderna.apagar());

                  Console.ReadLine();

                  BombillaAdapter usarVela = new BombillaAdapter();
                  Console.WriteLine(usarVela.encender());
                  Console.WriteLine(usarVela.aumentarIntensidad());
                  Console.WriteLine(usarVela.apagar());

                  Console.ReadLine();
              }
          }




      }

      Tensorflow. Reconocimiento facial con inteligencia artificial (2/3)

      22. Reconocimiento facial con inteligencia artificial (2)

      • Hola a todos.Una vez finalizado el curso de google, vamos a entrenar un modelo para hacer un ejemplo de reconocimiento facial.Este ejemplo lo dividiremos en tres vídeos, que estructuraremos de la siguiente manera.

      • En el segundo vídeo que podéis ver a continuación nos centramos en definir y entrenar una red convolucional con Keras. También veremos el código necesario para este propósito.
      • A continuación os dejo el código visto en el vídeo.
      #Imporatamos el fichero utils que tiene la lógica necesaria para obtener 15 puntos 
      #representativos de las caras.
      from utils import *

      # load_data es un método definido en el fichero utils para cargar los csv que 
      #tenemos en la carpeta data:training.csv y
      # test.csv'
      X_train, y_train = load_data()
      print("X_train.shape == {}".format(X_train.shape))
      print("y_train.shape == {}; y_train.min == {:.3f}; y_train.max == {:.3f}".format(
          y_train.shape, y_train.min(), y_train.max()))

      # cargamos datos entrenamiento que son los dos csv que tene
      X_test, _ = load_data(test=True)
      print("X_test.shape == {}".format(X_test.shape))


      #muestro los puntos 15 puntos representativos de las caras de del conjunto de entrenamiento 
      import matplotlib.pyplot as plt
      %matplotlib inline

      fig = plt.figure(figsize=(20,20))
      fig.subplots_adjust(left=0, right=1, bottom=0, top=1, hspace=0.05, wspace=0.05)
      for i in range(9):
          ax = fig.add_subplot(3, 3, i + 1, xticks=[], yticks=[])
          plot_data(X_train[i], y_train[i], ax)
      # Importamos librerias necesarias 
      from keras.models import Sequential
      from keras.layers import Convolution2D, MaxPooling2D, Dropout
      from keras.layers import Flatten, Dense


      # El modelo debe aceptar imágenes en escala de 96x96 píxeles.
      # Debe tener una capa de salida totalmente conectada con 30 valores 
      #(2 para cada punto clave facial)
      # Como funcion de activacion utilizamos relu que activa una neoruna solo si es mayor que cero.
      shape = (96,96)
      modelo = Sequential()
      modelo.add(Convolution2D(16,(2,2),padding='same',input_shape=(96,96, 1), activation='relu'))
      modelo.add(MaxPooling2D(pool_size=3, data_format="channels_first"))

      modelo.add(Convolution2D(32,(3,3),padding='same', activation='relu'))
      modelo.add(MaxPooling2D(pool_size=3))
      modelo.add(Dropout(0.2))

      modelo.add(Convolution2D(64,(3,3),padding='same',activation='relu'))
      modelo.add(MaxPooling2D(pool_size=3))
      modelo.add(Dropout(0.2))

      modelo.add(Convolution2D(128,(3,3),padding='same', activation='relu'))
      modelo.add(MaxPooling2D(pool_size=3))
      modelo.add(Dropout(0.2))

      modelo.add(Flatten())
      modelo.add(Dense(256,activation='relu'))
      modelo.add(Dropout(0.2))


      modelo.add(Dense(30))


      modelo.summary()


      from keras.optimizers import SGD, RMSprop, Adagrad, Adadelta, Adam, Adamax, Nadam
      from keras.callbacks import ModelCheckpoint, History  

      iteraciones = 50
      histo = History()

      ## Compilamo el modelo
      def compilarModelo(modelo, iteraciones):
          
          ruta = 'model.hdf5'
          modelo.compile(optimizer='adam', loss='mse', metrics=['accuracy'])

          checkpointer = ModelCheckpoint(filepath=ruta, 
                                         verbose=1, save_best_only=True)

          ## Entrenamos el modelo
          hist = modelo.fit(X_train, y_train, validation_split=0.2,
                    epochs=iteraciones, batch_size=20, callbacks=[checkpointer, histo], verbose=1)
          
          modelo.save(ruta)
          
          return hist

      # Booleano con el controlamos si entrenar el modelo o no
      entrenarModelo = False

      if entrenarModelo is True:
          hist = compilarModelo(modelo, iteraciones) 
      else:
          modelo.load_weights('model.hdf5')

      def obtenerPuntosClave(imagen, caras=None):
          
        
          #lista parea (cara, puntosClave)
          resultado = []
          
          if caras is None:
              caras = get_faces(imagen)
          

          # mismo tamaño que los conjuntos de entrenamiento y validacion
          carasForma = (96, 96)
          
          copiaImagen = np.copy(imagen)

          #Por cada cara detectamos puntos clave y características
          for (x,y,w,h) in caras:

              #Recortamos la región de la imagen donde esta la cara
              cara = copiaImagen[y:y+h,x:x+w]

              # Cara convertida a escala de grises y tamaño 96x96x1
              caraGris = cv2.cvtColor(cara, cv2.COLOR_BGR2GRAY)
              caraGrisRedimensionar = cv2.resize(caraGris, carasForma) / 255

              # Adaptando entrada a (1, 96, 96, 1)
              inputs = np.expand_dims(np.expand_dims(caraGrisRedimensionar, axis=-1), axis=0)
                                      
              # obtener puntos clave                        
              puntosClavePrediccion = modelo.predict(inputs)

              # Todos los puntos clave en una sola matriz plana. 
              # Recuperaremos puntos clave como (x, y) con (idx, idx + 1) valores.
              puntosClavePrediccion = np.squeeze(puntosClavePrediccion)
              
              puntosClave = []        
              for idx in range(0, len(puntosClavePrediccion), 2):
                  #Factor de escala (revertir escala)
                  x_scale_factor = cara.shape[0]/carasForma[0] 
                  y_scale_factor = cara.shape[1]/carasForma[1] 

                  x_center_left_offset = puntosClavePrediccion[idx] * carasForma[0]/2 + carasForma[0]/2 
                  y_center_left_offset = puntosClavePrediccion[idx + 1] * carasForma[1]/2 + carasForma[1]/2
                  
                  x_center = int(x + (x_scale_factor * x_center_left_offset))
                  y_center = int(y + (y_scale_factor * y_center_left_offset))

                  puntosClave.append([x_center, y_center])
              
              resultado.append([(x,y,w,h), puntosClave])
          
          return resultado

      def mostrarImagenCaracteristicas(image_path):
          imagen = cargaImagen(image_path)
          caras = dameCaras(imagen)
          puntosClave = obtenerPuntosClave(imagen, caras)
          imagenConCaras = pintarCaras(imagen, caras ,plot=False)
          pintarPuntosClave(imagenConCaras, puntosClave)

      mostrarImagenCaracteristicas('imagenes/clubdelalucha.jpg')

      Curso .NET Core en C# - 34.Creamos nuestro propio log

      34.Creamos nuestro propio log Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de  ASP.NET...