Trabajo final Visión por computadora¶

Estudiante: Pablo Jusim

Importaciones¶

In [ ]:
import os
import time
import albumentations as A
from albumentations.pytorch import ToTensorV2
import cv2
import numpy as np
import torch
from torch.utils.data import Dataset, DataLoader
from torch.optim.lr_scheduler import StepLR, ReduceLROnPlateau
import torchvision
from torchvision.models.detection import RetinaNet_ResNet50_FPN_V2_Weights
from torchvision.models.detection.retinanet import RetinaNetClassificationHead
from torchmetrics.detection.mean_ap import MeanAveragePrecision
import glob
import matplotlib.pyplot as plt
from functools import partial
from tqdm.auto import tqdm
from sklearn.metrics import confusion_matrix, classification_report
import json
from collections import OrderedDict, Counter

Variables de configuración y rutas¶

Rutas¶

In [2]:
# Imagenes de entrenamiento y etiquetas
TRAIN_DIR = "data/train"
# Imagenes de validacion y etiquetas
VALID_DIR = "data/valid"
# Imagenes de prueba y etiquetas
TEST_DIR = "data/test"

# Salidas y graficos del modelo
OUT_DIR = "outputs"

Variables de configuración¶

In [3]:
BATCH_SIZE = 8  # Increase / decrease according to GPU memeory.
RESIZE_TO = 640  # Resize the image for training and transforms.
NUM_EPOCHS = 60  # Number of epochs to train for.
NUM_WORKERS = 4  # Number of parallel workers for data loading.

DEVICE = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

# Classes: 0 index is reserved for background.
CLASSES = ["__background__", "buffalo", "elephant", "rhino", "zebra"]


NUM_CLASSES = len(CLASSES)

# Whether to visualize images after crearing the data loaders.
VISUALIZE_TRANSFORMED_IMAGES = True

Utils: funciones varias para diferentes pasos¶

In [4]:
plt.style.use("ggplot")


class Averager:
    """
    A class to keep track of running average of values (e.g. training loss).
    """

    def __init__(self):
        self.current_total = 0.0
        self.iterations = 0.0

    def send(self, value):
        self.current_total += value
        self.iterations += 1

    @property
    def value(self):
        if self.iterations == 0:
            return 0
        else:
            return self.current_total / self.iterations

    def reset(self):
        self.current_total = 0.0
        self.iterations = 0.0


class SaveBestModel:
    """
    Saves the model if the current epoch's validation mAP is higher
    than all previously observed values.
    """

    def __init__(self, best_valid_map=float(0)):
        self.best_valid_map = best_valid_map

    def __call__(
        self,
        model,
        current_valid_map,
        epoch,
        OUT_DIR,
    ):
        if current_valid_map > self.best_valid_map:
            self.best_valid_map = current_valid_map
            print(f"\nBEST VALIDATION mAP: {self.best_valid_map}")
            print(f"SAVING BEST MODEL FOR EPOCH: {epoch+1}\n")
            torch.save(
                {
                    "epoch": epoch + 1,
                    "model_state_dict": model.state_dict(),
                },
                f"{OUT_DIR}/best_model.pth",
            )


def collate_fn(batch):
    """
    To handle the data loading as different images may have different
    numbers of objects, and to handle varying-size tensors as well.
    """
    return tuple(zip(*batch))


def get_train_transform():
    # We keep "pascal_voc" because bounding box format is [x_min, y_min, x_max, y_max].
    return A.Compose(
        [
            A.HorizontalFlip(p=0.5),
            A.VerticalFlip(p=0.5),
            A.Rotate(limit=45),
            A.Blur(blur_limit=3, p=0.2),
            A.MotionBlur(blur_limit=3, p=0.1),
            A.MedianBlur(blur_limit=3, p=0.1),
            A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=0.3),
            A.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.2, p=0.3),
            A.RandomScale(scale_limit=0.2, p=0.3),
            ToTensorV2(p=1.0),
        ],
        bbox_params={"format": "pascal_voc", "label_fields": ["labels"]},
    )


def get_valid_transform():
    return A.Compose(
        [
            ToTensorV2(p=1.0),
        ],
        bbox_params={"format": "pascal_voc", "label_fields": ["labels"]},
    )


def show_tranformed_image(train_loader):
    """
    Visualize transformed images from the `train_loader` for debugging.
    Only runs if `VISUALIZE_TRANSFORMED_IMAGES = True` in config.py.
    """
    if len(train_loader) > 0:
        for i in range(2):
            images, targets = next(iter(train_loader))
            images = list(image.to(DEVICE) for image in images)

            targets = [{k: v.to(DEVICE) for k, v in t.items()} for t in targets]
            for i in range(len(images)):
                if len(targets[i]["boxes"]) == 0:
                    continue
                boxes = targets[i]["boxes"].cpu().numpy().astype(np.int32)
                labels = targets[i]["labels"].cpu().numpy().astype(np.int32)
                sample = images[i].permute(1, 2, 0).cpu().numpy()
                sample = cv2.cvtColor(sample, cv2.COLOR_RGB2BGR)

                for box_num, box in enumerate(boxes):
                    cv2.rectangle(sample, (box[0], box[1]), (box[2], box[3]), (0, 0, 255), 2)
                    cv2.putText(
                        sample,
                        CLASSES[labels[box_num]],
                        (box[0], box[1] - 10),
                        cv2.FONT_HERSHEY_SIMPLEX,
                        1.0,
                        (0, 0, 255),
                        2,
                    )
                cv2.imshow("Transformed image", sample)
                cv2.waitKey(0)
                cv2.destroyAllWindows()


def save_model(epoch, model, optimizer):
    """
    Save the trained model (state dict) and optimizer state to disk.
    """
    torch.save(
        {
            "epoch": epoch + 1,
            "model_state_dict": model.state_dict(),
            "optimizer_state_dict": optimizer.state_dict(),
        },
        "outputs/last_model.pth",
    )


def save_loss_plot(OUT_DIR, train_loss_list, x_label="iterations", y_label="train loss", save_name="train_loss"):
    """
    Saves the training loss curve.
    """
    plt.figure(figsize=(10, 7))
    plt.plot(train_loss_list, color="tab:blue")
    plt.xlabel(x_label)
    plt.ylabel(y_label)
    plt.savefig(f"{OUT_DIR}/{save_name}.png")
    # plt.close()
    print("SAVING PLOTS COMPLETE...")


def save_mAP(OUT_DIR, map_05, map):
    """
    Saves the mAP@0.5 and mAP@0.5:0.95 curves per epoch.
    """
    plt.figure(figsize=(10, 7))
    plt.plot(map_05, color="tab:orange", linestyle="-", label="mAP@0.5")
    plt.plot(map, color="tab:red", linestyle="-", label="mAP@0.5:0.95")
    plt.xlabel("Epochs")
    plt.ylabel("mAP")
    plt.legend()
    plt.savefig(f"{OUT_DIR}/map.png")
    # plt.close()
    print("SAVING mAP PLOTS COMPLETE...")

Preprocesamiento¶

Etiquetas¶

Convertir las etiquetas del formato YOLO a un formato normalizado

In [55]:
def convert_polygon_to_pytorch(txt_dir, output_dir):
    """
    Converts YOLO-style polygon bounding boxes (x1, y1, x2, y2, ..., xN, yN) 
    into PyTorch format (x_min, y_min, x_max, y_max) via an intermediate YOLO conversion step.

    :param txt_dir: Directory containing original YOLO polygon txt files
    :param output_dir: Directory where converted txt files will be saved
    """
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    txt_files = [f for f in os.listdir(txt_dir) if f.endswith(".txt")]

    for file_name in txt_files:
        input_path = os.path.join(txt_dir, file_name)
        output_path = os.path.join(output_dir, file_name)

        with open(input_path, "r") as f:
            lines = f.readlines()

        converted_lines = []
        for line in lines:
            values = line.strip().split()
           
            
            cls_id = int(values[0])
            coords = list(map(float, values[1:]))  # Extract coordinates dynamically

            # Separate x and y coordinates dynamically
            x_coords = coords[0::2]  # Every even index -> x
            y_coords = coords[1::2]  # Every odd index -> y

            # Compute bounding box from min/max values
            x_min = min(x_coords)
            y_min = min(y_coords)
            x_max = max(x_coords)
            y_max = max(y_coords)

            # Step 1: Convert to YOLO format (x_center, y_center, width, height)
            x_center = (x_min + x_max) / 2
            y_center = (y_min + y_max) / 2
            width = x_max - x_min
            height = y_max - y_min

            # Step 2: Recalculate (x1, y1, x2, y2) from (x_center, y_center, width, height)
            final_x1 = x_center - (width / 2)
            final_y1 = y_center - (height / 2)
            final_x2 = x_center + (width / 2)
            final_y2 = y_center + (height / 2)

            # Save final PyTorch format
            converted_lines.append(f"{cls_id} {final_x1:.6f} {final_y1:.6f} {final_x2:.6f} {final_y2:.6f}\n")

        # Save new label file in PyTorch format
        if converted_lines:
            with open(output_path, "w") as f:
                f.writelines(converted_lines)

        print(f"Converted {file_name} → {output_path}")
