21

En el siguiente escenario:Encontrar archivos de video duplicados por base de datos (millones), huella digital? ¿Reconocimiento de patrones?

Obtuve un proyecto que tenía un catálogo de actualmente unos diez mil archivos de video, el número va a aumentar drásticamente.

Sin embargo, muchos de ellos son duplicados. Con cada archivo de video, tengo información semántica y descriptiva asociada a la que quiero unir duplicados para obtener mejores resultados para cada uno.

Ahora necesito algún tipo de procedimiento en el que indexe los metadatos en una base de datos, y cada vez que un nuevo video ingresa al catálogo, se calculan y contrastan los mismos datos en la base de datos.

El problema es que los videos no son duplicados exactos. Pueden tener diferente calidad, amby cropped, watermarked o tener una secuela/precuela. O se cortan al principio y/o al final.

Desafortunadamente, cuanto mejor sea la comparación, más memoria y memoria consume, así que planeo implementar varias capas de comparación que comiencen con una comparación muy elegante pero rápida (maby video lengh con una tolerancia del 10%) y terminen con la final comparación que decide si realmente es un duplicado (eso sería un voto de la comunidad).

Así que como tengo una comunidad para verificar los resultados, basta con "buenas suposiciones" con una baja proporción de errores.

Así que ahora mi pregunta es qué capas pueden ustedes pensar o tienen un mejor enfoque?

No me importa el esfuerzo de crear los metadatos, tengo suficientes esclavos para hacer eso. Solo la comparación debe ser rápida. Así que si ayuda que puedo convertir el vídeo 100 veces, así ...

Estas son mis ideas actuales:

  • duración de vídeo (segundos)

  • análisis primero y el último marco de imagen

Volvería a muestrear la imagen a un tamaño de miniatura y obtendría los valores promedio de rgb luego serializar píxeles por píxel si el color en este píxel es mayor o menor que el promedio edad representada por 0 o 1. Así que obtengo una cadena binaria que puedo almacenar en mysql y hago una boolean bit-sum (soportada por mysql internamente) y cuento los bits impares restantes (también soportados internamente, que entonces serían los Levenshtein) distancia de las cuerdas binario a)

  • Desarrollos de la tasa de bits en el tiempo con el mismo códec VBR

me transcodificar el vídeo en un archivo de vídeo VBR con la misma configuración. y luego vería la tasa de bits en ciertos momentos (porcentaje del video completado o segundos absolutos ... entonces solo analizaríamos una parte del video). lo mismo que con la imagen. Si la tasa de bits es mayor, el promedio es 1 más es 0. hacemos una cadena binaria y la almacenamos en db y calculamos la distancia Levenshtein tarde

  • de análisis el audio (bitrate y varaition decibelios con el tiempo al igual que la tasa de bits del vídeo)

  • análisis fotograma clave

Comarision de imagen al igual que el primer y último fotograma, pero en las posiciones de fotograma clave? Utilizaríamos los mismos archivos fuente que utilizamos para las calcuaciones de bitrate porque los fotogramas clave dependen mucho del códec y la configuración.

  • Desarrollos de color con el tiempo

Tal vez vamos a tomar una o más áreas/píxeles dentro de la imagen y ver cómo se develope lo largo del tiempo. También el cambio por encima/debajo del promedio. negro/blanco sería suficiente, creo.

  • presentes las sugerencias al usuario para su aprobación final ...

O voy el camino completamente equivocado? Creo que no puedo ser el primero en tener este problema, pero no he tenido suerte para encontrar soluciones.

+2

+1 para una pregunta muy interesante, pero esto definitivamente necesita etiquetas diferentes. PHP no será el idioma elegido aquí. –

+1

Estoy de acuerdo @Pekka. – Josh

+1

Estoy de acuerdo también: No sé por qué lo puse ahí: D –

Respuesta

17

Esto es un gran problema, así que he elegido escribir una respuesta bastante larga para tratar de descomponer el problema en partes que pueden ser más fáciles de resolver.

Es importante que las comparaciones se realicen utilizando los recursos informáticos y de tiempo disponibles: dudo que una solución que lleve meses ejecutar sea muy útil en una base de datos dinámica de video. Y el tamaño de la base de datos probablemente hace que el uso de los recursos de computación en la nube sea inviable. Entonces, realmente nos importa el costo local de cada comparación en varios dominios diferentes: 1) almacenamiento de datos, 2) recursos informáticos, y 3) tiempo.

