Dada una imagen de una cabra, su programa debería tratar de identificar si la cabra está boca abajo o no.
Ejemplos
Estos son ejemplos de lo que puede ser la entrada. Entradas no reales
Entrada:
Salida:
Downgoat
Especificaciones
Su programa debe tener como máximo 30,000 bytes
- La entrada contendrá la cabra llena
- La imagen siempre contendrá una cabra.
- Si la cabra está al revés, salida
Downgoat
, de lo contrarioUpgoat
La entrada será, sin embargo, puede tomar una imagen como entrada (nombre de archivo, base64 de la imagen, etc.)
No confíe en el nombre de la imagen u otros metadatos para contener "Upgoat" o "Downgoat", ya que los nombres de los archivos básicos son solo para referencia.
Por favor no codifique . Es aburrido, no puedo aplicarlo por completo, pero puedo preguntar amablemente.
Casos de prueba
Gist con imágenes . las imágenes que comienzan con downgoat
tienen Downgoat
salida y las imágenes que comienzan con upgoat
tienen Upgoat
salida.
Segundo lote de casos de prueba
Asegúrese de probar sus imágenes en todos los casos de prueba. Estas imágenes son un jpg
s. Los tamaños de imagen varían, pero no por eso mucho.
Nota: Se pueden agregar algunos casos de prueba antes de aceptar una respuesta para evitar respuestas que codifican y verificar el rendimiento general del programa.
Puntos de bonificación por obtener mi avatar correcto: P
Puntuación
La puntuación es un porcentaje que se puede calcular mediante: (number_correct / total) * 100
fuente
Respuestas:
Mathematica, 100%, 141 bytes
Bueno, esto se siente más que un poco como hacer trampa. También es increíblemente lento, además de ser muy tonto. La función
f
ve aproximadamente qué tan alto puede establecer el umbral de Reconocimiento en una de las funciones de visión por computadora de Mathematica, y aún así reconocer la imagen como un animal Caprino.Luego vemos si la imagen o la imagen volteada es más caprichosa. Funciona en su imagen de perfil solo porque el empate está roto a favor de downgoat. Probablemente hay muchas formas en que esto podría mejorarse, incluida la pregunta si la imagen representa Bovids u otras generalizaciones del tipo de entidad animal Caprino.
Responda como puntajes escritos 100% para el primer conjunto de pruebas y 94% para el segundo conjunto de pruebas, ya que el algoritmo arroja un resultado no concluyente para la cabra 1. Esto puede elevarse hasta el 100% a expensas de un tiempo de cálculo aún más largo probando más valores de
RecognitionThreshold
. Subiendo de100
a1000
suficientes; ¡Por alguna razón, Mathematica piensa que es una imagen muy desagradable! Cambiar la entidad de reconocimiento de Caprine animal a Hoofed Mammal también parece funcionar.Sin golf:
Solución alternativa, 100% + bonificación
Éste usa la misma estrategia que antes, pero con una búsqueda binaria por encima del umbral. Aquí hay dos funciones involucradas:
g[t]
devuelve si su argumento es o no una imagen caprichosa con umbralt
.f
toma tres parámetros: una imagen y un límite superior e inferior en el umbral. Es recursivo; funciona probando un umbralm
entre los umbrales superior e inferior (sesgado hacia el inferior). Si la imagen y la imagen reflejada son caprichosas o no caprichosas, elimina la parte inferior o superior del rango según corresponda y se llama a sí misma nuevamente. De lo contrario, si una imagen es caprichosa y la otra no es caprichosa, regresaUpgoat
si la primera imagen es caprichosa y de loDowngoat
contrario (si la segunda imagen reflejada es caprichosa).Las definiciones de funciones merecen una pequeña explicación. Primero, la aplicación de la función es asociativa a la izquierda. Esto significa que algo así
g[x][y]
se interpreta como(g[x])[y]
; "el resultado deg[x]
aplicado ay
".Segundo, la asignación en Mathematica es más o menos equivalente a definir una regla de reemplazo. Es decir,
f[x_] := x^2
no , no significa "declarar una función llamadaf
con el parámetrox
que devuelvex^2
;" su significado está más cerca de "cuando veas algo asíf[ ... ]
, llama a la cosa que está adentrox
y reemplaza todo conx^2
".Al poner estos dos juntos, podemos ver que la definición de
g
es decirle a Mathematica que reemplace cualquier expresión de la forma(g[ ... ])[ ... ]
con el lado derecho de la tarea.Cuando Mathematica encuentra la expresión
g[m]
(en la segunda línea def
), ve que la expresión no coincide con ninguna regla que conozca y la deja sin cambios. Luego coincide con elMap
operador/@
, cuyos argumentos song[m]
y la lista{i, ImageReflect@i}
. (/@
es notación infija; esta expresión es exactamente equivalente aMap[g[m], { ... }]
). ElMap
se reemplaza aplicando su primer argumento a cada elemento de su segundo argumento, por lo que obtenemos{(g[m])[i], (g[m])[ ... ]}
. Ahora Mathematica ve que cada elemento coincide con la definición deg
y hace el reemplazo.De esta manera, tenemos
g
que actuar como una función que devuelve otra función; es decir, actúa más o menos como escribimos:(Excepto en este caso
g[t]
por sí solo se evalúa como aFunction
, mientras que antesg[t]
solo no se transformó en absoluto).El truco final que uso es un patrón opcional. El patrón
l_ : 0
significa "hacer coincidir cualquier expresión y hacer que esté disponible comol
, o no hacer coincidir nada y hacer que0
esté disponible comol
". Entonces, si llamasf[i]
con un argumento (la imagen a probar) es como si hubieras llamadof[i, 0, 1]
.Aquí está el arnés de prueba que utilicé:
fuente
JavaScript, 93.9%
Explicación
Implementación simple de la idea de @BlackCap de verificar de dónde viene la luz.
La mayoría de las cabras están en el centro de sus imágenes, y sus barrigas siempre son más oscuras que sus espaldas debido a la luz solar. El programa comienza en el medio de la imagen y toma nota del color. Luego obtiene la luminosidad promedio de los píxeles por encima y por debajo del centro hasta donde el color es diferente al color en el centro (cuando termina el cuerpo de la cabra y comienza el fondo). El lado más claro determina si se trata de un upgoat o un downgoat.
Falla para downgoat 9 y upgoats 7 y 9 en el segundo caso de prueba.
fuente
Python, 100%, 225 bytes
Utilice la búsqueda de imágenes inversas en la cabra. Si la página devuelve una cantidad satisfactoria de resultados, probablemente sea una cabra hacia arriba. Esta solución probablemente no funcionará en cabras dibujadas a mano o si Bing alguna vez se corrompe.
fuente
Java,
93.9%100%Esto funciona determinando el contraste de fila en la parte superior e inferior de la imagen. Supongo que el contraste en la mitad inferior de la imagen es mayor por 2 razones:
Determino el contraste de cada fila calculando la diferencia de los valores de píxeles vecinos, cuadrando la diferencia y sumando todos los cuadrados.
Actualizar
Algunas imágenes del segundo lote causaron problemas con el algoritmo original.
upgoat3.jpg
Esta imagen estaba usando una transparencia que fue ignorada anteriormente. Hay varias posibilidades para resolver este problema, pero simplemente elegí renderizar todas las imágenes en un fondo negro de 400x400. Esto tiene las siguientes ventajas:
downgoat8.jpg / upgoat8.jpg
Estas imágenes tienen detalles exagerados en el cuerpo de la cabra. La solución aquí fue desenfocar la imagen solo en dirección vertical. Sin embargo, esto generó problemas con las imágenes del primer lote, que tienen estructuras verticales en el fondo. La solución aquí fue simplemente contar las diferencias que exceden un cierto umbral e ignorar el valor real de la diferencia.
En pocas palabras, el algoritmo actualizado busca áreas con muchas diferencias en las imágenes que después del preprocesamiento se ven así:
fuente
Python 3, 91.6%
-editado con los nuevos casos de prueba
establece el nombre del archivo a la imagen de cabra que deseas probar Utiliza un núcleo para hacer una imagen asimétrica superior / inferior. Probé con el operador sobel, pero fue mejor.
fuente
pip install Pillow
OpenCV con Hough Transform, 100%
Mi idea original era detectar las líneas verticales de las patas de la cabra y determinar su posición vertical en relación con el cuerpo y el horizonte.
Como resultado, en todas las imágenes, el suelo es extremadamente ruidoso, lo que produce una gran cantidad de salida de detección de bordes Canny y las líneas detectadas correspondientes de la transformación Hough. Mi estrategia fue entonces determinar si las líneas horizontales se encuentran en la mitad superior o inferior de la imagen, lo cual fue suficiente para resolver el problema.
Aquí está la función completa sin generar imágenes:
Downgoat1 bordes:
Downgoat1 líneas:
Upgoat2 bordes y líneas:
El método incluso funcionó bien en imágenes particularmente ruidosas. Aquí están downgoat3 bordes y líneas:
Apéndice
Resulta que el desenfoque mediano y el umbral gaussiano adaptativo antes de que la Transformación de Hough funcione mucho mejor que la detección de bordes de Canny, principalmente porque el desenfoque mediano es bueno en áreas ruidosas. Sin embargo, los problemas de mi enfoque original de inmediato son claros: se detectan líneas de fondo prominentes, así como la cara de la cabra en algunas imágenes.
Aquí está downgoat8:
Los contornos (no se muestra el código) detectan el borde superior de la cabra (columna) bastante bien, pero no logran obtener la forma completa.
Investigación adicional: OpenCV tiene detección de objetos basada en características de Haar que generalmente se usa para cosas como automóviles y caras, pero probablemente también podría funcionar para cabras, dada su forma distintiva.
El reconocimiento de características 2D parece prometedor (la coincidencia de plantillas no funcionará debido a la escala y la rotación), pero soy demasiado vago como para descubrir OpenCV para C ++.
fuente
Python 3, numpy, scikit, 100%
Este código ejecuta un clasificador de imágenes con entrenamiento de cabra contra un solo nombre de archivo, imprimiendo 'Upgoat' o 'Downgoat'. El código en sí es una línea de python3, precedida por una única cadena gigantesca y una línea de importación. La cadena gigante es en realidad el clasificador entrenado para cabras, que se desenrolla en el tiempo de ejecución y se le da la imagen de entrada para su clasificación.
El clasificador fue creado usando el sistema TPOT, de Randal Olson y el equipo de la Universidad de Pennsylvania. TPOT ayuda a evolucionar las tuberías del clasificador de imágenes de aprendizaje automático mediante programación genética. Básicamente, utiliza la selección artificial para elegir varios parámetros y tipos de clasificación para que funcionen mejor con los datos de entrada que le da, por lo que no tiene que saber mucho sobre el aprendizaje automático para obtener una configuración de tubería bastante buena. https://github.com/EpistasisLab/tpot . TPOT se ejecuta sobre scikit-learn, de INRIA et al, http://scikit-learn.org/stable/
Le di a TPOT unas cien imágenes de cabra que encontré en Internet. Elegí unos que parecían relativamente similares a las cabras en Test, es decir, "en un campo", desde el costado, sin que sucediera mucho más en la imagen. La salida de este proceso TPOT era básicamente un objeto ExtraTreesClassifier scikit-learn. Este clasificador de imágenes, después de ser entrenado (o 'encajar') en mis cabras, se encurtió en la gran cadena. La cadena, entonces, contiene no solo el código del clasificador, sino la "impresión" del entrenamiento de todas las imágenes de cabra en las que fue entrenado.
Hice trampa un poco durante el entrenamiento, al incluir la imagen de prueba 'cabra parada en un tronco' en las imágenes de entrenamiento, pero aún funciona bastante bien en imágenes genéricas de cabra en el campo. Parece haber una compensación: cuanto más tiempo dejo que TPOT se ejecute, mejor clasificador creó. Sin embargo, los mejores clasificadores también parecen ser "más grandes" y eventualmente se encuentran con el límite de 30,000 bytes dado por @Downgoat en el juego de golf. Este programa tal como está actualmente es de aproximadamente 27kbytes. Tenga en cuenta que el 'segundo grupo' de imágenes de prueba está roto, al igual que el 'enlace de respaldo', por lo que no estoy seguro de cómo les iría. Si fueran a repararse, probablemente comenzaría de nuevo, volvería a ejecutar TPOT y le daría un montón de nuevas imágenes, y vería si podía crear un nuevo clasificador de menos de 30k bytes.
Gracias
actualización: por solicitud aquí están los datos de entrenamiento, redimensionados a 24x12 y combinados en una sola imagen para facilitar la carga / presentación. Son más de cien imágenes. http://deeplearning.net/datasets/ , http://www.vision.caltech.edu/Image_Datasets/Caltech256/ , duckduckgo image search, google image search, etc.
fuente
Aprende Scikit con bosques aleatorios, 100%
El enfoque probado y verdadero son las convnets, pero los bosques aleatorios pueden funcionar muy bien desde el primer momento (pocos parámetros para ajustar). Aquí muestro algunas técnicas generales en tareas de clasificación de imágenes.
Comencé con 100 imágenes de cabras para entrenamiento que encontré a través de Google Images (AFAIK ninguno de los datos de entrenamiento coincide con los datos de la prueba). Cada imagen se redimensiona a 20x16 en escala de grises, luego la matriz se aplana para producir una fila en una matriz 2D. También se agrega una versión invertida de la imagen como una fila para los datos de entrenamiento. No necesitaba usar ninguna técnica de aumento de datos .
Luego introduzco la matriz 2D en el clasificador de bosque aleatorio y llamo a predicción para producir 50 árboles de decisión. Aquí está el código (desordenado):
Aquí está el primer árbol de decisión (aunque dado que el modelo está en un conjunto, no es particularmente útil )
fuente