Guest User

Untitled

a guest
Dec 3rd, 2025
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.52 KB | Source Code | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. #!pip install transformers accelerate
  4.  
  5. !pip install --upgrade  transformers==4.35.2 accelerate==0.24.1
  6. !pip install peft==0.4.0
  7.  
  8. #!pip install -q datasets jiwer
  9. !pip install -q datasets==2.21.0 jiwer
  10.  
  11. from google.colab import drive
  12. drive.mount('/content/drive')
  13.  
  14.  
  15.  
  16. import pandas as pd
  17.  
  18. column_names = ['file_name', 'text']
  19. df = pd.read_csv('/content/drive/MyDrive/mydata_training/mydata8/data.csv',index_col=False,header=0)
  20. del df['id']
  21. del df['image_name']
  22. df['word'] = df['word'].apply(lambda x: x[2:-2])
  23. print(df.head())
  24. print(len(df))
  25. #df.drop(df.tail(200).index,inplace = True)
  26. #print(len(df))
  27.  
  28. from sklearn.model_selection import train_test_split
  29.  
  30. train_df, test_df = train_test_split(df, test_size=0.1)
  31. # we reset the indices to start from zero
  32. train_df.reset_index(drop=True, inplace=True)
  33. test_df.reset_index(drop=True, inplace=True)
  34.  
  35. import torch
  36. from torchvision.transforms import Resize, ToTensor
  37. from torch.utils.data import Dataset
  38. from PIL import Image
  39.  
  40. class IAMDataset(Dataset):
  41.     def __init__(self, root_dir, df, processor, max_target_length=128):
  42.         self.root_dir = root_dir
  43.         self.df = df
  44.         self.processor = processor
  45.         self.max_target_length = max_target_length
  46.  
  47.     def __len__(self):
  48.         return len(self.df)
  49.  
  50.     def __getitem__(self, idx):
  51.         # get file name + text
  52.         file_name = self.df['filename'][idx]
  53.         text = self.df['word'][idx].rstrip()
  54.         # prepare image (i.e. resize + normalize)
  55.         image = Image.open(self.root_dir + file_name).convert("RGB")
  56.         pixel_values = self.processor(image, return_tensors="pt").pixel_values
  57.         # add labels (input_ids) by encoding the text
  58.         labels = self.processor.tokenizer(text,
  59.                                           padding="max_length",
  60.                                           max_length=self.max_target_length).input_ids
  61.         # important: make sure that PAD tokens are ignored by the loss function
  62.         labels = [label if label != self.processor.tokenizer.pad_token_id else -100 for label in labels]
  63.  
  64.         encoding = {"pixel_values": pixel_values.squeeze(), "labels": torch.tensor(labels)}
  65.         #encoding = {"pixel_values": pixel_values, "labels": torch.tensor(labels)}
  66.         return encoding
  67.  
  68.  
  69.  
  70. from transformers import TrOCRProcessor
  71.  
  72. processor = TrOCRProcessor.from_pretrained("microsoft/trocr-base-handwritten") #base-stage1
  73.  
  74. train_dataset = IAMDataset(root_dir='/content/drive/MyDrive/mydata_training/mydata8/images/',
  75.                            df=train_df,
  76.                            processor=processor)
  77. eval_dataset = IAMDataset(root_dir='/content/drive/MyDrive/mydata_training/mydata8/images/',
  78.                            df=test_df,
  79.                            processor=processor)
  80.  
  81.  
  82.  
  83. print("Number of training examples:", len(train_dataset))
  84. print("Number of validation examples:", len(eval_dataset))
  85.  
  86. encoding = train_dataset[0]
  87. for k,v in encoding.items():
  88.   print(k, v.shape)
  89.  
  90. print("Number of training examples:", len(train_dataset))
  91. print("Number of validation examples:", len(eval_dataset))
  92.  
  93. image = Image.open(train_dataset.root_dir + train_df['filename'][0]).convert("RGB")
  94. image
  95.  
  96. labels = encoding['labels']
  97. labels[labels == -100] = processor.tokenizer.pad_token_id
  98. label_str = processor.decode(labels, skip_special_tokens=True)
  99. print(label_str)
  100.  
  101. from transformers import VisionEncoderDecoderModel, AutoModel
  102.  
  103. model = VisionEncoderDecoderModel.from_pretrained("raxtemur/trocr-base-ru")
  104. #model = VisionEncoderDecoderModel.from_pretrained("cyrillic-trocr/trocr-handwritten-cyrillic", early_stopping=True)
  105.  
  106.  
  107.  
  108. # set special tokens used for creating the decoder_input_ids from the labels
  109. model.config.decoder_start_token_id = processor.tokenizer.cls_token_id
  110. model.config.pad_token_id = processor.tokenizer.pad_token_id
  111. # make sure vocab size is set correctly
  112. model.config.vocab_size = model.config.decoder.vocab_size
  113. # set beam search parameters
  114. model.config.eos_token_id = processor.tokenizer.sep_token_id
  115. model.config.max_length = 32
  116. model.config.early_stopping = True
  117. model.config.no_repeat_ngram_size = 3
  118. model.config.length_penalty = 2.0
  119. model.config.num_beams = 8
  120.  
  121.  
  122.  
  123. from transformers import Seq2SeqTrainer, Seq2SeqTrainingArguments
  124.  
  125. training_args = Seq2SeqTrainingArguments(
  126.     predict_with_generate=True,
  127.     evaluation_strategy="steps",
  128.     per_device_train_batch_size=8,
  129.     per_device_eval_batch_size=8,
  130.     fp16=True,
  131.     output_dir="/content/drive/MyDrive/SAVE_CHECK_POINT_my_trocr_model",
  132.     logging_steps=2,
  133.     save_steps=400,
  134.     eval_steps=1200,
  135.     num_train_epochs=3,
  136.     report_to="none"  # Disable wandb integration
  137. )
  138.  
  139. # from datasets import load_metric
  140.  
  141. # cer_metric = load_metric("cer")
  142. !pip install evaluate
  143. from evaluate import load
  144. cer_metric = load("cer")
  145.  
  146. def compute_metrics(pred):
  147.     labels_ids = pred.label_ids
  148.     pred_ids = pred.predictions
  149.  
  150.     pred_str = processor.batch_decode(pred_ids, skip_special_tokens=True)
  151.     labels_ids[labels_ids == -100] = processor.tokenizer.pad_token_id
  152.     label_str = processor.batch_decode(labels_ids, skip_special_tokens=True)
  153.  
  154.     # Convert to lowercase for case-insensitive comparison
  155.     pred_str = [s.lower() for s in processor.batch_decode(pred_ids, skip_special_tokens=True)]
  156.     labels_ids[labels_ids == -100] = processor.tokenizer.pad_token_id
  157.     label_str = [s.lower() for s in processor.batch_decode(labels_ids, skip_special_tokens=True)]
  158.  
  159.  
  160.     cer = cer_metric.compute(predictions=pred_str, references=label_str)
  161.     # Identify and store bad predictions
  162.     bad_predictions = [(p, l) for p, l in zip(pred_str, label_str) if p != l]
  163.     good_predictions = [(p, l) for p, l in zip(pred_str, label_str) if p == l]
  164.     print("Bad")
  165.     print(bad_predictions[0:20])
  166.     print("good")
  167.     print(good_predictions[0:15])
  168.     print(len(bad_predictions))
  169.  
  170.     return {"cer": cer}
  171.  
  172. from transformers import default_data_collator
  173.  
  174. # instantiate trainer
  175. trainer = Seq2SeqTrainer(
  176.     model=model,
  177.     tokenizer=processor.feature_extractor,
  178.     args=training_args,
  179.     compute_metrics=compute_metrics,
  180.     train_dataset=train_dataset,
  181.     eval_dataset=eval_dataset,
  182.     data_collator=default_data_collator,
  183. )
  184. trainer.train()
  185.  
  186. # Your existing training code here
  187.  
  188. # After training, save to Google Drive
  189. final_output_dir = "/content/drive/MyDrive/my_trocr_model"
  190. trainer.save_model(final_output_dir)
  191. processor.save_pretrained(final_output_dir)
  192.  
  193. print(f"Model and processor saved to Google Drive: {final_output_dir}")
Advertisement
Add Comment
Please, Sign In to add comment