Un costo clave a considerar es la extracción de los datos necesarios de cada video para cualquier métrica de comparación que se vaya a utilizar. Una vez que los datos extraídos están disponibles, se debe considerar el costo de realizar una comparación. Finalmente, se deben realizar las comparaciones necesarias para hacer coincidir todos los videos entre sí.

El costo de los dos primeros pasos es O (1) en la cantidad de videos. El costo del último paso debe ser peor que O (1), potencialmente mucho peor. Por lo tanto, nuestro objetivo principal debe ser minimizar los costos del último paso, incluso si eso significa agregar muchos pasos iniciales simples.

Los algoritmos óptimos para este proceso dependerán en gran medida de las características de la base de datos, el nivel en el que existen coincidencias únicas y múltiples. Si el 100% de los videos coinciden con algún otro video, entonces querremos minimizar el costo de una coincidencia exitosa. Sin embargo, lo más probable es que las coincidencias sean raras, por lo que querremos minimizar el costo de una coincidencia fallida. Es decir, si hay una manera rápida y sucia de decir "estos dos videos no pueden ser coincidencias", entonces debemos usarlo primero, incluso antes de comenzar a confirmar una coincidencia.

Para caracterizar la base de datos Primero, realice un muestreo y una coincidencia manual para estimar el grado de coincidencia dentro de la base de datos. Este experimento debe mostrar cómo los videos redundantes se "agruparon": si un video dado tenía una coincidencia, ¿qué tan probable era tener más de una coincidencia? ? ¿Qué porcentaje de todos los partidos también formaban parte de una coincidencia múltiple? Este proceso generará un "modelo" de la base de datos (una distribución estadística) que se utilizará para ayudar a la selección del algoritmo y ajustar el sistema.

En el futuro I asumirá que los partidos son relativamente raros. Después de todo, si hay muchos partidos, el video os se "agruparán", haciendo que la base de datos sea más pequeña y simplificando el problema. Supongamos que el problema se mantiene lo más difícil posible.

Recomendaría un enfoque de categorización multinivel, donde construiríamos una secuencia de algoritmos que repetidamente realizan la decisión binaria de "estos dos videos no coinciden"/"estos dos videos posiblemente coincidan". Solo el último algoritmo de la cadena debe emitir la respuesta "Estos dos videos coinciden".

Los algoritmos de clasificación/coincidencia pueden fallar de una o dos maneras: False Positive (los videos que no coinciden son mislabled como coincidentes) y False Negative (los videos que coinciden son etiquetados erróneamente como no coincidentes). Cada una de estas decisiones erróneas tiene un rango de probabilidades asociadas, y queremos minimizar ambas.

Como estamos construyendo una canalización de algoritmos, queremos algoritmos que sean muy buenos para identificar no coincidencias sin error, lo que significa que deben tener una tasa de rechazo falso extremadamente baja y no nos importa demasiado la tasa de aceptación falsa . Por ejemplo, el clon de un video de Wierd Al puede verse y parecerse mucho al original, y es posible que no podamos mostrar que no coincide con el original hasta más adelante en la canalización del algoritmo.

Los algoritmos más simples, rápidos y confiables se deben ejecutar primero, ya que la inmensa mayoría de las pruebas producirán el resultado "no coinciden". La comprobación más simple sería buscar archivos idénticos dentro de la base de datos, algo hecho por muchos sistemas de archivos rápidos y simples y utilidades de mantenimiento de bases de datos. Después de ejecutar este escaneo, podemos suponer que realmente necesitaremos abrir y leer los archivos de video para detectar diferencias.

Como la comparación de video es relativamente difícil, comencemos con el audio. Piense en la base de datos como la primera que es una colección de MP3 que puede contener duplicados. Después de todo, si conseguimos una buena coincidencia de audio, es muy probable que tengamos una coincidencia de video, y viceversa. Podemos decir con seguridad que el audio es un representante 'justo' para el video.Afortunadamente, una búsqueda rápida en Internet arrojará muchas huellas dactilares de audio y paquetes de comparación que son confiables, rápidos y maduros. La huella digital de audio necesitaría generarse para cada video en la base de datos. Los videos que carecen de una pista de audio caen automáticamente en el conjunto "podría corresponder".

Pero hay un 'gotcha' aquí: ¿Qué pasa con las voces en off? Si un video determinado está codificado dos veces, con y sin una voz en off, ¿coinciden o no? ¿Qué pasa con el audio francés frente al español o el inglés? Si se debe considerar que todas estas cosas coinciden, es posible que sea necesario omitir las pruebas de audio.