In [56]:
# Entrenamiento
convert_polygon_to_pytorch(TRAIN_DIR + '/labels', TRAIN_DIR + '/labels_converted')
# Prueba
convert_polygon_to_pytorch(TEST_DIR + '/labels', TEST_DIR + '/labels_converted')
# Validacion
convert_polygon_to_pytorch(VALID_DIR + '/labels', VALID_DIR + '/labels_converted')
Converted 1 (10).txt → data/train/labels_converted\1 (10).txt
Converted 1 (100).txt → data/train/labels_converted\1 (100).txt
Converted 1 (101).txt → data/train/labels_converted\1 (101).txt
Converted 1 (104).txt → data/train/labels_converted\1 (104).txt
Converted 1 (105).txt → data/train/labels_converted\1 (105).txt
Converted 1 (106).txt → data/train/labels_converted\1 (106).txt
Converted 1 (107).txt → data/train/labels_converted\1 (107).txt
Converted 1 (108).txt → data/train/labels_converted\1 (108).txt
Converted 1 (109).txt → data/train/labels_converted\1 (109).txt
Converted 1 (11).txt → data/train/labels_converted\1 (11).txt
Converted 1 (110).txt → data/train/labels_converted\1 (110).txt
Converted 1 (112).txt → data/train/labels_converted\1 (112).txt
Converted 1 (113).txt → data/train/labels_converted\1 (113).txt
Converted 1 (114).txt → data/train/labels_converted\1 (114).txt
Converted 1 (115).txt → data/train/labels_converted\1 (115).txt
Converted 1 (116).txt → data/train/labels_converted\1 (116).txt
Converted 1 (117).txt → data/train/labels_converted\1 (117).txt
Converted 1 (118).txt → data/train/labels_converted\1 (118).txt
Converted 1 (119).txt → data/train/labels_converted\1 (119).txt
Converted 1 (12).txt → data/train/labels_converted\1 (12).txt
Converted 1 (123).txt → data/train/labels_converted\1 (123).txt
Converted 1 (124).txt → data/train/labels_converted\1 (124).txt
Converted 1 (125).txt → data/train/labels_converted\1 (125).txt
Converted 1 (126).txt → data/train/labels_converted\1 (126).txt
Converted 1 (129).txt → data/train/labels_converted\1 (129).txt
Converted 1 (13).txt → data/train/labels_converted\1 (13).txt
Converted 1 (132).txt → data/train/labels_converted\1 (132).txt
Converted 1 (133).txt → data/train/labels_converted\1 (133).txt
Converted 1 (134).txt → data/train/labels_converted\1 (134).txt
Converted 1 (135).txt → data/train/labels_converted\1 (135).txt
Converted 1 (139).txt → data/train/labels_converted\1 (139).txt
Converted 1 (14).txt → data/train/labels_converted\1 (14).txt
Converted 1 (140).txt → data/train/labels_converted\1 (140).txt
Converted 1 (141).txt → data/train/labels_converted\1 (141).txt
Converted 1 (142).txt → data/train/labels_converted\1 (142).txt
Converted 1 (143).txt → data/train/labels_converted\1 (143).txt
Converted 1 (146).txt → data/train/labels_converted\1 (146).txt
Converted 1 (147).txt → data/train/labels_converted\1 (147).txt
Converted 1 (148).txt → data/train/labels_converted\1 (148).txt
Converted 1 (150).txt → data/train/labels_converted\1 (150).txt
Converted 1 (151).txt → data/train/labels_converted\1 (151).txt
Converted 1 (152).txt → data/train/labels_converted\1 (152).txt
Converted 1 (153).txt → data/train/labels_converted\1 (153).txt
Converted 1 (155).txt → data/train/labels_converted\1 (155).txt
Converted 1 (156).txt → data/train/labels_converted\1 (156).txt
Converted 1 (157).txt → data/train/labels_converted\1 (157).txt
Converted 1 (158).txt → data/train/labels_converted\1 (158).txt
Converted 1 (16).txt → data/train/labels_converted\1 (16).txt
Converted 1 (160).txt → data/train/labels_converted\1 (160).txt
Converted 1 (161).txt → data/train/labels_converted\1 (161).txt
Converted 1 (163).txt → data/train/labels_converted\1 (163).txt
Converted 1 (164).txt → data/train/labels_converted\1 (164).txt
Converted 1 (165).txt → data/train/labels_converted\1 (165).txt
Converted 1 (166).txt → data/train/labels_converted\1 (166).txt
Converted 1 (167).txt → data/train/labels_converted\1 (167).txt
Converted 1 (169).txt → data/train/labels_converted\1 (169).txt
Converted 1 (172).txt → data/train/labels_converted\1 (172).txt
Converted 1 (173).txt → data/train/labels_converted\1 (173).txt
Converted 1 (175).txt → data/train/labels_converted\1 (175).txt
Converted 1 (176).txt → data/train/labels_converted\1 (176).txt
Converted 1 (180).txt → data/train/labels_converted\1 (180).txt
Converted 1 (181).txt → data/train/labels_converted\1 (181).txt
Converted 1 (182).txt → data/train/labels_converted\1 (182).txt
Converted 1 (184).txt → data/train/labels_converted\1 (184).txt
Converted 1 (185).txt → data/train/labels_converted\1 (185).txt
Converted 1 (186).txt → data/train/labels_converted\1 (186).txt
Converted 1 (187).txt → data/train/labels_converted\1 (187).txt
Converted 1 (188).txt → data/train/labels_converted\1 (188).txt
Converted 1 (189).txt → data/train/labels_converted\1 (189).txt
Converted 1 (19).txt → data/train/labels_converted\1 (19).txt
Converted 1 (190).txt → data/train/labels_converted\1 (190).txt
Converted 1 (193).txt → data/train/labels_converted\1 (193).txt
Converted 1 (195).txt → data/train/labels_converted\1 (195).txt
Converted 1 (197).txt → data/train/labels_converted\1 (197).txt
Converted 1 (2).txt → data/train/labels_converted\1 (2).txt
Converted 1 (20).txt → data/train/labels_converted\1 (20).txt
Converted 1 (204).txt → data/train/labels_converted\1 (204).txt
Converted 1 (205).txt → data/train/labels_converted\1 (205).txt
Converted 1 (206).txt → data/train/labels_converted\1 (206).txt
Converted 1 (209).txt → data/train/labels_converted\1 (209).txt
Converted 1 (21).txt → data/train/labels_converted\1 (21).txt
Converted 1 (210).txt → data/train/labels_converted\1 (210).txt
Converted 1 (211).txt → data/train/labels_converted\1 (211).txt
Converted 1 (213).txt → data/train/labels_converted\1 (213).txt
Converted 1 (215).txt → data/train/labels_converted\1 (215).txt
Converted 1 (216).txt → data/train/labels_converted\1 (216).txt
Converted 1 (217).txt → data/train/labels_converted\1 (217).txt
Converted 1 (218).txt → data/train/labels_converted\1 (218).txt
Converted 1 (22).txt → data/train/labels_converted\1 (22).txt
Converted 1 (220).txt → data/train/labels_converted\1 (220).txt
Converted 1 (224).txt → data/train/labels_converted\1 (224).txt
Converted 1 (226).txt → data/train/labels_converted\1 (226).txt
Converted 1 (227).txt → data/train/labels_converted\1 (227).txt
Converted 1 (229).txt → data/train/labels_converted\1 (229).txt
Converted 1 (23).txt → data/train/labels_converted\1 (23).txt
Converted 1 (230).txt → data/train/labels_converted\1 (230).txt
Converted 1 (232).txt → data/train/labels_converted\1 (232).txt
Converted 1 (233).txt → data/train/labels_converted\1 (233).txt
Converted 1 (236).txt → data/train/labels_converted\1 (236).txt
Converted 1 (237).txt → data/train/labels_converted\1 (237).txt
Converted 1 (238).txt → data/train/labels_converted\1 (238).txt
Converted 1 (239).txt → data/train/labels_converted\1 (239).txt
Converted 1 (24).txt → data/train/labels_converted\1 (24).txt
Converted 1 (240).txt → data/train/labels_converted\1 (240).txt
Converted 1 (241).txt → data/train/labels_converted\1 (241).txt
Converted 1 (242).txt → data/train/labels_converted\1 (242).txt
Converted 1 (244).txt → data/train/labels_converted\1 (244).txt
Converted 1 (245).txt → data/train/labels_converted\1 (245).txt
Converted 1 (246).txt → data/train/labels_converted\1 (246).txt
Converted 1 (248).txt → data/train/labels_converted\1 (248).txt
Converted 1 (25).txt → data/train/labels_converted\1 (25).txt
Converted 1 (251).txt → data/train/labels_converted\1 (251).txt
Converted 1 (252).txt → data/train/labels_converted\1 (252).txt
Converted 1 (253).txt → data/train/labels_converted\1 (253).txt
Converted 1 (254).txt → data/train/labels_converted\1 (254).txt
Converted 1 (255).txt → data/train/labels_converted\1 (255).txt
Converted 1 (256).txt → data/train/labels_converted\1 (256).txt
Converted 1 (258).txt → data/train/labels_converted\1 (258).txt
Converted 1 (259).txt → data/train/labels_converted\1 (259).txt
Converted 1 (26).txt → data/train/labels_converted\1 (26).txt
Converted 1 (260).txt → data/train/labels_converted\1 (260).txt
Converted 1 (262).txt → data/train/labels_converted\1 (262).txt
Converted 1 (265).txt → data/train/labels_converted\1 (265).txt
Converted 1 (267).txt → data/train/labels_converted\1 (267).txt
Converted 1 (268).txt → data/train/labels_converted\1 (268).txt
Converted 1 (269).txt → data/train/labels_converted\1 (269).txt
Converted 1 (27).txt → data/train/labels_converted\1 (27).txt
Converted 1 (270).txt → data/train/labels_converted\1 (270).txt
Converted 1 (271).txt → data/train/labels_converted\1 (271).txt
Converted 1 (272).txt → data/train/labels_converted\1 (272).txt
Converted 1 (273).txt → data/train/labels_converted\1 (273).txt
Converted 1 (274).txt → data/train/labels_converted\1 (274).txt
Converted 1 (275).txt → data/train/labels_converted\1 (275).txt
Converted 1 (276).txt → data/train/labels_converted\1 (276).txt
Converted 1 (277).txt → data/train/labels_converted\1 (277).txt
Converted 1 (278).txt → data/train/labels_converted\1 (278).txt
Converted 1 (279).txt → data/train/labels_converted\1 (279).txt
Converted 1 (28).txt → data/train/labels_converted\1 (28).txt
Converted 1 (280).txt → data/train/labels_converted\1 (280).txt
Converted 1 (281).txt → data/train/labels_converted\1 (281).txt
Converted 1 (282).txt → data/train/labels_converted\1 (282).txt
Converted 1 (283).txt → data/train/labels_converted\1 (283).txt
Converted 1 (285).txt → data/train/labels_converted\1 (285).txt
Converted 1 (286).txt → data/train/labels_converted\1 (286).txt
Converted 1 (287).txt → data/train/labels_converted\1 (287).txt
Converted 1 (290).txt → data/train/labels_converted\1 (290).txt
Converted 1 (293).txt → data/train/labels_converted\1 (293).txt
Converted 1 (294).txt → data/train/labels_converted\1 (294).txt
Converted 1 (295).txt → data/train/labels_converted\1 (295).txt
Converted 1 (297).txt → data/train/labels_converted\1 (297).txt
Converted 1 (299).txt → data/train/labels_converted\1 (299).txt
Converted 1 (300).txt → data/train/labels_converted\1 (300).txt
Converted 1 (301).txt → data/train/labels_converted\1 (301).txt
Converted 1 (302).txt → data/train/labels_converted\1 (302).txt
Converted 1 (303).txt → data/train/labels_converted\1 (303).txt
Converted 1 (304).txt → data/train/labels_converted\1 (304).txt
Converted 1 (305).txt → data/train/labels_converted\1 (305).txt
Converted 1 (306).txt → data/train/labels_converted\1 (306).txt
Converted 1 (307).txt → data/train/labels_converted\1 (307).txt
Converted 1 (309).txt → data/train/labels_converted\1 (309).txt
Converted 1 (31).txt → data/train/labels_converted\1 (31).txt
Converted 1 (311).txt → data/train/labels_converted\1 (311).txt
Converted 1 (312).txt → data/train/labels_converted\1 (312).txt
Converted 1 (313).txt → data/train/labels_converted\1 (313).txt
Converted 1 (314).txt → data/train/labels_converted\1 (314).txt
Converted 1 (315).txt → data/train/labels_converted\1 (315).txt
Converted 1 (316).txt → data/train/labels_converted\1 (316).txt
Converted 1 (318).txt → data/train/labels_converted\1 (318).txt
Converted 1 (319).txt → data/train/labels_converted\1 (319).txt
Converted 1 (32).txt → data/train/labels_converted\1 (32).txt
Converted 1 (320).txt → data/train/labels_converted\1 (320).txt
Converted 1 (321).txt → data/train/labels_converted\1 (321).txt
Converted 1 (322).txt → data/train/labels_converted\1 (322).txt
Converted 1 (323).txt → data/train/labels_converted\1 (323).txt
Converted 1 (324).txt → data/train/labels_converted\1 (324).txt
Converted 1 (325).txt → data/train/labels_converted\1 (325).txt
Converted 1 (326).txt → data/train/labels_converted\1 (326).txt
Converted 1 (328).txt → data/train/labels_converted\1 (328).txt
Converted 1 (329).txt → data/train/labels_converted\1 (329).txt
Converted 1 (33).txt → data/train/labels_converted\1 (33).txt
Converted 1 (330).txt → data/train/labels_converted\1 (330).txt
Converted 1 (331).txt → data/train/labels_converted\1 (331).txt
Converted 1 (332).txt → data/train/labels_converted\1 (332).txt
Converted 1 (333).txt → data/train/labels_converted\1 (333).txt
Converted 1 (335).txt → data/train/labels_converted\1 (335).txt
Converted 1 (336).txt → data/train/labels_converted\1 (336).txt
Converted 1 (337).txt → data/train/labels_converted\1 (337).txt
Converted 1 (338).txt → data/train/labels_converted\1 (338).txt
Converted 1 (339).txt → data/train/labels_converted\1 (339).txt
Converted 1 (340).txt → data/train/labels_converted\1 (340).txt
Converted 1 (341).txt → data/train/labels_converted\1 (341).txt
Converted 1 (342).txt → data/train/labels_converted\1 (342).txt
Converted 1 (343).txt → data/train/labels_converted\1 (343).txt
Converted 1 (344).txt → data/train/labels_converted\1 (344).txt
Converted 1 (345).txt → data/train/labels_converted\1 (345).txt
Converted 1 (346).txt → data/train/labels_converted\1 (346).txt
Converted 1 (347).txt → data/train/labels_converted\1 (347).txt
Converted 1 (348).txt → data/train/labels_converted\1 (348).txt
Converted 1 (349).txt → data/train/labels_converted\1 (349).txt
Converted 1 (350).txt → data/train/labels_converted\1 (350).txt
Converted 1 (351).txt → data/train/labels_converted\1 (351).txt
Converted 1 (352).txt → data/train/labels_converted\1 (352).txt
Converted 1 (353).txt → data/train/labels_converted\1 (353).txt
Converted 1 (354).txt → data/train/labels_converted\1 (354).txt
Converted 1 (355).txt → data/train/labels_converted\1 (355).txt
Converted 1 (358).txt → data/train/labels_converted\1 (358).txt
Converted 1 (359).txt → data/train/labels_converted\1 (359).txt
Converted 1 (36).txt → data/train/labels_converted\1 (36).txt
Converted 1 (360).txt → data/train/labels_converted\1 (360).txt
Converted 1 (361).txt → data/train/labels_converted\1 (361).txt
Converted 1 (362).txt → data/train/labels_converted\1 (362).txt
Converted 1 (363).txt → data/train/labels_converted\1 (363).txt
Converted 1 (364).txt → data/train/labels_converted\1 (364).txt
Converted 1 (368).txt → data/train/labels_converted\1 (368).txt
Converted 1 (37).txt → data/train/labels_converted\1 (37).txt
Converted 1 (370).txt → data/train/labels_converted\1 (370).txt
Converted 1 (371).txt → data/train/labels_converted\1 (371).txt
Converted 1 (374).txt → data/train/labels_converted\1 (374).txt
Converted 1 (375).txt → data/train/labels_converted\1 (375).txt
Converted 1 (38).txt → data/train/labels_converted\1 (38).txt
Converted 1 (4).txt → data/train/labels_converted\1 (4).txt
Converted 1 (42).txt → data/train/labels_converted\1 (42).txt
Converted 1 (43).txt → data/train/labels_converted\1 (43).txt
Converted 1 (44).txt → data/train/labels_converted\1 (44).txt
Converted 1 (45).txt → data/train/labels_converted\1 (45).txt
Converted 1 (46).txt → data/train/labels_converted\1 (46).txt
Converted 1 (49).txt → data/train/labels_converted\1 (49).txt
Converted 1 (50).txt → data/train/labels_converted\1 (50).txt
Converted 1 (52).txt → data/train/labels_converted\1 (52).txt
Converted 1 (56).txt → data/train/labels_converted\1 (56).txt
Converted 1 (57).txt → data/train/labels_converted\1 (57).txt
Converted 1 (58).txt → data/train/labels_converted\1 (58).txt
Converted 1 (59).txt → data/train/labels_converted\1 (59).txt
Converted 1 (60).txt → data/train/labels_converted\1 (60).txt
Converted 1 (63).txt → data/train/labels_converted\1 (63).txt
Converted 1 (64).txt → data/train/labels_converted\1 (64).txt
Converted 1 (65).txt → data/train/labels_converted\1 (65).txt
Converted 1 (67).txt → data/train/labels_converted\1 (67).txt
Converted 1 (68).txt → data/train/labels_converted\1 (68).txt
Converted 1 (69).txt → data/train/labels_converted\1 (69).txt
Converted 1 (7).txt → data/train/labels_converted\1 (7).txt
Converted 1 (70).txt → data/train/labels_converted\1 (70).txt
Converted 1 (71).txt → data/train/labels_converted\1 (71).txt
Converted 1 (75).txt → data/train/labels_converted\1 (75).txt
Converted 1 (77).txt → data/train/labels_converted\1 (77).txt
Converted 1 (78).txt → data/train/labels_converted\1 (78).txt
Converted 1 (79).txt → data/train/labels_converted\1 (79).txt
Converted 1 (8).txt → data/train/labels_converted\1 (8).txt
Converted 1 (81).txt → data/train/labels_converted\1 (81).txt
Converted 1 (82).txt → data/train/labels_converted\1 (82).txt
Converted 1 (84).txt → data/train/labels_converted\1 (84).txt
Converted 1 (85).txt → data/train/labels_converted\1 (85).txt
Converted 1 (86).txt → data/train/labels_converted\1 (86).txt
Converted 1 (87).txt → data/train/labels_converted\1 (87).txt
Converted 1 (88).txt → data/train/labels_converted\1 (88).txt
Converted 1 (89).txt → data/train/labels_converted\1 (89).txt
Converted 1 (90).txt → data/train/labels_converted\1 (90).txt
Converted 1 (91).txt → data/train/labels_converted\1 (91).txt
Converted 1 (92).txt → data/train/labels_converted\1 (92).txt
Converted 1 (93).txt → data/train/labels_converted\1 (93).txt
Converted 1 (95).txt → data/train/labels_converted\1 (95).txt
Converted 1 (96).txt → data/train/labels_converted\1 (96).txt
Converted 1 (97).txt → data/train/labels_converted\1 (97).txt
Converted 1 (98).txt → data/train/labels_converted\1 (98).txt
Converted 1 (99).txt → data/train/labels_converted\1 (99).txt
Converted 2 (10).txt → data/train/labels_converted\2 (10).txt
Converted 2 (101).txt → data/train/labels_converted\2 (101).txt
Converted 2 (102).txt → data/train/labels_converted\2 (102).txt
Converted 2 (104).txt → data/train/labels_converted\2 (104).txt
Converted 2 (105).txt → data/train/labels_converted\2 (105).txt
Converted 2 (106).txt → data/train/labels_converted\2 (106).txt
Converted 2 (107).txt → data/train/labels_converted\2 (107).txt
Converted 2 (108).txt → data/train/labels_converted\2 (108).txt
Converted 2 (110).txt → data/train/labels_converted\2 (110).txt
Converted 2 (111).txt → data/train/labels_converted\2 (111).txt
Converted 2 (112).txt → data/train/labels_converted\2 (112).txt
Converted 2 (116).txt → data/train/labels_converted\2 (116).txt
Converted 2 (12).txt → data/train/labels_converted\2 (12).txt
Converted 2 (121).txt → data/train/labels_converted\2 (121).txt
Converted 2 (124).txt → data/train/labels_converted\2 (124).txt
Converted 2 (125).txt → data/train/labels_converted\2 (125).txt
Converted 2 (126).txt → data/train/labels_converted\2 (126).txt
Converted 2 (127).txt → data/train/labels_converted\2 (127).txt
Converted 2 (129).txt → data/train/labels_converted\2 (129).txt
Converted 2 (13).txt → data/train/labels_converted\2 (13).txt
Converted 2 (132).txt → data/train/labels_converted\2 (132).txt
Converted 2 (133).txt → data/train/labels_converted\2 (133).txt
Converted 2 (134).txt → data/train/labels_converted\2 (134).txt
Converted 2 (135).txt → data/train/labels_converted\2 (135).txt
Converted 2 (136).txt → data/train/labels_converted\2 (136).txt
Converted 2 (137).txt → data/train/labels_converted\2 (137).txt
Converted 2 (139).txt → data/train/labels_converted\2 (139).txt
Converted 2 (14).txt → data/train/labels_converted\2 (14).txt
Converted 2 (140).txt → data/train/labels_converted\2 (140).txt
Converted 2 (141).txt → data/train/labels_converted\2 (141).txt
Converted 2 (142).txt → data/train/labels_converted\2 (142).txt
Converted 2 (145).txt → data/train/labels_converted\2 (145).txt
Converted 2 (146).txt → data/train/labels_converted\2 (146).txt
Converted 2 (147).txt → data/train/labels_converted\2 (147).txt
Converted 2 (148).txt → data/train/labels_converted\2 (148).txt
Converted 2 (149).txt → data/train/labels_converted\2 (149).txt
Converted 2 (15).txt → data/train/labels_converted\2 (15).txt
Converted 2 (150).txt → data/train/labels_converted\2 (150).txt
Converted 2 (151).txt → data/train/labels_converted\2 (151).txt
Converted 2 (155).txt → data/train/labels_converted\2 (155).txt
Converted 2 (156).txt → data/train/labels_converted\2 (156).txt
Converted 2 (157).txt → data/train/labels_converted\2 (157).txt
Converted 2 (158).txt → data/train/labels_converted\2 (158).txt
Converted 2 (160).txt → data/train/labels_converted\2 (160).txt
Converted 2 (161).txt → data/train/labels_converted\2 (161).txt
Converted 2 (162).txt → data/train/labels_converted\2 (162).txt
Converted 2 (163).txt → data/train/labels_converted\2 (163).txt
Converted 2 (164).txt → data/train/labels_converted\2 (164).txt
Converted 2 (165).txt → data/train/labels_converted\2 (165).txt
Converted 2 (166).txt → data/train/labels_converted\2 (166).txt
Converted 2 (167).txt → data/train/labels_converted\2 (167).txt
Converted 2 (168).txt → data/train/labels_converted\2 (168).txt
Converted 2 (170).txt → data/train/labels_converted\2 (170).txt
Converted 2 (173).txt → data/train/labels_converted\2 (173).txt
Converted 2 (174).txt → data/train/labels_converted\2 (174).txt
Converted 2 (176).txt → data/train/labels_converted\2 (176).txt
Converted 2 (177).txt → data/train/labels_converted\2 (177).txt
Converted 2 (178).txt → data/train/labels_converted\2 (178).txt
Converted 2 (179).txt → data/train/labels_converted\2 (179).txt
Converted 2 (180).txt → data/train/labels_converted\2 (180).txt
Converted 2 (183).txt → data/train/labels_converted\2 (183).txt
Converted 2 (184).txt → data/train/labels_converted\2 (184).txt
Converted 2 (185).txt → data/train/labels_converted\2 (185).txt
Converted 2 (186).txt → data/train/labels_converted\2 (186).txt
Converted 2 (187).txt → data/train/labels_converted\2 (187).txt
Converted 2 (188).txt → data/train/labels_converted\2 (188).txt
Converted 2 (189).txt → data/train/labels_converted\2 (189).txt
Converted 2 (19).txt → data/train/labels_converted\2 (19).txt
Converted 2 (190).txt → data/train/labels_converted\2 (190).txt
Converted 2 (191).txt → data/train/labels_converted\2 (191).txt
Converted 2 (192).txt → data/train/labels_converted\2 (192).txt
Converted 2 (193).txt → data/train/labels_converted\2 (193).txt
Converted 2 (194).txt → data/train/labels_converted\2 (194).txt
Converted 2 (195).txt → data/train/labels_converted\2 (195).txt
Converted 2 (196).txt → data/train/labels_converted\2 (196).txt
Converted 2 (199).txt → data/train/labels_converted\2 (199).txt
Converted 2 (2).txt → data/train/labels_converted\2 (2).txt
Converted 2 (20).txt → data/train/labels_converted\2 (20).txt
Converted 2 (200).txt → data/train/labels_converted\2 (200).txt
Converted 2 (201).txt → data/train/labels_converted\2 (201).txt
Converted 2 (202).txt → data/train/labels_converted\2 (202).txt
Converted 2 (203).txt → data/train/labels_converted\2 (203).txt
Converted 2 (204).txt → data/train/labels_converted\2 (204).txt
Converted 2 (205).txt → data/train/labels_converted\2 (205).txt
Converted 2 (206).txt → data/train/labels_converted\2 (206).txt
Converted 2 (209).txt → data/train/labels_converted\2 (209).txt
Converted 2 (21).txt → data/train/labels_converted\2 (21).txt
Converted 2 (211).txt → data/train/labels_converted\2 (211).txt
Converted 2 (213).txt → data/train/labels_converted\2 (213).txt
Converted 2 (215).txt → data/train/labels_converted\2 (215).txt
Converted 2 (216).txt → data/train/labels_converted\2 (216).txt
Converted 2 (217).txt → data/train/labels_converted\2 (217).txt
Converted 2 (218).txt → data/train/labels_converted\2 (218).txt
Converted 2 (219).txt → data/train/labels_converted\2 (219).txt
Converted 2 (22).txt → data/train/labels_converted\2 (22).txt
Converted 2 (220).txt → data/train/labels_converted\2 (220).txt
Converted 2 (221).txt → data/train/labels_converted\2 (221).txt
Converted 2 (222).txt → data/train/labels_converted\2 (222).txt
Converted 2 (223).txt → data/train/labels_converted\2 (223).txt
Converted 2 (224).txt → data/train/labels_converted\2 (224).txt
Converted 2 (225).txt → data/train/labels_converted\2 (225).txt
Converted 2 (228).txt → data/train/labels_converted\2 (228).txt
Converted 2 (229).txt → data/train/labels_converted\2 (229).txt
Converted 2 (230).txt → data/train/labels_converted\2 (230).txt
Converted 2 (231).txt → data/train/labels_converted\2 (231).txt
Converted 2 (232).txt → data/train/labels_converted\2 (232).txt
Converted 2 (235).txt → data/train/labels_converted\2 (235).txt
Converted 2 (236).txt → data/train/labels_converted\2 (236).txt
Converted 2 (237).txt → data/train/labels_converted\2 (237).txt
Converted 2 (238).txt → data/train/labels_converted\2 (238).txt
Converted 2 (239).txt → data/train/labels_converted\2 (239).txt
Converted 2 (24).txt → data/train/labels_converted\2 (24).txt
Converted 2 (240).txt → data/train/labels_converted\2 (240).txt
Converted 2 (241).txt → data/train/labels_converted\2 (241).txt
Converted 2 (242).txt → data/train/labels_converted\2 (242).txt
Converted 2 (244).txt → data/train/labels_converted\2 (244).txt
Converted 2 (245).txt → data/train/labels_converted\2 (245).txt
Converted 2 (247).txt → data/train/labels_converted\2 (247).txt
Converted 2 (248).txt → data/train/labels_converted\2 (248).txt
Converted 2 (250).txt → data/train/labels_converted\2 (250).txt
Converted 2 (251).txt → data/train/labels_converted\2 (251).txt
Converted 2 (252).txt → data/train/labels_converted\2 (252).txt
Converted 2 (253).txt → data/train/labels_converted\2 (253).txt
Converted 2 (254).txt → data/train/labels_converted\2 (254).txt
Converted 2 (255).txt → data/train/labels_converted\2 (255).txt
Converted 2 (257).txt → data/train/labels_converted\2 (257).txt
Converted 2 (258).txt → data/train/labels_converted\2 (258).txt
Converted 2 (259).txt → data/train/labels_converted\2 (259).txt
Converted 2 (26).txt → data/train/labels_converted\2 (26).txt
Converted 2 (260).txt → data/train/labels_converted\2 (260).txt
Converted 2 (261).txt → data/train/labels_converted\2 (261).txt
Converted 2 (262).txt → data/train/labels_converted\2 (262).txt
Converted 2 (263).txt → data/train/labels_converted\2 (263).txt
Converted 2 (265).txt → data/train/labels_converted\2 (265).txt
Converted 2 (266).txt → data/train/labels_converted\2 (266).txt
Converted 2 (267).txt → data/train/labels_converted\2 (267).txt
Converted 2 (27).txt → data/train/labels_converted\2 (27).txt
Converted 2 (271).txt → data/train/labels_converted\2 (271).txt
Converted 2 (272).txt → data/train/labels_converted\2 (272).txt
Converted 2 (273).txt → data/train/labels_converted\2 (273).txt
Converted 2 (275).txt → data/train/labels_converted\2 (275).txt
Converted 2 (276).txt → data/train/labels_converted\2 (276).txt
Converted 2 (277).txt → data/train/labels_converted\2 (277).txt
Converted 2 (278).txt → data/train/labels_converted\2 (278).txt
Converted 2 (280).txt → data/train/labels_converted\2 (280).txt
Converted 2 (281).txt → data/train/labels_converted\2 (281).txt
Converted 2 (282).txt → data/train/labels_converted\2 (282).txt
Converted 2 (283).txt → data/train/labels_converted\2 (283).txt
Converted 2 (284).txt → data/train/labels_converted\2 (284).txt
Converted 2 (285).txt → data/train/labels_converted\2 (285).txt
Converted 2 (287).txt → data/train/labels_converted\2 (287).txt
Converted 2 (288).txt → data/train/labels_converted\2 (288).txt
Converted 2 (291).txt → data/train/labels_converted\2 (291).txt
Converted 2 (292).txt → data/train/labels_converted\2 (292).txt
Converted 2 (293).txt → data/train/labels_converted\2 (293).txt
Converted 2 (294).txt → data/train/labels_converted\2 (294).txt
Converted 2 (295).txt → data/train/labels_converted\2 (295).txt
Converted 2 (296).txt → data/train/labels_converted\2 (296).txt
Converted 2 (298).txt → data/train/labels_converted\2 (298).txt
Converted 2 (299).txt → data/train/labels_converted\2 (299).txt
Converted 2 (3).txt → data/train/labels_converted\2 (3).txt
Converted 2 (30).txt → data/train/labels_converted\2 (30).txt
Converted 2 (300).txt → data/train/labels_converted\2 (300).txt
Converted 2 (301).txt → data/train/labels_converted\2 (301).txt
Converted 2 (302).txt → data/train/labels_converted\2 (302).txt
Converted 2 (303).txt → data/train/labels_converted\2 (303).txt
Converted 2 (304).txt → data/train/labels_converted\2 (304).txt
Converted 2 (305).txt → data/train/labels_converted\2 (305).txt
Converted 2 (307).txt → data/train/labels_converted\2 (307).txt
Converted 2 (308).txt → data/train/labels_converted\2 (308).txt
Converted 2 (309).txt → data/train/labels_converted\2 (309).txt
Converted 2 (31).txt → data/train/labels_converted\2 (31).txt
Converted 2 (310).txt → data/train/labels_converted\2 (310).txt
Converted 2 (313).txt → data/train/labels_converted\2 (313).txt
Converted 2 (314).txt → data/train/labels_converted\2 (314).txt
Converted 2 (315).txt → data/train/labels_converted\2 (315).txt
Converted 2 (317).txt → data/train/labels_converted\2 (317).txt
Converted 2 (318).txt → data/train/labels_converted\2 (318).txt
Converted 2 (319).txt → data/train/labels_converted\2 (319).txt
Converted 2 (32).txt → data/train/labels_converted\2 (32).txt
Converted 2 (320).txt → data/train/labels_converted\2 (320).txt
Converted 2 (321).txt → data/train/labels_converted\2 (321).txt
Converted 2 (322).txt → data/train/labels_converted\2 (322).txt
Converted 2 (324).txt → data/train/labels_converted\2 (324).txt
Converted 2 (325).txt → data/train/labels_converted\2 (325).txt
Converted 2 (329).txt → data/train/labels_converted\2 (329).txt
Converted 2 (33).txt → data/train/labels_converted\2 (33).txt
Converted 2 (330).txt → data/train/labels_converted\2 (330).txt
Converted 2 (334).txt → data/train/labels_converted\2 (334).txt
Converted 2 (335).txt → data/train/labels_converted\2 (335).txt
Converted 2 (336).txt → data/train/labels_converted\2 (336).txt
Converted 2 (338).txt → data/train/labels_converted\2 (338).txt
Converted 2 (340).txt → data/train/labels_converted\2 (340).txt
Converted 2 (342).txt → data/train/labels_converted\2 (342).txt
Converted 2 (344).txt → data/train/labels_converted\2 (344).txt
Converted 2 (346).txt → data/train/labels_converted\2 (346).txt
Converted 2 (347).txt → data/train/labels_converted\2 (347).txt
Converted 2 (348).txt → data/train/labels_converted\2 (348).txt
Converted 2 (349).txt → data/train/labels_converted\2 (349).txt
Converted 2 (35).txt → data/train/labels_converted\2 (35).txt
Converted 2 (350).txt → data/train/labels_converted\2 (350).txt
Converted 2 (352).txt → data/train/labels_converted\2 (352).txt
Converted 2 (354).txt → data/train/labels_converted\2 (354).txt
Converted 2 (356).txt → data/train/labels_converted\2 (356).txt
Converted 2 (357).txt → data/train/labels_converted\2 (357).txt
Converted 2 (359).txt → data/train/labels_converted\2 (359).txt
Converted 2 (36).txt → data/train/labels_converted\2 (36).txt
Converted 2 (360).txt → data/train/labels_converted\2 (360).txt
Converted 2 (362).txt → data/train/labels_converted\2 (362).txt
Converted 2 (363).txt → data/train/labels_converted\2 (363).txt
Converted 2 (364).txt → data/train/labels_converted\2 (364).txt
Converted 2 (365).txt → data/train/labels_converted\2 (365).txt
Converted 2 (367).txt → data/train/labels_converted\2 (367).txt
Converted 2 (368).txt → data/train/labels_converted\2 (368).txt
Converted 2 (369).txt → data/train/labels_converted\2 (369).txt
Converted 2 (37).txt → data/train/labels_converted\2 (37).txt
Converted 2 (371).txt → data/train/labels_converted\2 (371).txt
Converted 2 (372).txt → data/train/labels_converted\2 (372).txt
Converted 2 (373).txt → data/train/labels_converted\2 (373).txt
Converted 2 (375).txt → data/train/labels_converted\2 (375).txt
Converted 2 (38).txt → data/train/labels_converted\2 (38).txt
Converted 2 (39).txt → data/train/labels_converted\2 (39).txt
Converted 2 (4).txt → data/train/labels_converted\2 (4).txt
Converted 2 (40).txt → data/train/labels_converted\2 (40).txt
Converted 2 (41).txt → data/train/labels_converted\2 (41).txt
Converted 2 (42).txt → data/train/labels_converted\2 (42).txt
Converted 2 (43).txt → data/train/labels_converted\2 (43).txt
Converted 2 (44).txt → data/train/labels_converted\2 (44).txt
Converted 2 (45).txt → data/train/labels_converted\2 (45).txt
Converted 2 (47).txt → data/train/labels_converted\2 (47).txt
Converted 2 (48).txt → data/train/labels_converted\2 (48).txt
Converted 2 (5).txt → data/train/labels_converted\2 (5).txt
Converted 2 (50).txt → data/train/labels_converted\2 (50).txt
Converted 2 (51).txt → data/train/labels_converted\2 (51).txt
Converted 2 (52).txt → data/train/labels_converted\2 (52).txt
Converted 2 (54).txt → data/train/labels_converted\2 (54).txt
Converted 2 (56).txt → data/train/labels_converted\2 (56).txt
Converted 2 (57).txt → data/train/labels_converted\2 (57).txt
Converted 2 (58).txt → data/train/labels_converted\2 (58).txt
Converted 2 (59).txt → data/train/labels_converted\2 (59).txt
Converted 2 (6).txt → data/train/labels_converted\2 (6).txt
Converted 2 (60).txt → data/train/labels_converted\2 (60).txt
Converted 2 (61).txt → data/train/labels_converted\2 (61).txt
Converted 2 (64).txt → data/train/labels_converted\2 (64).txt
Converted 2 (65).txt → data/train/labels_converted\2 (65).txt
Converted 2 (67).txt → data/train/labels_converted\2 (67).txt
Converted 2 (68).txt → data/train/labels_converted\2 (68).txt
Converted 2 (69).txt → data/train/labels_converted\2 (69).txt
Converted 2 (7).txt → data/train/labels_converted\2 (7).txt
Converted 2 (74).txt → data/train/labels_converted\2 (74).txt
Converted 2 (75).txt → data/train/labels_converted\2 (75).txt
Converted 2 (76).txt → data/train/labels_converted\2 (76).txt
Converted 2 (77).txt → data/train/labels_converted\2 (77).txt
Converted 2 (79).txt → data/train/labels_converted\2 (79).txt
Converted 2 (8).txt → data/train/labels_converted\2 (8).txt
Converted 2 (80).txt → data/train/labels_converted\2 (80).txt
Converted 2 (81).txt → data/train/labels_converted\2 (81).txt
Converted 2 (82).txt → data/train/labels_converted\2 (82).txt
Converted 2 (84).txt → data/train/labels_converted\2 (84).txt
Converted 2 (86).txt → data/train/labels_converted\2 (86).txt
Converted 2 (89).txt → data/train/labels_converted\2 (89).txt
Converted 2 (9).txt → data/train/labels_converted\2 (9).txt
Converted 2 (90).txt → data/train/labels_converted\2 (90).txt
Converted 2 (92).txt → data/train/labels_converted\2 (92).txt
Converted 2 (93).txt → data/train/labels_converted\2 (93).txt
Converted 2 (94).txt → data/train/labels_converted\2 (94).txt
Converted 2 (96).txt → data/train/labels_converted\2 (96).txt
Converted 2 (98).txt → data/train/labels_converted\2 (98).txt
Converted 3 (1).txt → data/train/labels_converted\3 (1).txt
Converted 3 (10).txt → data/train/labels_converted\3 (10).txt
Converted 3 (100).txt → data/train/labels_converted\3 (100).txt
Converted 3 (101).txt → data/train/labels_converted\3 (101).txt
Converted 3 (102).txt → data/train/labels_converted\3 (102).txt
Converted 3 (103).txt → data/train/labels_converted\3 (103).txt
Converted 3 (104).txt → data/train/labels_converted\3 (104).txt
Converted 3 (105).txt → data/train/labels_converted\3 (105).txt
Converted 3 (108).txt → data/train/labels_converted\3 (108).txt
Converted 3 (109).txt → data/train/labels_converted\3 (109).txt
Converted 3 (110).txt → data/train/labels_converted\3 (110).txt
Converted 3 (112).txt → data/train/labels_converted\3 (112).txt
Converted 3 (113).txt → data/train/labels_converted\3 (113).txt
Converted 3 (115).txt → data/train/labels_converted\3 (115).txt
Converted 3 (116).txt → data/train/labels_converted\3 (116).txt
Converted 3 (117).txt → data/train/labels_converted\3 (117).txt
Converted 3 (118).txt → data/train/labels_converted\3 (118).txt
Converted 3 (119).txt → data/train/labels_converted\3 (119).txt
Converted 3 (121).txt → data/train/labels_converted\3 (121).txt
Converted 3 (124).txt → data/train/labels_converted\3 (124).txt
Converted 3 (125).txt → data/train/labels_converted\3 (125).txt
Converted 3 (126).txt → data/train/labels_converted\3 (126).txt
Converted 3 (127).txt → data/train/labels_converted\3 (127).txt
Converted 3 (128).txt → data/train/labels_converted\3 (128).txt
Converted 3 (13).txt → data/train/labels_converted\3 (13).txt
Converted 3 (130).txt → data/train/labels_converted\3 (130).txt
Converted 3 (131).txt → data/train/labels_converted\3 (131).txt
Converted 3 (133).txt → data/train/labels_converted\3 (133).txt
Converted 3 (135).txt → data/train/labels_converted\3 (135).txt
Converted 3 (136).txt → data/train/labels_converted\3 (136).txt
Converted 3 (138).txt → data/train/labels_converted\3 (138).txt
Converted 3 (14).txt → data/train/labels_converted\3 (14).txt
Converted 3 (140).txt → data/train/labels_converted\3 (140).txt
Converted 3 (141).txt → data/train/labels_converted\3 (141).txt
Converted 3 (142).txt → data/train/labels_converted\3 (142).txt
Converted 3 (145).txt → data/train/labels_converted\3 (145).txt
Converted 3 (147).txt → data/train/labels_converted\3 (147).txt
Converted 3 (148).txt → data/train/labels_converted\3 (148).txt
Converted 3 (149).txt → data/train/labels_converted\3 (149).txt
Converted 3 (15).txt → data/train/labels_converted\3 (15).txt
Converted 3 (150).txt → data/train/labels_converted\3 (150).txt
Converted 3 (151).txt → data/train/labels_converted\3 (151).txt
Converted 3 (152).txt → data/train/labels_converted\3 (152).txt
Converted 3 (153).txt → data/train/labels_converted\3 (153).txt
Converted 3 (155).txt → data/train/labels_converted\3 (155).txt
Converted 3 (159).txt → data/train/labels_converted\3 (159).txt
Converted 3 (16).txt → data/train/labels_converted\3 (16).txt
Converted 3 (160).txt → data/train/labels_converted\3 (160).txt
Converted 3 (161).txt → data/train/labels_converted\3 (161).txt
Converted 3 (162).txt → data/train/labels_converted\3 (162).txt
Converted 3 (165).txt → data/train/labels_converted\3 (165).txt
Converted 3 (167).txt → data/train/labels_converted\3 (167).txt
Converted 3 (169).txt → data/train/labels_converted\3 (169).txt
Converted 3 (17).txt → data/train/labels_converted\3 (17).txt
Converted 3 (171).txt → data/train/labels_converted\3 (171).txt
Converted 3 (172).txt → data/train/labels_converted\3 (172).txt
Converted 3 (175).txt → data/train/labels_converted\3 (175).txt
Converted 3 (177).txt → data/train/labels_converted\3 (177).txt
Converted 3 (178).txt → data/train/labels_converted\3 (178).txt
Converted 3 (179).txt → data/train/labels_converted\3 (179).txt
Converted 3 (18).txt → data/train/labels_converted\3 (18).txt
Converted 3 (180).txt → data/train/labels_converted\3 (180).txt
Converted 3 (181).txt → data/train/labels_converted\3 (181).txt
Converted 3 (182).txt → data/train/labels_converted\3 (182).txt
Converted 3 (183).txt → data/train/labels_converted\3 (183).txt
Converted 3 (184).txt → data/train/labels_converted\3 (184).txt
Converted 3 (185).txt → data/train/labels_converted\3 (185).txt
Converted 3 (187).txt → data/train/labels_converted\3 (187).txt
Converted 3 (188).txt → data/train/labels_converted\3 (188).txt
Converted 3 (19).txt → data/train/labels_converted\3 (19).txt
Converted 3 (190).txt → data/train/labels_converted\3 (190).txt
Converted 3 (191).txt → data/train/labels_converted\3 (191).txt
Converted 3 (193).txt → data/train/labels_converted\3 (193).txt
Converted 3 (194).txt → data/train/labels_converted\3 (194).txt
Converted 3 (195).txt → data/train/labels_converted\3 (195).txt
Converted 3 (196).txt → data/train/labels_converted\3 (196).txt
Converted 3 (197).txt → data/train/labels_converted\3 (197).txt
Converted 3 (199).txt → data/train/labels_converted\3 (199).txt
Converted 3 (200).txt → data/train/labels_converted\3 (200).txt
Converted 3 (201).txt → data/train/labels_converted\3 (201).txt
Converted 3 (202).txt → data/train/labels_converted\3 (202).txt
Converted 3 (203).txt → data/train/labels_converted\3 (203).txt
Converted 3 (204).txt → data/train/labels_converted\3 (204).txt
Converted 3 (207).txt → data/train/labels_converted\3 (207).txt
Converted 3 (21).txt → data/train/labels_converted\3 (21).txt
Converted 3 (211).txt → data/train/labels_converted\3 (211).txt
Converted 3 (212).txt → data/train/labels_converted\3 (212).txt
Converted 3 (216).txt → data/train/labels_converted\3 (216).txt
Converted 3 (217).txt → data/train/labels_converted\3 (217).txt
Converted 3 (218).txt → data/train/labels_converted\3 (218).txt
Converted 3 (22).txt → data/train/labels_converted\3 (22).txt
Converted 3 (220).txt → data/train/labels_converted\3 (220).txt
Converted 3 (222).txt → data/train/labels_converted\3 (222).txt
Converted 3 (223).txt → data/train/labels_converted\3 (223).txt
Converted 3 (224).txt → data/train/labels_converted\3 (224).txt
Converted 3 (225).txt → data/train/labels_converted\3 (225).txt
Converted 3 (229).txt → data/train/labels_converted\3 (229).txt
Converted 3 (23).txt → data/train/labels_converted\3 (23).txt
Converted 3 (230).txt → data/train/labels_converted\3 (230).txt
Converted 3 (231).txt → data/train/labels_converted\3 (231).txt
Converted 3 (235).txt → data/train/labels_converted\3 (235).txt
Converted 3 (236).txt → data/train/labels_converted\3 (236).txt
Converted 3 (237).txt → data/train/labels_converted\3 (237).txt
Converted 3 (238).txt → data/train/labels_converted\3 (238).txt
Converted 3 (239).txt → data/train/labels_converted\3 (239).txt
Converted 3 (24).txt → data/train/labels_converted\3 (24).txt
Converted 3 (241).txt → data/train/labels_converted\3 (241).txt
Converted 3 (242).txt → data/train/labels_converted\3 (242).txt
Converted 3 (243).txt → data/train/labels_converted\3 (243).txt
Converted 3 (244).txt → data/train/labels_converted\3 (244).txt
Converted 3 (245).txt → data/train/labels_converted\3 (245).txt
Converted 3 (246).txt → data/train/labels_converted\3 (246).txt
Converted 3 (247).txt → data/train/labels_converted\3 (247).txt
Converted 3 (249).txt → data/train/labels_converted\3 (249).txt
Converted 3 (25).txt → data/train/labels_converted\3 (25).txt
Converted 3 (250).txt → data/train/labels_converted\3 (250).txt
Converted 3 (251).txt → data/train/labels_converted\3 (251).txt
Converted 3 (252).txt → data/train/labels_converted\3 (252).txt
Converted 3 (253).txt → data/train/labels_converted\3 (253).txt
Converted 3 (254).txt → data/train/labels_converted\3 (254).txt
Converted 3 (255).txt → data/train/labels_converted\3 (255).txt
Converted 3 (258).txt → data/train/labels_converted\3 (258).txt
Converted 3 (259).txt → data/train/labels_converted\3 (259).txt
Converted 3 (26).txt → data/train/labels_converted\3 (26).txt
Converted 3 (260).txt → data/train/labels_converted\3 (260).txt
Converted 3 (262).txt → data/train/labels_converted\3 (262).txt
Converted 3 (264).txt → data/train/labels_converted\3 (264).txt
Converted 3 (267).txt → data/train/labels_converted\3 (267).txt
Converted 3 (268).txt → data/train/labels_converted\3 (268).txt
Converted 3 (27).txt → data/train/labels_converted\3 (27).txt
Converted 3 (270).txt → data/train/labels_converted\3 (270).txt
Converted 3 (274).txt → data/train/labels_converted\3 (274).txt
Converted 3 (275).txt → data/train/labels_converted\3 (275).txt
Converted 3 (276).txt → data/train/labels_converted\3 (276).txt
Converted 3 (277).txt → data/train/labels_converted\3 (277).txt
Converted 3 (278).txt → data/train/labels_converted\3 (278).txt
Converted 3 (279).txt → data/train/labels_converted\3 (279).txt
Converted 3 (28).txt → data/train/labels_converted\3 (28).txt
Converted 3 (280).txt → data/train/labels_converted\3 (280).txt
Converted 3 (282).txt → data/train/labels_converted\3 (282).txt
Converted 3 (283).txt → data/train/labels_converted\3 (283).txt
Converted 3 (284).txt → data/train/labels_converted\3 (284).txt
Converted 3 (285).txt → data/train/labels_converted\3 (285).txt
Converted 3 (286).txt → data/train/labels_converted\3 (286).txt
Converted 3 (288).txt → data/train/labels_converted\3 (288).txt
Converted 3 (289).txt → data/train/labels_converted\3 (289).txt
Converted 3 (29).txt → data/train/labels_converted\3 (29).txt
Converted 3 (290).txt → data/train/labels_converted\3 (290).txt
Converted 3 (291).txt → data/train/labels_converted\3 (291).txt
Converted 3 (292).txt → data/train/labels_converted\3 (292).txt
Converted 3 (296).txt → data/train/labels_converted\3 (296).txt
Converted 3 (297).txt → data/train/labels_converted\3 (297).txt
Converted 3 (298).txt → data/train/labels_converted\3 (298).txt
Converted 3 (299).txt → data/train/labels_converted\3 (299).txt
Converted 3 (3).txt → data/train/labels_converted\3 (3).txt
Converted 3 (30).txt → data/train/labels_converted\3 (30).txt
Converted 3 (300).txt → data/train/labels_converted\3 (300).txt
Converted 3 (301).txt → data/train/labels_converted\3 (301).txt
Converted 3 (302).txt → data/train/labels_converted\3 (302).txt
Converted 3 (303).txt → data/train/labels_converted\3 (303).txt
Converted 3 (304).txt → data/train/labels_converted\3 (304).txt
Converted 3 (305).txt → data/train/labels_converted\3 (305).txt
Converted 3 (306).txt → data/train/labels_converted\3 (306).txt
Converted 3 (307).txt → data/train/labels_converted\3 (307).txt
Converted 3 (308).txt → data/train/labels_converted\3 (308).txt
Converted 3 (309).txt → data/train/labels_converted\3 (309).txt
Converted 3 (31).txt → data/train/labels_converted\3 (31).txt
Converted 3 (310).txt → data/train/labels_converted\3 (310).txt
Converted 3 (311).txt → data/train/labels_converted\3 (311).txt
Converted 3 (312).txt → data/train/labels_converted\3 (312).txt
Converted 3 (313).txt → data/train/labels_converted\3 (313).txt
Converted 3 (315).txt → data/train/labels_converted\3 (315).txt
Converted 3 (316).txt → data/train/labels_converted\3 (316).txt
Converted 3 (317).txt → data/train/labels_converted\3 (317).txt
Converted 3 (319).txt → data/train/labels_converted\3 (319).txt
Converted 3 (32).txt → data/train/labels_converted\3 (32).txt
Converted 3 (321).txt → data/train/labels_converted\3 (321).txt
Converted 3 (322).txt → data/train/labels_converted\3 (322).txt
Converted 3 (325).txt → data/train/labels_converted\3 (325).txt
Converted 3 (327).txt → data/train/labels_converted\3 (327).txt
Converted 3 (33).txt → data/train/labels_converted\3 (33).txt
Converted 3 (330).txt → data/train/labels_converted\3 (330).txt
Converted 3 (331).txt → data/train/labels_converted\3 (331).txt
Converted 3 (332).txt → data/train/labels_converted\3 (332).txt
Converted 3 (333).txt → data/train/labels_converted\3 (333).txt
Converted 3 (335).txt → data/train/labels_converted\3 (335).txt
Converted 3 (336).txt → data/train/labels_converted\3 (336).txt
Converted 3 (339).txt → data/train/labels_converted\3 (339).txt
Converted 3 (34).txt → data/train/labels_converted\3 (34).txt
Converted 3 (340).txt → data/train/labels_converted\3 (340).txt
Converted 3 (342).txt → data/train/labels_converted\3 (342).txt
Converted 3 (343).txt → data/train/labels_converted\3 (343).txt
Converted 3 (344).txt → data/train/labels_converted\3 (344).txt
Converted 3 (345).txt → data/train/labels_converted\3 (345).txt
Converted 3 (347).txt → data/train/labels_converted\3 (347).txt
Converted 3 (348).txt → data/train/labels_converted\3 (348).txt
Converted 3 (349).txt → data/train/labels_converted\3 (349).txt
Converted 3 (35).txt → data/train/labels_converted\3 (35).txt
Converted 3 (350).txt → data/train/labels_converted\3 (350).txt
Converted 3 (352).txt → data/train/labels_converted\3 (352).txt
Converted 3 (353).txt → data/train/labels_converted\3 (353).txt
Converted 3 (355).txt → data/train/labels_converted\3 (355).txt
Converted 3 (356).txt → data/train/labels_converted\3 (356).txt
Converted 3 (357).txt → data/train/labels_converted\3 (357).txt
Converted 3 (358).txt → data/train/labels_converted\3 (358).txt
Converted 3 (359).txt → data/train/labels_converted\3 (359).txt
Converted 3 (36).txt → data/train/labels_converted\3 (36).txt
Converted 3 (360).txt → data/train/labels_converted\3 (360).txt
Converted 3 (361).txt → data/train/labels_converted\3 (361).txt
Converted 3 (362).txt → data/train/labels_converted\3 (362).txt
Converted 3 (363).txt → data/train/labels_converted\3 (363).txt
Converted 3 (365).txt → data/train/labels_converted\3 (365).txt
Converted 3 (366).txt → data/train/labels_converted\3 (366).txt
Converted 3 (367).txt → data/train/labels_converted\3 (367).txt
Converted 3 (368).txt → data/train/labels_converted\3 (368).txt
Converted 3 (369).txt → data/train/labels_converted\3 (369).txt
Converted 3 (37).txt → data/train/labels_converted\3 (37).txt
Converted 3 (370).txt → data/train/labels_converted\3 (370).txt
Converted 3 (371).txt → data/train/labels_converted\3 (371).txt
Converted 3 (373).txt → data/train/labels_converted\3 (373).txt
Converted 3 (374).txt → data/train/labels_converted\3 (374).txt
Converted 3 (375).txt → data/train/labels_converted\3 (375).txt
Converted 3 (38).txt → data/train/labels_converted\3 (38).txt
Converted 3 (39).txt → data/train/labels_converted\3 (39).txt
Converted 3 (4).txt → data/train/labels_converted\3 (4).txt
Converted 3 (40).txt → data/train/labels_converted\3 (40).txt
Converted 3 (41).txt → data/train/labels_converted\3 (41).txt
Converted 3 (42).txt → data/train/labels_converted\3 (42).txt
Converted 3 (43).txt → data/train/labels_converted\3 (43).txt
Converted 3 (44).txt → data/train/labels_converted\3 (44).txt
Converted 3 (45).txt → data/train/labels_converted\3 (45).txt
Converted 3 (5).txt → data/train/labels_converted\3 (5).txt
Converted 3 (50).txt → data/train/labels_converted\3 (50).txt
Converted 3 (53).txt → data/train/labels_converted\3 (53).txt
Converted 3 (56).txt → data/train/labels_converted\3 (56).txt
Converted 3 (57).txt → data/train/labels_converted\3 (57).txt
Converted 3 (6).txt → data/train/labels_converted\3 (6).txt
Converted 3 (60).txt → data/train/labels_converted\3 (60).txt
Converted 3 (62).txt → data/train/labels_converted\3 (62).txt
Converted 3 (63).txt → data/train/labels_converted\3 (63).txt
Converted 3 (64).txt → data/train/labels_converted\3 (64).txt
Converted 3 (65).txt → data/train/labels_converted\3 (65).txt
Converted 3 (66).txt → data/train/labels_converted\3 (66).txt
Converted 3 (68).txt → data/train/labels_converted\3 (68).txt
Converted 3 (69).txt → data/train/labels_converted\3 (69).txt
Converted 3 (70).txt → data/train/labels_converted\3 (70).txt
Converted 3 (71).txt → data/train/labels_converted\3 (71).txt
Converted 3 (72).txt → data/train/labels_converted\3 (72).txt
Converted 3 (73).txt → data/train/labels_converted\3 (73).txt
Converted 3 (74).txt → data/train/labels_converted\3 (74).txt
Converted 3 (77).txt → data/train/labels_converted\3 (77).txt
Converted 3 (78).txt → data/train/labels_converted\3 (78).txt
Converted 3 (81).txt → data/train/labels_converted\3 (81).txt
Converted 3 (82).txt → data/train/labels_converted\3 (82).txt
Converted 3 (84).txt → data/train/labels_converted\3 (84).txt
Converted 3 (85).txt → data/train/labels_converted\3 (85).txt
Converted 3 (86).txt → data/train/labels_converted\3 (86).txt
Converted 3 (87).txt → data/train/labels_converted\3 (87).txt
Converted 3 (88).txt → data/train/labels_converted\3 (88).txt
Converted 3 (89).txt → data/train/labels_converted\3 (89).txt
Converted 3 (9).txt → data/train/labels_converted\3 (9).txt
Converted 3 (92).txt → data/train/labels_converted\3 (92).txt
Converted 3 (94).txt → data/train/labels_converted\3 (94).txt
Converted 3 (95).txt → data/train/labels_converted\3 (95).txt
Converted 3 (96).txt → data/train/labels_converted\3 (96).txt
Converted 4 (1).txt → data/train/labels_converted\4 (1).txt
Converted 4 (100).txt → data/train/labels_converted\4 (100).txt
Converted 4 (101).txt → data/train/labels_converted\4 (101).txt
Converted 4 (103).txt → data/train/labels_converted\4 (103).txt
Converted 4 (104).txt → data/train/labels_converted\4 (104).txt
Converted 4 (106).txt → data/train/labels_converted\4 (106).txt
Converted 4 (108).txt → data/train/labels_converted\4 (108).txt
Converted 4 (109).txt → data/train/labels_converted\4 (109).txt
Converted 4 (11).txt → data/train/labels_converted\4 (11).txt
Converted 4 (110).txt → data/train/labels_converted\4 (110).txt
Converted 4 (111).txt → data/train/labels_converted\4 (111).txt
Converted 4 (113).txt → data/train/labels_converted\4 (113).txt
Converted 4 (114).txt → data/train/labels_converted\4 (114).txt
Converted 4 (115).txt → data/train/labels_converted\4 (115).txt
Converted 4 (117).txt → data/train/labels_converted\4 (117).txt
Converted 4 (119).txt → data/train/labels_converted\4 (119).txt
Converted 4 (120).txt → data/train/labels_converted\4 (120).txt
Converted 4 (121).txt → data/train/labels_converted\4 (121).txt
Converted 4 (122).txt → data/train/labels_converted\4 (122).txt
Converted 4 (123).txt → data/train/labels_converted\4 (123).txt
Converted 4 (124).txt → data/train/labels_converted\4 (124).txt
Converted 4 (125).txt → data/train/labels_converted\4 (125).txt
Converted 4 (126).txt → data/train/labels_converted\4 (126).txt
Converted 4 (127).txt → data/train/labels_converted\4 (127).txt
Converted 4 (128).txt → data/train/labels_converted\4 (128).txt
Converted 4 (129).txt → data/train/labels_converted\4 (129).txt
Converted 4 (13).txt → data/train/labels_converted\4 (13).txt
Converted 4 (130).txt → data/train/labels_converted\4 (130).txt
Converted 4 (133).txt → data/train/labels_converted\4 (133).txt
Converted 4 (134).txt → data/train/labels_converted\4 (134).txt
Converted 4 (139).txt → data/train/labels_converted\4 (139).txt
Converted 4 (14).txt → data/train/labels_converted\4 (14).txt
Converted 4 (140).txt → data/train/labels_converted\4 (140).txt
Converted 4 (141).txt → data/train/labels_converted\4 (141).txt
Converted 4 (142).txt → data/train/labels_converted\4 (142).txt
Converted 4 (144).txt → data/train/labels_converted\4 (144).txt
Converted 4 (145).txt → data/train/labels_converted\4 (145).txt
Converted 4 (146).txt → data/train/labels_converted\4 (146).txt
Converted 4 (147).txt → data/train/labels_converted\4 (147).txt
Converted 4 (149).txt → data/train/labels_converted\4 (149).txt
Converted 4 (15).txt → data/train/labels_converted\4 (15).txt
Converted 4 (150).txt → data/train/labels_converted\4 (150).txt
Converted 4 (151).txt → data/train/labels_converted\4 (151).txt
Converted 4 (154).txt → data/train/labels_converted\4 (154).txt
Converted 4 (156).txt → data/train/labels_converted\4 (156).txt
Converted 4 (157).txt → data/train/labels_converted\4 (157).txt
Converted 4 (159).txt → data/train/labels_converted\4 (159).txt
Converted 4 (165).txt → data/train/labels_converted\4 (165).txt
Converted 4 (166).txt → data/train/labels_converted\4 (166).txt
Converted 4 (167).txt → data/train/labels_converted\4 (167).txt
Converted 4 (168).txt → data/train/labels_converted\4 (168).txt
Converted 4 (169).txt → data/train/labels_converted\4 (169).txt
Converted 4 (17).txt → data/train/labels_converted\4 (17).txt
Converted 4 (170).txt → data/train/labels_converted\4 (170).txt
Converted 4 (171).txt → data/train/labels_converted\4 (171).txt
Converted 4 (174).txt → data/train/labels_converted\4 (174).txt
Converted 4 (176).txt → data/train/labels_converted\4 (176).txt
Converted 4 (177).txt → data/train/labels_converted\4 (177).txt
Converted 4 (178).txt → data/train/labels_converted\4 (178).txt
Converted 4 (180).txt → data/train/labels_converted\4 (180).txt
Converted 4 (182).txt → data/train/labels_converted\4 (182).txt
Converted 4 (183).txt → data/train/labels_converted\4 (183).txt
Converted 4 (184).txt → data/train/labels_converted\4 (184).txt
Converted 4 (185).txt → data/train/labels_converted\4 (185).txt
Converted 4 (187).txt → data/train/labels_converted\4 (187).txt
Converted 4 (188).txt → data/train/labels_converted\4 (188).txt
Converted 4 (189).txt → data/train/labels_converted\4 (189).txt
Converted 4 (190).txt → data/train/labels_converted\4 (190).txt
Converted 4 (192).txt → data/train/labels_converted\4 (192).txt
Converted 4 (194).txt → data/train/labels_converted\4 (194).txt
Converted 4 (195).txt → data/train/labels_converted\4 (195).txt
Converted 4 (198).txt → data/train/labels_converted\4 (198).txt
Converted 4 (20).txt → data/train/labels_converted\4 (20).txt
Converted 4 (201).txt → data/train/labels_converted\4 (201).txt
Converted 4 (202).txt → data/train/labels_converted\4 (202).txt
Converted 4 (203).txt → data/train/labels_converted\4 (203).txt
Converted 4 (204).txt → data/train/labels_converted\4 (204).txt
Converted 4 (205).txt → data/train/labels_converted\4 (205).txt
Converted 4 (206).txt → data/train/labels_converted\4 (206).txt
Converted 4 (207).txt → data/train/labels_converted\4 (207).txt
Converted 4 (208).txt → data/train/labels_converted\4 (208).txt
Converted 4 (21).txt → data/train/labels_converted\4 (21).txt
Converted 4 (212).txt → data/train/labels_converted\4 (212).txt
Converted 4 (214).txt → data/train/labels_converted\4 (214).txt
Converted 4 (215).txt → data/train/labels_converted\4 (215).txt
Converted 4 (216).txt → data/train/labels_converted\4 (216).txt
Converted 4 (217).txt → data/train/labels_converted\4 (217).txt
Converted 4 (219).txt → data/train/labels_converted\4 (219).txt
Converted 4 (22).txt → data/train/labels_converted\4 (22).txt
Converted 4 (220).txt → data/train/labels_converted\4 (220).txt
Converted 4 (221).txt → data/train/labels_converted\4 (221).txt
Converted 4 (223).txt → data/train/labels_converted\4 (223).txt
Converted 4 (225).txt → data/train/labels_converted\4 (225).txt
Converted 4 (227).txt → data/train/labels_converted\4 (227).txt
Converted 4 (228).txt → data/train/labels_converted\4 (228).txt
Converted 4 (229).txt → data/train/labels_converted\4 (229).txt
Converted 4 (230).txt → data/train/labels_converted\4 (230).txt
Converted 4 (232).txt → data/train/labels_converted\4 (232).txt
Converted 4 (236).txt → data/train/labels_converted\4 (236).txt
Converted 4 (237).txt → data/train/labels_converted\4 (237).txt
Converted 4 (238).txt → data/train/labels_converted\4 (238).txt
Converted 4 (24).txt → data/train/labels_converted\4 (24).txt
Converted 4 (240).txt → data/train/labels_converted\4 (240).txt
Converted 4 (241).txt → data/train/labels_converted\4 (241).txt
Converted 4 (242).txt → data/train/labels_converted\4 (242).txt
Converted 4 (244).txt → data/train/labels_converted\4 (244).txt
Converted 4 (245).txt → data/train/labels_converted\4 (245).txt
Converted 4 (247).txt → data/train/labels_converted\4 (247).txt
Converted 4 (248).txt → data/train/labels_converted\4 (248).txt
Converted 4 (249).txt → data/train/labels_converted\4 (249).txt
Converted 4 (25).txt → data/train/labels_converted\4 (25).txt
Converted 4 (250).txt → data/train/labels_converted\4 (250).txt
Converted 4 (251).txt → data/train/labels_converted\4 (251).txt
Converted 4 (253).txt → data/train/labels_converted\4 (253).txt
Converted 4 (255).txt → data/train/labels_converted\4 (255).txt
Converted 4 (256).txt → data/train/labels_converted\4 (256).txt
Converted 4 (258).txt → data/train/labels_converted\4 (258).txt
Converted 4 (259).txt → data/train/labels_converted\4 (259).txt
Converted 4 (26).txt → data/train/labels_converted\4 (26).txt
Converted 4 (261).txt → data/train/labels_converted\4 (261).txt
Converted 4 (263).txt → data/train/labels_converted\4 (263).txt
Converted 4 (264).txt → data/train/labels_converted\4 (264).txt
Converted 4 (265).txt → data/train/labels_converted\4 (265).txt
Converted 4 (267).txt → data/train/labels_converted\4 (267).txt
Converted 4 (268).txt → data/train/labels_converted\4 (268).txt
Converted 4 (269).txt → data/train/labels_converted\4 (269).txt
Converted 4 (27).txt → data/train/labels_converted\4 (27).txt
Converted 4 (273).txt → data/train/labels_converted\4 (273).txt
Converted 4 (276).txt → data/train/labels_converted\4 (276).txt
Converted 4 (277).txt → data/train/labels_converted\4 (277).txt
Converted 4 (279).txt → data/train/labels_converted\4 (279).txt
Converted 4 (28).txt → data/train/labels_converted\4 (28).txt
Converted 4 (280).txt → data/train/labels_converted\4 (280).txt
Converted 4 (281).txt → data/train/labels_converted\4 (281).txt
Converted 4 (282).txt → data/train/labels_converted\4 (282).txt
Converted 4 (286).txt → data/train/labels_converted\4 (286).txt
Converted 4 (287).txt → data/train/labels_converted\4 (287).txt
Converted 4 (289).txt → data/train/labels_converted\4 (289).txt
Converted 4 (291).txt → data/train/labels_converted\4 (291).txt
Converted 4 (292).txt → data/train/labels_converted\4 (292).txt
Converted 4 (293).txt → data/train/labels_converted\4 (293).txt
Converted 4 (296).txt → data/train/labels_converted\4 (296).txt
Converted 4 (297).txt → data/train/labels_converted\4 (297).txt
Converted 4 (3).txt → data/train/labels_converted\4 (3).txt
Converted 4 (30).txt → data/train/labels_converted\4 (30).txt
Converted 4 (300).txt → data/train/labels_converted\4 (300).txt
Converted 4 (302).txt → data/train/labels_converted\4 (302).txt
Converted 4 (303).txt → data/train/labels_converted\4 (303).txt
Converted 4 (304).txt → data/train/labels_converted\4 (304).txt
Converted 4 (306).txt → data/train/labels_converted\4 (306).txt
Converted 4 (308).txt → data/train/labels_converted\4 (308).txt
Converted 4 (309).txt → data/train/labels_converted\4 (309).txt
Converted 4 (310).txt → data/train/labels_converted\4 (310).txt
Converted 4 (311).txt → data/train/labels_converted\4 (311).txt
Converted 4 (312).txt → data/train/labels_converted\4 (312).txt
Converted 4 (316).txt → data/train/labels_converted\4 (316).txt
Converted 4 (317).txt → data/train/labels_converted\4 (317).txt
Converted 4 (319).txt → data/train/labels_converted\4 (319).txt
Converted 4 (320).txt → data/train/labels_converted\4 (320).txt
Converted 4 (321).txt → data/train/labels_converted\4 (321).txt
Converted 4 (322).txt → data/train/labels_converted\4 (322).txt
Converted 4 (323).txt → data/train/labels_converted\4 (323).txt
Converted 4 (324).txt → data/train/labels_converted\4 (324).txt
Converted 4 (327).txt → data/train/labels_converted\4 (327).txt
Converted 4 (328).txt → data/train/labels_converted\4 (328).txt
Converted 4 (33).txt → data/train/labels_converted\4 (33).txt
Converted 4 (330).txt → data/train/labels_converted\4 (330).txt
Converted 4 (331).txt → data/train/labels_converted\4 (331).txt
Converted 4 (332).txt → data/train/labels_converted\4 (332).txt
Converted 4 (333).txt → data/train/labels_converted\4 (333).txt
Converted 4 (334).txt → data/train/labels_converted\4 (334).txt
Converted 4 (335).txt → data/train/labels_converted\4 (335).txt
Converted 4 (337).txt → data/train/labels_converted\4 (337).txt
Converted 4 (339).txt → data/train/labels_converted\4 (339).txt
Converted 4 (341).txt → data/train/labels_converted\4 (341).txt
Converted 4 (342).txt → data/train/labels_converted\4 (342).txt
Converted 4 (344).txt → data/train/labels_converted\4 (344).txt
Converted 4 (345).txt → data/train/labels_converted\4 (345).txt
Converted 4 (346).txt → data/train/labels_converted\4 (346).txt
Converted 4 (347).txt → data/train/labels_converted\4 (347).txt
Converted 4 (348).txt → data/train/labels_converted\4 (348).txt
Converted 4 (349).txt → data/train/labels_converted\4 (349).txt
Converted 4 (35).txt → data/train/labels_converted\4 (35).txt
Converted 4 (350).txt → data/train/labels_converted\4 (350).txt
Converted 4 (351).txt → data/train/labels_converted\4 (351).txt
Converted 4 (352).txt → data/train/labels_converted\4 (352).txt
Converted 4 (353).txt → data/train/labels_converted\4 (353).txt
Converted 4 (356).txt → data/train/labels_converted\4 (356).txt
Converted 4 (358).txt → data/train/labels_converted\4 (358).txt
Converted 4 (359).txt → data/train/labels_converted\4 (359).txt
Converted 4 (36).txt → data/train/labels_converted\4 (36).txt
Converted 4 (362).txt → data/train/labels_converted\4 (362).txt
Converted 4 (363).txt → data/train/labels_converted\4 (363).txt
Converted 4 (364).txt → data/train/labels_converted\4 (364).txt
Converted 4 (365).txt → data/train/labels_converted\4 (365).txt
Converted 4 (367).txt → data/train/labels_converted\4 (367).txt
Converted 4 (368).txt → data/train/labels_converted\4 (368).txt
Converted 4 (37).txt → data/train/labels_converted\4 (37).txt
Converted 4 (371).txt → data/train/labels_converted\4 (371).txt
Converted 4 (373).txt → data/train/labels_converted\4 (373).txt
Converted 4 (375).txt → data/train/labels_converted\4 (375).txt
Converted 4 (376).txt → data/train/labels_converted\4 (376).txt
Converted 4 (38).txt → data/train/labels_converted\4 (38).txt
Converted 4 (39).txt → data/train/labels_converted\4 (39).txt
Converted 4 (4).txt → data/train/labels_converted\4 (4).txt
Converted 4 (40).txt → data/train/labels_converted\4 (40).txt
Converted 4 (41).txt → data/train/labels_converted\4 (41).txt
Converted 4 (42).txt → data/train/labels_converted\4 (42).txt
Converted 4 (45).txt → data/train/labels_converted\4 (45).txt
Converted 4 (46).txt → data/train/labels_converted\4 (46).txt
Converted 4 (47).txt → data/train/labels_converted\4 (47).txt
Converted 4 (48).txt → data/train/labels_converted\4 (48).txt
Converted 4 (49).txt → data/train/labels_converted\4 (49).txt
Converted 4 (5).txt → data/train/labels_converted\4 (5).txt
Converted 4 (50).txt → data/train/labels_converted\4 (50).txt
Converted 4 (51).txt → data/train/labels_converted\4 (51).txt
Converted 4 (54).txt → data/train/labels_converted\4 (54).txt
Converted 4 (55).txt → data/train/labels_converted\4 (55).txt
Converted 4 (56).txt → data/train/labels_converted\4 (56).txt
Converted 4 (57).txt → data/train/labels_converted\4 (57).txt
Converted 4 (58).txt → data/train/labels_converted\4 (58).txt
Converted 4 (59).txt → data/train/labels_converted\4 (59).txt
Converted 4 (6).txt → data/train/labels_converted\4 (6).txt
Converted 4 (60).txt → data/train/labels_converted\4 (60).txt
Converted 4 (61).txt → data/train/labels_converted\4 (61).txt
Converted 4 (62).txt → data/train/labels_converted\4 (62).txt
Converted 4 (63).txt → data/train/labels_converted\4 (63).txt
Converted 4 (65).txt → data/train/labels_converted\4 (65).txt
Converted 4 (66).txt → data/train/labels_converted\4 (66).txt
Converted 4 (67).txt → data/train/labels_converted\4 (67).txt
Converted 4 (69).txt → data/train/labels_converted\4 (69).txt
Converted 4 (7).txt → data/train/labels_converted\4 (7).txt
Converted 4 (71).txt → data/train/labels_converted\4 (71).txt
Converted 4 (72).txt → data/train/labels_converted\4 (72).txt
Converted 4 (73).txt → data/train/labels_converted\4 (73).txt
Converted 4 (76).txt → data/train/labels_converted\4 (76).txt
Converted 4 (77).txt → data/train/labels_converted\4 (77).txt
Converted 4 (78).txt → data/train/labels_converted\4 (78).txt
Converted 4 (8).txt → data/train/labels_converted\4 (8).txt
Converted 4 (80).txt → data/train/labels_converted\4 (80).txt
Converted 4 (82).txt → data/train/labels_converted\4 (82).txt
Converted 4 (83).txt → data/train/labels_converted\4 (83).txt
Converted 4 (84).txt → data/train/labels_converted\4 (84).txt
Converted 4 (85).txt → data/train/labels_converted\4 (85).txt
Converted 4 (87).txt → data/train/labels_converted\4 (87).txt
Converted 4 (89).txt → data/train/labels_converted\4 (89).txt
Converted 4 (9).txt → data/train/labels_converted\4 (9).txt
Converted 4 (92).txt → data/train/labels_converted\4 (92).txt
Converted 4 (93).txt → data/train/labels_converted\4 (93).txt
Converted 4 (94).txt → data/train/labels_converted\4 (94).txt
Converted 4 (95).txt → data/train/labels_converted\4 (95).txt
Converted 4 (96).txt → data/train/labels_converted\4 (96).txt
Converted 4 (98).txt → data/train/labels_converted\4 (98).txt
Converted 4 (99).txt → data/train/labels_converted\4 (99).txt
Converted 1 (103).txt → data/test/labels_converted\1 (103).txt
Converted 1 (121).txt → data/test/labels_converted\1 (121).txt
Converted 1 (128).txt → data/test/labels_converted\1 (128).txt
Converted 1 (130).txt → data/test/labels_converted\1 (130).txt
Converted 1 (131).txt → data/test/labels_converted\1 (131).txt
Converted 1 (137).txt → data/test/labels_converted\1 (137).txt
Converted 1 (144).txt → data/test/labels_converted\1 (144).txt
Converted 1 (154).txt → data/test/labels_converted\1 (154).txt
Converted 1 (168).txt → data/test/labels_converted\1 (168).txt
Converted 1 (171).txt → data/test/labels_converted\1 (171).txt
Converted 1 (178).txt → data/test/labels_converted\1 (178).txt
Converted 1 (179).txt → data/test/labels_converted\1 (179).txt
Converted 1 (18).txt → data/test/labels_converted\1 (18).txt
Converted 1 (183).txt → data/test/labels_converted\1 (183).txt
Converted 1 (192).txt → data/test/labels_converted\1 (192).txt
Converted 1 (196).txt → data/test/labels_converted\1 (196).txt
Converted 1 (198).txt → data/test/labels_converted\1 (198).txt
Converted 1 (199).txt → data/test/labels_converted\1 (199).txt
Converted 1 (201).txt → data/test/labels_converted\1 (201).txt
Converted 1 (207).txt → data/test/labels_converted\1 (207).txt
Converted 1 (219).txt → data/test/labels_converted\1 (219).txt
Converted 1 (221).txt → data/test/labels_converted\1 (221).txt
Converted 1 (222).txt → data/test/labels_converted\1 (222).txt
Converted 1 (225).txt → data/test/labels_converted\1 (225).txt
Converted 1 (231).txt → data/test/labels_converted\1 (231).txt
Converted 1 (243).txt → data/test/labels_converted\1 (243).txt
Converted 1 (247).txt → data/test/labels_converted\1 (247).txt
Converted 1 (257).txt → data/test/labels_converted\1 (257).txt
Converted 1 (289).txt → data/test/labels_converted\1 (289).txt
Converted 1 (292).txt → data/test/labels_converted\1 (292).txt
Converted 1 (30).txt → data/test/labels_converted\1 (30).txt
Converted 1 (308).txt → data/test/labels_converted\1 (308).txt
Converted 1 (317).txt → data/test/labels_converted\1 (317).txt
Converted 1 (34).txt → data/test/labels_converted\1 (34).txt
Converted 1 (35).txt → data/test/labels_converted\1 (35).txt
Converted 1 (356).txt → data/test/labels_converted\1 (356).txt
Converted 1 (365).txt → data/test/labels_converted\1 (365).txt
Converted 1 (372).txt → data/test/labels_converted\1 (372).txt
Converted 1 (373).txt → data/test/labels_converted\1 (373).txt
Converted 1 (376).txt → data/test/labels_converted\1 (376).txt
Converted 1 (41).txt → data/test/labels_converted\1 (41).txt
Converted 1 (47).txt → data/test/labels_converted\1 (47).txt
Converted 1 (53).txt → data/test/labels_converted\1 (53).txt
Converted 1 (55).txt → data/test/labels_converted\1 (55).txt
Converted 1 (66).txt → data/test/labels_converted\1 (66).txt
Converted 1 (74).txt → data/test/labels_converted\1 (74).txt
Converted 1 (76).txt → data/test/labels_converted\1 (76).txt
Converted 1 (83).txt → data/test/labels_converted\1 (83).txt
Converted 1 (94).txt → data/test/labels_converted\1 (94).txt
Converted 2 (100).txt → data/test/labels_converted\2 (100).txt
Converted 2 (113).txt → data/test/labels_converted\2 (113).txt
Converted 2 (114).txt → data/test/labels_converted\2 (114).txt
Converted 2 (115).txt → data/test/labels_converted\2 (115).txt
Converted 2 (119).txt → data/test/labels_converted\2 (119).txt
Converted 2 (120).txt → data/test/labels_converted\2 (120).txt
Converted 2 (122).txt → data/test/labels_converted\2 (122).txt
Converted 2 (123).txt → data/test/labels_converted\2 (123).txt
Converted 2 (130).txt → data/test/labels_converted\2 (130).txt
Converted 2 (138).txt → data/test/labels_converted\2 (138).txt
Converted 2 (144).txt → data/test/labels_converted\2 (144).txt
Converted 2 (152).txt → data/test/labels_converted\2 (152).txt
Converted 2 (154).txt → data/test/labels_converted\2 (154).txt
Converted 2 (169).txt → data/test/labels_converted\2 (169).txt
Converted 2 (175).txt → data/test/labels_converted\2 (175).txt
Converted 2 (182).txt → data/test/labels_converted\2 (182).txt
Converted 2 (197).txt → data/test/labels_converted\2 (197).txt
Converted 2 (208).txt → data/test/labels_converted\2 (208).txt
Converted 2 (214).txt → data/test/labels_converted\2 (214).txt
Converted 2 (226).txt → data/test/labels_converted\2 (226).txt
Converted 2 (227).txt → data/test/labels_converted\2 (227).txt
Converted 2 (234).txt → data/test/labels_converted\2 (234).txt
Converted 2 (243).txt → data/test/labels_converted\2 (243).txt
Converted 2 (246).txt → data/test/labels_converted\2 (246).txt
Converted 2 (249).txt → data/test/labels_converted\2 (249).txt
Converted 2 (268).txt → data/test/labels_converted\2 (268).txt
Converted 2 (269).txt → data/test/labels_converted\2 (269).txt
Converted 2 (270).txt → data/test/labels_converted\2 (270).txt
Converted 2 (286).txt → data/test/labels_converted\2 (286).txt
Converted 2 (290).txt → data/test/labels_converted\2 (290).txt
Converted 2 (306).txt → data/test/labels_converted\2 (306).txt
Converted 2 (316).txt → data/test/labels_converted\2 (316).txt
Converted 2 (323).txt → data/test/labels_converted\2 (323).txt
Converted 2 (326).txt → data/test/labels_converted\2 (326).txt
Converted 2 (327).txt → data/test/labels_converted\2 (327).txt
Converted 2 (328).txt → data/test/labels_converted\2 (328).txt
Converted 2 (333).txt → data/test/labels_converted\2 (333).txt
Converted 2 (339).txt → data/test/labels_converted\2 (339).txt
Converted 2 (34).txt → data/test/labels_converted\2 (34).txt
Converted 2 (341).txt → data/test/labels_converted\2 (341).txt
Converted 2 (343).txt → data/test/labels_converted\2 (343).txt
Converted 2 (353).txt → data/test/labels_converted\2 (353).txt
Converted 2 (366).txt → data/test/labels_converted\2 (366).txt
Converted 2 (374).txt → data/test/labels_converted\2 (374).txt
Converted 2 (376).txt → data/test/labels_converted\2 (376).txt
Converted 2 (53).txt → data/test/labels_converted\2 (53).txt
Converted 2 (62).txt → data/test/labels_converted\2 (62).txt
Converted 2 (63).txt → data/test/labels_converted\2 (63).txt
Converted 2 (66).txt → data/test/labels_converted\2 (66).txt
Converted 2 (71).txt → data/test/labels_converted\2 (71).txt
Converted 2 (72).txt → data/test/labels_converted\2 (72).txt
Converted 2 (73).txt → data/test/labels_converted\2 (73).txt
Converted 2 (78).txt → data/test/labels_converted\2 (78).txt
Converted 2 (83).txt → data/test/labels_converted\2 (83).txt
Converted 2 (85).txt → data/test/labels_converted\2 (85).txt
Converted 2 (95).txt → data/test/labels_converted\2 (95).txt
Converted 2 (97).txt → data/test/labels_converted\2 (97).txt
Converted 3 (12).txt → data/test/labels_converted\3 (12).txt
Converted 3 (120).txt → data/test/labels_converted\3 (120).txt
Converted 3 (122).txt → data/test/labels_converted\3 (122).txt
Converted 3 (123).txt → data/test/labels_converted\3 (123).txt
Converted 3 (129).txt → data/test/labels_converted\3 (129).txt
Converted 3 (132).txt → data/test/labels_converted\3 (132).txt
Converted 3 (139).txt → data/test/labels_converted\3 (139).txt
Converted 3 (143).txt → data/test/labels_converted\3 (143).txt
Converted 3 (144).txt → data/test/labels_converted\3 (144).txt
Converted 3 (146).txt → data/test/labels_converted\3 (146).txt
Converted 3 (157).txt → data/test/labels_converted\3 (157).txt
Converted 3 (164).txt → data/test/labels_converted\3 (164).txt
Converted 3 (166).txt → data/test/labels_converted\3 (166).txt
Converted 3 (173).txt → data/test/labels_converted\3 (173).txt
Converted 3 (192).txt → data/test/labels_converted\3 (192).txt
Converted 3 (206).txt → data/test/labels_converted\3 (206).txt
Converted 3 (209).txt → data/test/labels_converted\3 (209).txt
Converted 3 (213).txt → data/test/labels_converted\3 (213).txt
Converted 3 (214).txt → data/test/labels_converted\3 (214).txt
Converted 3 (219).txt → data/test/labels_converted\3 (219).txt
Converted 3 (228).txt → data/test/labels_converted\3 (228).txt
Converted 3 (232).txt → data/test/labels_converted\3 (232).txt
Converted 3 (233).txt → data/test/labels_converted\3 (233).txt
Converted 3 (240).txt → data/test/labels_converted\3 (240).txt
Converted 3 (256).txt → data/test/labels_converted\3 (256).txt
Converted 3 (261).txt → data/test/labels_converted\3 (261).txt
Converted 3 (265).txt → data/test/labels_converted\3 (265).txt
Converted 3 (266).txt → data/test/labels_converted\3 (266).txt
Converted 3 (271).txt → data/test/labels_converted\3 (271).txt
Converted 3 (272).txt → data/test/labels_converted\3 (272).txt
Converted 3 (281).txt → data/test/labels_converted\3 (281).txt
Converted 3 (287).txt → data/test/labels_converted\3 (287).txt
Converted 3 (314).txt → data/test/labels_converted\3 (314).txt
Converted 3 (320).txt → data/test/labels_converted\3 (320).txt
Converted 3 (323).txt → data/test/labels_converted\3 (323).txt
Converted 3 (328).txt → data/test/labels_converted\3 (328).txt
Converted 3 (329).txt → data/test/labels_converted\3 (329).txt
Converted 3 (334).txt → data/test/labels_converted\3 (334).txt
Converted 3 (337).txt → data/test/labels_converted\3 (337).txt
Converted 3 (351).txt → data/test/labels_converted\3 (351).txt
Converted 3 (354).txt → data/test/labels_converted\3 (354).txt
Converted 3 (46).txt → data/test/labels_converted\3 (46).txt
Converted 3 (52).txt → data/test/labels_converted\3 (52).txt
Converted 3 (54).txt → data/test/labels_converted\3 (54).txt
Converted 3 (55).txt → data/test/labels_converted\3 (55).txt
Converted 3 (58).txt → data/test/labels_converted\3 (58).txt
Converted 3 (59).txt → data/test/labels_converted\3 (59).txt
Converted 3 (67).txt → data/test/labels_converted\3 (67).txt
Converted 3 (7).txt → data/test/labels_converted\3 (7).txt
Converted 3 (79).txt → data/test/labels_converted\3 (79).txt
Converted 3 (8).txt → data/test/labels_converted\3 (8).txt
Converted 3 (83).txt → data/test/labels_converted\3 (83).txt
Converted 3 (90).txt → data/test/labels_converted\3 (90).txt
Converted 3 (93).txt → data/test/labels_converted\3 (93).txt
Converted 3 (97).txt → data/test/labels_converted\3 (97).txt
Converted 4 (102).txt → data/test/labels_converted\4 (102).txt
Converted 4 (105).txt → data/test/labels_converted\4 (105).txt
Converted 4 (107).txt → data/test/labels_converted\4 (107).txt
Converted 4 (112).txt → data/test/labels_converted\4 (112).txt
Converted 4 (116).txt → data/test/labels_converted\4 (116).txt
Converted 4 (131).txt → data/test/labels_converted\4 (131).txt
Converted 4 (132).txt → data/test/labels_converted\4 (132).txt
Converted 4 (136).txt → data/test/labels_converted\4 (136).txt
Converted 4 (138).txt → data/test/labels_converted\4 (138).txt
Converted 4 (148).txt → data/test/labels_converted\4 (148).txt
Converted 4 (152).txt → data/test/labels_converted\4 (152).txt
Converted 4 (153).txt → data/test/labels_converted\4 (153).txt
Converted 4 (155).txt → data/test/labels_converted\4 (155).txt
Converted 4 (16).txt → data/test/labels_converted\4 (16).txt
Converted 4 (163).txt → data/test/labels_converted\4 (163).txt
Converted 4 (173).txt → data/test/labels_converted\4 (173).txt
Converted 4 (179).txt → data/test/labels_converted\4 (179).txt
Converted 4 (18).txt → data/test/labels_converted\4 (18).txt
Converted 4 (19).txt → data/test/labels_converted\4 (19).txt
Converted 4 (191).txt → data/test/labels_converted\4 (191).txt
Converted 4 (196).txt → data/test/labels_converted\4 (196).txt
Converted 4 (199).txt → data/test/labels_converted\4 (199).txt
Converted 4 (200).txt → data/test/labels_converted\4 (200).txt
Converted 4 (209).txt → data/test/labels_converted\4 (209).txt
Converted 4 (210).txt → data/test/labels_converted\4 (210).txt
Converted 4 (213).txt → data/test/labels_converted\4 (213).txt
Converted 4 (218).txt → data/test/labels_converted\4 (218).txt
Converted 4 (222).txt → data/test/labels_converted\4 (222).txt
Converted 4 (224).txt → data/test/labels_converted\4 (224).txt
Converted 4 (226).txt → data/test/labels_converted\4 (226).txt
Converted 4 (23).txt → data/test/labels_converted\4 (23).txt
Converted 4 (233).txt → data/test/labels_converted\4 (233).txt
Converted 4 (234).txt → data/test/labels_converted\4 (234).txt
Converted 4 (235).txt → data/test/labels_converted\4 (235).txt
Converted 4 (243).txt → data/test/labels_converted\4 (243).txt
Converted 4 (252).txt → data/test/labels_converted\4 (252).txt
Converted 4 (254).txt → data/test/labels_converted\4 (254).txt
Converted 4 (257).txt → data/test/labels_converted\4 (257).txt
Converted 4 (260).txt → data/test/labels_converted\4 (260).txt
Converted 4 (266).txt → data/test/labels_converted\4 (266).txt
Converted 4 (270).txt → data/test/labels_converted\4 (270).txt
Converted 4 (272).txt → data/test/labels_converted\4 (272).txt
Converted 4 (274).txt → data/test/labels_converted\4 (274).txt
Converted 4 (275).txt → data/test/labels_converted\4 (275).txt
Converted 4 (288).txt → data/test/labels_converted\4 (288).txt
Converted 4 (29).txt → data/test/labels_converted\4 (29).txt
Converted 4 (294).txt → data/test/labels_converted\4 (294).txt
Converted 4 (295).txt → data/test/labels_converted\4 (295).txt
Converted 4 (305).txt → data/test/labels_converted\4 (305).txt
Converted 4 (307).txt → data/test/labels_converted\4 (307).txt
Converted 4 (315).txt → data/test/labels_converted\4 (315).txt
Converted 4 (329).txt → data/test/labels_converted\4 (329).txt
Converted 4 (336).txt → data/test/labels_converted\4 (336).txt
Converted 4 (34).txt → data/test/labels_converted\4 (34).txt
Converted 4 (357).txt → data/test/labels_converted\4 (357).txt
Converted 4 (366).txt → data/test/labels_converted\4 (366).txt
Converted 4 (369).txt → data/test/labels_converted\4 (369).txt
Converted 4 (372).txt → data/test/labels_converted\4 (372).txt
Converted 4 (374).txt → data/test/labels_converted\4 (374).txt
Converted 4 (44).txt → data/test/labels_converted\4 (44).txt
Converted 4 (53).txt → data/test/labels_converted\4 (53).txt
Converted 4 (68).txt → data/test/labels_converted\4 (68).txt
Converted 4 (75).txt → data/test/labels_converted\4 (75).txt
Converted 4 (79).txt → data/test/labels_converted\4 (79).txt
Converted 4 (81).txt → data/test/labels_converted\4 (81).txt
Converted 4 (90).txt → data/test/labels_converted\4 (90).txt
Converted 1 (1).txt → data/valid/labels_converted\1 (1).txt
Converted 1 (102).txt → data/valid/labels_converted\1 (102).txt
Converted 1 (111).txt → data/valid/labels_converted\1 (111).txt
Converted 1 (120).txt → data/valid/labels_converted\1 (120).txt
Converted 1 (122).txt → data/valid/labels_converted\1 (122).txt
Converted 1 (127).txt → data/valid/labels_converted\1 (127).txt
Converted 1 (136).txt → data/valid/labels_converted\1 (136).txt
Converted 1 (138).txt → data/valid/labels_converted\1 (138).txt
Converted 1 (145).txt → data/valid/labels_converted\1 (145).txt
Converted 1 (149).txt → data/valid/labels_converted\1 (149).txt
Converted 1 (15).txt → data/valid/labels_converted\1 (15).txt
Converted 1 (159).txt → data/valid/labels_converted\1 (159).txt
Converted 1 (162).txt → data/valid/labels_converted\1 (162).txt
Converted 1 (17).txt → data/valid/labels_converted\1 (17).txt
Converted 1 (170).txt → data/valid/labels_converted\1 (170).txt
Converted 1 (174).txt → data/valid/labels_converted\1 (174).txt
Converted 1 (177).txt → data/valid/labels_converted\1 (177).txt
Converted 1 (191).txt → data/valid/labels_converted\1 (191).txt
Converted 1 (194).txt → data/valid/labels_converted\1 (194).txt
Converted 1 (200).txt → data/valid/labels_converted\1 (200).txt
Converted 1 (202).txt → data/valid/labels_converted\1 (202).txt
Converted 1 (203).txt → data/valid/labels_converted\1 (203).txt
Converted 1 (208).txt → data/valid/labels_converted\1 (208).txt
Converted 1 (212).txt → data/valid/labels_converted\1 (212).txt
Converted 1 (214).txt → data/valid/labels_converted\1 (214).txt
Converted 1 (223).txt → data/valid/labels_converted\1 (223).txt
Converted 1 (228).txt → data/valid/labels_converted\1 (228).txt
Converted 1 (234).txt → data/valid/labels_converted\1 (234).txt
Converted 1 (235).txt → data/valid/labels_converted\1 (235).txt
Converted 1 (249).txt → data/valid/labels_converted\1 (249).txt
Converted 1 (250).txt → data/valid/labels_converted\1 (250).txt
Converted 1 (261).txt → data/valid/labels_converted\1 (261).txt
Converted 1 (263).txt → data/valid/labels_converted\1 (263).txt
Converted 1 (264).txt → data/valid/labels_converted\1 (264).txt
Converted 1 (266).txt → data/valid/labels_converted\1 (266).txt
Converted 1 (284).txt → data/valid/labels_converted\1 (284).txt
Converted 1 (288).txt → data/valid/labels_converted\1 (288).txt
Converted 1 (29).txt → data/valid/labels_converted\1 (29).txt
Converted 1 (291).txt → data/valid/labels_converted\1 (291).txt
Converted 1 (296).txt → data/valid/labels_converted\1 (296).txt
Converted 1 (298).txt → data/valid/labels_converted\1 (298).txt
Converted 1 (3).txt → data/valid/labels_converted\1 (3).txt
Converted 1 (310).txt → data/valid/labels_converted\1 (310).txt
Converted 1 (327).txt → data/valid/labels_converted\1 (327).txt
Converted 1 (334).txt → data/valid/labels_converted\1 (334).txt
Converted 1 (357).txt → data/valid/labels_converted\1 (357).txt
Converted 1 (366).txt → data/valid/labels_converted\1 (366).txt
Converted 1 (367).txt → data/valid/labels_converted\1 (367).txt
Converted 1 (369).txt → data/valid/labels_converted\1 (369).txt
Converted 1 (39).txt → data/valid/labels_converted\1 (39).txt
Converted 1 (40).txt → data/valid/labels_converted\1 (40).txt
Converted 1 (48).txt → data/valid/labels_converted\1 (48).txt
Converted 1 (5).txt → data/valid/labels_converted\1 (5).txt
Converted 1 (51).txt → data/valid/labels_converted\1 (51).txt
Converted 1 (54).txt → data/valid/labels_converted\1 (54).txt
Converted 1 (6).txt → data/valid/labels_converted\1 (6).txt
Converted 1 (61).txt → data/valid/labels_converted\1 (61).txt
Converted 1 (62).txt → data/valid/labels_converted\1 (62).txt
Converted 1 (72).txt → data/valid/labels_converted\1 (72).txt
Converted 1 (73).txt → data/valid/labels_converted\1 (73).txt
Converted 1 (80).txt → data/valid/labels_converted\1 (80).txt
Converted 1 (9).txt → data/valid/labels_converted\1 (9).txt
Converted 2 (1).txt → data/valid/labels_converted\2 (1).txt
Converted 2 (103).txt → data/valid/labels_converted\2 (103).txt
Converted 2 (109).txt → data/valid/labels_converted\2 (109).txt
Converted 2 (11).txt → data/valid/labels_converted\2 (11).txt
Converted 2 (117).txt → data/valid/labels_converted\2 (117).txt
Converted 2 (118).txt → data/valid/labels_converted\2 (118).txt
Converted 2 (128).txt → data/valid/labels_converted\2 (128).txt
Converted 2 (131).txt → data/valid/labels_converted\2 (131).txt
Converted 2 (143).txt → data/valid/labels_converted\2 (143).txt
Converted 2 (153).txt → data/valid/labels_converted\2 (153).txt
Converted 2 (159).txt → data/valid/labels_converted\2 (159).txt
Converted 2 (16).txt → data/valid/labels_converted\2 (16).txt
Converted 2 (17).txt → data/valid/labels_converted\2 (17).txt
Converted 2 (171).txt → data/valid/labels_converted\2 (171).txt
Converted 2 (172).txt → data/valid/labels_converted\2 (172).txt
Converted 2 (18).txt → data/valid/labels_converted\2 (18).txt
Converted 2 (181).txt → data/valid/labels_converted\2 (181).txt
Converted 2 (198).txt → data/valid/labels_converted\2 (198).txt
Converted 2 (207).txt → data/valid/labels_converted\2 (207).txt
Converted 2 (210).txt → data/valid/labels_converted\2 (210).txt
Converted 2 (212).txt → data/valid/labels_converted\2 (212).txt
Converted 2 (23).txt → data/valid/labels_converted\2 (23).txt
Converted 2 (233).txt → data/valid/labels_converted\2 (233).txt
Converted 2 (25).txt → data/valid/labels_converted\2 (25).txt
Converted 2 (256).txt → data/valid/labels_converted\2 (256).txt
Converted 2 (264).txt → data/valid/labels_converted\2 (264).txt
Converted 2 (274).txt → data/valid/labels_converted\2 (274).txt
Converted 2 (279).txt → data/valid/labels_converted\2 (279).txt
Converted 2 (28).txt → data/valid/labels_converted\2 (28).txt
Converted 2 (289).txt → data/valid/labels_converted\2 (289).txt
Converted 2 (29).txt → data/valid/labels_converted\2 (29).txt
Converted 2 (297).txt → data/valid/labels_converted\2 (297).txt
Converted 2 (311).txt → data/valid/labels_converted\2 (311).txt
Converted 2 (312).txt → data/valid/labels_converted\2 (312).txt
Converted 2 (331).txt → data/valid/labels_converted\2 (331).txt
Converted 2 (332).txt → data/valid/labels_converted\2 (332).txt
Converted 2 (337).txt → data/valid/labels_converted\2 (337).txt
Converted 2 (345).txt → data/valid/labels_converted\2 (345).txt
Converted 2 (351).txt → data/valid/labels_converted\2 (351).txt
Converted 2 (355).txt → data/valid/labels_converted\2 (355).txt
Converted 2 (358).txt → data/valid/labels_converted\2 (358).txt
Converted 2 (361).txt → data/valid/labels_converted\2 (361).txt
Converted 2 (370).txt → data/valid/labels_converted\2 (370).txt
Converted 2 (46).txt → data/valid/labels_converted\2 (46).txt
Converted 2 (49).txt → data/valid/labels_converted\2 (49).txt
Converted 2 (55).txt → data/valid/labels_converted\2 (55).txt
Converted 2 (70).txt → data/valid/labels_converted\2 (70).txt
Converted 2 (87).txt → data/valid/labels_converted\2 (87).txt
Converted 2 (88).txt → data/valid/labels_converted\2 (88).txt
Converted 2 (91).txt → data/valid/labels_converted\2 (91).txt
Converted 2 (99).txt → data/valid/labels_converted\2 (99).txt
Converted 3 (106).txt → data/valid/labels_converted\3 (106).txt
Converted 3 (107).txt → data/valid/labels_converted\3 (107).txt
Converted 3 (11).txt → data/valid/labels_converted\3 (11).txt
Converted 3 (111).txt → data/valid/labels_converted\3 (111).txt
Converted 3 (114).txt → data/valid/labels_converted\3 (114).txt
Converted 3 (134).txt → data/valid/labels_converted\3 (134).txt
Converted 3 (137).txt → data/valid/labels_converted\3 (137).txt
Converted 3 (154).txt → data/valid/labels_converted\3 (154).txt
Converted 3 (156).txt → data/valid/labels_converted\3 (156).txt
Converted 3 (158).txt → data/valid/labels_converted\3 (158).txt
Converted 3 (163).txt → data/valid/labels_converted\3 (163).txt
Converted 3 (168).txt → data/valid/labels_converted\3 (168).txt
Converted 3 (170).txt → data/valid/labels_converted\3 (170).txt
Converted 3 (174).txt → data/valid/labels_converted\3 (174).txt
Converted 3 (176).txt → data/valid/labels_converted\3 (176).txt
Converted 3 (186).txt → data/valid/labels_converted\3 (186).txt
Converted 3 (189).txt → data/valid/labels_converted\3 (189).txt
Converted 3 (198).txt → data/valid/labels_converted\3 (198).txt
Converted 3 (2).txt → data/valid/labels_converted\3 (2).txt
Converted 3 (20).txt → data/valid/labels_converted\3 (20).txt
Converted 3 (205).txt → data/valid/labels_converted\3 (205).txt
Converted 3 (208).txt → data/valid/labels_converted\3 (208).txt
Converted 3 (210).txt → data/valid/labels_converted\3 (210).txt
Converted 3 (215).txt → data/valid/labels_converted\3 (215).txt
Converted 3 (221).txt → data/valid/labels_converted\3 (221).txt
Converted 3 (226).txt → data/valid/labels_converted\3 (226).txt
Converted 3 (227).txt → data/valid/labels_converted\3 (227).txt
Converted 3 (234).txt → data/valid/labels_converted\3 (234).txt
Converted 3 (248).txt → data/valid/labels_converted\3 (248).txt
Converted 3 (257).txt → data/valid/labels_converted\3 (257).txt
Converted 3 (263).txt → data/valid/labels_converted\3 (263).txt
Converted 3 (269).txt → data/valid/labels_converted\3 (269).txt
Converted 3 (273).txt → data/valid/labels_converted\3 (273).txt
Converted 3 (293).txt → data/valid/labels_converted\3 (293).txt
Converted 3 (294).txt → data/valid/labels_converted\3 (294).txt
Converted 3 (295).txt → data/valid/labels_converted\3 (295).txt
Converted 3 (318).txt → data/valid/labels_converted\3 (318).txt
Converted 3 (324).txt → data/valid/labels_converted\3 (324).txt
Converted 3 (326).txt → data/valid/labels_converted\3 (326).txt
Converted 3 (338).txt → data/valid/labels_converted\3 (338).txt
Converted 3 (341).txt → data/valid/labels_converted\3 (341).txt
Converted 3 (346).txt → data/valid/labels_converted\3 (346).txt
Converted 3 (364).txt → data/valid/labels_converted\3 (364).txt
Converted 3 (372).txt → data/valid/labels_converted\3 (372).txt
Converted 3 (376).txt → data/valid/labels_converted\3 (376).txt
Converted 3 (47).txt → data/valid/labels_converted\3 (47).txt
Converted 3 (48).txt → data/valid/labels_converted\3 (48).txt
Converted 3 (49).txt → data/valid/labels_converted\3 (49).txt
Converted 3 (51).txt → data/valid/labels_converted\3 (51).txt
Converted 3 (61).txt → data/valid/labels_converted\3 (61).txt
Converted 3 (75).txt → data/valid/labels_converted\3 (75).txt
Converted 3 (76).txt → data/valid/labels_converted\3 (76).txt
Converted 3 (80).txt → data/valid/labels_converted\3 (80).txt
Converted 3 (91).txt → data/valid/labels_converted\3 (91).txt
Converted 3 (98).txt → data/valid/labels_converted\3 (98).txt
Converted 3 (99).txt → data/valid/labels_converted\3 (99).txt
Converted 4 (10).txt → data/valid/labels_converted\4 (10).txt
Converted 4 (118).txt → data/valid/labels_converted\4 (118).txt
Converted 4 (12).txt → data/valid/labels_converted\4 (12).txt
Converted 4 (135).txt → data/valid/labels_converted\4 (135).txt
Converted 4 (137).txt → data/valid/labels_converted\4 (137).txt
Converted 4 (143).txt → data/valid/labels_converted\4 (143).txt
Converted 4 (158).txt → data/valid/labels_converted\4 (158).txt
Converted 4 (160).txt → data/valid/labels_converted\4 (160).txt
Converted 4 (161).txt → data/valid/labels_converted\4 (161).txt
Converted 4 (162).txt → data/valid/labels_converted\4 (162).txt
Converted 4 (164).txt → data/valid/labels_converted\4 (164).txt
Converted 4 (172).txt → data/valid/labels_converted\4 (172).txt
Converted 4 (175).txt → data/valid/labels_converted\4 (175).txt
Converted 4 (181).txt → data/valid/labels_converted\4 (181).txt
Converted 4 (186).txt → data/valid/labels_converted\4 (186).txt
Converted 4 (193).txt → data/valid/labels_converted\4 (193).txt
Converted 4 (197).txt → data/valid/labels_converted\4 (197).txt
Converted 4 (2).txt → data/valid/labels_converted\4 (2).txt
Converted 4 (211).txt → data/valid/labels_converted\4 (211).txt
Converted 4 (231).txt → data/valid/labels_converted\4 (231).txt
Converted 4 (239).txt → data/valid/labels_converted\4 (239).txt
Converted 4 (246).txt → data/valid/labels_converted\4 (246).txt
Converted 4 (262).txt → data/valid/labels_converted\4 (262).txt
Converted 4 (271).txt → data/valid/labels_converted\4 (271).txt
Converted 4 (278).txt → data/valid/labels_converted\4 (278).txt
Converted 4 (283).txt → data/valid/labels_converted\4 (283).txt
Converted 4 (284).txt → data/valid/labels_converted\4 (284).txt
Converted 4 (285).txt → data/valid/labels_converted\4 (285).txt
Converted 4 (290).txt → data/valid/labels_converted\4 (290).txt
Converted 4 (298).txt → data/valid/labels_converted\4 (298).txt
Converted 4 (299).txt → data/valid/labels_converted\4 (299).txt
Converted 4 (301).txt → data/valid/labels_converted\4 (301).txt
Converted 4 (31).txt → data/valid/labels_converted\4 (31).txt
Converted 4 (313).txt → data/valid/labels_converted\4 (313).txt
Converted 4 (314).txt → data/valid/labels_converted\4 (314).txt
Converted 4 (318).txt → data/valid/labels_converted\4 (318).txt
Converted 4 (32).txt → data/valid/labels_converted\4 (32).txt
Converted 4 (325).txt → data/valid/labels_converted\4 (325).txt
Converted 4 (326).txt → data/valid/labels_converted\4 (326).txt
Converted 4 (338).txt → data/valid/labels_converted\4 (338).txt
Converted 4 (340).txt → data/valid/labels_converted\4 (340).txt
Converted 4 (343).txt → data/valid/labels_converted\4 (343).txt
Converted 4 (354).txt → data/valid/labels_converted\4 (354).txt
Converted 4 (355).txt → data/valid/labels_converted\4 (355).txt
Converted 4 (360).txt → data/valid/labels_converted\4 (360).txt
Converted 4 (361).txt → data/valid/labels_converted\4 (361).txt
Converted 4 (370).txt → data/valid/labels_converted\4 (370).txt
Converted 4 (43).txt → data/valid/labels_converted\4 (43).txt
Converted 4 (52).txt → data/valid/labels_converted\4 (52).txt
Converted 4 (64).txt → data/valid/labels_converted\4 (64).txt
Converted 4 (70).txt → data/valid/labels_converted\4 (70).txt
Converted 4 (74).txt → data/valid/labels_converted\4 (74).txt
Converted 4 (86).txt → data/valid/labels_converted\4 (86).txt
Converted 4 (88).txt → data/valid/labels_converted\4 (88).txt
Converted 4 (91).txt → data/valid/labels_converted\4 (91).txt
Converted 4 (97).txt → data/valid/labels_converted\4 (97).txt

