Segmente cualquier configuración del entorno y use la prueba

Hardware: RTX3070 i9-11900H memoria 16G

Tabla de contenido

1. Configuración del entorno

2. Utilice la prueba --predictor_example.ipynb

1. Operación de preparación del cuaderno jupyter

2. Máscaras de objetos a partir de indicaciones con SAM与Configuración del entorno

3.Configuración

4.Imagen de ejemplo

5.Seleccionar objetos con SAM

6. Especificar un objeto específico con puntos adicionales

7. Especificar un objeto específico con un cuadro

 8.Combinando puntos y cajas

 9. Entradas rápidas por lotes

10. Inferencia por lotes de extremo a extremo

3. Use la prueba --automatic_mask_generator_example.ipynb

1. Configuración del entorno

2.Configuración

3.Imagen de ejemplo

4. Generación automática de máscaras

 5.Opciones de generación automática de máscaras


1. Configuración del entorno

Primero descárguelo del github oficial y descomprímalo en un directorio, la URL oficial de github:

GitHub - facebookresearch/segment-anything https://github.com/facebookresearch/segment-anything La siguiente configuración de entorno:

1. Conda crea un entorno virtual. Tenga en cuenta que la versión de python es mayor o igual a 3.8 (el requisito oficial es python>=3.8).

conda create -n segment python=3.8 -y

2. Active el entorno virtual que acaba de crear, instale pytorch y preste atención a los requisitos oficialespytorch>=1.7torchvision>=0.8。

conda activate segment
pip install torch==1.10.1+cu113 torchvision==0.11.2+cu113 torchaudio==0.10.1+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html

3. Este artículo realiza la depuración en el IDE de pycharm, abre pycharm en el directorio de descompresión y configura el entorno recién configurado, y realiza la configuración del entorno posterior.

pycharm llama al entorno virtual conda

Ingresar a la terminal de pycharm terminal para su posterior instalación

pip install -e .

El funcionario no dio una versión detallada de la biblioteca de instalación, siga las instrucciones dadas por el funcionario para ejecutar 

pip install opencv-python pycocotools matplotlib onnxruntime onnx

En este punto, se completa la configuración del entorno y el problema de seguimiento es completar la biblioteca que falta en el entorno o ajustar la versión de la biblioteca a través del informe de errores del programa.

2. Utilice la prueba --predictor_example.ipynb

1. Operación de preparación del cuaderno jupyter

El proceso de prueba oficial lo da jupyter notebook Primero, inicie la terminal e ingrese al entorno virtual.

conda activate segment

Ingrese al directorio del cuaderno jupyter oficial y ajuste xxx de acuerdo con el directorio real por cd

cd xxx:\xxx\segment-anything-main\segment-anything-main\notebooks

Nota: hay muchas formas de llamar al entorno virtual en jupyter notebook en Internet. Creo que es mejor instalar la biblioteca en el entorno virtual. Si la instalación es incorrecta, puede eliminar directamente el entorno virtual, dejando una tolerancia a fallas. tasa y manteniendo el entorno base de conda simple. Intente no instalar bibliotecas redundantes en el entorno de base de conda, y el entorno de base de conda solo se utiliza como entorno de base para crear entornos virtuales.

Instale ipykernel en el entorno virtual. Si no está instalado, jupyter notebook no puede reconocer el entorno virtual recién creado, incluso si la terminal ha iniciado el entorno virtual.

pip install ipykernel

 Escriba el entorno virtual recién creado en el cuaderno jupyter

plantilla:

python -m ipykernel install --user --name 虚拟环境名 --display-name "显示名"

Operación real:

python -m ipykernel install --user --name segment --display-name "segment"

 Inicie jupyter notebook, no cierre la terminal después del inicio

jupyter notebook

En esta figura, se puede encontrar el entorno virtual del segmento, lo que indica que la configuración del entorno de reconocimiento de jupyter notebook es correcta, pero es necesario configurar el entorno virtual.

 El nombre del entorno virtual se puede ver en el lado derecho de la figura.

