HAMIM-ML commited on
Commit
b9a1fab
·
1 Parent(s): a0f1e38

data transformation added

Browse files
config/config.yaml CHANGED
@@ -4,4 +4,12 @@ data_ingestion:
4
  root_dir: artifacts/data_ingestion
5
  source_dir: C:\\mlops project\\archive.zip
6
  local_data_file : artifacts/data_ingestion/archive.zip
7
- unzip_dir : artifacts/data_ingestion
 
 
 
 
 
 
 
 
 
4
  root_dir: artifacts/data_ingestion
5
  source_dir: C:\\mlops project\\archive.zip
6
  local_data_file : artifacts/data_ingestion/archive.zip
7
+ unzip_dir : artifacts/data_ingestion
8
+
9
+
10
+ data_transformation:
11
+ root_dir : artifacts/data_transformation
12
+ data_path_black : artifacts/data_ingestion/ab/ab/ab1.npy
13
+ data_path_grey : artifacts/data_ingestion/l/gray_scale.npy
14
+
15
+
main.py CHANGED
@@ -1,4 +1,5 @@
1
  from src.imagecolorization.pipeline.stage01_data_ingestion import DataIngestionPipeline
 
2
  from src.imagecolorization.logging import logger
3
 
4
  STAGE_NAME = 'Data Ingestion Config'
@@ -8,6 +9,17 @@ try:
8
  data_ingestion = DataIngestionPipeline()
9
  data_ingestion.main()
10
  logger.info(f">>>>>> stage {STAGE_NAME} completed <<<<<<\n\nx==========x")
 
 
 
 
 
 
 
 
 
 
 
11
  except Exception as e:
12
  logger.exception(e)
13
  raise e
 
1
  from src.imagecolorization.pipeline.stage01_data_ingestion import DataIngestionPipeline
2
+ from src.imagecolorization.pipeline.stage02_data_transformation import DataTransformationPipeline
3
  from src.imagecolorization.logging import logger
4
 
5
  STAGE_NAME = 'Data Ingestion Config'
 
9
  data_ingestion = DataIngestionPipeline()
10
  data_ingestion.main()
11
  logger.info(f">>>>>> stage {STAGE_NAME} completed <<<<<<\n\nx==========x")
12
+ except Exception as e:
13
+ logger.exception(e)
14
+ raise e
15
+
16
+ STAGE_NAME = 'Data Tranasformation Config'
17
+
18
+ try:
19
+ logger.info(f">>>>>> stage {STAGE_NAME} started <<<<<<")
20
+ data_transformation = DataTransformationPipeline()
21
+ data_transformation.main()
22
+ logger.info(f">>>>>> stage {STAGE_NAME} completed <<<<<<\n\nx==========x")
23
  except Exception as e:
24
  logger.exception(e)
25
  raise e
params.yaml CHANGED
@@ -1 +1,5 @@
1
- key: val
 
 
 
 
 