Imágenes¶

Adaptar el tamaño de las imágenes según lo que ncesita el modelo. También acomodar el formato de las etiquetas para PyTorch

In [57]:
class CustomDataset(Dataset):
    def __init__(self, dir_path, width, height, classes, transforms=None):
        """
        :param dir_path: Directory containing 'images/' and 'labels_converted/' subfolders.
        :param width: Resized image width.
        :param height: Resized image height.
        :param classes: List of class names (or an indexing scheme).
        :param transforms: Albumentations transformations to apply.
        """
        self.transforms = transforms
        self.dir_path = dir_path
        self.image_dir = os.path.join(self.dir_path, "images")
        self.label_dir = os.path.join(self.dir_path, "labels_converted")
        self.width = width
        self.height = height
        self.classes = classes

        # Gather all image paths
        self.image_file_types = ["*.jpg", "*.jpeg", "*.png", "*.ppm", "*.JPG"]
        self.all_image_paths = []
        for file_type in self.image_file_types:
            self.all_image_paths.extend(glob.glob(os.path.join(self.image_dir, file_type)))

        # Sort for consistent ordering
        self.all_image_paths = sorted(self.all_image_paths)
        self.all_image_names = [os.path.basename(img_p) for img_p in self.all_image_paths]

    def __len__(self):
        return len(self.all_image_paths)

    def __getitem__(self, idx):
        # 1) Read image
        image_name = self.all_image_names[idx]
        image_path = os.path.join(self.image_dir, image_name)
        label_filename = os.path.splitext(image_name)[0] + ".txt"
        label_path = os.path.join(self.label_dir, label_filename)

        image = cv2.imread(image_path)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB).astype(np.float32)

        # 2) Resize image (to the model's expected size)
        image_resized = cv2.resize(image, (self.width, self.height))
        image_resized /= 255.0  # Scale pixel values to [0, 1]

        # 3) Read bounding boxes (normalized) from .txt file
        boxes = []
        labels = []
        if os.path.exists(label_path):
            with open(label_path, "r") as f:
                lines = f.readlines()

            for line in lines:
                line = line.strip()
                if not line:
                    continue
                # Format: class_id x_min y_min x_max y_max  (all in [0..1])
                parts = line.split()
                class_id = int(parts[0])  # e.g. 0, 1, 2, ...
                xmin = float(parts[1])
                ymin = float(parts[2])
                xmax = float(parts[3])
                ymax = float(parts[4])

                # Example: if you want class IDs to start at 1 for foreground
                # and background=0, do:
                label_idx = class_id + 1

                # Convert normalized coords to absolute (in resized space)
                x_min_final = xmin * self.width
                y_min_final = ymin * self.height
                x_max_final = xmax * self.width
                y_max_final = ymax * self.height

                # Ensure valid box
                if x_max_final <= x_min_final:
                    x_max_final = x_min_final + 1
                if y_max_final <= y_min_final:
                    y_max_final = y_min_final + 1

                # Clip if out of bounds
                x_min_final = max(0, min(x_min_final, self.width - 1))
                x_max_final = max(0, min(x_max_final, self.width))
                y_min_final = max(0, min(y_min_final, self.height - 1))
                y_max_final = max(0, min(y_max_final, self.height))

                boxes.append([x_min_final, y_min_final, x_max_final, y_max_final])
                labels.append(label_idx)

        # 4) Convert boxes & labels to Torch tensors
        if len(boxes) == 0:
            boxes = torch.zeros((0, 4), dtype=torch.float32)
            labels = torch.zeros((0,), dtype=torch.int64)
        else:
            boxes = torch.tensor(boxes, dtype=torch.float32)
            labels = torch.tensor(labels, dtype=torch.int64)

        # 5) Prepare the target dict
        area = (
            (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0])
            if len(boxes) > 0
            else torch.tensor([], dtype=torch.float32)
        )
        iscrowd = torch.zeros((len(boxes),), dtype=torch.int64)
        image_id = torch.tensor([idx])

        target = {"boxes": boxes, "labels": labels, "area": area, "iscrowd": iscrowd, "image_id": image_id}

        # 6) Albumentations transforms: pass Python lists, not Tensors
        if self.transforms:
            bboxes_list = boxes.cpu().numpy().tolist()  # shape: list of [xmin, ymin, xmax, ymax]
            labels_list = labels.cpu().numpy().tolist()  # shape: list of ints

            transformed = self.transforms(
                image=image_resized,
                bboxes=bboxes_list,
                labels=labels_list,
            )

            # Reassign the image
            image_resized = transformed["image"]

            # Convert bboxes back to Torch Tensors
            new_bboxes_list = transformed["bboxes"]  # list of [xmin, ymin, xmax, ymax]
            new_labels_list = transformed["labels"]  # list of int

            if len(new_bboxes_list) > 0:
                new_bboxes = torch.tensor(new_bboxes_list, dtype=torch.float32)
                new_labels = torch.tensor(new_labels_list, dtype=torch.int64)
            else:
                new_bboxes = torch.zeros((0, 4), dtype=torch.float32)
                new_labels = torch.zeros((0,), dtype=torch.int64)

            target["boxes"] = new_bboxes
            target["labels"] = new_labels

        return image_resized, target