El cuaderno oficial de jupyter da más detalles, el primero es predictor_example

A continuación, siga el título para ver el ejemplo oficial.

2. Máscaras de objetos a partir de indicaciones con SAM与Configuración del entorno

En cuanto a las operaciones que se ejecutan en Google colab, estas operaciones no son necesarias porque se ejecutan localmente.

3.Configuración

Llame a la biblioteca y defina funciones de trazado para máscaras, puntos y rectángulos.

4.Imagen de ejemplo

Como imagen de ejemplo, léala y muéstrela a través de Opencv

5.Seleccionar objetos con SAM

Para la prueba de detección, dividida en varios pasos

(1) Descargue el modelo de red entrenado, colóquelo en la carpeta del modelo del proyecto y modifique la ruta en el programa

GitHub: facebookresearch/segment-anything: el repositorio proporciona código para ejecutar inferencias con SegmentAnything Model (SAM), enlaces para descargar los puntos de control del modelo entrenado y cuadernos de ejemplo que muestran cómo usar el modelo. https://github.com/facebookresearch/segment-anything#model-checkpoints

 Modifique la ruta y agregue caracteres de escape, no es necesario modificar el tipo de modelo para usar el modelo grande H.

sam_checkpoint = "D:\\segment-anything-main\\segment-anything-main\\model\\sam_vit_h_4b8939.pth"
model_type = "vit_h"

(2)官方:Primero, cargue el modelo SAM y el predictor. Cambie la ruta a continuación para que apunte al punto de control SAM. Se recomienda ejecutar CUDA y usar el modelo predeterminado para obtener mejores resultados。

Traducción: Primero, cargue el modelo SAM y los predictores. Cambie la ruta a continuación para que apunte al punto de control SAM. Se recomienda ejecutar en CUDA y utilizar el modelo predeterminado para obtener mejores resultados.

El paso (1) se ha realizado.

(3)官方:Procese la imagen para producir una incrustación de imagen llamando a  SamPredictor.set_imageSamPredictor recuerda esta incrustación y la usará para la predicción de máscara posterior.

Traducción: procese imágenes para generar incrustaciones de imágenes llamando a SamPredictor.set_image. SamPredictor recuerda esta incrustación y la usa para predicciones de máscara posteriores.

La imagen presentada en el paso Imagen de ejemplo llama a la clase SamPredictor en segment_anything/predictor.py

La función set_image para recibir la imagen leída por opencv.

(4)官方:Para seleccionar el camión, elija un punto en él. Los puntos se ingresan al modelo en formato (x,y) y vienen con las etiquetas 1 (punto de primer plano) o 0 (punto de fondo). Se pueden ingresar múltiples puntos; aquí usamos solo uno. El punto elegido se mostrará como una estrella en la imagen.

Traducción: Para seleccionar un camión, seleccione un punto en él. Los puntos se introducen en el modelo en formato (x,y), con etiquetas 1 (puntos de primer plano) o 0 (puntos de fondo). Se pueden ingresar múltiples puntos, aquí solo usamos uno. Los puntos seleccionados aparecerán como estrellas en la imagen.

A partir de esta oración, podemos saber que se debe dar un punto de aviso. El punto de aviso usa las coordenadas en el sistema de coordenadas de la imagen, donde la esquina superior izquierda es el punto cero, y si este punto es el primer plano o el fondo. Lo que se da en el programa es:

input_point = np.array([[500, 375]])
input_label = np.array([1])

El programa también muestra los resultados, añadiendo puntos a la imagen original, y la función de dibujo se da en el paso de Configuración:

plt.imshow(image)
show_points(input_point, input_label, plt.gca())

(5)官方:Predecir con  SamPredictor.predict. El modelo devuelve máscaras, predicciones de calidad para esas máscaras y logits de máscara de baja resolución que se pueden pasar a la siguiente iteración de predicción.