1
+ BATCH_SIZE : 1
2
+ IMAGE_SIZE : [224,224,1]
3
+ DATA_RANGE: 5000
4
+ KERNEL_SIZE : 3
5
+ p
research/data_transformation.ipynb ADDED
@@ -0,0 +1,287 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import os\n",
10
+ "os.chdir('../')"
11
+ ]
12
+ },
13
+ {
14
+ "cell_type": "code",
15
+ "execution_count": 2,
16
+ "metadata": {},
17
+ "outputs": [
18
+ {
19
+ "data": {
20
+ "text/plain": [
21
+ "'c:\\\\mlops project\\\\image-colorization-mlops'"
22
+ ]
23
+ },
24
+ "execution_count": 2,
25
+ "metadata": {},
26
+ "output_type": "execute_result"
27
+ }
28
+ ],
29
+ "source": [
30
+ "%pwd"
31
+ ]
32
+ },
33
+ {
34
+ "cell_type": "code",
35
+ "execution_count": 3,
36
+ "metadata": {},
37
+ "outputs": [],
38
+ "source": [
39
+ "from dataclasses import dataclass\n",
40
+ "from pathlib import Path\n",
41
+ "\n",
42
+ "@dataclass(frozen=True)\n",
43
+ "class DataTransformationConfig:\n",
44
+ " root_dir : Path\n",
45
+ " data_path_black : Path\n",
46
+ " data_path_grey : Path\n",
47
+ " BATCH_SIZE : int\n",
48
+ " IMAGE_SIZE : list\n",
49
+ " DATA_RANGE: int\n"
50
+ ]
51
+ },
52
+ {
53
+ "cell_type": "code",
54
+ "execution_count": 4,
55
+ "metadata": {},
56
+ "outputs": [],
57
+ "source": [
58
+ "from src.imagecolorization.constants import *\n",
59
+ "from src.imagecolorization.utils.common import read_yaml, create_directories\n",
60
+ "\n",
61
+ "class ConfigurationManager:\n",
62
+ " def __init__(\n",
63
+ " self,\n",
64
+ " config_filepath = CONFIG_FILE_PATH,\n",
65
+ " params_filepath = PARAMS_FILE_PATH):\n",
66
+ "\n",
67
+ " self.config = read_yaml(config_filepath)\n",
68
+ " self.params = read_yaml(params_filepath)\n",
69
+ "\n",
70
+ " create_directories([self.config.artifacts_root])\n",
71
+ " \n",
72
+ " \n",
73
+ " def get_data_transformation_config(self) -> DataTransformationConfig:\n",
74
+ " config = self.config.data_transformation\n",
75
+ " params = self.params\n",
76
+ " \n",
77
+ " data_transformation_cofig = DataTransformationConfig(\n",
78
+ " root_dir= config.root_dir,\n",
79
+ " data_path_black=config.data_path_black,\n",
80
+ " data_path_grey=config.data_path_grey,\n",
81
+ " BATCH_SIZE=params.BATCH_SIZE,\n",
82
+ " IMAGE_SIZE=params.IMAGE_SIZE,\n",
83
+ " DATA_RANGE=params.DATA_RANGE\n",
84
+ " )\n",
85
+ " \n",
86
+ " return data_transformation_cofig"
87
+ ]
88
+ },
89
+ {
90
+ "cell_type": "code",
91
+ "execution_count": 5,
92
+ "metadata": {},
93
+ "outputs": [],
94
+ "source": [
95
+ "import numpy as np\n",
96
+ "import torch\n",
97
+ "from torch.utils.data import DataLoader, Dataset\n",
98
+ "from torchvision import transforms\n",
99
+ "\n",
100
+ "class ImageColorizationDataset(Dataset):\n",
101
+ " def __init__(self, dataset, image_size, transform=None):\n",
102
+ " self.dataset = dataset\n",
103
+ " self.transform = transform\n",
104
+ " self.image_size = tuple(image_size) \n",
105
+ " def __len__(self):\n",
106
+ " return len(self.dataset[0])\n",
107
+ " \n",
108
+ " def __getitem__(self, idx):\n",
109
+ " L = np.array(self.dataset[0][idx]).reshape(self.image_size + (1,))\n",
110
+ " L = transforms.ToTensor()(L)\n",
111
+ " \n",
112
+ " ab = np.array(self.dataset[1][idx])\n",
113
+ " ab = transforms.ToTensor()(ab)\n",
114
+ " \n",
115
+ " return ab, L\n"
116
+ ]
117
+ },
118
+ {
119
+ "cell_type": "code",
120
+ "execution_count": 6,
121
+ "metadata": {},
122
+ "outputs": [],
123
+ "source": [
124
+ "from torch.utils.data import DataLoader\n",
125
+ "import gc\n",
126
+ "import os\n",
127
+ "from src.imagecolorization.logging import logger\n",
128
+ "\n",
129
+ "class DataTransformation:\n",
130
+ " def __init__(self, config: DataTransformationConfig):\n",
131
+ " self.config = config\n",
132
+ " \n",
133
+ " def load_data(self):\n",
134
+ " ab_df = np.load(self.config.data_path_black)[:self.config.DATA_RANGE]\n",
135
+ " l_df = np.load(self.config.data_path_grey)[:self.config.DATA_RANGE]\n",
136
+ " dataset = (l_df, ab_df)\n",
137
+ " gc.collect()\n",
138
+ " return dataset\n",
139
+ " \n",
140
+ " \n",
141
+ " def get_dataloader(self, dataset):\n",
142
+ " train_dataset = ImageColorizationDataset(\n",
143
+ " dataset=dataset,\n",
144
+ " image_size=self.config.IMAGE_SIZE\n",
145
+ " )\n",
146
+ " test_dataset = ImageColorizationDataset(\n",
147
+ " dataset=dataset,\n",
148
+ " image_size=self.config.IMAGE_SIZE\n",
149
+ " )\n",
150
+ " \n",
151
+ " train_loader = DataLoader(\n",
152
+ " train_dataset,\n",
153
+ " batch_size=self.config.BATCH_SIZE,\n",
154
+ " shuffle=True,\n",
155
+ " pin_memory=True\n",
156
+ " )\n",
157
+ " test_loader = DataLoader(\n",
158
+ " test_dataset,\n",
159
+ " batch_size=self.config.BATCH_SIZE,\n",
160
+ " shuffle=True,\n",
161
+ " pin_memory=True\n",
162
+ " )\n",
163
+ " \n",
164
+ " return train_loader, test_loader\n",
165
+ " \n",
166
+ " \n",
167
+ " def save_dataloaders(self, train_loader, test_loader):\n",
168
+ " train_loader_path = os.path.join(self.config.root_dir, 'train_loader.pt')\n",
169
+ " test_loader_path = os.path.join(self.config.root_dir, 'test_loader.pt')\n",
170
+ " \n",
171
+ " torch.save(train_loader, train_loader_path)\n",
172
+ " torch.save(test_loader, test_loader_path)\n",
173
+ " \n",
174
+ " logger.info(f\"Train Loader saved at: {train_loader_path}\")\n",
175
+ " logger.info(f\"Test Loader saved at: {test_loader_path}\")"
176
+ ]
177
+ },
178
+ {
179
+ "cell_type": "code",
180
+ "execution_count": 7,
181
+ "metadata": {},
182
+ "outputs": [
183
+ {
184
+ "name": "stdout",
185
+ "output_type": "stream",
186
+ "text": [
187
+ "[2024-08-18 13:20:34,232: INFO: common: yaml file: config\\config.yaml loaded successfully]\n",
188
+ "[2024-08-18 13:20:34,234: INFO: common: yaml file: params.yaml loaded successfully]\n",
189
+ "[2024-08-18 13:20:34,235: INFO: common: created directory at: artifacts]\n"
190
+ ]
191
+ },
192
+ {
193
+ "ename": "BoxKeyError",
194
+ "evalue": "\"'ConfigBox' object has no attribute 'data_transformation'\"",
195
+ "output_type": "error",
196
+ "traceback": [
197
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
198
+ "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
199
+ "File \u001b[1;32mc:\\Users\\azizu\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\box\\box.py:503\u001b[0m, in \u001b[0;36mBox.__getitem__\u001b[1;34m(self, item, _ignore_default)\u001b[0m\n\u001b[0;32m 502\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 503\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__getitem__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mitem\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 504\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n",
200
+ "\u001b[1;31mKeyError\u001b[0m: 'data_transformation'",
201
+ "\nThe above exception was the direct cause of the following exception:\n",
202
+ "\u001b[1;31mBoxKeyError\u001b[0m Traceback (most recent call last)",
203
+ "File \u001b[1;32mc:\\Users\\azizu\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\box\\box.py:536\u001b[0m, in \u001b[0;36mBox.__getattr__\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m 535\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 536\u001b[0m value \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__getitem__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mitem\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m_ignore_default\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[0;32m 537\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m:\n",
204
+ "File \u001b[1;32mc:\\Users\\azizu\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\box\\box.py:524\u001b[0m, in \u001b[0;36mBox.__getitem__\u001b[1;34m(self, item, _ignore_default)\u001b[0m\n\u001b[0;32m 523\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__get_default(item)\n\u001b[1;32m--> 524\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m BoxKeyError(\u001b[38;5;28mstr\u001b[39m(err)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m_exception_cause\u001b[39;00m(err)\n\u001b[0;32m 525\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n",
205
+ "\u001b[1;31mBoxKeyError\u001b[0m: \"'data_transformation'\"",
206
+ "\nDuring handling of the above exception, another exception occurred:\n",
207
+ "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
208
+ "File \u001b[1;32mc:\\Users\\azizu\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\box\\box.py:538\u001b[0m, in \u001b[0;36mBox.__getattr__\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m 537\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m:\n\u001b[1;32m--> 538\u001b[0m value \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mobject\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__getattribute__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mitem\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 539\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n",
209
+ "\u001b[1;31mAttributeError\u001b[0m: 'ConfigBox' object has no attribute 'data_transformation'",
210
+ "\nThe above exception was the direct cause of the following exception:\n",
211
+ "\u001b[1;31mBoxKeyError\u001b[0m Traceback (most recent call last)",
212
+ "File \u001b[1;32mc:\\Users\\azizu\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\box\\config_box.py:28\u001b[0m, in \u001b[0;36mConfigBox.__getattr__\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m 27\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m---> 28\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__getattr__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mitem\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 29\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m:\n",
213
+ "File \u001b[1;32mc:\\Users\\azizu\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\box\\box.py:552\u001b[0m, in \u001b[0;36mBox.__getattr__\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m 551\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__get_default(item, attr\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m--> 552\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m BoxKeyError(\u001b[38;5;28mstr\u001b[39m(err)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m_exception_cause\u001b[39;00m(err)\n\u001b[0;32m 553\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m value\n",
214
+ "\u001b[1;31mBoxKeyError\u001b[0m: \"'ConfigBox' object has no attribute 'data_transformation'\"",
215
+ "\nDuring handling of the above exception, another exception occurred:\n",
216
+ "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
217
+ "File \u001b[1;32mc:\\Users\\azizu\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\box\\box.py:503\u001b[0m, in \u001b[0;36mBox.__getitem__\u001b[1;34m(self, item, _ignore_default)\u001b[0m\n\u001b[0;32m 502\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 503\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__getitem__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mitem\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 504\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n",
218
+ "\u001b[1;31mKeyError\u001b[0m: 'data_transformation'",
219
+ "\nThe above exception was the direct cause of the following exception:\n",
220
+ "\u001b[1;31mBoxKeyError\u001b[0m Traceback (most recent call last)",
221
+ "File \u001b[1;32mc:\\Users\\azizu\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\box\\box.py:536\u001b[0m, in \u001b[0;36mBox.__getattr__\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m 535\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 536\u001b[0m value \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__getitem__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mitem\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m_ignore_default\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[0;32m 537\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m:\n",
222
+ "File \u001b[1;32mc:\\Users\\azizu\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\box\\box.py:524\u001b[0m, in \u001b[0;36mBox.__getitem__\u001b[1;34m(self, item, _ignore_default)\u001b[0m\n\u001b[0;32m 523\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__get_default(item)\n\u001b[1;32m--> 524\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m BoxKeyError(\u001b[38;5;28mstr\u001b[39m(err)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m_exception_cause\u001b[39;00m(err)\n\u001b[0;32m 525\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n",
223
+ "\u001b[1;31mBoxKeyError\u001b[0m: \"'data_transformation'\"",
224
+ "\nDuring handling of the above exception, another exception occurred:\n",
225
+ "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
226
+ "File \u001b[1;32mc:\\Users\\azizu\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\box\\box.py:538\u001b[0m, in \u001b[0;36mBox.__getattr__\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m 537\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m:\n\u001b[1;32m--> 538\u001b[0m value \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mobject\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__getattribute__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mitem\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 539\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n",
227
+ "\u001b[1;31mAttributeError\u001b[0m: 'ConfigBox' object has no attribute 'data_transformation'",
228
+ "\nThe above exception was the direct cause of the following exception:\n",
229
+ "\u001b[1;31mBoxKeyError\u001b[0m Traceback (most recent call last)",
230
+ "Cell \u001b[1;32mIn[7], line 9\u001b[0m\n\u001b[0;32m 7\u001b[0m data_transformation\u001b[38;5;241m.\u001b[39msa\n\u001b[0;32m 8\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m----> 9\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\n",
231
+ "Cell \u001b[1;32mIn[7], line 3\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 2\u001b[0m config \u001b[38;5;241m=\u001b[39m ConfigurationManager()\n\u001b[1;32m----> 3\u001b[0m data_transformation_config \u001b[38;5;241m=\u001b[39m \u001b[43mconfig\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_data_transformation_config\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 4\u001b[0m data_transformation \u001b[38;5;241m=\u001b[39m DataTransformation(config\u001b[38;5;241m=\u001b[39mdata_transformation_config)\n\u001b[0;32m 5\u001b[0m data_transformation\u001b[38;5;241m.\u001b[39mload_data()\n",
232
+ "Cell \u001b[1;32mIn[4], line 17\u001b[0m, in \u001b[0;36mConfigurationManager.get_data_transformation_config\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 16\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_data_transformation_config\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m DataTransformationConfig:\n\u001b[1;32m---> 17\u001b[0m config \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdata_transformation\u001b[49m\n\u001b[0;32m 18\u001b[0m params \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mparams\n\u001b[0;32m 20\u001b[0m data_transformation_cofig \u001b[38;5;241m=\u001b[39m DataTransformationConfig(\n\u001b[0;32m 21\u001b[0m root_dir\u001b[38;5;241m=\u001b[39m config\u001b[38;5;241m.\u001b[39mroot_dir,\n\u001b[0;32m 22\u001b[0m data_path_black\u001b[38;5;241m=\u001b[39mconfig\u001b[38;5;241m.\u001b[39mdata_path_black,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 26\u001b[0m DATA_RANGE\u001b[38;5;241m=\u001b[39mparams\u001b[38;5;241m.\u001b[39mDATA_RANGE\n\u001b[0;32m 27\u001b[0m )\n",
233
+ "File \u001b[1;32mc:\\Users\\azizu\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\box\\config_box.py:30\u001b[0m, in \u001b[0;36mConfigBox.__getattr__\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m 28\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__getattr__\u001b[39m(item)\n\u001b[0;32m 29\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m:\n\u001b[1;32m---> 30\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__getattr__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mitem\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlower\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n",
234
+ "File \u001b[1;32mc:\\Users\\azizu\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\box\\box.py:552\u001b[0m, in \u001b[0;36mBox.__getattr__\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m 550\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m BoxKeyError(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mitem\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m: Does not exist and internal methods are never defaulted\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 551\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__get_default(item, attr\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m--> 552\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m BoxKeyError(\u001b[38;5;28mstr\u001b[39m(err)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m_exception_cause\u001b[39;00m(err)\n\u001b[0;32m 553\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m value\n",
235
+ "\u001b[1;31mBoxKeyError\u001b[0m: \"'ConfigBox' object has no attribute 'data_transformation'\""
236
+ ]
237
+ }
238
+ ],
239
+ "source": [
240
+ "try:\n",
241
+ " config = ConfigurationManager()\n",
242
+ " data_transformation_config = config.get_data_transformation_config()\n",
243
+ " data_transformation = DataTransformation(config=data_transformation_config)\n",
244
+ " data_transformation.load_data()\n",
245
+ " data_transformation.get_dataloader()\n",
246
+ " data_transformation.sa\n",
247
+ "except Exception as e:\n",
248
+ " raise e"
249
+ ]
250
+ },
251
+ {
252
+ "cell_type": "code",
253
+ "execution_count": null,
254
+ "metadata": {},
255
+ "outputs": [],
256
+ "source": []
257
+ },
258
+ {
259
+ "cell_type": "code",
260
+ "execution_count": null,
261
+ "metadata": {},
262
+ "outputs": [],
263
+ "source": []
264
+ }
265
+ ],
266
+ "metadata": {
267
+ "kernelspec": {
268
+ "display_name": "Python 3",
269
+ "language": "python",
270
+ "name": "python3"
271
+ },
272
+ "language_info": {
273
+ "codemirror_mode": {
274
+ "name": "ipython",
275
+ "version": 3
276
+ },
277
+ "file_extension": ".py",
278
+ "mimetype": "text/x-python",
279
+ "name": "python",
280
+ "nbconvert_exporter": "python",
281
+ "pygments_lexer": "ipython3",
282
+ "version": "3.11.0"
283
+ }
284
+ },
285
+ "nbformat": 4,
286
+ "nbformat_minor": 2
287
+ }
src/imagecolorization/config/configuration.py CHANGED
@@ -1,6 +1,7 @@
1
  from src.imagecolorization.constants import *
