programas - introduccion a python
Enfoque general para desarrollar un algoritmo de clasificación de imágenes para los dibujos animados de Dilbert (4)
Creo que, en general, este es el enfoque correcto y que hay dos técnicas que puedes ver.
- Eigenfaces , el nombre de todos los algoritmos que usan vectores propios para el reconocimiento facial.
- El enfoque de Bag-of-Words o palabras visuales.
Como ejercicio de autodesarrollo, deseo desarrollar un algoritmo de clasificación simple que, dada una celda particular de un dibujo animado de Dilbert, pueda identificar qué personajes están presentes en el dibujo animado (Dilbert, PHB, Ratbert, etc.).
Supongo que la mejor manera de hacerlo es (1) aplicar algún algoritmo a la imagen, que lo convierte en un conjunto de características, y (2) utilizar un conjunto de entrenamiento y uno de los muchos posibles algoritmos de aprendizaje automático para correlacionar la presencia / ausencia de ciertas características con un carácter particular presente en la celda.
Entonces mis preguntas son: (a) ¿es este el enfoque correcto? (B) dado que hay una serie de algoritmos de clasificación y algoritmos de ML para evaluar, ¿cuál es una buena metodología para encontrar el correcto ?, y (c) qué algoritmos comenzarías. con, dado que esencialmente estamos llevando a cabo un ejercicio de clasificación en una caricatura.
Esta pregunta se hizo hace 5 años, por lo tanto, las respuestas proporcionadas anteriormente están desactualizadas dado el hecho de que el aprendizaje profundo ha cambiado la visión de la computadora en los últimos 3 o 4 años. Una solución basada en el aprendizaje profundo implicaría la formación de una red neuronal convolucional, que aprendería las características y realizaría la clasificación en un marco de aprendizaje de extremo a extremo. Sin embargo, dado que múltiples dibujos animados pueden estar presentes en la misma imagen, la pérdida de entropía cruzada de softmax estándar usada en la clasificación de imágenes puede no ser apropiada. Por lo tanto, la regresión logística independiente debe usarse como una función de pérdida. El umbral para cada clase se puede obtener en base a la precisión obtenida en un conjunto de validación extendido. Incluso para las caricaturas, es mejor utilizar un modelo preentrenado inicializado utilizando imagenet en lugar de entrenamiento desde cero ( https://arxiv.org/pdf/1611.05118v1.pdf , aunque la tarea final en este documento es diferente, todavía hacer procesamiento en dibujos animados). Si tienes datos abundantes, el preentrenamiento puede no ser tan importante. Esta tarea se puede realizar utilizando bibliotecas estándar como caffe / torch etc.
Por lo tanto, creo que está en el camino correcto con / r / t su paso 1 ( aplique algún algoritmo a la imagen, que la convierta en un conjunto de características) .
Este proyecto es más desafiante que la mayoría de los problemas de ML porque aquí en realidad tendrá que crear su conjunto de datos de entrenamiento a partir de los datos brutos (los cuadros individuales que comprenden los dibujos animados). Por ejemplo, agarra un marco, identifica dos personajes en ese marco, Dilbert y el personaje con cuernos (el jefe de Dilbert, creo, no sé su nombre), extrae esos dos caracteres de ese marco y anexa a cada uno la etiqueta de clase apropiada ( por ejemplo, "1" para Dlibert).
Paso 1
Para extraer los caracteres individuales de cada uno de los cuadros que componen el dibujo animado de Dilbert, sugeriría una descomposición espectral de cada cuadro. Si no está familiarizado con esta técnica, en esencia, es solo una descomposición eigenvector.
Si le gusta Python (o R, dado que puede usar enlaces de pitón a R como RPy ), le recomiendo encarecidamente que consulte sklearn . En particular, esta excelente biblioteca (que originalmente se desarrolló bajo el paraguas del proyecto SciPy scikits , y por lo tanto utiliza NumPy + SciPy para el cálculo matricial) tiene varios algoritmos para la segmentación de imágenes, uno de los cuales se basa en la agrupación espectral . Para este paso en su proyecto, lo más probable es que desee ver estos dos módulos scikits.learn
sklearn.feature_extraction (especialmente el submódulo de imagen )
sklearn.cluster.spectral_clustering
Con estos dos módulos se incluyen dos buenos scripts de ejemplo, uno segmentando una fotografía digital y el otro segmentando una imagen compuesta por tres círculos parcialmente superimpuestos con un contraste mínimo w / r / t entre sí y sin / el fondo-- ambos, sospecho que son problemas más difíciles que las descomposiciones que necesitarás realizar. En otras palabras, sklearn tiene dos scripts de ejemplo completos y bien documentados incluidos en la distribución de origen, y ambos procesan datos similares a los tuyos. Cualquiera de los dos sería una excelente plantilla para este paso.
Paso 2
Entonces ese es el primer paso; aquí está el segundo: clasifique todos los componentes de las imágenes descompuestas en grupos, un grupo para cada personaje Dilbert . A continuación, asigne una etiqueta de clase a cada grupo, por ejemplo, si hay cuatro caracteres de su etapa de descomposición, entonces una opción decente para las etiquetas de clase es "0", "1", "2" y "3". Agregue esas etiquetas de clase a las matrices de componentes (los productos de descomposición del paso 1) para que cada matriz de caracteres se mapee a su clase correspondiente (carácter de Dilbert).
Paso 3
Seleccione una técnica ML adecuada. Tienes muchas opciones para este paso; el único criterio es que la técnica está en la categoría supervisada (porque ha asignado etiquetas de clase a sus datos) y que funciona como un clasificador (es decir, devuelve una etiqueta de clase, frente a un regresor que genera un valor numérico). Dado que este es un proyecto personal, elegiría el que te parezca más interesante. Algunos que satisfacen los criterios que acabo de mencionar son: perceptrón multicapa (red neuronal), máquina de vectores de soporte (SVM) y k vecinos más cercanos (kNN).
Etapa 4
entrenar, validar y probar su clasificador
Técnica alternativa : coincidencia de plantillas
Una vez que se complete el Paso 1 (cada imagen se descompone en un conjunto de objetos, algunos de los cuales sin duda representarán los caracteres) puede tamizar manualmente estos productos de descomposición y recopilar ejemplares para cada personaje de la caricatura. Las son las plantillas .
Luego, compara los objetos segmentados de una imagen con este conjunto de plantillas únicas. En scikit-image , otro scikit scipy, puedes usar el método match_template , al que pasas en una imagen de plantilla y una imagen candidata, y este método devuelve una matriz 2D que muestra la correlación píxel por píxel (entre -1 y 1 )
Puede intentar crear un modelo cargando sus datos de entrenamiento (imágenes de cómics) en demo.nanonets.ai (de uso gratuito)
Luego consulta la API usando el siguiente (código Python):
import requests
import json
import urllib
model_name = "Enter-Your-Model-Name-Here"
url = "http://static5.businessinsider.com/image/525464f969bedd0b0422cfb6/dilbert-creator-scott-adams-presents-his-10-favorite-comics-of-all-time.jpg"
files = {''uploadfile'': urllib.urlopen(url).read()}
url = "http://demo.nanonets.ai/classify/?appId="+model_name
r = requests.post(url, files=files)
print json.loads(r.content)
la respuesta se ve así:
{
"message": "Model trained",
"result": [
{
"label": "Dilbert",
"probability": 0.97
},
{
"label": "PHB",
"probability": 0.025
},
{
"label": "Ratbert",
"probability": 0.005
}
]
}