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:
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
paraxyxy
- 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
Transformação em mascara preto e branco
- Passar para mais do que uma box
- Também é possivel guardar individualmente cada mascara
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