Skip to content

Pipeline

Output normalizado xywh
0   0.371875  0.34921875   0.48125     0.68984375 
0   0.671875  0.45078125   0.16171875  0.58203125 
0   0.903125  0.3703125    0.1765625   0.4296875

Primeiro digito é a classe e os restantes são as coordenadas x,y,w,h normalizadas.

Input do SAM como bounding box

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

#TODO

As coordenadas que o SAM recebe são do formato xyxy não normalizadas. Logo o seguinte código foi escrito para fazer a conversão das cordenadas do YOLOv9:

Conversão de coordenadas
# Normalized bounding box coordinates
x_center_norm = 0.44816
y_center_norm = 0.550328
width_norm = 0.896319
height_norm = 0.582786

# Image size
image_width = 1929
image_height = 1371

# Convert normalized coordinates to denormalized coordinates
x_min = (x_center_norm - width_norm / 2) * image_width
y_min = (y_center_norm - height_norm / 2) * image_height
x_max = (x_center_norm + width_norm / 2) * image_width
y_max = (y_center_norm + height_norm / 2) * image_height

# Print denormalized bounding box coordinates
print("x_min:", x_min)
print("y_min:", y_min)
print("x_max:", x_max)
print("y_max:", y_max)

Para termos o tamanho da imagem fazemos:

Tamanho da imagem
image = cv2.imread('images/truck.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 
h, w, c = image.shape
print('width:  ', w)
print('height: ', h)
print('channel:', c)

picture 0

Output do código

Imagem RBG -> Mascara preto e branc

Tem que se adaptar a função:

Conversão para mascara preto e branco
def get_whiteBlack_masks_image(self):
        masks = self.masks
        darkImg = np.zeros_like(self.origin_image)
        image = darkImg.copy()

        np.random.seed(0)
        if (len(masks) == 0):
            self.whiteMasks = image
            return image
        for mask in masks:
            if mask['opt'] == "negative":
                image = self.clearMaskWithOriginImg(darkImg, image, mask['mask'])
            else:
                image = self.overlay_mask(image, mask['mask'], 0.5, random_color=False)

        self.whiteMasks = image
        return image

Source, linha 593.

Duvidas para a reunião

  • D: Encontrei isto (G-DINO + SAM), devo continuar com a pipeline ou experimento isto? Paper 25JAN2024 Grounded SAM
    • R: Continuar com o que temos, e depois ver se podemos usar outra coisa
  • D: Onde arranjar mais imagens para fazer a dataset? (Uma vez que têm que ser privadas)
    • R: Provavelmente FAP tem mais imagens, mas têm que ser pedidas e provavelmente não serão muitas

18-Apr-24

  • Ler output do YOLOv9
  • Normalizar coordenadas de xywh para xyxy
  • Meter tudo numa estrutura de dados do tipo:
Estrutura de dados
data = {
    'img_path': 'path/to/image.png',
    'file_name': 'image.png',
    'bounding_box_data': [
        {
            'class_id': 0,
            'bbox_data': [x1, y1, x2, y2]
        },
        {
            'class_id': 1,
            'bbox_data': [x1, y1, x2, y2]
        },
        ...
    ]
}
  • Resolvido o problema de, quando o YOLOv8 não deteta nada, não cria a label.txt, então se o a imagem existir, vai criar um .txt vazio com o nome da imagem
  • Transformar em máscara preto e branco
Inferência feita pela pipeline

img_1675
img_1675

Transformação em mascara preto e branco

img_1675_BW_mask
Black and white mask

  • Passar para mais do que uma box
Mais do que uma box

multi-box

  • Também é possivel guardar individualmente cada mascara
Mascaras individuais

picture 3 picture 4
picture 5

TODO: separar em pastas por classe (fumo e fogo)

22-Apr-24

  • Testar com imagens ground truth

12-Jul-24

  • meter no latex que treinar com poligonos é mais eficiente e apresenta melhores resultados para o YOLO

  • v1 -> 45 imagens

  • v2 -> 482 imagens
  • v3 -> 949 imagens

refazer yolo dataset com anotacoes - feito retreinar - feito anotar dataset inteira com novo modelo - feito get results


Last update: July 16, 2024