Crear los datasets en el formato correcto¶

In [58]:
def create_train_dataset(DIR):
    train_dataset = CustomDataset(
        dir_path=DIR, width=RESIZE_TO, height=RESIZE_TO, classes=CLASSES, transforms=get_train_transform()
    )
    return train_dataset


def create_valid_dataset(DIR):
    valid_dataset = CustomDataset(
        dir_path=DIR, width=RESIZE_TO, height=RESIZE_TO, classes=CLASSES, transforms=get_valid_transform()
    )
    return valid_dataset


def create_train_loader(train_dataset, num_workers=NUM_WORKERS):
    train_loader = DataLoader(
        train_dataset,
        batch_size=BATCH_SIZE,
        shuffle=True,
        num_workers=num_workers,
        collate_fn=collate_fn,
        drop_last=True,
    )
    return train_loader


def create_valid_loader(valid_dataset, num_workers=NUM_WORKERS):
    valid_loader = DataLoader(
        valid_dataset,
        batch_size=BATCH_SIZE,
        shuffle=False,
        num_workers=num_workers,
        collate_fn=collate_fn,
        drop_last=True,
    )
    return valid_loader

Crear una instancia de dataframe para cada data set (entrenamiento, validación, pruebas)¶

In [59]:
# Transformo las imagenes de entrenamiento
train_dataset = create_train_dataset(TRAIN_DIR)

