| import torch |
| from torch.utils.data import Dataset |
| import h5py |
| import numpy as np |
| import cv2 |
|
|
|
|
| class CRNNDataset(Dataset): |
| def __init__(self, h5_path, char_list): |
| self.h5_path = h5_path |
| self.char_list = char_list |
| self.char_to_int = {char: i + 1 for i, char in enumerate(char_list)} |
| self.int_to_char = {i + 1: char for i, char in enumerate(char_list)} |
|
|
| with h5py.File(self.h5_path, 'r') as hf: |
| self.num_samples = len(hf['labels']) |
|
|
| def __len__(self): |
| return self.num_samples |
|
|
| def __getitem__(self, idx): |
| with h5py.File(self.h5_path, 'r') as hf: |
| img_encoded = hf['image_data'][idx] |
| image = cv2.imdecode(np.frombuffer(img_encoded, np.uint8), cv2.IMREAD_GRAYSCALE) |
| label_str = hf['labels'][idx].decode('utf-8') |
|
|
| image = (image / 255.0).astype(np.float32) |
| label_int = [self.char_to_int[char] for char in label_str] |
|
|
| return torch.from_numpy(image).unsqueeze(0), torch.tensor(label_int) |
|
|
|
|
| def collate_fn(batch): |
| images, labels = zip(*batch) |
|
|
| image_widths = [img.shape[2] for img in images] |
|
|
| max_width = max(image_widths) |
|
|
| padded_images = [] |
| for img in images: |
| padding = (0, max_width - img.shape[2], 0, 0) |
| padded_images.append(torch.nn.functional.pad(img, padding, "constant", 0)) |
|
|
| images_tensor = torch.stack(padded_images, 0) |
| labels_concat = torch.cat(labels, 0) |
| label_lengths = torch.tensor([len(lab) for lab in labels]) |
|
|
| return images_tensor, labels_concat, label_lengths, torch.tensor(image_widths) |
|
|