IA en logística: optimización de la tasa de llenado de contenedores con visión por computadora

Aprovechar la IA para una logística más inteligente y una perspectiva basada en datos sobre la utilización de contenedores, maximizando la eficiencia y el retorno de la inversión (ROI)

Foto por Elevar en desempaquetar

Una de las ineficiencias más evidentes en logística es el problema del espacio vacío. Los contenedores de transporte, el alma del comercio mundial, a menudo viajan parcialmente llenos, desperdiciando espacio y recursos valiosos. Esta ineficiencia se traduce en un aumento de los costos operativos y daños a la sostenibilidad de las empresas y el medio ambiente.

Mayores costos de transporte
Los transportistas basan sus cargos en el tamaño del contenedor, no en la cantidad de carga que contiene. Esto significa que incluso un contenedor parcialmente lleno cuesta lo mismo que uno completamente lleno. Para ponerlo en perspectiva, AP Moller — Maersk, según informó estadista (2018-2023), experimentó un aumento significativo en las tarifas de flete durante la pandemia de Covid-19. Por lo tanto, enviar contenedores parcialmente llenos esencialmente se reduce a pagar por espacio vacío en lugar de por carga valiosa, lo que afecta el retorno de la inversión.

Aumento de la huella de carbono en toda la cadena de suministro
Dividir la misma carga que podría caber en un solo contenedor significa duplicar los medios de transporte.

Mayor daño a las mercancías de carga
Con más espacio, la carga no está tan apretada. Esto permite que cajas, paletas y mercancías se muevan más libremente durante el tránsito, particularmente debido a vibraciones y paradas repentinas.

Para ayudar a identificar esto en su raíz antes de sellar y enviar el contenedor, se analizador de tasa de llenado de contenedores que utiliza visión por computadora e inteligencia artificial (IA) para comprender la tasa de llenado de cada capa de paleta cargada en el contenedor. La tasa de llenado de un contenedor de envío es el porcentaje de espacio disponible ocupado por la carga.

Utilizando la visión por computadora con la ayuda de la IA, se podría eliminar la tarea manual de juzgar la tasa de llenado de cada imagen por parte de una persona y centrarse en resolver el problema real.

Código Github AI de tasa de llenado de contenedores

Portal

Acercarse

Hay muchos enfoques para este desafío. Se podría utilizar un Detector de disparo único (SSD) o Sólo miras una vez (YOLO) para detectar paletas y luego calcular la tasa de llenado a partir de ahí. Arcgic explica cómo funciona SSD en detalle en su página de documentación aquí.

Sin embargo, la idea era probar el Meta Segmentar cualquier modelo (SAM) para este caso de uso específico. En el blog de Meta AI aquí, Meta compartió un campo de juego de demostración y una descripción general de lo que SAM es capaz de hacer. Por supuesto, este método no es específico de un dominio en comparación con el entrenamiento de un modelo para esta tarea específica, pero los modelos generalizados han recorrido un largo camino y vale la pena probar la viabilidad de dicha tarea.

SAM es muy versátil y viene con 2 métodos de detección, uno es la generación automática de máscara, donde segmentará todo en una imagen, y el otro, basado en indicaciones, donde una coordenada en la imagen guía la segmentación. Meta compartió una publicación muy detallada sobre cómo se construyó SAM aquí.

Generación automática de máscaras SAM

# Initialize Segement Anything and pass in the image for auto mask generation
mask_generator = SamAutomaticMaskGenerator(sam)
masks = mask_generator.generate(input_layer_img)

Este método funciona muy bien y es fácil de configurar con solo 2 líneas de código Python, y todo quedará segmentado en la imagen sin instrucciones.

Objeto extraño segmentado (Imagen del autor)

Sin embargo, el desafío surge a la hora de decidir si el tamaño impar de los palés u objetos extraños forma parte de la capa. En la imagen superior, el airbag, algunos envoltorios de relleno y un cartón están segmentados, pareciendo un pallet.

Segmentación múltiple (Imagen del autor)

Ocasionalmente, debido a correas o envoltorios sueltos, eso se segmenta por separado como se muestra arriba.

Segmentación basada en indicaciones