# No transformo las imagenes de validacion y prueba
valid_dataset = create_valid_dataset(VALID_DIR)
test_dataset = create_valid_dataset(TEST_DIR)

Crear loaders¶

In [52]:
train_loader = create_train_loader(test_dataset)
valid_loader = create_valid_loader(valid_dataset)
test_loader = create_valid_loader(test_dataset)

Modelo¶

Crear el modelo RetinaNet preentrenado

In [11]:
def create_model(num_classes):
    """
    Creates a RetinaNet-ResNet50-FPN v2 model pre-trained on COCO.
    Replaces the classification head for the required number of classes.
    """
    model = torchvision.models.detection.retinanet_resnet50_fpn_v2(weights=RetinaNet_ResNet50_FPN_V2_Weights.COCO_V1)
    num_anchors = model.head.classification_head.num_anchors

    # Replace the classification head
    model.head.classification_head = RetinaNetClassificationHead(
        in_channels=256, num_anchors=num_anchors, num_classes=num_classes, norm_layer=partial(torch.nn.GroupNorm, 32)
    )
    return model

Entrenamiento¶

Semilla¶

In [12]:
# Para los graficos
plt.style.use("ggplot")

seed = 42
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)

Función para entrenar el modelo¶

In [13]:
def train(train_data_loader, model):
    print("Training")
    model.train()

    # initialize tqdm progress bar
    prog_bar = tqdm(train_data_loader, total=len(train_data_loader))

    for i, data in enumerate(prog_bar):
        optimizer.zero_grad()
        images, targets = data

        images = list(image.to(DEVICE) for image in images)
        targets = [{k: v.to(DEVICE) for k, v in t.items()} for t in targets]
        loss_dict = model(images, targets)

        losses = sum(loss for loss in loss_dict.values())
        loss_value = losses.item()

        train_loss_hist.send(loss_value)

        losses.backward()
        optimizer.step()

        # update the loss value beside the progress bar for each iteration
        prog_bar.set_description(desc=f"Loss: {loss_value:.4f}")
    return loss_value