Traducción: Usa SamPredictor.predictor para hacer predicciones. El modelo devuelve máscaras, predicciones de calidad para esas máscaras y un registro de máscaras de baja resolución que se puede pasar a la siguiente iteración de predicción.

Entra en la sección de predicción:

masks, scores, logits = predictor.predict(
    point_coords=input_point,
    point_labels=input_label,
    multimask_output=True,
)

La imagen pronosticada se colocó en el predictor a través de predictor.set_image(image), y luego se colocó en el punto de referencia y la etiqueta del punto a través de predictor.predict().

其中multimask_output官方给出解释:Con  multimask_output=True (la configuración predeterminada), SAM genera 3 máscaras, donde  scores proporciona la estimación propia del modelo de la calidad de estas máscaras. Esta configuración está pensada para solicitudes de entrada ambiguas y ayuda al modelo a eliminar la ambigüedad de diferentes objetos consistentes con la solicitud. Cuando  False, devolverá una sola máscara. Para solicitudes ambiguas, como un solo punto, se recomienda usar  multimask_output=True incluso si solo se desea una sola máscara; la mejor máscara individual se puede elegir eligiendo la que tenga la puntuación más alta devuelta en  scores. Esto a menudo resultará en una mejor máscara.

Traducción: con multimask_output=True (configuración predeterminada), el SAM genera 3 máscaras, donde la puntuación proporciona la estimación del propio modelo de la calidad de estas máscaras. Esta configuración funciona bien para solicitudes de entrada ambiguas y ayuda al modelo a eliminar la ambigüedad de diferentes objetos consistentes con la solicitud. Cuando es False, devuelve una máscara. Para señales ambiguas, como puntos únicos, se recomienda utilizar multimask_output=True incluso si solo se requiere una única máscara; se puede elegir la mejor máscara única eligiendo la que tenga la puntuación más alta. Esto generalmente produce una mejor máscara.

masks.shape  # (number_of_masks) x H x W
(3, 1200, 1800)

La máscara de salida, 3 máscaras con una altura de 1200 y un ancho de 1800, para poder usar estas máscaras, el oficial da:

for i, (mask, score) in enumerate(zip(masks, scores)):
    plt.figure(figsize=(10,10))
    plt.imshow(image)
    show_mask(mask, plt.gca())
    show_points(input_point, input_label, plt.gca())
    plt.title(f"Mask {i+1}, Score: {score:.3f}", fontsize=18)
    plt.axis('on')
    plt.show()  

¿Cómo realizar la visualización de la máscara? Consulte mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1) en la función show_mask() Específicamente, la función remodelar en el código convierte la matriz de máscaras en una forma de ( Una matriz tridimensional de h, w, 1), donde la tercera dimensión tiene tamaño 1, que representa el valor de la máscara. Luego, convierta la matriz de colores en una matriz tridimensional con forma (1, 1, N), en la que el tamaño de las dos primeras dimensiones es 1 y el tamaño de la tercera dimensión es N, lo que representa el valor del color. Finalmente, las dos matrices tridimensionales se multiplican elemento por elemento para obtener una matriz tridimensional mask_image con forma (h, w, N), donde el elemento en la fila i y la columna j representan el color del píxel en la fila i y el valor de la columna j, si el valor de la máscara correspondiente es N, entonces el N del píxel. Esta operación se usa a menudo para aplicar una máscara a una imagen para lograr un efecto de máscara en la imagen.

 Resultados originales oficiales:

Intento 1: al comprender la visualización de la máscara, la modifiqué para lograr la binarización:

Cambie show_mask a show_mask1, muestre la función de máscara para modificar el color y cambie la transparencia de todo el blanco a 1

def show_mask1(mask, ax, random_color=False):
    if random_color:
        color = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)
    else:
#         color = np.array([30/255, 144/255, 255/255, 0.6])
        color = np.array([255/255, 255/255, 255/255, 1])
    h, w = mask.shape[-2:]
    mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)
    ax.imshow(mask_image)

