├── Results ├── in │ ├── 0.jpg │ ├── 1.jpg │ ├── 10.jpg │ ├── 11.jpg │ ├── 12.jpg │ ├── 13.jpg │ ├── 14.jpg │ ├── 15.jpg │ ├── 16.jpg │ ├── 17.jpg │ ├── 18.jpg │ ├── 19.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── 7.jpg │ ├── 8.jpg │ ├── 9.jpg │ ├── 0_clean.jpg │ ├── 1_clean.jpg │ ├── 2_clean.jpg │ ├── 3_clean.jpg │ ├── 4_clean.jpg │ ├── 5_clean.jpg │ ├── 6_clean.jpg │ ├── 7_clean.jpg │ ├── 8_clean.jpg │ ├── 9_clean.jpg │ ├── 0_dehaze.jpg │ ├── 10_clean.jpg │ ├── 10_dehaze.jpg │ ├── 11_clean.jpg │ ├── 11_dehaze.jpg │ ├── 12_clean.jpg │ ├── 12_dehaze.jpg │ ├── 13_clean.jpg │ ├── 13_dehaze.jpg │ ├── 14_clean.jpg │ ├── 14_dehaze.jpg │ ├── 15_clean.jpg │ ├── 15_dehaze.jpg │ ├── 16_clean.jpg │ ├── 16_dehaze.jpg │ ├── 17_clean.jpg │ ├── 17_dehaze.jpg │ ├── 18_clean.jpg │ ├── 18_dehaze.jpg │ ├── 19_clean.jpg │ ├── 19_dehaze.jpg │ ├── 1_dehaze.jpg │ ├── 2_dehaze.jpg │ ├── 3_dehaze.jpg │ ├── 4_dehaze.jpg │ ├── 5_dehaze.jpg │ ├── 6_dehaze.jpg │ ├── 7_dehaze.jpg │ ├── 8_dehaze.jpg │ └── 9_dehaze.jpg ├── out │ ├── 0.jpg │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── 7.jpg │ ├── 8.jpg │ ├── 9.jpg │ ├── 10.jpg │ ├── 11.jpg │ ├── 12.jpg │ ├── 13.jpg │ ├── 14.jpg │ ├── 15.jpg │ ├── 16.jpg │ ├── 17.jpg │ ├── 18.jpg │ ├── 19.jpg │ ├── 0_dehaze.jpg │ ├── 10_dehaze.jpg │ ├── 11_dehaze.jpg │ ├── 12_dehaze.jpg │ ├── 13_dehaze.jpg │ ├── 14_dehaze.jpg │ ├── 15_dehaze.jpg │ ├── 16_dehaze.jpg │ ├── 17_dehaze.jpg │ ├── 18_dehaze.jpg │ ├── 19_dehaze.jpg │ ├── 1_dehaze.jpg │ ├── 2_dehaze.jpg │ ├── 3_dehaze.jpg │ ├── 4_dehaze.jpg │ ├── 5_dehaze.jpg │ ├── 6_dehaze.jpg │ ├── 7_dehaze.jpg │ ├── 8_dehaze.jpg │ └── 9_dehaze.jpg └── other │ ├── pic.png │ ├── pic1.png │ ├── canon.jpg │ ├── canon1.png │ ├── canon2.png │ ├── cones.jpg │ ├── cones1.png │ ├── cones2.png │ ├── canon_trans.png │ ├── cones_res_in.png │ ├── cones_trans.png │ ├── cones_res_out.png │ ├── canon_trans_refine.png │ └── cones_trans_refine.png ├── Model and Weights ├── res_model.png ├── Model │ ├── resmodel.h5 │ ├── transmodel.h5 │ └── other │ │ ├── resmodel_150_30.h5 │ │ ├── transmodel_100_20.h5 │ │ ├── transmodel_250_50.h5 │ │ ├── transmodel_300_10.h5 │ │ └── transmodel_75_15.h5 ├── trans_model.png ├── res_model_shape.png ├── trans_model_shape.png ├── Graphs │ ├── learning_rate.png │ ├── residual-loss.png │ └── transmission-loss.png └── Weights │ ├── resmodel_weights.h5 │ ├── transmodel_weights.h5 │ └── other │ ├── resmodel_150_30_weights.h5 │ ├── transmodel_100_20_weights.h5 │ ├── transmodel_250_50_weights.h5 │ ├── transmodel_300_10_weights.h5 │ └── transmodel_75_15_weights.h5 ├── LICENSE ├── README.md └── Jupyter Notebooks ├── Create_Test_Dataset.ipynb └── Network_Model_Residual.ipynb /Results/in/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/0.jpg -------------------------------------------------------------------------------- /Results/in/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/1.jpg -------------------------------------------------------------------------------- /Results/in/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/10.jpg -------------------------------------------------------------------------------- /Results/in/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/11.jpg -------------------------------------------------------------------------------- /Results/in/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/12.jpg -------------------------------------------------------------------------------- /Results/in/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/13.jpg -------------------------------------------------------------------------------- /Results/in/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/14.jpg -------------------------------------------------------------------------------- /Results/in/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/15.jpg -------------------------------------------------------------------------------- /Results/in/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/16.jpg -------------------------------------------------------------------------------- /Results/in/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/17.jpg -------------------------------------------------------------------------------- /Results/in/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/18.jpg -------------------------------------------------------------------------------- /Results/in/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/19.jpg -------------------------------------------------------------------------------- /Results/in/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/2.jpg -------------------------------------------------------------------------------- /Results/in/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/3.jpg -------------------------------------------------------------------------------- /Results/in/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/4.jpg -------------------------------------------------------------------------------- /Results/in/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/5.jpg -------------------------------------------------------------------------------- /Results/in/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/6.jpg -------------------------------------------------------------------------------- /Results/in/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/7.jpg -------------------------------------------------------------------------------- /Results/in/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/8.jpg -------------------------------------------------------------------------------- /Results/in/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/9.jpg -------------------------------------------------------------------------------- /Results/out/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/0.jpg -------------------------------------------------------------------------------- /Results/out/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/1.jpg -------------------------------------------------------------------------------- /Results/out/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/2.jpg -------------------------------------------------------------------------------- /Results/out/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/3.jpg -------------------------------------------------------------------------------- /Results/out/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/4.jpg -------------------------------------------------------------------------------- /Results/out/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/5.jpg -------------------------------------------------------------------------------- /Results/out/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/6.jpg -------------------------------------------------------------------------------- /Results/out/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/7.jpg -------------------------------------------------------------------------------- /Results/out/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/8.jpg -------------------------------------------------------------------------------- /Results/out/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/9.jpg -------------------------------------------------------------------------------- /Results/out/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/10.jpg -------------------------------------------------------------------------------- /Results/out/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/11.jpg -------------------------------------------------------------------------------- /Results/out/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/12.jpg -------------------------------------------------------------------------------- /Results/out/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/13.jpg -------------------------------------------------------------------------------- /Results/out/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/14.jpg -------------------------------------------------------------------------------- /Results/out/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/15.jpg -------------------------------------------------------------------------------- /Results/out/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/16.jpg -------------------------------------------------------------------------------- /Results/out/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/17.jpg -------------------------------------------------------------------------------- /Results/out/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/18.jpg -------------------------------------------------------------------------------- /Results/out/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/19.jpg -------------------------------------------------------------------------------- /Results/in/0_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/0_clean.jpg -------------------------------------------------------------------------------- /Results/in/1_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/1_clean.jpg -------------------------------------------------------------------------------- /Results/in/2_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/2_clean.jpg -------------------------------------------------------------------------------- /Results/in/3_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/3_clean.jpg -------------------------------------------------------------------------------- /Results/in/4_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/4_clean.jpg -------------------------------------------------------------------------------- /Results/in/5_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/5_clean.jpg -------------------------------------------------------------------------------- /Results/in/6_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/6_clean.jpg -------------------------------------------------------------------------------- /Results/in/7_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/7_clean.jpg -------------------------------------------------------------------------------- /Results/in/8_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/8_clean.jpg -------------------------------------------------------------------------------- /Results/in/9_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/9_clean.jpg -------------------------------------------------------------------------------- /Results/other/pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/other/pic.png -------------------------------------------------------------------------------- /Results/other/pic1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/other/pic1.png -------------------------------------------------------------------------------- /Results/in/0_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/0_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/10_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/10_clean.jpg -------------------------------------------------------------------------------- /Results/in/10_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/10_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/11_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/11_clean.jpg -------------------------------------------------------------------------------- /Results/in/11_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/11_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/12_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/12_clean.jpg -------------------------------------------------------------------------------- /Results/in/12_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/12_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/13_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/13_clean.jpg -------------------------------------------------------------------------------- /Results/in/13_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/13_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/14_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/14_clean.jpg -------------------------------------------------------------------------------- /Results/in/14_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/14_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/15_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/15_clean.jpg -------------------------------------------------------------------------------- /Results/in/15_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/15_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/16_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/16_clean.jpg -------------------------------------------------------------------------------- /Results/in/16_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/16_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/17_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/17_clean.jpg -------------------------------------------------------------------------------- /Results/in/17_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/17_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/18_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/18_clean.jpg -------------------------------------------------------------------------------- /Results/in/18_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/18_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/19_clean.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/19_clean.jpg -------------------------------------------------------------------------------- /Results/in/19_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/19_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/1_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/1_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/2_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/2_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/3_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/3_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/4_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/4_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/5_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/5_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/6_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/6_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/7_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/7_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/8_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/8_dehaze.jpg -------------------------------------------------------------------------------- /Results/in/9_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/in/9_dehaze.jpg -------------------------------------------------------------------------------- /Results/other/canon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/other/canon.jpg -------------------------------------------------------------------------------- /Results/other/canon1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/other/canon1.png -------------------------------------------------------------------------------- /Results/other/canon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/other/canon2.png -------------------------------------------------------------------------------- /Results/other/cones.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/other/cones.jpg -------------------------------------------------------------------------------- /Results/other/cones1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/other/cones1.png -------------------------------------------------------------------------------- /Results/other/cones2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/other/cones2.png -------------------------------------------------------------------------------- /Results/out/0_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/0_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/10_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/10_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/11_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/11_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/12_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/12_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/13_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/13_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/14_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/14_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/15_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/15_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/16_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/16_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/17_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/17_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/18_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/18_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/19_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/19_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/1_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/1_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/2_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/2_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/3_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/3_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/4_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/4_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/5_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/5_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/6_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/6_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/7_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/7_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/8_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/8_dehaze.jpg -------------------------------------------------------------------------------- /Results/out/9_dehaze.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/out/9_dehaze.jpg -------------------------------------------------------------------------------- /Results/other/canon_trans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/other/canon_trans.png -------------------------------------------------------------------------------- /Results/other/cones_res_in.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/other/cones_res_in.png -------------------------------------------------------------------------------- /Results/other/cones_trans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/other/cones_trans.png -------------------------------------------------------------------------------- /Model and Weights/res_model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/res_model.png -------------------------------------------------------------------------------- /Results/other/cones_res_out.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/other/cones_res_out.png -------------------------------------------------------------------------------- /Model and Weights/Model/resmodel.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Model/resmodel.h5 -------------------------------------------------------------------------------- /Model and Weights/trans_model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/trans_model.png -------------------------------------------------------------------------------- /Model and Weights/Model/transmodel.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Model/transmodel.h5 -------------------------------------------------------------------------------- /Model and Weights/res_model_shape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/res_model_shape.png -------------------------------------------------------------------------------- /Results/other/canon_trans_refine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/other/canon_trans_refine.png -------------------------------------------------------------------------------- /Results/other/cones_trans_refine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Results/other/cones_trans_refine.png -------------------------------------------------------------------------------- /Model and Weights/trans_model_shape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/trans_model_shape.png -------------------------------------------------------------------------------- /Model and Weights/Graphs/learning_rate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Graphs/learning_rate.png -------------------------------------------------------------------------------- /Model and Weights/Graphs/residual-loss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Graphs/residual-loss.png -------------------------------------------------------------------------------- /Model and Weights/Weights/resmodel_weights.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Weights/resmodel_weights.h5 -------------------------------------------------------------------------------- /Model and Weights/Graphs/transmission-loss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Graphs/transmission-loss.png -------------------------------------------------------------------------------- /Model and Weights/Weights/transmodel_weights.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Weights/transmodel_weights.h5 -------------------------------------------------------------------------------- /Model and Weights/Model/other/resmodel_150_30.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Model/other/resmodel_150_30.h5 -------------------------------------------------------------------------------- /Model and Weights/Model/other/transmodel_100_20.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Model/other/transmodel_100_20.h5 -------------------------------------------------------------------------------- /Model and Weights/Model/other/transmodel_250_50.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Model/other/transmodel_250_50.h5 -------------------------------------------------------------------------------- /Model and Weights/Model/other/transmodel_300_10.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Model/other/transmodel_300_10.h5 -------------------------------------------------------------------------------- /Model and Weights/Model/other/transmodel_75_15.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Model/other/transmodel_75_15.h5 -------------------------------------------------------------------------------- /Model and Weights/Weights/other/resmodel_150_30_weights.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Weights/other/resmodel_150_30_weights.h5 -------------------------------------------------------------------------------- /Model and Weights/Weights/other/transmodel_100_20_weights.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Weights/other/transmodel_100_20_weights.h5 -------------------------------------------------------------------------------- /Model and Weights/Weights/other/transmodel_250_50_weights.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Weights/other/transmodel_250_50_weights.h5 -------------------------------------------------------------------------------- /Model and Weights/Weights/other/transmodel_300_10_weights.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Weights/other/transmodel_300_10_weights.h5 -------------------------------------------------------------------------------- /Model and Weights/Weights/other/transmodel_75_15_weights.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muditjoshi98/Image-Dehazing-Using-Residual-Based-Deep-CNN/HEAD/Model and Weights/Weights/other/transmodel_75_15_weights.h5 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Mudit Joshi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Image Dehazing using Residual-Based Deep CNN 2 | 3 | Implementation of paper https://ieeexplore.ieee.org/document/8355803 with the addition of the transmission refinement using [guided filters](https://arxiv.org/abs/1505.00996) from Dehazenet paper. 4 | 5 | ## Dataset 6 | 7 | **Training Dataset** 8 | 9 | * NYU2 Depth Dataset - https://cs.nyu.edu/~silberman/datasets/nyu_depth_v2.html 10 | 11 | Used 1200 indoor images and their respective depth maps and generated 60000 image patches (16x16 size) 50 patch each image. 12 | 13 | **Testing Dataset** 14 | 15 | * Reside Standard Dataset - https://sites.google.com/view/reside-dehaze-datasets/reside-standard (Randomly taken indoor hazy images) 16 | * Also taken few outdoor hazy images from Internet. 17 | 18 | ## Training 19 | 20 | Training is done on the dataset of size **16x16** in two phases: 21 | 22 | * **CNN Model -** Hazy image is taken as input to generate the transmission map of the image. 23 | 24 | * Here we have also added the Transmission refinement using Guided Filter (taken from Dehazenet) 25 | 26 | * **Residual Model -** Ratio of hazy image and transmission map is feeded to the network to generate the residual image. 27 | 28 | * Residual Image is finally subtracted from the Hazy Image to generate the Clear Image. 29 | 30 | ## Testing 31 | 32 | Testing involves the creation of the network model from the image size and then loading the trained weights. 33 | 34 | #### Network Testing Steps 35 | 36 | | ![Input Cones](Results/other/cones.jpg) | ![Output Trans](Results/other/cones_trans.png) | ![Transmission Map Refined](Results/other/cones_trans_refine.png) | 37 | |:---:|:---:|:---:| 38 | | 1. Input Image `(I)` | 2. Output Transmission map `(t)` | 3. Transmission Map Refined `(T)` | 39 | 40 | | ![(I/T) Ration](Results/other/cones_res_in.png) | ![Residual Image](Results/other/cones_res_out.png) | ![Generated Clear Image](Results/other/cones2.png) | 41 | |:---:|:---:|:---:| 42 | | 4. Residual Map Input `(H = I/T)` | 5. Residual Image `(b)` | 6. Generated Clear Image `(J)` | 43 | 44 | ## Results 45 | 46 | **Outdoor** 47 | 48 | | **Input** | **Output** | 49 | |:---:|:---:| 50 | | ![](Results/other/canon.jpg) | ![](Results/other/canon2.png) | 51 | | ![](Results/out/16.jpg) | ![](Results/out/16_dehaze.jpg) | 52 | 53 | **Indoor** 54 | 55 | | **Input** | **Output** | 56 | |:---:|:---:| 57 | | ![](Results/in/1.jpg) | ![](Results/in/1_dehaze.jpg) | 58 | | ![](Results/in/3.jpg) | ![](Results/in/3_dehaze.jpg) | 59 | 60 | **For some images result were not as good** 61 | 62 | | ![](Results/out/0.jpg) | ![](Results/out/0_dehaze.jpg) | 63 | |:---:|:---:| 64 | | ![](Results/out/14.jpg) | ![](Results/out/14_dehaze.jpg) | 65 | | ![](Results/in/8.jpg) | ![](Results/in/8_dehaze.jpg) | 66 | | ![](Results/in/7.jpg) | ![](Results/in/7_dehaze.jpg) | 67 | 68 | 69 | 70 | ## Problems Faced 71 | 72 | This is my first attempt to implement a Deep Learning research Paper. Many things is not clear in the paper itself, so tried on the assumptions, like : 73 | * The training dataset preparation is not specified properly, so used method mentioned in Dehazenet paper. 74 | * Slice layer implementation is hard in Keras. 75 | * Residual Network is not clear. 76 | 77 | ## References 78 | 79 | **Datasets:** 80 | 81 | * https://cs.nyu.edu/~silberman/datasets/nyu_depth_v2.html 82 | * https://sites.google.com/view/reside-dehaze-datasets/reside-standard 83 | 84 | **Papers :** 85 | * DehazeNet: An End-to-End System for Single Image Haze Removal https://arxiv.org/abs/1601.07661 86 | * AOD-Net: All-in-One Dehazing Network https://ieeexplore.ieee.org/document/8237773 87 | * Recursive Deep Residual Learning for Single Image Dehazing https://ieeexplore.ieee.org/document/8575267/ 88 | 89 | **Reference Codes :** 90 | * https://github.com/zlinker/DehazeNet 91 | * https://github.com/yixindu1573/Recursive-Deep-Residual-Learning-for-Single-Image-Dehazing-DRL 92 | * https://prateekvjoshi.com/2016/02/02/deep-learning-with-caffe-in-python-part-i-defining-a-layer/ 93 | * https://ddokkddokk.tistory.com/21 94 | * https://stackoverflow.com/questions/42883547/intuitive-understanding-of-1d-2d-and-3d-convolutions-in-convolutional-neural-n 95 | * https://github.com/keras-team/keras/issues/890 96 | -------------------------------------------------------------------------------- /Jupyter Notebooks/Create_Test_Dataset.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Create Test Dataset.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [] 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | } 14 | }, 15 | "cells": [ 16 | { 17 | "cell_type": "code", 18 | "metadata": { 19 | "id": "9HLfQFGM4toB", 20 | "colab_type": "code", 21 | "colab": {} 22 | }, 23 | "source": [ 24 | "from google.colab import drive\n", 25 | "drive.mount('/content/gdrive')" 26 | ], 27 | "execution_count": null, 28 | "outputs": [] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "metadata": { 33 | "id": "Kzvg1tQ26Mo7", 34 | "colab_type": "code", 35 | "colab": {} 36 | }, 37 | "source": [ 38 | "import os, random\n", 39 | "\n", 40 | "from PIL import Image\n", 41 | "from matplotlib import pyplot as plt" 42 | ], 43 | "execution_count": null, 44 | "outputs": [] 45 | }, 46 | { 47 | "cell_type": "markdown", 48 | "metadata": { 49 | "id": "_eI1fcthaNT9", 50 | "colab_type": "text" 51 | }, 52 | "source": [ 53 | "### OTS" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "metadata": { 59 | "id": "13jxkOpVFnn_", 60 | "colab_type": "code", 61 | "colab": {} 62 | }, 63 | "source": [ 64 | "!unzip -q '/content/gdrive/My Drive/DL Project/Datasets/TestData/OTS/clear.zip' -d '/content/'" 65 | ], 66 | "execution_count": null, 67 | "outputs": [] 68 | }, 69 | { 70 | "cell_type": "code", 71 | "metadata": { 72 | "id": "DWol7N3EFzsa", 73 | "colab_type": "code", 74 | "colab": {} 75 | }, 76 | "source": [ 77 | "!unzip -q '/content/gdrive/My Drive/DL Project/Datasets/TestData/OTS/haze1.zip' -d '/content/'" 78 | ], 79 | "execution_count": null, 80 | "outputs": [] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "metadata": { 85 | "id": "PmTpTHBU9S0_", 86 | "colab_type": "code", 87 | "colab": {} 88 | }, 89 | "source": [ 90 | "clear = os.listdir('clear')\n", 91 | "clear.sort()\n", 92 | "haze = os.listdir('part1')\n", 93 | "haze.sort()\n", 94 | "l = ['_0.8_0.04.jpg','_0.8_0.2.jpg','_0.85_0.06.jpg','_0.85_0.16.jpg','_0.9_0.08.jpg','_0.9_0.12.jpg','_0.95_0.1.jpg','_0.95_0.04.jpg','_1_0.08.jpg','_1_0.16.jpg']" 95 | ], 96 | "execution_count": null, 97 | "outputs": [] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "metadata": { 102 | "id": "L1lIIZ4C-nCa", 103 | "colab_type": "code", 104 | "colab": {} 105 | }, 106 | "source": [ 107 | "!mkdir test" 108 | ], 109 | "execution_count": null, 110 | "outputs": [] 111 | }, 112 | { 113 | "cell_type": "code", 114 | "metadata": { 115 | "id": "cWZxVbcRSDen", 116 | "colab_type": "code", 117 | "colab": {} 118 | }, 119 | "source": [ 120 | "!rm test/*" 121 | ], 122 | "execution_count": null, 123 | "outputs": [] 124 | }, 125 | { 126 | "cell_type": "code", 127 | "metadata": { 128 | "id": "tlzfUFbcXZQG", 129 | "colab_type": "code", 130 | "colab": {} 131 | }, 132 | "source": [ 133 | "k=20\n", 134 | "for i in range(len(l)):\n", 135 | " for j in range(k-20,k):\n", 136 | " im_c = Image.open('clear/'+clear[j])\n", 137 | " im = Image.open('part1/'+(clear[j].replace('.jpg',''))+l[i])\n", 138 | " # plt.imshow(im_c)\n", 139 | " # plt.show()\n", 140 | " # plt.imshow(im)\n", 141 | " # plt.show()\n", 142 | " im_c.save('test/'+str(j)+'_clean.jpg')\n", 143 | " im.save('test/'+str(j)+'.jpg')\n", 144 | " k = k + 20" 145 | ], 146 | "execution_count": null, 147 | "outputs": [] 148 | }, 149 | { 150 | "cell_type": "code", 151 | "metadata": { 152 | "id": "XnnSn1yuSOfl", 153 | "colab_type": "code", 154 | "colab": { 155 | "base_uri": "https://localhost:8080/", 156 | "height": 33 157 | }, 158 | "outputId": "d0a9c463-a2ba-4a18-b88d-2c82b8b48cb3" 159 | }, 160 | "source": [ 161 | "!ls test | wc -l" 162 | ], 163 | "execution_count": null, 164 | "outputs": [ 165 | { 166 | "output_type": "stream", 167 | "text": [ 168 | "400\n" 169 | ], 170 | "name": "stdout" 171 | } 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "metadata": { 177 | "id": "T-4q3AwXZqm_", 178 | "colab_type": "code", 179 | "colab": {} 180 | }, 181 | "source": [ 182 | "!tar -czvf test.tar.gz test" 183 | ], 184 | "execution_count": null, 185 | "outputs": [] 186 | }, 187 | { 188 | "cell_type": "code", 189 | "metadata": { 190 | "id": "v0vRkB7mY_AM", 191 | "colab_type": "code", 192 | "colab": {} 193 | }, 194 | "source": [ 195 | "!cp test.tar.gz '/content/gdrive/My Drive/DL Project/Datasets/TestData'" 196 | ], 197 | "execution_count": null, 198 | "outputs": [] 199 | }, 200 | { 201 | "cell_type": "markdown", 202 | "metadata": { 203 | "id": "-qmG0TG-aRGb", 204 | "colab_type": "text" 205 | }, 206 | "source": [ 207 | "### ITS" 208 | ] 209 | }, 210 | { 211 | "cell_type": "code", 212 | "metadata": { 213 | "colab_type": "code", 214 | "id": "GcjnHDu5aZR0", 215 | "colab": {} 216 | }, 217 | "source": [ 218 | "!unzip -q '/content/gdrive/My Drive/DL Project/Datasets/TestData/ITS/clear.zip' -d '/content/'" 219 | ], 220 | "execution_count": null, 221 | "outputs": [] 222 | }, 223 | { 224 | "cell_type": "code", 225 | "metadata": { 226 | "colab_type": "code", 227 | "id": "t8RN1cNTaZSN", 228 | "colab": {} 229 | }, 230 | "source": [ 231 | "!unzip -q '/content/gdrive/My Drive/DL Project/Datasets/TestData/ITS/haze.zip' -d '/content/'" 232 | ], 233 | "execution_count": null, 234 | "outputs": [] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "metadata": { 239 | "colab_type": "code", 240 | "id": "tf4FXd8EaZSV", 241 | "colab": {} 242 | }, 243 | "source": [ 244 | "clear = os.listdir('clear')\n", 245 | "haze = os.listdir('hazy')" 246 | ], 247 | "execution_count": null, 248 | "outputs": [] 249 | }, 250 | { 251 | "cell_type": "code", 252 | "metadata": { 253 | "colab_type": "code", 254 | "id": "c5PlmgvUaZSd", 255 | "colab": {} 256 | }, 257 | "source": [ 258 | "!mkdir test_its" 259 | ], 260 | "execution_count": null, 261 | "outputs": [] 262 | }, 263 | { 264 | "cell_type": "code", 265 | "metadata": { 266 | "colab_type": "code", 267 | "id": "jlgrgYDOaZSk", 268 | "colab": { 269 | "base_uri": "https://localhost:8080/", 270 | "height": 33 271 | }, 272 | "outputId": "d10ca901-7963-4c3f-f3fa-8747183654b4" 273 | }, 274 | "source": [ 275 | "!rm test_its/*" 276 | ], 277 | "execution_count": null, 278 | "outputs": [ 279 | { 280 | "output_type": "stream", 281 | "text": [ 282 | "rm: cannot remove 'test_its/*': No such file or directory\n" 283 | ], 284 | "name": "stdout" 285 | } 286 | ] 287 | }, 288 | { 289 | "cell_type": "code", 290 | "metadata": { 291 | "id": "KypCrN_TcBQx", 292 | "colab_type": "code", 293 | "colab": {} 294 | }, 295 | "source": [ 296 | "rhaze = random.sample(haze, 20)\n", 297 | "for i in range(len(rhaze)):\n", 298 | " im = Image.open('hazy/'+rhaze[i])\n", 299 | " c = rhaze[i].partition('_')[0]+'.png'\n", 300 | " im_c = Image.open('clear/'+c)\n", 301 | " # plt.imshow(im_c)\n", 302 | " # plt.show()\n", 303 | " # plt.imshow(im)\n", 304 | " # plt.show()\n", 305 | " im_c.save('test_its/'+str(i)+'_clean.jpg')\n", 306 | " im.save('test_its/'+str(i)+'.jpg')" 307 | ], 308 | "execution_count": null, 309 | "outputs": [] 310 | }, 311 | { 312 | "cell_type": "code", 313 | "metadata": { 314 | "colab_type": "code", 315 | "id": "vggoYo_BaZSy", 316 | "colab": { 317 | "base_uri": "https://localhost:8080/", 318 | "height": 33 319 | }, 320 | "outputId": "f4d51eb7-a6df-4111-a808-00bf585bc99c" 321 | }, 322 | "source": [ 323 | "!ls test_its | wc -l" 324 | ], 325 | "execution_count": null, 326 | "outputs": [ 327 | { 328 | "output_type": "stream", 329 | "text": [ 330 | "40\n" 331 | ], 332 | "name": "stdout" 333 | } 334 | ] 335 | }, 336 | { 337 | "cell_type": "code", 338 | "metadata": { 339 | "colab_type": "code", 340 | "id": "dloLnLDwaZS7", 341 | "colab": { 342 | "base_uri": "https://localhost:8080/", 343 | "height": 700 344 | }, 345 | "outputId": "30b61e60-554f-45b9-f235-4fd5d9437ec7" 346 | }, 347 | "source": [ 348 | "!tar -czvf test_its.tar.gz test_its" 349 | ], 350 | "execution_count": null, 351 | "outputs": [ 352 | { 353 | "output_type": "stream", 354 | "text": [ 355 | "test_its/\n", 356 | "test_its/16_clean.jpg\n", 357 | "test_its/7.jpg\n", 358 | "test_its/8.jpg\n", 359 | "test_its/11_clean.jpg\n", 360 | "test_its/4.jpg\n", 361 | "test_its/3.jpg\n", 362 | "test_its/0_clean.jpg\n", 363 | "test_its/16.jpg\n", 364 | "test_its/1.jpg\n", 365 | "test_its/17_clean.jpg\n", 366 | "test_its/6.jpg\n", 367 | "test_its/4_clean.jpg\n", 368 | "test_its/11.jpg\n", 369 | "test_its/10_clean.jpg\n", 370 | "test_its/14_clean.jpg\n", 371 | "test_its/18_clean.jpg\n", 372 | "test_its/1_clean.jpg\n", 373 | "test_its/2_clean.jpg\n", 374 | "test_its/3_clean.jpg\n", 375 | "test_its/19_clean.jpg\n", 376 | "test_its/14.jpg\n", 377 | "test_its/2.jpg\n", 378 | "test_its/18.jpg\n", 379 | "test_its/19.jpg\n", 380 | "test_its/13_clean.jpg\n", 381 | "test_its/13.jpg\n", 382 | "test_its/0.jpg\n", 383 | "test_its/9.jpg\n", 384 | "test_its/5.jpg\n", 385 | "test_its/5_clean.jpg\n", 386 | "test_its/12_clean.jpg\n", 387 | "test_its/6_clean.jpg\n", 388 | "test_its/17.jpg\n", 389 | "test_its/8_clean.jpg\n", 390 | "test_its/9_clean.jpg\n", 391 | "test_its/10.jpg\n", 392 | "test_its/7_clean.jpg\n", 393 | "test_its/15.jpg\n", 394 | "test_its/12.jpg\n", 395 | "test_its/15_clean.jpg\n" 396 | ], 397 | "name": "stdout" 398 | } 399 | ] 400 | }, 401 | { 402 | "cell_type": "code", 403 | "metadata": { 404 | "colab_type": "code", 405 | "id": "K2FX9BHvaZTC", 406 | "colab": {} 407 | }, 408 | "source": [ 409 | "!cp test_its.tar.gz '/content/gdrive/My Drive/DL Project/Datasets/TestData'" 410 | ], 411 | "execution_count": null, 412 | "outputs": [] 413 | } 414 | ] 415 | } -------------------------------------------------------------------------------- /Jupyter Notebooks/Network_Model_Residual.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Network Model-Residual.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [] 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "accelerator": "GPU" 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "markdown", 19 | "metadata": { 20 | "id": "oQcB_IZ3SoSx", 21 | "colab_type": "text" 22 | }, 23 | "source": [ 24 | "**Mounting Google Drive for Dataset**" 25 | ] 26 | }, 27 | { 28 | "cell_type": "code", 29 | "metadata": { 30 | "id": "N5WvauNXSr3i", 31 | "colab_type": "code", 32 | "colab": {} 33 | }, 34 | "source": [ 35 | "from google.colab import drive\n", 36 | "drive.mount('/content/drive') " 37 | ], 38 | "execution_count": null, 39 | "outputs": [] 40 | }, 41 | { 42 | "cell_type": "markdown", 43 | "metadata": { 44 | "id": "xfXrgIyOSi7v", 45 | "colab_type": "text" 46 | }, 47 | "source": [ 48 | "**Importing Libraries**" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "metadata": { 54 | "id": "_AHvd5tsNT-n", 55 | "colab_type": "code", 56 | "colab": {} 57 | }, 58 | "source": [ 59 | "import numpy as np\n", 60 | "import h5py\n", 61 | "import math\n", 62 | "\n", 63 | "from keras.models import Model\n", 64 | "from keras.layers import Input, Activation, BatchNormalization, Conv2D, Conv3D\n", 65 | "from keras.layers import Lambda, Concatenate, MaxPooling2D, Maximum, Add\n", 66 | "from keras.initializers import RandomNormal\n", 67 | "from keras.optimizers import SGD\n", 68 | "from keras.losses import MeanSquaredError\n", 69 | "from keras.callbacks import Callback,LearningRateScheduler\n", 70 | "from keras.utils import plot_model\n", 71 | "\n", 72 | "import keras.backend as K\n", 73 | "K.set_image_data_format('channels_last')\n", 74 | "\n", 75 | "import matplotlib.pyplot as plt\n", 76 | "from matplotlib.pyplot import imshow\n", 77 | "\n", 78 | "%matplotlib inline" 79 | ], 80 | "execution_count": null, 81 | "outputs": [] 82 | }, 83 | { 84 | "cell_type": "markdown", 85 | "metadata": { 86 | "id": "bODVTrnLUxhX", 87 | "colab_type": "text" 88 | }, 89 | "source": [ 90 | "**util functions**" 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "metadata": { 96 | "id": "g30fKhmUSx0A", 97 | "colab_type": "code", 98 | "colab": {} 99 | }, 100 | "source": [ 101 | "# Load Dataset from Google Drive\n", 102 | "def load_train_dataset():\n", 103 | " \"\"\"\n", 104 | " Load training dataset from Google Drive\n", 105 | " \n", 106 | " Returns:\n", 107 | " clean_image -- Clean image patches\n", 108 | " clean_image -- Hazy image patches\n", 109 | " transmission_value -- Transmission value which convert clean image to \n", 110 | " haze image\n", 111 | " \"\"\"\n", 112 | "\n", 113 | " file = '/content/drive/My Drive/DL Project/Datasets/TrainData/train_data_patch_16x16_res.hdf5'\n", 114 | " train_dataset = h5py.File(file, 'r')\n", 115 | " clean_image = np.array(train_dataset['clear_image'][:])\n", 116 | " haze_image = np.array(train_dataset['haze_image'][:])\n", 117 | " transmission_map = np.array(train_dataset['transmission_map'])\n", 118 | " transmission_map_refine = np.array(train_dataset['transmission_map_refine'])\n", 119 | " \n", 120 | " return clean_image, haze_image, transmission_map, transmission_map_refine\n", 121 | "\n", 122 | "\n", 123 | "# Gaussian Weight Initializtion for layers\n", 124 | "weight_init = RandomNormal(mean=0.0, stddev=0.001)\n", 125 | "\n", 126 | "\n", 127 | "# LearningRate Decay function\n", 128 | "def lr_schedule(epoch,lr, logs={}):\n", 129 | " \"\"\"\n", 130 | " Learning Rate Deacy scheduler\n", 131 | "\n", 132 | " Arguments:\n", 133 | " epoch -- current epoch number\n", 134 | " lr -- current learning rate\n", 135 | " log -- dictionary storing the logs of training\n", 136 | "\n", 137 | " Returns:\n", 138 | " lr -- learning rate for next epoch\n", 139 | " \"\"\"\n", 140 | " \n", 141 | " print('learning_rate:',lr)\n", 142 | " logs.update({'lr': lr})\n", 143 | " if epoch in (49,99):\n", 144 | " return lr*0.5\n", 145 | " else:\n", 146 | " return lr" 147 | ], 148 | "execution_count": null, 149 | "outputs": [] 150 | }, 151 | { 152 | "cell_type": "markdown", 153 | "metadata": { 154 | "id": "w6g_9pM0StUr", 155 | "colab_type": "text" 156 | }, 157 | "source": [ 158 | "**Preparing Train Dataset**" 159 | ] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "metadata": { 164 | "id": "gcW1gHygTySj", 165 | "colab_type": "code", 166 | "colab": { 167 | "base_uri": "https://localhost:8080/", 168 | "height": 100 169 | }, 170 | "outputId": "9dae6c97-c8c6-4783-95e4-98e895ae0175" 171 | }, 172 | "source": [ 173 | "clean_image, haze_image, transmission_map, transmission_map_refine = load_train_dataset()\n", 174 | "\n", 175 | "print (\"Number of training examples:\", clean_image.shape[0])\n", 176 | "print (\"Clean Image Patch shape:\", clean_image.shape)\n", 177 | "print (\"Haze Image Patch shape:\", haze_image.shape)\n", 178 | "print (\"Transmission Map shape:\", haze_image.shape)\n", 179 | "print (\"Transmission Map Refine shape:\", haze_image.shape)" 180 | ], 181 | "execution_count": null, 182 | "outputs": [ 183 | { 184 | "output_type": "stream", 185 | "text": [ 186 | "number of training examples: 60000\n", 187 | "Clean Image Patch shape: (60000, 16, 16, 3)\n", 188 | "Haze Image Patch shape: (60000, 16, 16, 3)\n", 189 | "Transmission Map shape: (60000, 16, 16, 3)\n", 190 | "Transmission Map Refine shape: (60000, 16, 16, 3)\n" 191 | ], 192 | "name": "stdout" 193 | } 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "metadata": { 199 | "id": "1N4gfzQWXuYk", 200 | "colab_type": "code", 201 | "colab": { 202 | "base_uri": "https://localhost:8080/", 203 | "height": 33 204 | }, 205 | "outputId": "99181846-448d-4b9c-895b-bb571ba4e567" 206 | }, 207 | "source": [ 208 | "residual_input = np.clip(((haze_image/255.0)/np.expand_dims(transmission_map_refine,axis=3)),0,1)\n", 209 | "residual_output = np.clip((residual_input-clean_image),0,1)" 210 | ], 211 | "execution_count": null, 212 | "outputs": [ 213 | { 214 | "output_type": "execute_result", 215 | "data": { 216 | "text/plain": [ 217 | "(0.15836089520286992, 1.0, 0.0, 1.0)" 218 | ] 219 | }, 220 | "metadata": { 221 | "tags": [] 222 | }, 223 | "execution_count": 44 224 | } 225 | ] 226 | }, 227 | { 228 | "cell_type": "markdown", 229 | "metadata": { 230 | "id": "WpItPvOdUSyQ", 231 | "colab_type": "text" 232 | }, 233 | "source": [ 234 | "#### Residual Model" 235 | ] 236 | }, 237 | { 238 | "cell_type": "markdown", 239 | "metadata": { 240 | "id": "6HfwDeLj8RKC", 241 | "colab_type": "text" 242 | }, 243 | "source": [ 244 | "**Designing**" 245 | ] 246 | }, 247 | { 248 | "cell_type": "code", 249 | "metadata": { 250 | "id": "nSdxtS_nRAyq", 251 | "colab_type": "code", 252 | "colab": {} 253 | }, 254 | "source": [ 255 | "def ResidualBlock(X, iter):\n", 256 | " \"\"\"\n", 257 | " Implementation of the single block of RNN\n", 258 | " \n", 259 | " Arguments:\n", 260 | " X -- input tensor of shape (m, n_H_prev, n_W_prev, n_C_prev)\n", 261 | " iter -- integer, used to name layers, depending on current residual block\n", 262 | " \n", 263 | " Returns:\n", 264 | " X -- output of the identity block, tensor of shape (n_H, n_W, n_C)\n", 265 | " \"\"\"\n", 266 | " \n", 267 | " # Save the input value\n", 268 | " X_shortcut = X\n", 269 | " \n", 270 | " # BATCHNORMALIZATION -> CONV Block\n", 271 | " X = BatchNormalization(axis = 3, name = 'res_batchnorm_' + str(iter))(X)\n", 272 | " X = Conv2D(1, (3, 3), strides = (1,1), padding = 'same', kernel_initializer = weight_init, name = 'res_conv_' + str(iter))(X)\n", 273 | "\n", 274 | " # Add shortcut value to main path, and pass it through a RELU activation\n", 275 | " X = Add(name = 'res_add_'+ str(iter))([X,X_shortcut])\n", 276 | " X = Activation('relu', name = 'res_activation_'+ str(iter))(X)\n", 277 | " \n", 278 | " return X\n", 279 | "\n", 280 | "def ResidualModel(input_shape):\n", 281 | " \"\"\"\n", 282 | " Implementation of the Model.\n", 283 | " \n", 284 | " Arguments:\n", 285 | " input_shape -- shape of the images of the dataset \n", 286 | " (height, width, channels) as a tuple. \n", 287 | "\n", 288 | " Returns:\n", 289 | " model -- a Model() instance in Keras\n", 290 | " \"\"\"\n", 291 | " \n", 292 | " X_input = Input(input_shape, name = 'input1')\n", 293 | "\n", 294 | " # CONV -> RELU Block applied to X\n", 295 | " X = Conv2D(16, (3, 3), strides = (1, 1), padding = 'same', kernel_initializer = weight_init, name = 'conv1')(X_input)\n", 296 | " X = Activation('relu', name = 'activation1')(X)\n", 297 | "\n", 298 | " # X = Conv2D(8, (1, 1), kernel_initializer = weight_init, name='test_conv')(X)\n", 299 | "\n", 300 | " for i in range(17):\n", 301 | " X = ResidualBlock(X, i)\n", 302 | " \n", 303 | " # CONV BLock\n", 304 | " X = Conv2D(3, (3, 3), strides = (1, 1), padding = 'same', kernel_initializer = weight_init, name = 'conv2')(X)\n", 305 | " X = Activation('relu', name = 'activation2')(X)\n", 306 | "\n", 307 | " # Create Keras model instance\n", 308 | " model = Model(inputs = X_input, outputs = X, name='TransmissionModel')\n", 309 | "\n", 310 | " return model" 311 | ], 312 | "execution_count": null, 313 | "outputs": [] 314 | }, 315 | { 316 | "cell_type": "markdown", 317 | "metadata": { 318 | "id": "Uw5ZITqj8TYP", 319 | "colab_type": "text" 320 | }, 321 | "source": [ 322 | "**Compiling**" 323 | ] 324 | }, 325 | { 326 | "cell_type": "code", 327 | "metadata": { 328 | "id": "lk2ml393VNBA", 329 | "colab_type": "code", 330 | "colab": { 331 | "base_uri": "https://localhost:8080/", 332 | "height": 1000 333 | }, 334 | "outputId": "c6b9fb93-2e35-4653-a0e4-6b13fa685cc4" 335 | }, 336 | "source": [ 337 | "model2 = ResidualModel(residual_input.shape[1:])\n", 338 | "model2.summary() \n", 339 | "model2.compile(optimizer=SGD(0.001), loss=MeanSquaredError())" 340 | ], 341 | "execution_count": null, 342 | "outputs": [ 343 | { 344 | "output_type": "stream", 345 | "text": [ 346 | "Model: \"TransmissionModel\"\n", 347 | "__________________________________________________________________________________________________\n", 348 | "Layer (type) Output Shape Param # Connected to \n", 349 | "==================================================================================================\n", 350 | "input1 (InputLayer) (None, 16, 16, 3) 0 \n", 351 | "__________________________________________________________________________________________________\n", 352 | "conv1 (Conv2D) (None, 16, 16, 16) 448 input1[0][0] \n", 353 | "__________________________________________________________________________________________________\n", 354 | "activation1 (Activation) (None, 16, 16, 16) 0 conv1[0][0] \n", 355 | "__________________________________________________________________________________________________\n", 356 | "res_batchnorm_0 (BatchNormaliza (None, 16, 16, 16) 64 activation1[0][0] \n", 357 | "__________________________________________________________________________________________________\n", 358 | "res_conv_0 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_0[0][0] \n", 359 | "__________________________________________________________________________________________________\n", 360 | "res_add_0 (Add) (None, 16, 16, 16) 0 res_conv_0[0][0] \n", 361 | " activation1[0][0] \n", 362 | "__________________________________________________________________________________________________\n", 363 | "res_activation_0 (Activation) (None, 16, 16, 16) 0 res_add_0[0][0] \n", 364 | "__________________________________________________________________________________________________\n", 365 | "res_batchnorm_1 (BatchNormaliza (None, 16, 16, 16) 64 res_activation_0[0][0] \n", 366 | "__________________________________________________________________________________________________\n", 367 | "res_conv_1 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_1[0][0] \n", 368 | "__________________________________________________________________________________________________\n", 369 | "res_add_1 (Add) (None, 16, 16, 16) 0 res_conv_1[0][0] \n", 370 | " res_activation_0[0][0] \n", 371 | "__________________________________________________________________________________________________\n", 372 | "res_activation_1 (Activation) (None, 16, 16, 16) 0 res_add_1[0][0] \n", 373 | "__________________________________________________________________________________________________\n", 374 | "res_batchnorm_2 (BatchNormaliza (None, 16, 16, 16) 64 res_activation_1[0][0] \n", 375 | "__________________________________________________________________________________________________\n", 376 | "res_conv_2 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_2[0][0] \n", 377 | "__________________________________________________________________________________________________\n", 378 | "res_add_2 (Add) (None, 16, 16, 16) 0 res_conv_2[0][0] \n", 379 | " res_activation_1[0][0] \n", 380 | "__________________________________________________________________________________________________\n", 381 | "res_activation_2 (Activation) (None, 16, 16, 16) 0 res_add_2[0][0] \n", 382 | "__________________________________________________________________________________________________\n", 383 | "res_batchnorm_3 (BatchNormaliza (None, 16, 16, 16) 64 res_activation_2[0][0] \n", 384 | "__________________________________________________________________________________________________\n", 385 | "res_conv_3 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_3[0][0] \n", 386 | "__________________________________________________________________________________________________\n", 387 | "res_add_3 (Add) (None, 16, 16, 16) 0 res_conv_3[0][0] \n", 388 | " res_activation_2[0][0] \n", 389 | "__________________________________________________________________________________________________\n", 390 | "res_activation_3 (Activation) (None, 16, 16, 16) 0 res_add_3[0][0] \n", 391 | "__________________________________________________________________________________________________\n", 392 | "res_batchnorm_4 (BatchNormaliza (None, 16, 16, 16) 64 res_activation_3[0][0] \n", 393 | "__________________________________________________________________________________________________\n", 394 | "res_conv_4 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_4[0][0] \n", 395 | "__________________________________________________________________________________________________\n", 396 | "res_add_4 (Add) (None, 16, 16, 16) 0 res_conv_4[0][0] \n", 397 | " res_activation_3[0][0] \n", 398 | "__________________________________________________________________________________________________\n", 399 | "res_activation_4 (Activation) (None, 16, 16, 16) 0 res_add_4[0][0] \n", 400 | "__________________________________________________________________________________________________\n", 401 | "res_batchnorm_5 (BatchNormaliza (None, 16, 16, 16) 64 res_activation_4[0][0] \n", 402 | "__________________________________________________________________________________________________\n", 403 | "res_conv_5 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_5[0][0] \n", 404 | "__________________________________________________________________________________________________\n", 405 | "res_add_5 (Add) (None, 16, 16, 16) 0 res_conv_5[0][0] \n", 406 | " res_activation_4[0][0] \n", 407 | "__________________________________________________________________________________________________\n", 408 | "res_activation_5 (Activation) (None, 16, 16, 16) 0 res_add_5[0][0] \n", 409 | "__________________________________________________________________________________________________\n", 410 | "res_batchnorm_6 (BatchNormaliza (None, 16, 16, 16) 64 res_activation_5[0][0] \n", 411 | "__________________________________________________________________________________________________\n", 412 | "res_conv_6 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_6[0][0] \n", 413 | "__________________________________________________________________________________________________\n", 414 | "res_add_6 (Add) (None, 16, 16, 16) 0 res_conv_6[0][0] \n", 415 | " res_activation_5[0][0] \n", 416 | "__________________________________________________________________________________________________\n", 417 | "res_activation_6 (Activation) (None, 16, 16, 16) 0 res_add_6[0][0] \n", 418 | "__________________________________________________________________________________________________\n", 419 | "res_batchnorm_7 (BatchNormaliza (None, 16, 16, 16) 64 res_activation_6[0][0] \n", 420 | "__________________________________________________________________________________________________\n", 421 | "res_conv_7 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_7[0][0] \n", 422 | "__________________________________________________________________________________________________\n", 423 | "res_add_7 (Add) (None, 16, 16, 16) 0 res_conv_7[0][0] \n", 424 | " res_activation_6[0][0] \n", 425 | "__________________________________________________________________________________________________\n", 426 | "res_activation_7 (Activation) (None, 16, 16, 16) 0 res_add_7[0][0] \n", 427 | "__________________________________________________________________________________________________\n", 428 | "res_batchnorm_8 (BatchNormaliza (None, 16, 16, 16) 64 res_activation_7[0][0] \n", 429 | "__________________________________________________________________________________________________\n", 430 | "res_conv_8 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_8[0][0] \n", 431 | "__________________________________________________________________________________________________\n", 432 | "res_add_8 (Add) (None, 16, 16, 16) 0 res_conv_8[0][0] \n", 433 | " res_activation_7[0][0] \n", 434 | "__________________________________________________________________________________________________\n", 435 | "res_activation_8 (Activation) (None, 16, 16, 16) 0 res_add_8[0][0] \n", 436 | "__________________________________________________________________________________________________\n", 437 | "res_batchnorm_9 (BatchNormaliza (None, 16, 16, 16) 64 res_activation_8[0][0] \n", 438 | "__________________________________________________________________________________________________\n", 439 | "res_conv_9 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_9[0][0] \n", 440 | "__________________________________________________________________________________________________\n", 441 | "res_add_9 (Add) (None, 16, 16, 16) 0 res_conv_9[0][0] \n", 442 | " res_activation_8[0][0] \n", 443 | "__________________________________________________________________________________________________\n", 444 | "res_activation_9 (Activation) (None, 16, 16, 16) 0 res_add_9[0][0] \n", 445 | "__________________________________________________________________________________________________\n", 446 | "res_batchnorm_10 (BatchNormaliz (None, 16, 16, 16) 64 res_activation_9[0][0] \n", 447 | "__________________________________________________________________________________________________\n", 448 | "res_conv_10 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_10[0][0] \n", 449 | "__________________________________________________________________________________________________\n", 450 | "res_add_10 (Add) (None, 16, 16, 16) 0 res_conv_10[0][0] \n", 451 | " res_activation_9[0][0] \n", 452 | "__________________________________________________________________________________________________\n", 453 | "res_activation_10 (Activation) (None, 16, 16, 16) 0 res_add_10[0][0] \n", 454 | "__________________________________________________________________________________________________\n", 455 | "res_batchnorm_11 (BatchNormaliz (None, 16, 16, 16) 64 res_activation_10[0][0] \n", 456 | "__________________________________________________________________________________________________\n", 457 | "res_conv_11 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_11[0][0] \n", 458 | "__________________________________________________________________________________________________\n", 459 | "res_add_11 (Add) (None, 16, 16, 16) 0 res_conv_11[0][0] \n", 460 | " res_activation_10[0][0] \n", 461 | "__________________________________________________________________________________________________\n", 462 | "res_activation_11 (Activation) (None, 16, 16, 16) 0 res_add_11[0][0] \n", 463 | "__________________________________________________________________________________________________\n", 464 | "res_batchnorm_12 (BatchNormaliz (None, 16, 16, 16) 64 res_activation_11[0][0] \n", 465 | "__________________________________________________________________________________________________\n", 466 | "res_conv_12 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_12[0][0] \n", 467 | "__________________________________________________________________________________________________\n", 468 | "res_add_12 (Add) (None, 16, 16, 16) 0 res_conv_12[0][0] \n", 469 | " res_activation_11[0][0] \n", 470 | "__________________________________________________________________________________________________\n", 471 | "res_activation_12 (Activation) (None, 16, 16, 16) 0 res_add_12[0][0] \n", 472 | "__________________________________________________________________________________________________\n", 473 | "res_batchnorm_13 (BatchNormaliz (None, 16, 16, 16) 64 res_activation_12[0][0] \n", 474 | "__________________________________________________________________________________________________\n", 475 | "res_conv_13 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_13[0][0] \n", 476 | "__________________________________________________________________________________________________\n", 477 | "res_add_13 (Add) (None, 16, 16, 16) 0 res_conv_13[0][0] \n", 478 | " res_activation_12[0][0] \n", 479 | "__________________________________________________________________________________________________\n", 480 | "res_activation_13 (Activation) (None, 16, 16, 16) 0 res_add_13[0][0] \n", 481 | "__________________________________________________________________________________________________\n", 482 | "res_batchnorm_14 (BatchNormaliz (None, 16, 16, 16) 64 res_activation_13[0][0] \n", 483 | "__________________________________________________________________________________________________\n", 484 | "res_conv_14 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_14[0][0] \n", 485 | "__________________________________________________________________________________________________\n", 486 | "res_add_14 (Add) (None, 16, 16, 16) 0 res_conv_14[0][0] \n", 487 | " res_activation_13[0][0] \n", 488 | "__________________________________________________________________________________________________\n", 489 | "res_activation_14 (Activation) (None, 16, 16, 16) 0 res_add_14[0][0] \n", 490 | "__________________________________________________________________________________________________\n", 491 | "res_batchnorm_15 (BatchNormaliz (None, 16, 16, 16) 64 res_activation_14[0][0] \n", 492 | "__________________________________________________________________________________________________\n", 493 | "res_conv_15 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_15[0][0] \n", 494 | "__________________________________________________________________________________________________\n", 495 | "res_add_15 (Add) (None, 16, 16, 16) 0 res_conv_15[0][0] \n", 496 | " res_activation_14[0][0] \n", 497 | "__________________________________________________________________________________________________\n", 498 | "res_activation_15 (Activation) (None, 16, 16, 16) 0 res_add_15[0][0] \n", 499 | "__________________________________________________________________________________________________\n", 500 | "res_batchnorm_16 (BatchNormaliz (None, 16, 16, 16) 64 res_activation_15[0][0] \n", 501 | "__________________________________________________________________________________________________\n", 502 | "res_conv_16 (Conv2D) (None, 16, 16, 1) 145 res_batchnorm_16[0][0] \n", 503 | "__________________________________________________________________________________________________\n", 504 | "res_add_16 (Add) (None, 16, 16, 16) 0 res_conv_16[0][0] \n", 505 | " res_activation_15[0][0] \n", 506 | "__________________________________________________________________________________________________\n", 507 | "res_activation_16 (Activation) (None, 16, 16, 16) 0 res_add_16[0][0] \n", 508 | "__________________________________________________________________________________________________\n", 509 | "conv2 (Conv2D) (None, 16, 16, 3) 435 res_activation_16[0][0] \n", 510 | "__________________________________________________________________________________________________\n", 511 | "activation2 (Activation) (None, 16, 16, 3) 0 conv2[0][0] \n", 512 | "==================================================================================================\n", 513 | "Total params: 4,436\n", 514 | "Trainable params: 3,892\n", 515 | "Non-trainable params: 544\n", 516 | "__________________________________________________________________________________________________\n" 517 | ], 518 | "name": "stdout" 519 | } 520 | ] 521 | }, 522 | { 523 | "cell_type": "markdown", 524 | "metadata": { 525 | "id": "vWXkYxRe7zud", 526 | "colab_type": "text" 527 | }, 528 | "source": [ 529 | "**Training**" 530 | ] 531 | }, 532 | { 533 | "cell_type": "code", 534 | "metadata": { 535 | "id": "S6gpK3oOAOdT", 536 | "colab_type": "code", 537 | "colab": {} 538 | }, 539 | "source": [ 540 | "history2 = model2.fit(residual_input, residual_output, batch_size = 30, epochs = 150, callbacks=[LearningRateScheduler(lr_schedule)])" 541 | ], 542 | "execution_count": null, 543 | "outputs": [] 544 | }, 545 | { 546 | "cell_type": "markdown", 547 | "metadata": { 548 | "id": "DUZLECSG73rc", 549 | "colab_type": "text" 550 | }, 551 | "source": [ 552 | "**Generating Models and Graph**" 553 | ] 554 | }, 555 | { 556 | "cell_type": "code", 557 | "metadata": { 558 | "id": "t3LoZlCEkpvC", 559 | "colab_type": "code", 560 | "colab": {} 561 | }, 562 | "source": [ 563 | "plot_model(model2, 'res_model.png')\n", 564 | "plot_model(model2, 'res_model_shape.png', True)" 565 | ], 566 | "execution_count": null, 567 | "outputs": [] 568 | }, 569 | { 570 | "cell_type": "code", 571 | "metadata": { 572 | "id": "UqN0-Ulys8Sh", 573 | "colab_type": "code", 574 | "colab": { 575 | "base_uri": "https://localhost:8080/", 576 | "height": 573 577 | }, 578 | "outputId": "43de1414-6d1d-4dbc-a56b-609904eb38f2" 579 | }, 580 | "source": [ 581 | "plt.plot(history2.history['lr'])\n", 582 | "plt.title('model learning rate')\n", 583 | "plt.ylabel('learning rate')\n", 584 | "plt.xlabel('epoch')\n", 585 | "plt.legend(['train'], loc='upper right')\n", 586 | "plt.savefig('res150-30-lr.png')\n", 587 | "plt.show()\n", 588 | "plt.plot(history2.history['loss'])\n", 589 | "plt.title('model loss')\n", 590 | "plt.ylabel('loss')\n", 591 | "plt.xlabel('epoch')\n", 592 | "plt.legend(['train'], loc='upper right')\n", 593 | "plt.savefig('res150-30-loss.png')\n", 594 | "plt.show()" 595 | ], 596 | "execution_count": null, 597 | "outputs": [ 598 | { 599 | "output_type": "display_data", 600 | "data": { 601 | "image/png": "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\n", 602 | "text/plain": [ 603 | "
" 604 | ] 605 | }, 606 | "metadata": { 607 | "tags": [], 608 | "needs_background": "light" 609 | } 610 | }, 611 | { 612 | "output_type": "display_data", 613 | "data": { 614 | "image/png": "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\n", 615 | "text/plain": [ 616 | "
" 617 | ] 618 | }, 619 | "metadata": { 620 | "tags": [], 621 | "needs_background": "light" 622 | } 623 | } 624 | ] 625 | }, 626 | { 627 | "cell_type": "code", 628 | "metadata": { 629 | "id": "ayF1BJvyZ2OW", 630 | "colab_type": "code", 631 | "colab": {} 632 | }, 633 | "source": [ 634 | "model2.save('resmodel_150_30.h5')\n", 635 | "model2.save_weights('resmodel_150_30_weights.h5')" 636 | ], 637 | "execution_count": null, 638 | "outputs": [] 639 | }, 640 | { 641 | "cell_type": "markdown", 642 | "metadata": { 643 | "id": "OnobuOgv796R", 644 | "colab_type": "text" 645 | }, 646 | "source": [ 647 | "**Predicting**" 648 | ] 649 | }, 650 | { 651 | "cell_type": "code", 652 | "metadata": { 653 | "id": "CBoxoZB9YH1M", 654 | "colab_type": "code", 655 | "colab": { 656 | "base_uri": "https://localhost:8080/", 657 | "height": 761 658 | }, 659 | "outputId": "1faf7a39-febc-4257-a39e-fddc701ff389" 660 | }, 661 | "source": [ 662 | "t = np.expand_dims(residual_input[7], axis=0)\n", 663 | "T = model2.predict(t)\n", 664 | "plt.imshow(residual_input[7]-T[0])\n", 665 | "plt.show()\n", 666 | "plt.imshow(clean_image[7])\n", 667 | "plt.show()\n", 668 | "plt.imshow(haze_image[7])\n", 669 | "plt.show()" 670 | ], 671 | "execution_count": null, 672 | "outputs": [ 673 | { 674 | "output_type": "display_data", 675 | "data": { 676 | "image/png": "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\n", 677 | "text/plain": [ 678 | "
" 679 | ] 680 | }, 681 | "metadata": { 682 | "tags": [], 683 | "needs_background": "light" 684 | } 685 | }, 686 | { 687 | "output_type": "display_data", 688 | "data": { 689 | "image/png": "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\n", 690 | "text/plain": [ 691 | "
" 692 | ] 693 | }, 694 | "metadata": { 695 | "tags": [], 696 | "needs_background": "light" 697 | } 698 | }, 699 | { 700 | "output_type": "display_data", 701 | "data": { 702 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD4CAYAAAAjDTByAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAOU0lEQVR4nO3df4xl9VnH8c/HXbBCCeyAUjq7EWgICTYqmw2htcHGVVxWwmJSkyVWl9KkaRQFU0O2ktjGv1qr9WfTBgFF3UAjP2TTgGWlbRoTWQvrLuyytLsgwo4LiyyBav+gK49/3LPNnWHu7p3vOec7d+Z5v5LJ3B/nznnu985nzrlnzvc+jggByOeHFrsAAIuD8ANJEX4gKcIPJEX4gaRW1lzZ1NSqmJ6errlKIJWZmRkdPfqax1m2avinp6f14IP31VxlgbHGreUjBqr+k3VJ/Eu3Xo2lr1m5Os/tmmt/Zexl2e0HkiL8QFKtwm97g+1v2z5oe2tXRQHoX3H4ba+Q9AVJV0m6RNJ1ti/pqjAA/Wqz5b9M0sGIeC4i3pR0j6RN3ZQFoG9twj8t6cWh64ea22ax/THbj9t+/OjR11qsDkCXej/gFxG3RcS6iFg3NbWq79UBGFOb8M9IWjN0fXVzG4AloE34vyXpItsX2D5V0mZJ27spC0Dfis/wi4hjtm+U9FVJKyTdGRH7OqsMQK9and4bEQ9JeqijWgBUxBl+QFJVJ/bUVXO6TdmkjZoVuv5MloVbCnOPik3eC8CWH0iK8ANJEX4gKcIPJEX4gaQIP5AU4QeSIvxAUoQfSIrwA0kRfiApwg8kVX1iT9EEk5i8SRHdqDshqEzFtS2J1kelJu93mC0/kBThB5Ii/EBSbTr2rLH9ddtP295n+6YuCwPQrzYH/I5J+kRE7LJ9hqQnbO+IiKc7qg1Aj4q3/BFxOCJ2NZe/K2m/5unYA2AydfKe3/b5ki6VtHOe+2jXBUyg1uG3/U5J90m6OSLemHs/7bqAydQq/LZP0SD42yLi/m5KAlBDm6P9lnSHpP0R8fnuSgJQQ5st/89I+jVJP2d7d/O1saO6APSsTa++f9EknrAMYCyc4QcktQjtugp2FiZ9/6J0VlnN57UkZr4VKpop2nkVSw5bfiApwg8kRfiBpAg/kBThB5Ii/EBShB9IivADSRF+ICnCDyRF+IGkCD+Q1CJM7Jl0FWeJLNs2ZEtA8dAvn9eMLT+QFOEHkiL8QFJdfHT3Ctv/bvsrXRQEoI4utvw3adCtB8AS0vZz+1dL+iVJt3dTDoBa2m75/1TSLZLe6qAWABW1adpxtaQjEfHESZajVx8wgdo27bjG9vOS7tGgecffz12IXn3AZGrTovuTEbE6Is6XtFnS1yLiw51VBqBX/J8fSKqTc/sj4huSvtHFzwJQB1t+IClm9XWi8kwvF6wvJr8/VfkoLvy5lY9GzXHsd11s+YGkCD+QFOEHkiL8QFKEH0iK8ANJEX4gKcIPJEX4gaQIP5AU4QeSIvxAUoQfSGoRZvXVmRXlwjliZdWVzkcre1zRo0pLLG1DWHX2W4na9U3eeLDlB5Ii/EBShB9Iqm3HnrNs32v7Gdv7bb+vq8IA9KvtAb8/k/RPEfEh26dKOq2DmgBUUBx+22dKukLS9ZIUEW9KerObsgD0rc1u/wWSXpH0102L7tttnz53Idp1AZOpTfhXSlor6YsRcamk/5W0de5CtOsCJlOb8B+SdCgidjbX79XgjwGAJaBNr76XJL1o++LmpvWSnu6kKgC9a3u0/7ckbWuO9D8n6SPtSwJQQ6vwR8RuSes6qgVARVUn9thlnabKFE7RiYUXGKUTdOoNRgv1JqRM3tSX5Y3Te4GkCD+QFOEHkiL8QFKEH0iK8ANJEX4gKcIPJEX4gaQIP5AU4QeSIvxAUoQfSGrZtusqVjDRrrQ1GPIom8G58KwsZC1s+YGkCD+QFOEHkmrbrut3bO+zvdf23bbf0VVhAPpVHH7b05J+W9K6iHivpBWSNndVGIB+td3tXynpR2yv1KBP33+1LwlADW0+t39G0h9JekHSYUmvR8Qjc5cbbtf16qu06wImRZvd/lWSNmnQs+/dkk63/eG5yw236zr7bNp1AZOizW7/z0v6j4h4JSK+L+l+Se/vpiwAfWsT/hckXW77NA9OX1ovaX83ZQHoW5v3/Ds1aM65S9JTzc+6raO6APSsbbuuT0n6VEe1AKiIM/yApOrP6pvwXn1lDytcV83JgKWTKV3a87DkUTVnfNaeiVny3PqtkS0/kBThB5Ii/EBShB9IivADSRF+ICnCDyRF+IGkCD+QFOEHkiL8QFKEH0hqGbfrqjhJxG+VPrDao6J0jkjlCUHVFD+v0hVO3nZ28ioCUAXhB5Ii/EBSJw2/7TttH7G9d+i2Kds7bB9ovvOZ3MASM86W/28kbZhz21ZJj0bERZIeba4DWEJOGv6I+Kako3Nu3iTprubyXZKu7bguAD0rfc9/bkQcbi6/JOncUQvOatd1dO7fEACLpfUBv4gIneC/prPadU1NtV0dgI6Uhv9l2+dJUvP9SHclAaihNPzbJW1pLm+R9GA35QCoZZx/9d0t6V8lXWz7kO2PSvqMpF+wfUCDhp2f6bdMAF076bn9EXHdiLvWd1wLgIo4ww9IahFm9ZUomYJVc1ZZ5SliLnhc7VlsVSf1FRRZu1tX/RWeFFt+ICnCDyRF+IGkCD+QFOEHkiL8QFKEH0iK8ANJEX4gKcIPJEX4gaQIP5DU0pjYUzRJZPImUnRl8MlpC1V5PIrm2lSssXDiUSyj3yu2/EBShB9IivADSZW26/qc7WdsP2n7Adtn9VsmgK6VtuvaIem9EfGTkr4j6ZMd1wWgZ0XtuiLikYg41lx9TNLqHmoD0KMu3vPfIOnhUXfSrguYTK3Cb/tWScckbRu1DO26gMlUfJKP7eslXS1pfZSddQJgERWF3/YGSbdI+tmI+F63JQGoobRd119KOkPSDtu7bX+p5zoBdKy0XdcdPdQCoCLO8AOSqj6rz1pR8KCaxxNLZm3VPd65XA+v1nxe5d3LCh9Zs8XamNjyA0kRfiApwg8kRfiBpAg/kBThB5Ii/EBShB9IivADSRF+ICnCDyRF+IGkCD+QVOVZfVbZrLlJ749Wt76SCWJLQuHzKvoUudIphDUHv+eosOUHkiL8QFJF7bqG7vuE7bB9Tj/lAehLabsu2V4j6UpJL3RcE4AKitp1Nf5Eg4/vXqYfKgUsb0Xv+W1vkjQTEXvGWPYH7bqO0q4LmBgLDr/t0yT9nqTfH2f54XZdU7TrAiZGyZb/PZIukLTH9vMadOjdZftdXRYGoF8LPsknIp6S9GPHrzd/ANZFxH93WBeAnpW26wKwxJW26xq+//zOqgFQDWf4AUlVb9c1+ZN0Fq72RJuiiSxLgJftjKXJxJYfSIrwA0kRfiApwg8kRfiBpAg/kBThB5Ii/EBShB9IivADSRF+ICnCDyRF+IGkXHOGmO1XJP3niLvPkTQJnwZEHbNRx2yTXsePR8SPjvMDqob/RGw/HhHrqIM6qKNOHez2A0kRfiCpSQr/bYtdQIM6ZqOO2ZZNHRPznh9AXZO05QdQEeEHkqoaftsbbH/b9kHbW+e5/4dtf7m5f6ft83uoYY3tr9t+2vY+2zfNs8wHbb9ue3fzNVZfwsJ6nrf9VLOex+e537b/vBmTJ22v7Xj9Fw89z92237B985xlehsP23faPmJ779BtU7Z32D7QfF814rFbmmUO2N7SQx2fs/1MM+4P2D5rxGNP+Bp2UMenbc8Mjf/GEY89Yb7eJiKqfElaIelZSRdKOlXSHkmXzFnmNyR9qbm8WdKXe6jjPElrm8tnSPrOPHV8UNJXKo3L85LOOcH9GyU9rMFnnl8uaWfPr9FLGpwoUmU8JF0haa2kvUO3/aGkrc3lrZI+O8/jpiQ913xf1Vxe1XEdV0pa2Vz+7Hx1jPMadlDHpyX97hiv3QnzNfer5pb/MkkHI+K5iHhT0j2SNs1ZZpOku5rL90pa744/zD0iDkfErubydyXtlzTd5To6tknS38bAY5LOsn1eT+taL+nZiBh1FmbnIuKbkub2bh/+PbhL0rXzPPQXJe2IiKMR8ZqkHZI2dFlHRDwSEceaq49p0JS2VyPGYxzj5GuWmuGflvTi0PVDenvofrBMM+ivSzq7r4KatxWXSto5z93vs73H9sO2f6KvGiSFpEdsP2H7Y/PcP864dWWzpLtH3FdrPCTp3Ig43Fx+SdK58yxTc1wk6QYN9sDmc7LXsAs3Nm8/7hzxNmjB45H2gJ/td0q6T9LNEfHGnLt3abDr+1OS/kLSP/ZYygciYq2kqyT9pu0relzXSLZPlXSNpH+Y5+6a4zFLDPZpF/X/0bZvlXRM0rYRi/T9Gn5R0nsk/bSkw5L+uIsfWjP8M5LWDF1f3dw27zK2V0o6U9KrXRdi+xQNgr8tIu6fe39EvBER/9NcfkjSKbbP6bqO5ufPNN+PSHpAg923YeOMWxeukrQrIl6ep8Zq49F4+fhbm+b7kXmWqTIutq+XdLWkX23+EL3NGK9hKxHxckT8X0S8JemvRvz8BY9HzfB/S9JFti9otjKbJW2fs8x2SceP2n5I0tdGDXip5hjCHZL2R8TnRyzzruPHGmxfpsE49fFH6HTbZxy/rMEBpr1zFtsu6debo/6XS3p9aJe4S9dpxC5/rfEYMvx7sEXSg/Ms81VJV9pe1ewGX9nc1hnbGyTdIumaiPjeiGXGeQ3b1jF8jOeXR/z8cfI1WxdHKBdwJHOjBkfXn5V0a3PbH2gwuJL0Dg12Ow9K+jdJF/ZQwwc02I18UtLu5mujpI9L+nizzI2S9mlwxPQxSe/vaTwubNaxp1nf8TEZrsWSvtCM2VOS1vVQx+kahPnModuqjIcGf3AOS/q+Bu9TP6rBcZ5HJR2Q9M+Spppl10m6feixNzS/KwclfaSHOg5q8D76+O/J8f9EvVvSQyd6DTuu4++a1/5JDQJ93tw6RuXrRF+c3gsklfaAH5Ad4QeSIvxAUoQfSIrwA0kRfiApwg8k9f/+FQagz8bSOgAAAABJRU5ErkJggg==\n", 703 | "text/plain": [ 704 | "
" 705 | ] 706 | }, 707 | "metadata": { 708 | "tags": [], 709 | "needs_background": "light" 710 | } 711 | } 712 | ] 713 | } 714 | ] 715 | } --------------------------------------------------------------------------------