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.