Función para validar el modelo¶

In [14]:
def validate(valid_data_loader, model):
    print("Validating")
    model.eval()

    # Initialize tqdm progress bar.
    prog_bar = tqdm(valid_data_loader, total=len(valid_data_loader))
    target = []
    preds = []
    for i, data in enumerate(prog_bar):
        images, targets = data

        images = list(image.to(DEVICE) for image in images)
        targets = [{k: v.to(DEVICE) for k, v in t.items()} for t in targets]

        with torch.no_grad():
            outputs = model(images, targets)

        # For mAP calculation using Torchmetrics.
        #####################################
        for i in range(len(images)):
            true_dict = dict()
            preds_dict = dict()
            true_dict["boxes"] = targets[i]["boxes"].detach().cpu()
            true_dict["labels"] = targets[i]["labels"].detach().cpu()
            preds_dict["boxes"] = outputs[i]["boxes"].detach().cpu()
            preds_dict["scores"] = outputs[i]["scores"].detach().cpu()
            preds_dict["labels"] = outputs[i]["labels"].detach().cpu()
            preds.append(preds_dict)
            target.append(true_dict)
        #####################################

    metric.reset()
    metric.update(preds, target)
    metric_summary = metric.compute()
    return metric_summary

Correr el entrenamiento¶

