En el ámbito de la publicidad digital, garantizar la seguridad de la marca es una preocupación primordial. Implica la tarea de identificar y proteger las ubicaciones de los anuncios dentro del contenido que se alinean con los valores y objetivos de la marca y, a veces lo que es más importante, detectar el contenido que no se alinea con el mensaje de la marca. En 2019, la Alianza Global para unos Medios Responsables (GARM) publicó el estándar de seguridad e idoneidad de las marcas, que ayuda a las marcas a comunicar sus necesidades particulares en un lenguaje común en toda la industria.
Con este contexto en mente, queremos presentar un desafío que nos presentó uno de nuestros clientes: ¿cómo identificar el contenido inseguro para la marca en un gran corpus de vídeos de forma rentable? El análisis de vídeo tenía un coste prohibitivo, por lo que diseñamos una solución que aprovechaba el análisis de imágenes y audio. Después de todo, los vídeos son un gran conjunto de imágenes superpuestas con sonido, ¿verdad?
En este artículo, nos centraremos en el componente de visión artificial del análisis: ¿cómo encontrar, entre otras cosas, escenas de vídeo relacionadas con el crimen, las armas, el terrorismo, el alcohol, las drogas o la pornografía?
Lo primero que decidimos fue basar nuestra solución en una muestra de imágenes fijas de vídeo de todo el vídeo. A pesar de que esto aumentaba la probabilidad de error, el análisis de imágenes es más económico que el análisis de vídeo, por lo que podíamos muestrear un mayor número de imágenes. Con fines ilustrativos, si usáramos AWS Rekognition para la moderación de contenido mediante análisis de vídeo, el coste sería de 0,10 USD por minuto, mientras que el reconocimiento de imágenes costaría 0,0008 USD por imagen. Podemos muestrear 100 imágenes en un minuto de vídeo y, aun así, estar por debajo del coste del vídeo.
La cantidad de imágenes a muestrear será un parámetro a tener en cuenta para equilibrar la precisión del modelo y el costo total. Para muestrear estas imágenes, escribimos un CV abierto script para cargar un vídeo y muestrear un subconjunto de imágenes fijas a partir de él.
Una vez que hayamos obtenido nuestras imágenes de imágenes fijas, ¿cómo queremos clasificarlas? ¿Qué modelo debemos usar? Lo primero que pensamos fue aprovechar una idea similar a la que expusimos en nuestro anterior entrada de blog, clasificarlos en todas las diferentes categorías y tener una categoría «general» para contenido seguro. Sin embargo, esto tenía varios problemas. Para empezar, una imagen podía pertenecer a varias categorías diferentes, lo que hacía que la clasificación multiclase no fuera una solución suficiente. Además, ¿qué pasaría con las imágenes que no pertenecieran a ninguna de las categorías? La categoría «segura» podría ser enorme. La cantidad de datos que necesitaríamos para entrenar a los modelos en todas las cosas que son realmente seguras habría sido enorme. No solo eso, sino que estaríamos incurriendo en un desequilibrio de clases y en los problemas que esto puede conllevar. Por ejemplo, el modelo puede inclinarse hacia la clase mayoritaria, lo que llevaría a un desempeño deficiente en la clase minoritaria.
Para resolver el problema de las etiquetas múltiples, consideramos los modelos de etiquetas múltiples, pero el problema con la cantidad de ejemplos necesarios para un contenido «seguro» aún persistía.
Por ello, decidimos abordar el problema desde una nueva perspectiva. En lugar de crear un modelo para clasificarlos todos (lo siento, es una broma fácil), creamos un conjunto de modelos de clasificación de una clase, uno para cada una de las clases que queremos detectar. La clasificación de una clase, también conocida como detección de anomalías, es una técnica en la que el modelo aprende a identificar una clase específica de datos a partir de un conjunto de datos predominantemente normal. Los codificadores automáticos, un tipo de arquitectura de redes neuronales, son particularmente adecuados para esta tarea.
Los codificadores automáticos son un tipo de red neuronal artificial que se utiliza en el aprendizaje automático no supervisado. Están diseñados principalmente para la reducción de la dimensionalidad, el aprendizaje de funciones y la compresión de datos. Los codificadores automáticos tienen aplicaciones en una variedad de dominios, incluido el procesamiento de imágenes y señales, la detección de anomalías e incluso el procesamiento del lenguaje natural.
Un autocodificador consta de dos partes principales: un codificador y un decodificador. Así es como funcionan:
Codificador: El codificador toma una entrada (que puede ser una imagen, una secuencia de datos o cualquier otra forma de datos estructurados) y la asigna a una representación de dimensiones inferiores, a menudo denominada «espacio latente» o «codificación». Este proceso implica una serie de transformaciones y capas que capturan las características o patrones esenciales de los datos de entrada. El objetivo del codificador es reducir la dimensionalidad y, al mismo tiempo, preservar la información más importante.
Espacio latente: El espacio latente es una representación comprimida de los datos de entrada y, por lo general, tiene una dimensión inferior a la de los datos originales. Constituye un obstáculo en la arquitectura del codificador automático, ya que obliga al modelo a capturar las características más importantes de forma compacta.
Decodificador: El decodificador toma la representación del espacio latente y reconstruye los datos de entrada a partir de ella. Consiste en capas que realizan la operación inversa del codificador, intentando generar una salida que se parezca mucho a la entrada original. La calidad de la reconstrucción es una medida de lo bien que el codificador automático ha aprendido a capturar las características esenciales de los datos.
Los codificadores automáticos se entrenan mediante una pérdida de reconstrucción, que mide la diferencia entre la entrada y la salida. El objetivo durante el entrenamiento es minimizar esta pérdida, enseñando de manera efectiva al codificador automático a reproducir los datos de entrada con la mayor precisión posible. En el caso de la clasificación de una clase, si la pérdida de reconstrucción es alta para una entrada en particular, esto sugiere que la entrada no se ajusta bien a los patrones aprendidos, lo que indica que la imagen no pertenece a la clase en la que se entrenó el modelo. Pongamos un ejemplo: imaginemos que entrenamos dos codificadores automáticos, uno para detectar armas y otro para detectar drogas. Luego podemos enviar una imagen arbitraria a cada codificador automático y considerar el error de reconstrucción de ambos. Si descubrimos que el codificador automático de fármacos tiene un error de reconstrucción bajo, es probable que la imagen esté relacionada con fármacos.
Es difícil encontrar conjuntos de datos de código abierto sobre muchos de estos temas, especialmente debido a su sensibilidad. Por eso era crucial crear nuestros propios conjuntos de datos. Creamos ocho conjuntos de datos diferentes: crimen, armas, escenas militares, terrorismo, contenido explícito, contenido sexy, imágenes sobre fumadores e imágenes sobre bebidas alcohólicas; cada uno de ellos tenía entre 200 y 500 imágenes. Para ello, utilizamos imágenes de uso comercial permitidas de diversas fuentes, como Flickr, Google y Wikimedia. Nuestro equipo las revisó manualmente para asegurarnos de que las imágenes originales representaban bien lo que podía tener un vídeo poco seguro para una marca. Por ejemplo, la imagen de un soldado posando en uniforme está relacionada con temas militares, pero no es lo que la norma GARM denomina contenido inseguro. Un comentario personal: etiquetar los datos es una tarea que es mejor hacer en equipo y en pequeñas dosis y, si es posible, viendo vídeos de adorables cachorros mientras están juntos.
Colocaremos todas nuestras imágenes en una carpeta, definida aquí como carpeta de imágenes. También definiremos la altura y el ancho de la imagen, que son necesarios para los modelos con codificadores automáticos. Es importante usar un tamaño de imagen que mantenga la calidad de la imagen sin que sea demasiado grande, ya que las imágenes grandes crearán modelos más grandes, ¡y requerirán más memoria para funcionar! En nuestro caso, 256 × 256 píxeles es una forma razonable.
Ahora crearemos una función para entrenar nuestro codificador automático.
En este caso, optamos por utilizar capas densas, pero hay diferentes capas disponibles: entre otras, Conv2D, MaxPooling2D y UpSampling2D. La arquitectura elegida fue una combinación de estudio y experimentación: determinar qué arquitectura producía los mejores resultados y, al mismo tiempo, mantener la complejidad del modelo razonablemente baja. El tamaño óptimo de los lotes y las épocas eran una combinación de alta precisión y tamaño total del modelo. Queríamos buenos modelos, pero que pudieran funcionar en ordenadores con 256 GB de memoria.
Con esa función definida, entrenamos el modelo:
Ahora viene la parte divertida. ¡Usaremos la siguiente función para clasificar nuestras imágenes!
Y ahora, a la hora de la verdad, lo probamos con nuestros datos:
Si prestas atención, verás un «umbral» mencionado en el código anterior, de forma muy casual. ¿Qué es eso? ¿Recuerdas que hace algunas secciones hablamos sobre cómo se pueden usar los codificadores automáticos para la clasificación de una clase? Le pedimos al modelo que codifique una imagen y, a continuación, mida el error de reconstrucción. En este caso, utilizaremos el error cuadrático medio (MSE), la media de los cuadrados de los errores entre la imagen real y la imagen predicha. Si el error es grande, significa que la imagen no pertenece al conjunto de imágenes que utilizamos para el entrenamiento porque el modelo no pudo recrearla con precisión. Este es el concepto que utilizaremos para clasificar nuestras imágenes. Sin embargo, ¿qué es un «gran error»? Esto es algo que tendremos que investigar: establecer un umbral que sea coherente con tus datos. Un error lo suficientemente bajo como para mantener altos los verdaderos positivos y verdaderos negativos, y los falsos positivos y falsos negativos bajos. Por supuesto, esto también dependerá del caso de uso empresarial y de la sensibilidad a los errores de tipo I y tipo II.
Esta es la distribución de los MSE de las imágenes que pertenecían a la clase:
Y esta es la distribución de los MSE para las imágenes que no pertenecían a la clase:
Como podemos ver, la elección del umbral es tanto una ciencia como un arte: elegir un umbral más bajo nos hará marcar muchas imágenes que pertenecen a la clase como no pertenecientes y correremos el riesgo de no captar contenido inseguro para la marca. Por otro lado, si elegimos un umbral más alto, marcaremos más inventario del estrictamente necesario. En este caso, un umbral de 0,05 era una buena elección, ya que capturaba la mayoría de las imágenes que pertenecían a la clase y clasificaba mal muy pocas imágenes que no pertenecían.
Un ejercicio interesante es analizar las imágenes que se clasificaron erróneamente. En este caso, dado que muchas de las imágenes del entrenamiento tenían un fondo desértico debido a las campañas militares en Oriente Medio, las imágenes del desierto se clasificaron como de contenido militar. Para mejorar esto, mejoré mis datos de entrenamiento para capturar imágenes de otros contextos, como la guerra de Vietnam.
La seguridad de la marca en la publicidad exige una atención meticulosa al contexto en el que se muestran los anuncios. Nuestro desafío consistía en identificar cómo detectar el posible contexto de colocación de anuncios de una manera rentable.
Podemos solucionar este problema empleando codificadores automáticos de Keras para la clasificación de fotogramas de vídeo en una sola clase. Este enfoque reduce considerablemente los requisitos de etiquetado de datos, ya que los modelos con etiquetas múltiples y clases múltiples requerirían una amplia variedad de datos «seguros para la marca».
Entrenar a un codificador automático en contenido seguro para la marca y establecer un umbral para los errores de reconstrucción nos permite identificar con precisión las ubicaciones que se ajustan a los valores de la marca.
Esta solución ofrece un potencial significativo para racionalizar los esfuerzos de seguridad de la marca en la publicidad, garantizando que los anuncios se presenten de acuerdo con la identidad y la misión de la marca.
En el ámbito de la publicidad digital, garantizar la seguridad de la marca es una preocupación primordial. Implica la tarea de identificar y proteger las ubicaciones de los anuncios dentro del contenido que se alinean con los valores y objetivos de la marca y, a veces lo que es más importante, detectar el contenido que no se alinea con el mensaje de la marca. En 2019, la Alianza Global para unos Medios Responsables (GARM) publicó el estándar de seguridad e idoneidad de las marcas, que ayuda a las marcas a comunicar sus necesidades particulares en un lenguaje común en toda la industria.
Con este contexto en mente, queremos presentar un desafío que nos presentó uno de nuestros clientes: ¿cómo identificar el contenido inseguro para la marca en un gran corpus de vídeos de forma rentable? El análisis de vídeo tenía un coste prohibitivo, por lo que diseñamos una solución que aprovechaba el análisis de imágenes y audio. Después de todo, los vídeos son un gran conjunto de imágenes superpuestas con sonido, ¿verdad?
En este artículo, nos centraremos en el componente de visión artificial del análisis: ¿cómo encontrar, entre otras cosas, escenas de vídeo relacionadas con el crimen, las armas, el terrorismo, el alcohol, las drogas o la pornografía?
Lo primero que decidimos fue basar nuestra solución en una muestra de imágenes fijas de vídeo de todo el vídeo. A pesar de que esto aumentaba la probabilidad de error, el análisis de imágenes es más económico que el análisis de vídeo, por lo que podíamos muestrear un mayor número de imágenes. Con fines ilustrativos, si usáramos AWS Rekognition para la moderación de contenido mediante análisis de vídeo, el coste sería de 0,10 USD por minuto, mientras que el reconocimiento de imágenes costaría 0,0008 USD por imagen. Podemos muestrear 100 imágenes en un minuto de vídeo y, aun así, estar por debajo del coste del vídeo.
La cantidad de imágenes a muestrear será un parámetro a tener en cuenta para equilibrar la precisión del modelo y el costo total. Para muestrear estas imágenes, escribimos un CV abierto script para cargar un vídeo y muestrear un subconjunto de imágenes fijas a partir de él.
Una vez que hayamos obtenido nuestras imágenes de imágenes fijas, ¿cómo queremos clasificarlas? ¿Qué modelo debemos usar? Lo primero que pensamos fue aprovechar una idea similar a la que expusimos en nuestro anterior entrada de blog, clasificarlos en todas las diferentes categorías y tener una categoría «general» para contenido seguro. Sin embargo, esto tenía varios problemas. Para empezar, una imagen podía pertenecer a varias categorías diferentes, lo que hacía que la clasificación multiclase no fuera una solución suficiente. Además, ¿qué pasaría con las imágenes que no pertenecieran a ninguna de las categorías? La categoría «segura» podría ser enorme. La cantidad de datos que necesitaríamos para entrenar a los modelos en todas las cosas que son realmente seguras habría sido enorme. No solo eso, sino que estaríamos incurriendo en un desequilibrio de clases y en los problemas que esto puede conllevar. Por ejemplo, el modelo puede inclinarse hacia la clase mayoritaria, lo que llevaría a un desempeño deficiente en la clase minoritaria.
Para resolver el problema de las etiquetas múltiples, consideramos los modelos de etiquetas múltiples, pero el problema con la cantidad de ejemplos necesarios para un contenido «seguro» aún persistía.
Por ello, decidimos abordar el problema desde una nueva perspectiva. En lugar de crear un modelo para clasificarlos todos (lo siento, es una broma fácil), creamos un conjunto de modelos de clasificación de una clase, uno para cada una de las clases que queremos detectar. La clasificación de una clase, también conocida como detección de anomalías, es una técnica en la que el modelo aprende a identificar una clase específica de datos a partir de un conjunto de datos predominantemente normal. Los codificadores automáticos, un tipo de arquitectura de redes neuronales, son particularmente adecuados para esta tarea.
Los codificadores automáticos son un tipo de red neuronal artificial que se utiliza en el aprendizaje automático no supervisado. Están diseñados principalmente para la reducción de la dimensionalidad, el aprendizaje de funciones y la compresión de datos. Los codificadores automáticos tienen aplicaciones en una variedad de dominios, incluido el procesamiento de imágenes y señales, la detección de anomalías e incluso el procesamiento del lenguaje natural.
Un autocodificador consta de dos partes principales: un codificador y un decodificador. Así es como funcionan:
Codificador: El codificador toma una entrada (que puede ser una imagen, una secuencia de datos o cualquier otra forma de datos estructurados) y la asigna a una representación de dimensiones inferiores, a menudo denominada «espacio latente» o «codificación». Este proceso implica una serie de transformaciones y capas que capturan las características o patrones esenciales de los datos de entrada. El objetivo del codificador es reducir la dimensionalidad y, al mismo tiempo, preservar la información más importante.
Espacio latente: El espacio latente es una representación comprimida de los datos de entrada y, por lo general, tiene una dimensión inferior a la de los datos originales. Constituye un obstáculo en la arquitectura del codificador automático, ya que obliga al modelo a capturar las características más importantes de forma compacta.
Decodificador: El decodificador toma la representación del espacio latente y reconstruye los datos de entrada a partir de ella. Consiste en capas que realizan la operación inversa del codificador, intentando generar una salida que se parezca mucho a la entrada original. La calidad de la reconstrucción es una medida de lo bien que el codificador automático ha aprendido a capturar las características esenciales de los datos.
Los codificadores automáticos se entrenan mediante una pérdida de reconstrucción, que mide la diferencia entre la entrada y la salida. El objetivo durante el entrenamiento es minimizar esta pérdida, enseñando de manera efectiva al codificador automático a reproducir los datos de entrada con la mayor precisión posible. En el caso de la clasificación de una clase, si la pérdida de reconstrucción es alta para una entrada en particular, esto sugiere que la entrada no se ajusta bien a los patrones aprendidos, lo que indica que la imagen no pertenece a la clase en la que se entrenó el modelo. Pongamos un ejemplo: imaginemos que entrenamos dos codificadores automáticos, uno para detectar armas y otro para detectar drogas. Luego podemos enviar una imagen arbitraria a cada codificador automático y considerar el error de reconstrucción de ambos. Si descubrimos que el codificador automático de fármacos tiene un error de reconstrucción bajo, es probable que la imagen esté relacionada con fármacos.
Es difícil encontrar conjuntos de datos de código abierto sobre muchos de estos temas, especialmente debido a su sensibilidad. Por eso era crucial crear nuestros propios conjuntos de datos. Creamos ocho conjuntos de datos diferentes: crimen, armas, escenas militares, terrorismo, contenido explícito, contenido sexy, imágenes sobre fumadores e imágenes sobre bebidas alcohólicas; cada uno de ellos tenía entre 200 y 500 imágenes. Para ello, utilizamos imágenes de uso comercial permitidas de diversas fuentes, como Flickr, Google y Wikimedia. Nuestro equipo las revisó manualmente para asegurarnos de que las imágenes originales representaban bien lo que podía tener un vídeo poco seguro para una marca. Por ejemplo, la imagen de un soldado posando en uniforme está relacionada con temas militares, pero no es lo que la norma GARM denomina contenido inseguro. Un comentario personal: etiquetar los datos es una tarea que es mejor hacer en equipo y en pequeñas dosis y, si es posible, viendo vídeos de adorables cachorros mientras están juntos.
Colocaremos todas nuestras imágenes en una carpeta, definida aquí como carpeta de imágenes. También definiremos la altura y el ancho de la imagen, que son necesarios para los modelos con codificadores automáticos. Es importante usar un tamaño de imagen que mantenga la calidad de la imagen sin que sea demasiado grande, ya que las imágenes grandes crearán modelos más grandes, ¡y requerirán más memoria para funcionar! En nuestro caso, 256 × 256 píxeles es una forma razonable.
Ahora crearemos una función para entrenar nuestro codificador automático.
En este caso, optamos por utilizar capas densas, pero hay diferentes capas disponibles: entre otras, Conv2D, MaxPooling2D y UpSampling2D. La arquitectura elegida fue una combinación de estudio y experimentación: determinar qué arquitectura producía los mejores resultados y, al mismo tiempo, mantener la complejidad del modelo razonablemente baja. El tamaño óptimo de los lotes y las épocas eran una combinación de alta precisión y tamaño total del modelo. Queríamos buenos modelos, pero que pudieran funcionar en ordenadores con 256 GB de memoria.
Con esa función definida, entrenamos el modelo:
Ahora viene la parte divertida. ¡Usaremos la siguiente función para clasificar nuestras imágenes!
Y ahora, a la hora de la verdad, lo probamos con nuestros datos:
Si prestas atención, verás un «umbral» mencionado en el código anterior, de forma muy casual. ¿Qué es eso? ¿Recuerdas que hace algunas secciones hablamos sobre cómo se pueden usar los codificadores automáticos para la clasificación de una clase? Le pedimos al modelo que codifique una imagen y, a continuación, mida el error de reconstrucción. En este caso, utilizaremos el error cuadrático medio (MSE), la media de los cuadrados de los errores entre la imagen real y la imagen predicha. Si el error es grande, significa que la imagen no pertenece al conjunto de imágenes que utilizamos para el entrenamiento porque el modelo no pudo recrearla con precisión. Este es el concepto que utilizaremos para clasificar nuestras imágenes. Sin embargo, ¿qué es un «gran error»? Esto es algo que tendremos que investigar: establecer un umbral que sea coherente con tus datos. Un error lo suficientemente bajo como para mantener altos los verdaderos positivos y verdaderos negativos, y los falsos positivos y falsos negativos bajos. Por supuesto, esto también dependerá del caso de uso empresarial y de la sensibilidad a los errores de tipo I y tipo II.
Esta es la distribución de los MSE de las imágenes que pertenecían a la clase:
Y esta es la distribución de los MSE para las imágenes que no pertenecían a la clase:
Como podemos ver, la elección del umbral es tanto una ciencia como un arte: elegir un umbral más bajo nos hará marcar muchas imágenes que pertenecen a la clase como no pertenecientes y correremos el riesgo de no captar contenido inseguro para la marca. Por otro lado, si elegimos un umbral más alto, marcaremos más inventario del estrictamente necesario. En este caso, un umbral de 0,05 era una buena elección, ya que capturaba la mayoría de las imágenes que pertenecían a la clase y clasificaba mal muy pocas imágenes que no pertenecían.
Un ejercicio interesante es analizar las imágenes que se clasificaron erróneamente. En este caso, dado que muchas de las imágenes del entrenamiento tenían un fondo desértico debido a las campañas militares en Oriente Medio, las imágenes del desierto se clasificaron como de contenido militar. Para mejorar esto, mejoré mis datos de entrenamiento para capturar imágenes de otros contextos, como la guerra de Vietnam.
La seguridad de la marca en la publicidad exige una atención meticulosa al contexto en el que se muestran los anuncios. Nuestro desafío consistía en identificar cómo detectar el posible contexto de colocación de anuncios de una manera rentable.
Podemos solucionar este problema empleando codificadores automáticos de Keras para la clasificación de fotogramas de vídeo en una sola clase. Este enfoque reduce considerablemente los requisitos de etiquetado de datos, ya que los modelos con etiquetas múltiples y clases múltiples requerirían una amplia variedad de datos «seguros para la marca».
Entrenar a un codificador automático en contenido seguro para la marca y establecer un umbral para los errores de reconstrucción nos permite identificar con precisión las ubicaciones que se ajustan a los valores de la marca.
Esta solución ofrece un potencial significativo para racionalizar los esfuerzos de seguridad de la marca en la publicidad, garantizando que los anuncios se presenten de acuerdo con la identidad y la misión de la marca.