2
  from src.imagecolorization.utils.common import read_yaml, create_directories
3
- from src.imagecolorization.entity.config_entity import DataIngestionConfig
 
4
  class ConfigurationManager:
5
  def __init__(
6
  self,
@@ -27,6 +28,22 @@ class ConfigurationManager:
27
  )
28
 
29
  return data_ingestion_config
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
 
32
 
 
1
  from src.imagecolorization.constants import *
2
  from src.imagecolorization.utils.common import read_yaml, create_directories
3
+ from src.imagecolorization.entity.config_entity import (DataIngestionConfig,
4
+ DataTransformationConfig)
5
  class ConfigurationManager:
6
  def __init__(
7
  self,
 
28
  )
29
 
30
  return data_ingestion_config
31
+
32
+
33
+ def get_data_transformation_config(self) -> DataTransformationConfig:
34
+ config = self.config.data_transformation
35
+ params = self.params
36
+
37
+ data_transformation_cofig = DataTransformationConfig(
38
+ root_dir= config.root_dir,
39
+ data_path_black=config.data_path_black,
40
+ data_path_grey=config.data_path_grey,
41
+ BATCH_SIZE=params.BATCH_SIZE,
42
+ IMAGE_SIZE=params.IMAGE_SIZE,
43
+ DATA_RANGE=params.DATA_RANGE
44
+ )
45
+
46
+ return data_transformation_cofig
47
 