El fondo se establece en negro.

for i, (mask, score) in enumerate(zip(masks, scores)):
    plt.figure(figsize=(10,10))
    image1 = np.zeros((1200, 1800), dtype=np.int8)
    plt.imshow(image1,cmap="gray")
    show_mask1(mask, plt.gca())
    show_points(input_point, input_label, plt.gca())
    plt.title(f"Mask {i+1}, Score: {score:.3f}", fontsize=18)
    plt.axis('on')
    plt.show()  

Resultado de la binarización. 

Intento 2: Devuelve la máscara de puntuación máxima según el resultado oficial:

plt.figure(figsize=(10,10))
plt.imshow(image)
show_mask(masks[np.argmax(scores)], plt.gca())
show_points(input_point, input_label, plt.gca())
plt.title(f"Best Mask Score: {scores[np.argmax(scores)]:.3f}", fontsize=18)
plt.axis('on')
plt.show()  

 

6. Especificar un objeto específico con puntos adicionales

especificar un objeto específico con un punto adjunto

官方: El único punto de entrada es ambiguo y el modelo ha devuelto varios objetos coherentes con él. Para obtener un solo objeto, se pueden proporcionar varios puntos. Si está disponible, también se puede proporcionar al modelo una máscara de una iteración anterior para ayudar en la predicción. Cuando se especifica un solo objeto con varias indicaciones, se puede solicitar una sola máscara configurando `multimask_output=False`.

Traducción: un único punto de entrada era ambiguo y el modelo devolvía varios objetos coherentes con él. Para obtener un solo objeto, se pueden proporcionar varios puntos. Si están disponibles, las máscaras de iteraciones anteriores también se pueden alimentar al modelo para ayudar en la predicción. Al especificar un solo objeto con múltiples sugerencias, se puede solicitar una sola máscara configurando "multimask_output=False".

El oficial ha dado dos métodos, uno es que las etiquetas de dos puntos son todos de primer plano 1, y el otro es que un punto está etiquetado como primer plano 1 y un punto como fondo 0. Aquí, la etiqueta del punto de aviso tiene significado.

Todo en primer plano 1

 Una es que la etiqueta de un punto es el primer plano 1 y la etiqueta de un punto es el fondo 0

7. Especificar un objeto específico con un cuadro

Use cuadros para especificar objetos específicos

Este artículo prueba la expresión de la caja rectangular.

input_box = np.array([425, 600, 700, 875])

Los cuatro valores representan las coordenadas (x, y) de la esquina superior izquierda y la esquina inferior derecha del marco rectangular. Llame a la función show_points() para mostrar los puntos, lo cual se prueba intuitivamente.

plt.figure(figsize=(10, 10))
plt.imshow(image)
show_mask(masks[0], plt.gca())
show_box(input_box, plt.gca())
input_point1 = np.array([[425, 600]])
input_label1 = np.array([1])
input_point2 = np.array([[700, 875]])
input_label2 = np.array([1])
show_points(input_point1, input_label2, plt.gca())
show_points(input_point2, input_label2, plt.gca())
plt.axis('on')
plt.show()

 8.Combinando puntos y cajas

Combinando puntos y cajas.

Agregue puntos de aviso sobre la base del cuadro rectangular de aviso y agregue oficialmente un punto de aviso etiquetado como fondo 0 en el cubo de la rueda del automóvil.

input_box = np.array([425, 600, 700, 875])
input_point = np.array([[575, 750]])
input_label = np.array([0])

 Lo modifiqué a primer plano 1, para probar

input_box = np.array([425, 600, 700, 875])
input_point = np.array([[575, 750]])
input_label = np.array([1])

 9. Entradas rápidas por lotes

Solicitud de entrada por lotes

