Spaces:
Runtime error
Runtime error
HAMIM-ML
commited on
Commit
·
b9a1fab
1
Parent(s):
a0f1e38
data transformation added
Browse files- config/config.yaml +9 -1
- main.py +12 -0
- params.yaml +5 -1
- research/data_transformation.ipynb +287 -0
- src/imagecolorization/config/configuration.py +18 -1
- src/imagecolorization/conponents/data_tranformation.py +90 -0
- src/imagecolorization/entity/config_entity.py +11 -1
- src/imagecolorization/pipeline/stage02_data_transformation.py +15 -0
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 |
-
|
|
|
|
|
|
|
|
|
|
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)
|