48
 
49
 
src/imagecolorization/conponents/data_tranformation.py ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import torch
3
+ from torch.utils.data import DataLoader, Dataset
4
+ from torchvision import transforms
5
+ from torch.utils.data import DataLoader
6
+ import gc
7
+ import os
8
+ from src.imagecolorization.logging import logger
9
+ from src.imagecolorization.entity.config_entity import DataTransformationConfig
10
+
11
+
12
+ class ImageColorizationDataset(Dataset):
13
+ def __init__(self, dataset, image_size, transform=None):
14
+ self.dataset = dataset
15
+ self.transform = transform
16
+ self.image_size = tuple(image_size)
17
+ def __len__(self):
18
+ return len(self.dataset[0])
19
+
20
+ def __getitem__(self, idx):
21
+ L = np.array(self.dataset[0][idx]).reshape(self.image_size + (1,))
22
+ L = transforms.ToTensor()(L)
23
+
24
+ ab = np.array(self.dataset[1][idx])
25
+ ab = transforms.ToTensor()(ab)
26
+
27
+ return ab, L
28
+
29
+
30
+ class DataTransformation:
31
+ def __init__(self, config: DataTransformationConfig):
32
+ self.config = config
33
+
34
+ def load_data(self):
35
+ ab_df = np.load(self.config.data_path_black)[:self.config.DATA_RANGE]
36
+ l_df = np.load(self.config.data_path_grey)[:self.config.DATA_RANGE]
37
+ dataset = (l_df, ab_df)
38
+ gc.collect()
39
+ return dataset
40
+
41
+
42
+ def get_dataloader(self, dataset):
43
+ train_dataset = ImageColorizationDataset(
44
+ dataset=dataset,
45
+ image_size=self.config.IMAGE_SIZE
46
+ )
47
+ test_dataset = ImageColorizationDataset(
48
+ dataset=dataset,
49
+ image_size=self.config.IMAGE_SIZE
50
+ )
51
+
52
+ train_loader = DataLoader(
53
+ train_dataset,
54
+ batch_size=self.config.BATCH_SIZE,
55
+ shuffle=True,
56
+ pin_memory=True
57
+ )
58
+ test_loader = DataLoader(
59
+ test_dataset,
60
+ batch_size=self.config.BATCH_SIZE,
61
+ shuffle=True,
62
+ pin_memory=True
63
+ )
64
+
65
+ return train_loader, test_loader
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+ def save_dataloaders(self, train_loader, test_loader):
74
+ # Ensure the directory exists
75
+ os.makedirs(self.config.root_dir, exist_ok=True)
76
+
77
+ train_loader_path = os.path.join(self.config.root_dir, 'train_loader.pt')
78
+ test_loader_path = os.path.join(self.config.root_dir, 'test_loader.pt')
79
+
80
+ try:
81
+ # Save the dataloaders
82
+ torch.save(train_loader, train_loader_path)
83
+ torch.save(test_loader, test_loader_path)
84
+
85
+ logger.info(f"Train Loader saved at: {train_loader_path}")
86
+ logger.info(f"Test Loader saved at: {test_loader_path}")
87
+ except Exception as e:
88
+ logger.error(f"Error saving dataloaders: {str(e)}")
89
+ raise e
90
+
src/imagecolorization/entity/config_entity.py CHANGED
@@ -6,4 +6,14 @@ class DataIngestionConfig:
6
  root_dir : Path