官方:SamPredictor puede tomar varias solicitudes de entrada para la misma imagen, usando  predict_torch el método. Este método asume que los puntos de entrada ya son tensores de antorcha y ya se han transformado en el marco de entrada. Por ejemplo, imagina que tenemos varias salidas de caja de un detector de objetos.

Traducción: SamPredictor puede usar el método predict_torch para obtener múltiples sugerencias de entrada para la misma imagen. Este método asume que los puntos de entrada ya son tensores y se han convertido en marcos de entrada. Por ejemplo, supongamos que tenemos varias salidas de caja de un detector de objetos.

input_boxes = torch.tensor([
    [75, 275, 1725, 850],
    [425, 600, 700, 875],
    [1375, 550, 1650, 800],
    [1240, 675, 1400, 750],
], device=predictor.device)

官方:Transforme los cuadros en el cuadro de entrada y luego prediga las máscaras. SamPredictor almacena la transformación necesaria como el  transform campo para facilitar el acceso, aunque también se puede crear una instancia directamente para su uso, por ejemplo, en un cargador de datos (ver  segment_anything.utils.transforms).

Traducción: convierta cuadros en marcos de entrada y luego prediga máscaras. SamPredictor almacena las transformaciones necesarias como campos de transformación para facilitar el acceso, aunque también se puede crear una instancia directamente para usar, por ejemplo, en cargadores de datos (ver segment_anything.utils.transforms).

Múltiples rectángulos deben convertirse primero

transformed_boxes = predictor.transform.apply_boxes_torch(input_boxes, image.shape[:2])

Use un bucle for para mostrar todas las máscaras y rectángulos

for mask in masks:
    show_mask(mask.cpu().numpy(), plt.gca(), random_color=True)
for box in input_boxes:
    show_box(box.cpu().numpy(), plt.gca())

 Intenté agregarle los puntos de referencia del paso anterior.

transformed_boxes = predictor.transform.apply_boxes_torch(input_boxes, image.shape[:2])
masks, _, _ = predictor.predict_torch(
    point_coords=input_point,
    point_labels=input_label,
    boxes=transformed_boxes,
    multimask_output=False,
)

Ocurrió un error, esto no está permitido.

10. Inferencia por lotes de extremo a extremo

Inferencia por lotes de extremo a extremo

官方:Si todas las indicaciones están disponibles de antemano, es posible ejecutar SAM directamente de un extremo a otro. Esto también permite el procesamiento por lotes de imágenes.

Traducción: si todas las sugerencias están disponibles con anticipación, es posible ejecutar SAM directamente de un extremo a otro. Esto también permite el procesamiento por lotes de imágenes.

Esta parte de la prueba en este artículo explota directamente la memoria de video, ¡y la memoria de video 8G no es suficiente! Las aplicaciones simples no requieren procesamiento por lotes. Trate de usar una sola imagen para el procesamiento.

3. Use la prueba --automatic_mask_generator_example.ipynb

Generación automática de máscaras de objetos con SAM Use SAM para generar automáticamente máscaras de objetos

oficial:

Dado que SAM puede procesar solicitudes de manera eficiente, se pueden generar máscaras para toda la imagen muestreando una gran cantidad de solicitudes sobre una imagen. Este método se utilizó para generar el conjunto de datos SA-1B.

La clase SamAutomaticMaskGenerator implementa esta capacidad. Funciona mediante el muestreo de indicaciones de entrada de un solo punto en una cuadrícula sobre la imagen, de cada una de las cuales SAM puede predecir varias máscaras. Luego, las máscaras se filtran por calidad y se deduplican mediante supresión no máxima. Las opciones adicionales permiten mejorar aún más la calidad y la cantidad de máscaras, como ejecutar la predicción en múltiples recortes de la imagen o máscaras de posprocesamiento para eliminar pequeñas regiones desconectadas y agujeros.

traducir:

