Ingeniería rápida
El modelo GroundingDino codifica indicaciones de texto en un espacio latente aprendido. La modificación de las indicaciones puede dar lugar a diferentes características del texto, lo que puede afectar el rendimiento del detector. Para mejorar el rendimiento de la predicción, es recomendable experimentar con varias indicaciones y elegir la que ofrezca los mejores resultados. Es importante tener en cuenta que mientras escribía este artículo tuve que probar varias sugerencias antes de encontrar la ideal, y a veces encontré resultados inesperados.
Empezando
Para empezar, clonaremos el Repositorio GroundingDino desde GitHub, configure el entorno instalando las dependencias necesarias y descargue los pesos del modelo previamente entrenado.
# Clone:
!git clone https://github.com/IDEA-Research/GroundingDINO.git# Install
%cd GroundingDINO/
!pip install -r requirements.txt
!pip install -q -e .
# Get weights
!wget -q https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth
Inferencia sobre una imagen
Comenzaremos nuestra exploración del algoritmo de detección de objetos aplicándolo a una sola imagen de tomates. Nuestro objetivo inicial es detectar todos los tomates en la imagen, por lo que usaremos el mensaje de texto. tomato. Si desea utilizar diferentes nombres de categorías, puede separarlos con un punto .. Tenga en cuenta que los colores de los cuadros delimitadores son aleatorios y no tienen ningún significado particular.
python3 demo/inference_on_a_image.py \
--config_file 'groundingdino/config/GroundingDINO_SwinT_OGC.py' \
--checkpoint_path 'groundingdino_swint_ogc.pth' \
--image_path 'tomatoes_dataset/tomatoes1.jpg' \
--text_prompt 'tomato' \
--box_threshold 0.35 \
--text_threshold 0.01 \
--output_dir 'outputs'
GroundingDino no sólo detecta objetos como categorías, como el tomate, sino que también comprende el texto de entrada, una tarea conocida como comprensión de expresiones de referencia (REC). Cambiemos el mensaje de texto de tomato a ripened tomatoy obtener el resultado:
python3 demo/inference_on_a_image.py \
--config_file 'groundingdino/config/GroundingDINO_SwinT_OGC.py' \
--checkpoint_path 'groundingdino_swint_ogc.pth' \
--image_path 'tomatoes_dataset/tomatoes1.jpg' \
--text_prompt 'ripened tomato' \
--box_threshold 0.35 \
--text_threshold 0.01 \
--output_dir 'outputs'
Sorprendentemente, el modelo puede “comprender” el texto y diferenciar entre un “tomate” y un “tomate maduro”. Incluso etiqueta tomates parcialmente maduros que no están completamente rojos. Si nuestra tarea requiere etiquetar sólo tomates rojos completamente maduros, podemos ajustar el box_threshold del valor predeterminado de 0,35 a 0,5.
python3 demo/inference_on_a_image.py \
--config_file 'groundingdino/config/GroundingDINO_SwinT_OGC.py' \
--checkpoint_path 'groundingdino_swint_ogc.pth' \
--image_path 'tomatoes_dataset/tomatoes1.jpg' \
--text_prompt 'ripened tomato' \
--box_threshold 0.5 \
--text_threshold 0.01 \
--output_dir 'outputs'
box_threshold = 0.5. Imagen por Markus Spiske.Generación de conjunto de datos etiquetados
Aunque GroundingDino tiene capacidades notables, es un modelo grande y lento. Si se necesita detección de objetos en tiempo real, considere utilizar un modelo más rápido como YOLO. Entrenar YOLO y modelos similares requiere una gran cantidad de datos etiquetados, cuya producción puede resultar costosa y llevar mucho tiempo. Sin embargo, si sus datos no son únicos, puede usar GroundingDino para etiquetarlos. Para obtener más información sobre la formación YOLO eficiente, consulte mi artículo anterior. [4].
El repositorio GroundingDino incluye un script para anotar conjuntos de datos de imágenes en el formato cocoque es adecuado para YOLOx, por ejemplo.
from demo.create_coco_dataset import mainmain(image_directory= 'tomatoes_dataset',
text_prompt= 'tomato',
box_threshold= 0.35,
text_threshold = 0.01,
export_dataset = True,
view_dataset = False,
export_annotated_images = True,
weights_path = 'groundingdino_swint_ogc.pth',
config_path = 'groundingdino/config/GroundingDINO_SwinT_OGC.py',
subsample = None
)
- export_dataset: si se establece en Verdadero, las anotaciones en formato COCO se guardarán en un directorio llamado ‘coco_dataset’.
- view_dataset: si se establece en Verdadero, el conjunto de datos anotado se mostrará para su visualización en la aplicación FiftyOne.
- export_annotated_images: si se establece en Verdadero, las imágenes anotadas se almacenarán en un directorio llamado ‘images_with_bounding_boxes’.
- submuestra (int): si se especifica, solo se anotará esta cantidad de imágenes del conjunto de datos.
Los diferentes algoritmos de YOLO requieren diferentes formatos de anotación. Si planeas entrenar YOLOv5 o YOLOv8, necesitarás exportar tu conjunto de datos en el Formato YOLOv5. Aunque el tipo de exportación está codificado en el script principal, puede cambiarlo fácilmente ajustando el dataset_type argumento en create_coco_dataset.mainde fo.types.COCODetectionDataset a fo.types.YOLOv5Dataset(línea 72). Para mantener todo organizado, también cambiaremos el nombre del directorio de salida de ‘coco_dataset’ a ‘yolov5_dataset’. Después de cambiar el script, ejecute create_coco_dataset.main de nuevo.
if export_dataset:
dataset.export(
'yolov5_dataset',
dataset_type=fo.types.YOLOv5Dataset
)
GroundingDino ofrece un salto significativo en las anotaciones de detección de objetos mediante el uso de mensajes de texto. En este tutorial, exploramos cómo utilizar el modelo para el etiquetado automatizado de una imagen o de un conjunto de datos completo. Sin embargo, es fundamental revisar y verificar manualmente estas anotaciones antes de utilizarlas en el entrenamiento de modelos posteriores.
_________________________________________________________________
Para su comodidad, se incluye un cuaderno Jupyter fácil de usar que contiene el código completo:
¿Querer aprender más?
[3] Un canal abierto y completo para la detección y puesta a tierra unificada de objetos2023.
[4] La guía práctica para la Detección de Objetos con el algoritmo YOLOv5por la Dra. Lihi Gur Arie.