In [ ]:
if __name__ == "__main__":
    os.makedirs("outputs", exist_ok=True)
    train_dataset = create_train_dataset(TRAIN_DIR)
    valid_dataset = create_valid_dataset(VALID_DIR)
    train_loader = create_train_loader(train_dataset, NUM_WORKERS)
    valid_loader = create_valid_loader(valid_dataset, NUM_WORKERS)
    print(f"Number of training samples: {len(train_dataset)}")
    print(f"Number of validation samples: {len(valid_dataset)}\n")

    # Initialize the model and move to the computation device.
    model = create_model(num_classes=NUM_CLASSES)
    model = model.to(DEVICE)
    print(model)
    # Total parameters and trainable parameters.
    total_params = sum(p.numel() for p in model.parameters())
    print(f"{total_params:,} total parameters.")
    total_trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
    print(f"{total_trainable_params:,} training parameters.")
    params = [p for p in model.parameters() if p.requires_grad]
    optimizer = torch.optim.SGD(params, lr=0.01, momentum=0.9, nesterov=True, weight_decay=0.0005)
    scheduler = ReduceLROnPlateau(
        optimizer,
        mode="max",  # we want to maximize mAP
        factor=0.1,  # reduce LR by this factor
        patience=8,  # wait 3 epochs with no improvement
        threshold=0.005,  # how much improvement is considered significant
        cooldown=1,
    )

    # To monitor training loss
    train_loss_hist = Averager()
    # To store training loss and mAP values.
    train_loss_list = []
    map_50_list = []
    map_list = []

    # Mame to save the trained model with.
    MODEL_NAME = "model"

    # Whether to show transformed images from data loader or not.
    if VISUALIZE_TRANSFORMED_IMAGES:
        show_tranformed_image(train_loader)

    # To save best model.
    save_best_model = SaveBestModel()

    metric = MeanAveragePrecision()
    metric.warn_on_many_detections = False

    # Training loop.
    for epoch in range(NUM_EPOCHS):
        print(f"\nEPOCH {epoch+1} of {NUM_EPOCHS}")

        # Reset the training loss histories for the current epoch.
        train_loss_hist.reset()

        # Start timer and carry out training and validation.
        start = time.time()
        train_loss = train(train_loader, model)
        metric_summary = validate(valid_loader, model)
        current_map_05_95 = float(metric_summary["map"])
        current_map_05 = float(metric_summary["map_50"])
        print(f"Epoch #{epoch+1} train loss: {train_loss_hist.value:.3f}")
        print(f"Epoch #{epoch+1} mAP: {metric_summary['map']:.3f}")
        end = time.time()
        print(f"Took {((end - start) / 60):.3f} minutes for epoch {epoch+1}")

        train_loss_list.append(train_loss)
        map_50_list.append(metric_summary["map_50"])
        map_list.append(metric_summary["map"])

        # save the best model till now.
        save_best_model(model, float(metric_summary["map"]), epoch, "outputs")
        # Save the current epoch model.
        save_model(epoch, model, optimizer)

        # Save loss plot.
        save_loss_plot(OUT_DIR, train_loss_list)

        # Save mAP plot.
        save_mAP(OUT_DIR, map_50_list, map_list)
        scheduler.step(current_map_05_95)
        print("Current LR:", scheduler.get_last_lr())