La segmentación basada en indicaciones requiere sugerencias para guiar a SAM a saber dónde y cómo debe estar el área de enfoque. Al realizar pruebas con el método de generación automática de máscaras, el método de segmentación basado en indicaciones es más viable para este proyecto.

A continuación se muestra el pseudocódigo y el fragmento de código del flujo de ejecución del programa.

# Read the input image
input_layer_img: np.ndarray = cv2.imread(img_fp)

# Downscale image for performance
input_layer_img = downscale(input_layer_img)

# First, find all the labels in the image
# The label position can help prompt SAM to generate segments better
label_points: list[list[int, int]] = pallet_label_detector(input_layer_img)

# Send the labels position to SAM and get a segment mask
segmented_mask: np.ndarray = prompt_segment(label_points, input_layer_img)

# Draw on the original image with values from the mask
segment_color = np.random.random(3) * 100

segmented_img = input_layer_img.copy()
segmented_img[segmented_mask] = segment_color
mask = cv2.inRange(segmented_img, segment_color - 10, segment_color + 10)

# Based on the segmented image, find the fill rate
fill_rate: float = fill_rate_calculation(label_points, mask, segmented_img)

En este caso, las coordenadas de cada etiqueta del palet se pueden pasar a SAM para segmentar. La extracción de etiquetas se puede lograr mediante técnicas de visión por computadora, como la definición de la región de interés, el filtrado de color y el contorno. Este proceso es específico del dominio empresarial, pero en general, la mayoría de las etiquetas son casi blancas.

La forma más precisa de detectar etiquetas es escaneando el Código de contenedor de envío en serie (SSCC), sin embargo, la calidad de la imagen es insuficiente para detectar códigos de barras.

lower_val = np.array([150, 150, 150], dtype=np.uint8)
upper_val = np.array([255, 255, 255], dtype=np.uint8)

# preparing the mask to overlay
mask = cv2.inRange(layer_img, lower_val, upper_val)

# find contours
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]

new_mask = np.ones(img.shape[:2], dtype="uint8") * 255
prompt_points = []

for c in contours:
x, y, w, h = cv2.boundingRect(c)

# only select points in our region of interest
if is_outside_roi(layer_img, x, y):
continue

if w * h < 1000:
continue

cv2.rectangle(new_mask, (x, y), (x + w, y + h), (0, 0, 255), -1)

# We calculate the center of the label to be passed for prompting
prompt_points.append([int(x + (w / 2)), int(y + (h / 2))])

res_final = cv2.bitwise_and(layer_img, layer_img, mask=cv2.bitwise_not(new_mask))
cv2.imshow("Labels only", res_final)

Se aplica un filtro de color entre 150 y 255 a la imagen de entrada como se muestra en el código Python anterior, y las máscaras se extraen de la imagen de entrada.

Salida para res_final de etiquetas seleccionadas (Imagen del autor)

Al solicitar la posición de las etiquetas, SAM producirá un resultado más centrado en el dominio. A pesar de que las etiquetas extraídas no tienen un tamaño exacto, una estimación es suficiente para permitir que el mensaje segmente lo necesario.

# prompt_points contains the coordinates of the labels
# [ [x, y], [x, y]...]
input_point_nd = np.array(prompt_points, dtype=np.int32)

# As all the prompt points are labels, we are giving them a category of 1
input_label = np.ones(len(prompt_points), dtype=np.int32)

predictor.set_image(segment_img)
masks, scores, _ = predictor.predict(
point_coords=input_point_nd,
point_labels=input_label,
multimask_output=False,
)
Salida SAM de otra imagen (Imagen del autor)

La salida segmentada se muestra en la imagen de arriba. Se utilizó un método simple para calcular los límites del contenedor, ilustrado por el cuadro rojo. La imagen se convierte posteriormente a blanco y negro para el cálculo de la tasa de relleno.

Salida para fill_rate_used (Imagen del autor)
# Sum of white pixels
total_white = np.sum(fill_rate_used[tallest:ch, cx: cw] == 255)

# Sum of black pixels
total_black = np.sum(fill_rate_used[tallest:ch, cx: cw] == 0)

# Percentage of white
fill_rate = round(total_white / (total_white + total_black), 2)