En este punto, sabemos que las entradas del sistema de archivos son "lo suficientemente diferentes", y sabemos que las pistas de audio son "lo suficientemente diferentes" (si se prueban), lo que significa que no podemos posarnos mirando los datos de video más tiempo. Afortunadamente, esto debería hacerse solo por una pequeña fracción de la base de datos de video, de modo que podamos tolerar algún costo. Al igual que antes, aún querremos primero tratar de eliminar rápidamente más no coincidencias antes de tratar de etiquetar positivamente un partido.

Como debemos tener en cuenta los cambios de resolución (por ejemplo, de 1080p a iPod), necesitaremos una manera de caracterizar la información de video que no solo sea independiente de la resolución, sino también tolerante al ruido y/o datos añadidos perdido como parte de cambiar la resolución. Debemos tolerar los cambios de velocidad de fotogramas (por ejemplo, de 24 fps de una película a 30 fps de video). También hay cambios en la relación de aspecto a considerar, como 4: 3 NTSC a 16: 9 HD. Quisiéramos manejar los cambios de espacio de color, como de color a monocromo.

Luego hay transformaciones que afectan a todos estos a la vez, como la transcodificación entre HD y PAL, que puede afectar simultáneamente el espacio de color, la velocidad de fotogramas, la relación de aspecto y la resolución. La caracterización también debe ser tolerante a cierto grado de recorte y/o llenado, como ocurriría a partir de un cambio entre 4: 3 y 16: 9 proporciones (letterboxing, pero no pan & scan). También debemos manejar los videos que se han truncado, como eliminar los créditos del final de una película. Y, obviamente, también debemos manejar las diferencias creadas por diferentes codificadores que fueron alimentados con una transmisión de video idéntica.

¡Esa es toda una lista! Consideremos algunas cosas que podemos elegir no tener en cuenta: sospecho que está bien no encontrar una coincidencia cuando hay deformación de imagen, a pesar del hecho de que la deformación anamórfica no es infrecuente, especialmente en las películas de pantalla panorámica de 35 mm que estaban directamente escaneada sin reconstrucción anamórfica (personas altas y flacas). También podemos optar por fallar cuando hay marcas de agua grandes en el centro del marco, aunque querremos tolerar marcas de agua más pequeñas en las esquinas. Y, por último, está bien que no coincida con los videos que se han distorsionado temporalmente o espaciado, como cuando uno es un slo-mo del otro, o se ha volteado de izquierda a derecha.

¿Eso cubre el espacio de video? Espero que esté claro por qué es importante comenzar con el sistema de archivos y el audio. Es decir, primero piense en su base de datos más como una colección de MP3 antes de considerarla como una colección de videos.

Ignorar el audio, el video es solo una secuencia ordenada de imágenes fijas. Así que en realidad estamos buscando uno o más algoritmos de comparación de imágenes combinados con uno o más algoritmos de comparación de series temporales. Esto podría ser pares de algoritmos separados (caracterizar cada fotograma, luego caracterizar la secuencia de fotogramas), o podría fusionarse en un solo algoritmo (ver las diferencias entre fotogramas).

Las imágenes mismas se pueden descomponer aún más, en una imagen "estructural" monocromática y una "superposición" de color. Creo que podemos ignorar la información de color de forma segura, si es conveniente hacerlo desde el punto de vista computacional.

De lo anterior, puede parecer que he asumido que tendremos que decodificar por completo un video para poder realizar comparaciones en él.Ese no es necesariamente el caso, aunque la comparación de datos codificados tiene muchas dificultades que limitan su utilidad. La única excepción significativa a esto es para las codificaciones de video a nivel de objetos como MP4, donde se han realizado comparaciones de fotogramas múltiples de muy alto nivel. Desafortunadamente, las comparaciones de objetos entre las transmisiones de MP4 no se han investigado mucho, y no tengo conocimiento de que ningún paquete pueda realizar esta función. ¡Pero si encuentras uno, úsalo!

La mayoría de las otras secuencias de video digital usan esquemas de codificación tales como MPEG2, Quicktime o algo similar. Todos estos esquemas utilizan el concepto de fotogramas clave y fotogramas diferenciados, aunque cada uno lo implementa de forma diferente. Cuando se comparan diferentes videos (que no son del mismo tamaño), es poco probable que los fotogramas clave y los cuadros de diferencia coincidan con cualquier grado útil. Sin embargo, esto no significa que sea imposible, y existen paquetes que intentan extraer información útil de dichas transmisiones sin realizar una descodificación completa. Si encuentra uno que sea rápido, puede caer en una categoría de pruebas "por qué no intentarlo".