Dado que los SAM pueden manejar señales de manera eficiente, se puede generar una máscara para toda la imagen muestreando una gran cantidad de señales en la imagen. Este método se utilizó para generar el conjunto de datos SA-1B. La clase SamAutomaticMaskGenerator implementa esta funcionalidad. Funciona mediante el muestreo de señales de entrada de un solo punto en una cuadrícula sobre la imagen, a partir de la cual el SAM puede predecir múltiples máscaras. A continuación, la máscara se filtra por calidad y se elimina la duplicación utilizando una supresión no máxima. Las opciones adicionales permiten un mayor refinamiento de la calidad y la cantidad de la máscara, como ejecutar predicciones en múltiples recortes de la imagen o el posprocesamiento de la máscara para eliminar pequeñas regiones y agujeros desconectados.

Se puede ver en la traducción que el método utilizado para generar el conjunto de datos SA-1B logra la función de generar una gran cantidad de conjuntos de datos, que también se explica en el documento.

O a través de la forma del título para probar

1. Configuración del entorno

Esta es una operación en Google Colab y este paso no es necesario para esta prueba de máquina de texto.

2.Configuración

Se importan algunas bibliotecas necesarias y se da la función de dibujar varias máscaras al mismo tiempo. Es diferente de la configuración anterior. Solía ​​​​dibujar puntos, dibujar rectángulos y dibujar una sola función de máscara. A partir de aquí, es funciones diferentes a las anteriores.

def show_anns(anns):
    if len(anns) == 0:
        return
    sorted_anns = sorted(anns, key=(lambda x: x['area']), reverse=True)
    ax = plt.gca()
    ax.set_autoscale_on(False)

    img = np.ones((sorted_anns[0]['segmentation'].shape[0], sorted_anns[0]['segmentation'].shape[1], 4))
    img[:,:,3] = 0
    for ann in sorted_anns:
        m = ann['segmentation']
        color_mask = np.concatenate([np.random.random(3), [0.35]])
        img[m] = color_mask
    ax.imshow(img)

3.Imagen de ejemplo

Importar imágenes, igual que antes, a través de opencv para importar

4. Generación automática de máscaras

Genere automáticamente una máscara, que es un diccionario que contiene las siguientes claves

['segmentation', 'area', 'bbox', 'predicted_iou', 'point_coords', 'stability_score', 'crop_box']
  • segmentation : la máscara
  • area : el área de la máscara en píxeles
  • bbox : el cuadro de límite de la máscara en formato XYWH
  • predicted_iou : predicción del propio modelo para la calidad de la máscara
  • point_coords : el punto de entrada muestreado que generó esta máscara
  • stability_score : una medida adicional de la calidad de la máscara
  • crop_box : el recorte de la imagen utilizada para generar esta máscara en formato XYWH

Importe la función de dibujar rectángulos y puntos antes, y dibuje el rectángulo de predicción

 5.Opciones de generación automática de máscaras

Opciones de generación automática de máscaras

官方:Hay varios parámetros ajustables en la generación automática de máscaras que controlan la densidad de muestreo de los puntos y cuáles son los umbrales para eliminar máscaras duplicadas o de baja calidad. Además, la generación se puede ejecutar automáticamente en los recortes de la imagen para obtener un rendimiento mejorado en objetos más pequeños, y el posprocesamiento puede eliminar los píxeles perdidos y los agujeros. Aquí hay una configuración de ejemplo que muestra más máscaras:

Traducción: hay varios parámetros ajustables en la generación automática de máscaras para controlar la densidad de los puntos de muestreo y el umbral para eliminar máscaras duplicadas o de baja calidad. Además, la generación puede ejecutarse automáticamente en los recortes de imágenes para mejorar el rendimiento de los objetos más pequeños, y el posprocesamiento puede eliminar los píxeles perdidos y los agujeros. Aquí hay una configuración de ejemplo para probar más máscaras:

Explique que se puede ajustar la generación automática de máscaras.

Supongo que te gusta

Origin blog.csdn.net/wzfafabga/article/details/131204143
Recomendado
Clasificación