La tasa de llenado estimada sería el espacio coloreado ocupado en comparación con el espacio desocupado, que son los píxeles negros en el límite del contenedor. Se pueden aplicar pocas operaciones morfológicas, como la dilatación, para rellenar los espacios entre cajas.

Resultados

Resultado de muestra (Imagen del autor)

Con los casos de prueba actuales basados ​​en un entorno personal, los resultados se acercan a la realidad. Esto reduce significativamente la carga de trabajo manual de analizar la tasa de llenado de cada contenedor y se dispone de un juicio más consistente sobre el porcentaje de la tasa de llenado. Se tienen en cuenta los palés con formas irregulares, ya que se detectará la etiqueta y se reducen las segmentaciones no deseadas debido a la indicación de las coordenadas de las etiquetas.

Con este resultado para cada capa cargada en un contenedor, las empresas ahora pueden analizar la causa de las cargas parciales y decidir si hay una brecha en el proceso operativo o de planificación. Desde el punto de vista operativo, la decisión de sellar un contenedor antes de su envío también podría utilizar el indicador de tasa de llenado como factor.

Al realizar un seguimiento de los resultados a lo largo del tiempo, se podría construir una tendencia visible para visualizar si hay alguna mejora en el proceso de carga.

Limitaciones

Capa de paletas

Detección por capas (Imagen del autor)

Una de las limitaciones sería que las paletas de atrás ocasionalmente se segmentan con las paletas de adelante si los colores coinciden demasiado. Esto provoca un cálculo falso de la tasa de llenado, ya que en realidad el compartimento se considera vacío. Para superar tales limitaciones, el uso de la segmentación basada en indicaciones puede no ser lo ideal, sino una combinación de generación automática de máscaras y detección de etiquetas.

Objeto extraño

Detección falsa de airbags (Imagen del autor)

Otro desafío viene con la segmentación de los airbags. En algunos casos, los airbags se camuflaban con los pallets, provocando que la segmentación quedara agrupada.

Detección de casilla más cercana (Imagen del autor)

Una opción para superar dicha limitación es dibujar un cuadro siempre que sea posible, eliminando segmentaciones de formas irregulares. Sin embargo, esto vuelve a plantear otro desafío para los palés de formas irregulares: pensemos en un palé de sillas no plegables.

Clausura

Con el uso de la visión por computadora, los equipos y compañeros de trabajo de una empresa pueden tomar decisiones basadas en datos sin la molestia de analizar manualmente imágenes individuales.

Hay muchas maneras de ampliar este proyecto. Algunos de ellos incluyen:

  • Carga de camiones e incluso furgonetas pequeñas (Entrega de última milla)
  • Estimación en tiempo real/Análisis de carga de fin de envío desde video
  • Traducir la tasa de llenado en valor monetario y metros cúbicos potenciales (m3) perdidos
  • Calcular la probabilidad de daños a las mercancías en función del umbral de tasa de cumplimiento

El mayor factor que contribuye a garantizar un buen resultado es tener una imagen o flujo de entrada consistente y estandarizado. Esto mejorará en gran medida la estimación de la altura del contenedor y la detección de la ubicación de los palés. La forma óptima sería detectar los códigos de barras SSCC y utilizar la posición del código de barras para provocar la segmentación; sin embargo, eso tendría el costo de cámaras más caras.

Cada uno es libre de adaptar el código del proyecto desde tasa de llenado de contenedores-ai Githubcon respecto a Licencia Meta SAM Apache. Este proyecto no es perfecto y siempre hay mucho margen de mejora.

Ampliar este proyecto a su propio caso de uso/negocio puede requerir comprender el código y ajustar los parámetros en el archivo Python. Más importante aún, el conocimiento del dominio del proceso de negocio es esencial antes de pasar al código. Esto le ayudaría a comprender cómo puede adaptar el código al negocio.

Para comprender más sobre este proyecto, no dude en comunicarse con:
Sitio web: https://jonathanlawhh.com/
Correo electrónico: jon_law98@hotmail.com


IA en logística: optimización de la tasa de llenado de contenedores con visión por computadora fue publicado originalmente en Hacia la ciencia de datos en Medium, donde las personas continúan la conversación resaltando y respondiendo a esta historia.