El único truco que utilizaré es en lugar de decodificar marcos por completo, en cambio los decodificaré solo en canales de componentes separados (HSV, HSL, YUV, lo que sea) y no hasta el framebuffer RGB (a menos que eso sea codificado, por supuesto). A partir de aquí, crearé marcos de luminancia y crominancia (color) separados para que se puedan realizar comparaciones en dominios relacionados. La decodificación hasta un framebuffer RGB puede introducir errores que pueden dificultar la búsqueda de coincidencias.

A continuación, descartaría la información de color. Como un video monocromático debe coincidir con el color original, ¡simplemente no nos importa el color!

¿Cómo se puede comparar mejor la secuencia resultante de fotogramas monocromáticos con otra secuencia que puede parecer muy diferente, pero que aún puede coincidir? Ha habido literalmente décadas de investigación en esta área, muchas de ellas clasificadas bajo "detección de coincidencia invariable de escala". Desafortunadamente, muy poco de esta investigación se ha aplicado directamente para determinar cuándo los videos coinciden o no.

Para nuestros propósitos, podemos abordar este problema desde varias direcciones. Primero, debemos saber por nosotros mismos qué es y qué no coincide en el dominio monocromático. Por ejemplo, no nos importan las diferencias de nivel de píxel, ya que incluso si dos videos coincidentes pero diferentes tienen la misma resolución, debemos tolerar cierto nivel de ruido debido a cosas como las diferencias del codificador.

Un simple (pero lento) camino a seguir es transformar cada imagen en una forma que es independiente tanto de la resolución como de la relación de aspecto. Una de estas transformaciones es en el dominio de frecuencia espacial, y la FFT 2D es ideal para esto. Después de descartar el componente imaginario, el componente real se puede truncar a altas frecuencias para eliminar el ruido y a bajas frecuencias para eliminar los efectos de la relación de aspecto, luego se normaliza a una escala estándar para eliminar las diferencias de resolución. Los datos resultantes se ven como una imagen pequeña e impar que se puede comparar directamente a través de las transmisiones de video.

Existen muchas otras posibles estrategias de transformación de trama, muchas mucho más eficientes que la FFT, y una búsqueda bibliográfica debe resaltarlas. Desafortunadamente, conozco algunos que se han implementado en bibliotecas de software que son tan fáciles de usar como la FFT.

Una vez que hemos transformado las tramas monocromas en un dominio más pequeño y útil, aún debemos realizar la comparación con otra transmisión de ese tipo desde otro video. Y es casi seguro que ese video no sea una coincidencia de fotograma a fotograma, por lo que una simple comparación fracasará. Necesitamos una comparación que tenga en cuenta las diferencias en el dominio del tiempo, incluidos los fotogramas añadidos/eliminados y las diferencias en la velocidad de fotogramas.

Si mira la secuencia de cuadros FFT, notará un comportamiento muy distinto.Los desvanecimientos de escena son abruptos y extremadamente fáciles de detectar, los cortes también se pueden distinguir, y por lo general solo se observan cambios lentos en la FFT entre cortes. A partir de la secuencia de FFT, podemos etiquetar cada cuadro como el primero después de un corte/fundido, o como un cuadro entre cortes/fundidos. Lo importante es el tiempo entre cada corte/fundido, independiente de los marcos numéricos entre ellos, lo que crea una firma o huella digital que es en gran parte independiente de la velocidad de cuadros.

Al tomar esta huella digital de un video completo se obtienen datos que son enormemente más pequeños que el video en sí. También es una secuencia lineal de números, un simple vector de series temporales, muy parecido al audio, y puede analizarse utilizando muchas de las mismas herramientas.

La primera herramienta es realizar una correlación, para determinar si el patrón de cortes en un video es una coincidencia cercana a la de otro video. Si hay diferencias significativas, entonces los videos son diferentes. Si son una coincidencia cercana, entonces las únicas pocas FFT después de cada corte correlacionado deben ser comparadas para determinar si los marcos son lo suficientemente similares como para ser una coincidencia.

No entraré en la comparación de las FFT en 2D aquí, ya que hay abundantes referencias que hacen el trabajo mucho mejor que yo.

