El acercamiento inicial
Como estás trabajando con imágenes, querrás usar una red neuronal convolucional. Lo entrenaría como lo haría con cualquier otra red neuronal, utilizando una función de pérdida que incluye un término de la forma | número de caras en la salida de imagen (número estimado de caras |. Después de unas pocas capas, esperaría terminar con algunos mapas de características que son cero, excepto en las regiones correspondientes a caras gracias a la convolución, agrupación máxima y capas ReLu. Después de esto, cierta agrupación máxima podría reducir cada “cara” a un solo punto. El resultado es entonces el número de no cero píxeles, que es una combinación lineal de las intensidades de píxeles como es estándar en una red neuronal.
¡Espere! ¡¡Hay un problema!!
- ¿Cuáles son las formas en que puede aplicar la máquina o el aprendizaje profundo al pirateo?
- ¿Son los enfoques variacionales estocásticos la forma de hacer ML bayesiano a gran escala o ves alguna esperanza de ampliar los algoritmos basados en MCMC?
- ¿Es la precisión proporcional al número de capas ocultas y las unidades de cada capa en la red neuronal?
- ¿Cuántos datos necesitamos para pensar siquiera en aplicar el aprendizaje profundo?
- ¿Cómo afecta el término de regularización a la constante de Lipschitz en la minimización empírica regularizada del riesgo?
Si las caras pueden ser de tamaños muy diferentes (tal vez no dependiendo de su problema), desea hacer una agrupación más agresiva. Esto puede ser problemático si diferentes caras están muy juntas, ya que puede contar varias caras como una sola. Es por eso que tendría diferentes canales de funciones con diferentes estrategias de agrupación. Su última capa completamente conectada tendrá en cuenta estos resultados y determinará una salida escalar.
¿Hay una mejor manera?
La respuesta a esa pregunta es quizás definitiva. Justo en la parte superior de mi cabeza, tienes varias otras opciones.
- Entrene una única red neuronal para determinar si una imagen contiene una cara. Divida la imagen en parches y marque “hay una cara en este parche” y cuente la cantidad de parches con caras en ellos. Haga esto para diferentes tamaños de parche y calcule su resultado a partir de eso. Este último paso también podría hacerse con una red neuronal estándar.
- Entrénelo para detectar narices, ojos, bocas, etc. ¡INDIVIDUALMENTE! Calcule su respuesta a partir de esa salida. Esto es efectivo cuando las caras pueden estar parcialmente oscurecidas. Tenga en cuenta que una CNN puede aprender a hacer exactamente esto por sí misma (o detectar otras características pero el mismo concepto), por lo que puede no ser necesario.
- Use una capa de agrupación variable (un término que acabo de inventar) que aplica la agrupación máxima pero su tamaño de agrupación depende de la salida de la capa anterior. Puede permitir que la red aprenda a calcular esto o puede especificarlo manualmente con bastante facilidad. Será molesto programarlo, ya que no es estándar en ninguna biblioteca que conozca y hace que el ajuste de los tamaños de las capas futuras sea complicado, pero es un experimento interesante.
Me acabas de dar como un millón de respuestas. ¡¿Cuál uso?!
Para la mayoría de los propósitos, la implementación básica debería funcionar bien, así que pruébalo primero. Si tienes problemas, mira lo que va mal. ¿Produce demasiadas o muy pocas caras? ¿Es correcto cuando las caras son del mismo tamaño pero incorrectas cuando no lo son? Ese tipo de cosas le dirá lo que necesita hacer para solucionarlo.