7
  source_dir : Path
8
  local_data_file: Path
9
- unzip_dir : Path
 
 
 
 
 
 
 
 
 
 
 
6
  root_dir : Path
7
  source_dir : Path
8
  local_data_file: Path
9
+ unzip_dir : Path
10
+
11
+
12
+ @dataclass(frozen=True)
13
+ class DataTransformationConfig:
14
+ root_dir : Path
15
+ data_path_black : Path
16
+ data_path_grey : Path
17
+ BATCH_SIZE : int
18
+ IMAGE_SIZE : list
19
+ DATA_RANGE: int
src/imagecolorization/pipeline/stage02_data_transformation.py ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from src.imagecolorization.conponents.data_tranformation import DataTransformation
2
+ from src.imagecolorization.config.configuration import ConfigurationManager
3
+
4
+
5
+ class DataTransformationPipeline:
6
+ def __init__(sefl):
7
+ pass
8
+
9
+ def main(self):
10
+ config = ConfigurationManager()
11
+ data_transformation_config = config.get_data_transformation_config()
12
+ data_transformation = DataTransformation(config=data_transformation_config)
13
+ dataset = data_transformation.load_data()
14
+ train_loader, test_loader = data_transformation.get_dataloader(dataset)
15
+ data_transformation.save_dataloaders(train_loader, test_loader)