Nota: Hay muchas otras manipulaciones (más allá de una FFT 2D) que se pueden aplicar a marcos monocromos para obtener huellas dactilares adicionales. Las representaciones del contenido real de la imagen pueden crearse extrayendo los bordes interiores de la imagen (literalmente como una huella dactilar del FBI), o seleccionando el umbral de la imagen y realizando una operación 'blobbing' (creando una lista vinculada de descriptores de región relacionados). El seguimiento de la evolución de los bordes y/o blobs entre fotogramas se puede usar no solo para generar listas de cortes, sino que también se puede usar para extraer características de imágenes de alto nivel adicionales que se perderían utilizando una FFT 2D.

Hemos construido una secuencia de algoritmos de comparación que deben ser muy rápidos para encontrar coincidencias y que no requieren demasiado tiempo para determinar las coincidencias de manera concluyente. Por desgracia, tener algoritmos no hace una solución! Debemos considerar varios problemas relacionados con la mejor forma de implementar estos algoritmos.

En primer lugar, no queremos abrir y leer cada archivo de video más veces de las necesarias, de lo contrario, la CPU podría quedarse atascada en espera de los datos del disco. Tampoco queremos leer más de lo necesario en un archivo, aunque no queremos dejar de leer demasiado pronto y posiblemente perder un partido posterior. ¿Debería guardarse la información que caracteriza cada video, o debería ser recalculada cuando sea necesario? Abordar estos problemas permitirá desarrollar, probar y desplegar un sistema de comparación de video eficiente y efectivo.

Hemos demostrado que es posible comparar videos con la esperanza de encontrar coincidencias en condiciones muy variables, con eficiencia computacional.

El resto se ha dejado como un ejercicio para el lector. ; ^)

+0

+1 ¡excelente respuesta! Primero reformuló las circunstancias e intenciones de mi pregunta de una manera formal correcta y más comprensible, y me ha señalado en las direcciones correctas de herramientas de comparación y dominios que ni siquiera he pensado :) –

+0

¡Muy buena respuesta para un problema muy amplio! –

+0

¡genial! ¿Tiene alguna referencia para convertir imágenes monocromáticas (2 colores?) a fft? – Yehonatan

3

¡Gran pregunta! Solo las pruebas indicarán cuáles de esos factores serán los mejores indicadores. Algunas ideas:

  • desarrollo de la tasa de bits en el tiempo con el mismo códec vbr: Suena muy intensivo en CPU, pero me imagino que daría excelentes resultados. Parece que el análisis de audio daría resultados similares con menos trabajo.
  • primer y último análisis de imagen de fotograma: ¿No sería 50% de estos sería negro? Una mejor idea podría ser utilizar el cuadro medio, pero no confiaría en que esta técnica sea confiable.
  • Usa las estadísticas bayesianas para registrar qué factores hacen las mejores contribuciones a una coincidencia positiva. Esto podría hacerse en la fase de prueba para descartar comparaciones inútiles y costosas.
  • Obtén ayuda de los usuarios! Permita que los usuarios agrupen los duplicados que encuentren. Votan en el que tiene la mejor calidad y que actuará como la versión principal/oficial dentro del grupo.
  • Comience con las comparaciones más fáciles y agregue pruebas más sofisticadas cuando encuentre las deficiencias de las sencillas. La duración del video sería una buena para comenzar, luego tal vez un análisis de audio rudimentario, y siga subiendo desde allí.
+0

estadísticas bayesianas y el cuadro medio es una muy buena idea! –

1

Solo trata de este producto - Duplicate Video Search (ex Visual Pony Buscar), que se puede encontrar archivos de vídeo duplicados de tasas de bits diferentes, formatos, resoluciones y etc.

Por ejemplo, la estrella-wars.avi. (640x480 H.264) y sw.mpg (1280x720 MPEG) se detectarán como duplicados, en caso de que ambos sean copias de una gran película: Star Wars.

Según su sitio web, el producto utiliza algunas técnicas de huellas digitales de video, como la extracción de fotogramas clave o smth. así, sé independiente de la codificación de video, resolución, calidad, velocidad de bits, etc.

+1

parece prometedor. desafortunadamente es un problema de escritorio de Windows que depende de los filtros de directshow. una versión de línea de comando usando ffmpeg o gstreamner sería agradable. sin embargo, esto va en la dirección correcta, creo que puedo contactarlos porque tienen algo bajo la manga. No me importaría ejecutar servidores de Windows para ese propósito también. –

Cuestiones relacionadas