Number of training samples: 2104
Number of validation samples: 450

c:\Users\pablo\AppData\Local\Programs\Python\Python313\Lib\site-packages\albumentations\core\composition.py:331: UserWarning: Got processor for bboxes, but no transform to process it.
  self._set_keys()
RetinaNet(
  (backbone): BackboneWithFPN(
    (body): IntermediateLayerGetter(
      (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (relu): ReLU(inplace=True)
      (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
      (layer1): Sequential(
        (0): Bottleneck(
          (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace=True)
          (downsample): Sequential(
            (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
            (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          )
        )
        (1): Bottleneck(
          (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace=True)
        )
        (2): Bottleneck(
          (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace=True)
        )
      )
      (layer2): Sequential(
        (0): Bottleneck(
          (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace=True)
          (downsample): Sequential(
            (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)
            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          )
        )
        (1): Bottleneck(
          (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace=True)
        )
        (2): Bottleneck(
          (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace=True)
        )
        (3): Bottleneck(
          (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace=True)
        )
      )
      (layer3): Sequential(
        (0): Bottleneck(
          (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace=True)
          (downsample): Sequential(
            (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)
            (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          )
        )
        (1): Bottleneck(
          (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace=True)
        )
        (2): Bottleneck(
          (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace=True)
        )
        (3): Bottleneck(
          (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace=True)
        )
        (4): Bottleneck(
          (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace=True)
        )
        (5): Bottleneck(
          (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace=True)
        )
      )
      (layer4): Sequential(
        (0): Bottleneck(
          (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace=True)
          (downsample): Sequential(
            (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)
            (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          )
        )
        (1): Bottleneck(
          (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace=True)
        )
        (2): Bottleneck(
          (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (relu): ReLU(inplace=True)
        )
      )
    )
    (fpn): FeaturePyramidNetwork(
      (inner_blocks): ModuleList(
        (0): Conv2dNormActivation(
          (0): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1))
        )
        (1): Conv2dNormActivation(
          (0): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1))
        )
        (2): Conv2dNormActivation(
          (0): Conv2d(2048, 256, kernel_size=(1, 1), stride=(1, 1))
        )
      )
      (layer_blocks): ModuleList(
        (0-2): 3 x Conv2dNormActivation(
          (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
        )
      )
      (extra_blocks): LastLevelP6P7(
        (p6): Conv2d(2048, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))
        (p7): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))
      )
    )
  )
  (anchor_generator): AnchorGenerator()
  (head): RetinaNetHead(
    (classification_head): RetinaNetClassificationHead(
      (conv): Sequential(
        (0): Conv2dNormActivation(
          (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (1): GroupNorm(32, 256, eps=1e-05, affine=True)
          (2): ReLU(inplace=True)
        )
        (1): Conv2dNormActivation(
          (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (1): GroupNorm(32, 256, eps=1e-05, affine=True)
          (2): ReLU(inplace=True)
        )
        (2): Conv2dNormActivation(
          (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (1): GroupNorm(32, 256, eps=1e-05, affine=True)
          (2): ReLU(inplace=True)
        )
        (3): Conv2dNormActivation(
          (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (1): GroupNorm(32, 256, eps=1e-05, affine=True)
          (2): ReLU(inplace=True)
        )
      )
      (cls_logits): Conv2d(256, 45, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    )
    (regression_head): RetinaNetRegressionHead(
      (conv): Sequential(
        (0): Conv2dNormActivation(
          (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (1): GroupNorm(32, 256, eps=1e-05, affine=True)
          (2): ReLU(inplace=True)
        )
        (1): Conv2dNormActivation(
          (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (1): GroupNorm(32, 256, eps=1e-05, affine=True)
          (2): ReLU(inplace=True)
        )
        (2): Conv2dNormActivation(
          (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (1): GroupNorm(32, 256, eps=1e-05, affine=True)
          (2): ReLU(inplace=True)
        )
        (3): Conv2dNormActivation(
          (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
          (1): GroupNorm(32, 256, eps=1e-05, affine=True)
          (2): ReLU(inplace=True)
        )
      )
      (bbox_reg): Conv2d(256, 36, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    )
  )
  (transform): GeneralizedRCNNTransform(
      Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
      Resize(min_size=(800,), max_size=1333, mode='bilinear')
  )
)
36,414,865 total parameters.
36,189,521 training parameters.

Evaluación del modelo con el conjunto de prueba¶

Predecir las clases de las imágenes de la carpeta test¶

In [ ]:
# ----- CONFIG -----
TEST_IMG_DIR = os.path.join(TEST_DIR, "images")   # ajusta si hace falta
MODEL_PATH = "outputs/best_model.pth"
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
SCORE_THRESH = 0.3
OUT_JSON = "predictions.json"

# Ejemplo: asegurate CLASSES está definido igual que en entrenamiento
# CLASSES = ["background", "clase1", "clase2", "clase3", "clase4"]

# ----- listar imágenes (dedupe) -----
EXTS = [".jpg", ".jpeg", ".png", ".ppm", ".JPG"]
image_paths = []
for ext in EXTS:
    image_paths.extend(glob.glob(os.path.join(TEST_IMG_DIR, f"*{ext}")))
# dedupe conservando orden
image_paths = list(dict.fromkeys(image_paths))
image_paths = sorted(image_paths)
print("Imágenes encontradas (dedupe):", len(image_paths))

# ----- cargar modelo (robusto) -----
model = create_model(num_classes=len(CLASSES))

ckpt = torch.load(MODEL_PATH, map_location=DEVICE)
if isinstance(ckpt, dict):
    if "model_state_dict" in ckpt:
        state_dict = ckpt["model_state_dict"]
    elif "state_dict" in ckpt:
        state_dict = ckpt["state_dict"]
    else:
        state_dict = ckpt
else:
    state_dict = ckpt

# quitar prefijo module. si existe
new_state = OrderedDict()
for k,v in state_dict.items():
    new_k = k.replace("module.","") if k.startswith("module.") else k
    new_state[new_k] = v

try:
    model.load_state_dict(new_state)
    print("✅ Pesos cargados (strict=True).")
except Exception as e:
    print("⚠️ No pudo cargar con strict=True, intento strict=False. Error:", e)
    model.load_state_dict(new_state, strict=False)
    print("Se cargaron pesos con strict=False.")

model.to(DEVICE)
model.eval()

# ----- inferencia imagen por imagen -----
predictions = {}
counts = Counter()

for img_path in tqdm(image_paths):
    img_name = os.path.basename(img_path)

    img = cv2.imread(img_path)
    if img is None:
        print("⚠️ No pudo leer:", img_path)
        predictions[img_name] = "read_error"
        continue
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.float32) / 255.0

    # convertir a tensor 3D [C,H,W] (NO añadir batch dim)
    img_tensor = torch.from_numpy(img).permute(2,0,1).to(DEVICE)

    with torch.no_grad():
        outputs = model([img_tensor])  # PASAR lista de tensores 3D
    out = outputs[0]

    scores = out.get("scores").cpu().numpy() if len(out.get("scores"))>0 else np.array([])
    labels = out.get("labels").cpu().numpy() if len(out.get("labels"))>0 else np.array([])
    boxes  = out.get("boxes").cpu().numpy()  if len(out.get("boxes"))>0 else np.array([])

    pred_name = "background"
    if scores.size > 0:
        best_idx = int(scores.argmax())
        best_score = float(scores[best_idx])
        best_label = int(labels[best_idx])
        if best_score >= SCORE_THRESH:
            # mapear label -> nombre de clase (cuidado con offset si aplica)
            if 0 <= best_label < len(CLASSES):
                pred_name = CLASSES[best_label]
            else:
                pred_name = str(best_label)
        else:
            pred_name = "background"

    predictions[img_name] = pred_name
    counts[pred_name] += 1

# ----- guardar y mostrar resumen -----
with open(OUT_JSON, "w", encoding="utf-8") as f:
    json.dump(predictions, f, indent=2, ensure_ascii=False)

print(f"\n✅ Predicciones guardadas en {OUT_JSON}")
print("Total imágenes:", len(image_paths))
print("Distribución predicha (top):")
for k,v in counts.most_common(20):
    print(f"  {k}: {v}")

# mostrar primeros 20 predicciones
print("\nPrimeras 20 predicciones:")
for i,(k,v) in enumerate(predictions.items()):
    if i>=20: break
    print(k,"->",v)
Imágenes encontradas (dedupe): 227
✅ Pesos cargados (strict=True).
  0%|          | 0/227 [00:00<?, ?it/s]
✅ Predicciones guardadas en predictions.json
Total imágenes: 227
Distribución predicha (top):
  clase4: 66
  clase2: 57
  clase3: 55
  clase1: 49

Primeras 20 predicciones:
1 (103).jpg -> clase1
1 (121).jpg -> clase1
1 (128).jpg -> clase1
1 (130).jpg -> clase1
1 (131).jpg -> clase1
1 (137).jpg -> clase1
1 (144).jpg -> clase1
1 (154).jpg -> clase1
1 (168).jpg -> clase1
1 (171).jpg -> clase1
1 (178).jpg -> clase1
1 (179).jpg -> clase1
1 (18).jpg -> clase1
1 (183).jpg -> clase1
1 (192).jpg -> clase1
1 (196).jpg -> clase1
1 (198).jpg -> clase1
1 (199).jpg -> clase1
1 (201).jpg -> clase1
1 (207).jpg -> clase1

Extraer la clase real de las etiquetas convertidas¶

In [86]:
import os, glob, json
from collections import Counter

# ---- CONFIG ----
LABEL_DIR = os.path.join(TEST_DIR, "labels_converted")   # tu carpeta de labels
PRED_JSON = "predictions.json"        # archivo que generó el script anterior
OUT_JSON = "predictions_with_gt.json" # salida
# CLASSES debe existir: ejemplo:
# CLASSES = ["background", "búfalo", "elefante", "jirafa", "rinoceronte"]

# ---- 1) cargar predicciones existentes ----
if 'predictions' in globals():
    preds = dict(predictions)   # usar variable en memoria si existe
elif os.path.exists(PRED_JSON):
    with open(PRED_JSON, "r", encoding="utf-8") as f:
        preds = json.load(f)
else:
    raise FileNotFoundError("No encontré 'predictions' en memoria ni el archivo 'predictions.json'.")

# ---- 2) función para leer labels y calcular la 'mode' y sumar +1 ----
def read_gt_for_basename(basename, label_dir):
    """
    Lee label_dir/<basename>.txt y devuelve:
      - gt_raw_list: lista de ints tal como están en el txt (ej [0,0,1])
      - chosen_raw: la raw class escogida por moda (int) o None
      - model_label = chosen_raw + 1 (o None si no hay)
    """
    fp = os.path.join(label_dir, basename + ".txt")
    if not os.path.exists(fp):
        return [], None, None
    with open(fp, "r", encoding="utf-8") as f:
        lines = [ln.strip() for ln in f.readlines() if ln.strip()]
    if len(lines) == 0:
        return [], None, None

    ids = []
    for ln in lines:
        parts = ln.split()
        if len(parts) == 0:
            continue
        try:
            # robusto: acepta "0" o "0.0"
            cls0 = int(float(parts[0]))
            ids.append(cls0)
        except:
            continue
    if len(ids) == 0:
        return ids, None, None

    # elegir la moda (si empate, elegimos el menor)
    cnt = Counter(ids)
    most_common = cnt.most_common()
    top_freq = most_common[0][1]
    candidates = [c for c,f in most_common if f == top_freq]
    chosen_raw = min(candidates)

    model_label = chosen_raw + 1  # <-- aquí sumamos 1 para que coincida con la escala del modelo
    return ids, chosen_raw, model_label

# ---- 3) construir diccionario combinado ----
combined = {}
missing_labels = 0
not_mapped = 0

for img_name, pred_val in preds.items():
    # img_name puede tener extensión; convertimos a basename para buscar el txt
    basename = os.path.splitext(img_name)[0]
    gt_raw_list, chosen_raw, model_label = read_gt_for_basename(basename, LABEL_DIR)

    if model_label is None:
        gt_name = None
        gt_id = None
        missing_labels += 1
    else:
        gt_id = int(model_label)
        # mapear a nombre si CLASSES está definido y tiene ese índice
        if 'CLASSES' in globals() and 0 <= gt_id < len(CLASSES):
            gt_name = CLASSES[gt_id]
        else:
            gt_name = None
            not_mapped += 1

    combined[img_name] = {
        "pred": pred_val,
        "gt_raw": gt_raw_list if len(gt_raw_list)>0 else None,
        "gt_raw_chosen": int(chosen_raw) if chosen_raw is not None else None,  # original 0-based
        "gt_id": gt_id,   # modelo-scale id (raw+1) o None
        "gt": gt_name     # nombre según CLASSES o None
    }

# ---- 4) guardar y mostrar resumen ----
with open(OUT_JSON, "w", encoding="utf-8") as f:
    json.dump(combined, f, indent=2, ensure_ascii=False)

print(f"✅ Guardado: {OUT_JSON}")
print(f"Imágenes procesadas: {len(combined)}")
print(f"Labels faltantes (txt vacíos o no existentes): {missing_labels}")
if not_mapped:
    print(f"Labels sin mapping a CLASSES (gt_id fuera de rango): {not_mapped}")

# mostrar primeros 20 ejemplos
for i,(k,v) in enumerate(combined.items()):
    if i>=20: break
    print(k, "-> pred:", v["pred"], " gt:", v["gt"], " gt_id:", v["gt_id"], " gt_raw:", v["gt_raw"])
✅ Guardado: predictions_with_gt.json
Imágenes procesadas: 227
Labels faltantes (txt vacíos o no existentes): 0
1 (103).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0]
1 (121).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0]
1 (128).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0]
1 (130).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0]
1 (131).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0]
1 (137).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0]
1 (144).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0]
1 (154).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0]
1 (168).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0]
1 (171).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0]
1 (178).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0]
1 (179).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0]
1 (18).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0]
1 (183).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0, 0]
1 (192).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0, 0, 0]
1 (196).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0, 0]
1 (198).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0]
1 (199).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0]
1 (201).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0, 0]
1 (207).jpg -> pred: clase1  gt: clase1  gt_id: 1  gt_raw: [0]

Analizar las métricas del modelo¶

In [88]:
import json
from collections import Counter
from sklearn.metrics import precision_score, recall_score, f1_score, accuracy_score

# ---------- Cargar JSON ----------
# Ajusta la ruta al archivo JSON con tus resultados
with open("predictions_with_gt.json", "r") as f:
    data = json.load(f)

# ---------- Preparar listas de predicciones y ground truth ----------
y_true = []
y_pred = []

for img_name, info in data.items():
    y_true.append(info["gt"])
    y_pred.append(info["pred"])

# ---------- Calcular Accuracy ----------
accuracy = accuracy_score(y_true, y_pred)
print(f"Accuracy global: {accuracy:.4f}")

# ---------- Calcular Precision, Recall y F1-score por clase ----------
# 'average=None' devuelve el valor para cada clase
precision_per_class = precision_score(y_true, y_pred, average=None, labels=list(set(y_true)))
recall_per_class = recall_score(y_true, y_pred, average=None, labels=list(set(y_true)))
f1_per_class = f1_score(y_true, y_pred, average=None, labels=list(set(y_true)))

classes = list(set(y_true))

print("\nMétricas por clase:")
for i, cls in enumerate(classes):
    print(f"Clase {cls}: Precision={precision_per_class[i]:.4f}, Recall={recall_per_class[i]:.4f}, F1={f1_per_class[i]:.4f}")

# ---------- Opcional: métricas globales con promedio macro ----------
precision_macro = precision_score(y_true, y_pred, average="macro")
recall_macro = recall_score(y_true, y_pred, average="macro")
f1_macro = f1_score(y_true, y_pred, average="macro")

print("\nMétricas globales (promedio macro):")
print(f"Precision={precision_macro:.4f}, Recall={recall_macro:.4f}, F1={f1_macro:.4f}")
Accuracy global: 1.0000

Métricas por clase:
Clase clase3: Precision=1.0000, Recall=1.0000, F1=1.0000
Clase clase2: Precision=1.0000, Recall=1.0000, F1=1.0000
Clase clase1: Precision=1.0000, Recall=1.0000, F1=1.0000
Clase clase4: Precision=1.0000, Recall=1.0000, F1=1.0000

Métricas globales (promedio macro):
Precision=1.0000, Recall=1.0000, F1=1.0000

Si bien no se muestran los errores cuando las imágenes tienen más de una especie, las clasificaciones están bien hechas en su totalidad. Debería comprobarse el funcionamiento para imágenes que sean menos claras.