{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Step 1: Reading CSV File","metadata":{}},{"cell_type":"code","source":"import pandas as pd\ntrain_csv_path = '../input/siim-isic-melanoma-classification/train.csv'\njpeg_dir = '../input/siim-isic-melanoma-classification/jpeg/train'\ntrain_df = pd.read_csv(train_csv_path)\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2021-06-11T15:49:51.574725Z","iopub.execute_input":"2021-06-11T15:49:51.575321Z","iopub.status.idle":"2021-06-11T15:49:51.63907Z","shell.execute_reply.started":"2021-06-11T15:49:51.575281Z","shell.execute_reply":"2021-06-11T15:49:51.638312Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Step 2: Reading an Image and Showing","metadata":{}},{"cell_type":"code","source":"from PIL import Image\nimport matplotlib.pyplot as plt\n\nrow = train_df.iloc[45]\nprint(row)\nimg = Image.open(f\"{jpeg_dir}/{row[0]}.jpg\")\nplt.imshow(img); plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-06-11T15:49:54.447399Z","iopub.execute_input":"2021-06-11T15:49:54.447763Z","iopub.status.idle":"2021-06-11T15:49:56.612646Z","shell.execute_reply.started":"2021-06-11T15:49:54.44773Z","shell.execute_reply":"2021-06-11T15:49:56.611726Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Step 3: Create Output folders","metadata":{}},{"cell_type":"code","source":"import os\nfolderlocation = './Melanoma-JPEG-folders/'\n\nif not os.path.exists(folderlocation):\n    os.mkdir(folderlocation)\n\nN_data = 53\n    \nfor itern in range(N_data):\n    iter_train = 'tr' + str(itern) + '/'\n    path = folderlocation+iter_train\n    if not os.path.exists(path):\n        os.mkdir(path)\n    path = folderlocation+iter_train+'benign'  \n    if not os.path.exists(path):\n        os.mkdir(path)\n    path = folderlocation+iter_train+'malignant'   \n    if not os.path.exists(path):\n        os.mkdir(path)    \n    \npath = folderlocation+'validation/'\nif not os.path.exists(path):\n    os.mkdir(path)\npath = folderlocation+'validation/benign'\nif not os.path.exists(path):\n    os.mkdir(path)\npath = folderlocation+'validation/malignant'\nif not os.path.exists(path):\n    os.mkdir(path)","metadata":{"execution":{"iopub.status.busy":"2021-06-11T15:49:59.863897Z","iopub.execute_input":"2021-06-11T15:49:59.86455Z","iopub.status.idle":"2021-06-11T15:49:59.872541Z","shell.execute_reply.started":"2021-06-11T15:49:59.864504Z","shell.execute_reply":"2021-06-11T15:49:59.871788Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Step 4: Data Transformation\n\nAugmentation on malignant samples based on a serial number.\n1. Resize-crop\n2. Resize\n3. Resize-crop fliplr\n4. Resize-crop flipud\n5. Resize-crop flipud + fliplr\n6. Resize fliplr\n7. Resize flipud\n8. Resize flipud + fliplr\n9. Resize-crop + rotate90\n10. Resize + rotate90","metadata":{}},{"cell_type":"code","source":"import numpy as np\n\ndef Image_resize_crop512(img):\n    min_dim = 512\n\n    if img.size[0]>=img.size[1]:     #width is greater or equal\n        hsize = min_dim\n        basewidth = int(hsize * (img.size[0]/img.size[1]))\n\n    if img.size[1]>img.size[0]:      #height is greater\n        basewidth = min_dim\n        hsize = int(basewidth * (img.size[1]/img.size[0]))\n\n    img = img.resize((basewidth, hsize), Image.ANTIALIAS)\n\n    left = int(img.size[0]/2-512/2)\n    upper = int(img.size[1]/2-512/2)\n    right = left +512\n    lower = upper + 512\n\n    img = img.crop((left, upper,right,lower))\n    return img\n\ndef Image_resize512(img):\n    img = img.resize((512, 512), Image.ANTIALIAS)\n    return img\n\ndef Data_transform(img, serial):\n    if serial ==1 or serial ==3 or serial ==4 or serial ==5 or serial ==9:\n        img = Image_resize_crop512(img)\n    else:\n        img = Image_resize512(img)\n    \n    if serial > 8:\n        img = np.rot90(img, 1)\n        img = Image.fromarray(np.uint8(img)).convert('RGB')\n        \n    if serial == 3 or serial == 5 or serial == 6 or serial == 8:\n        img = np.fliplr(img)\n        img = Image.fromarray(np.uint8(img)).convert('RGB')\n        \n    if serial == 4 or serial == 5 or serial == 7 or serial == 8:\n        img = np.flipud(img)\n        img = Image.fromarray(np.uint8(img)).convert('RGB')\n    \n    return img\n\nimg2 = Data_transform(img,10)\nplt.imshow(img2); plt.show()\n\n","metadata":{"execution":{"iopub.status.busy":"2021-06-11T15:50:03.32677Z","iopub.execute_input":"2021-06-11T15:50:03.327291Z","iopub.status.idle":"2021-06-11T15:50:03.722692Z","shell.execute_reply.started":"2021-06-11T15:50:03.327257Z","shell.execute_reply":"2021-06-11T15:50:03.72185Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Step 5: Image Conversion and Saving\n\n","metadata":{}},{"cell_type":"code","source":"import csv\nimport time\n\n\nsince = time.time()\niter1=0\niter2=0\n\nfor row in train_df.iloc:\n    img = Image.open(f\"{jpeg_dir}/{row[0]}.jpg\")\n    \n    iter1 = iter1 + 1\n    if iter1 % 2000 == 1999:\n        time_elapsed = time.time() - since\n        print('Time from start {:.0f}m {:.0f}s'.format(\n        time_elapsed // 60, time_elapsed % 60))\n        print('Percentage complete: {:4f}'.format(100*iter1/(len(train_df))))\n        #break # delete/comment this line for the entire dataset\n\n        \n    if iter1%10 ==9 and row[6] == 'malignant': # malignant images in validation without augmentation\n        out = Image_resize_crop512(img)\n        out.save(folderlocation+'validation/'+row[6]+'/'+row[0]+'.jpg', 'JPEG')\n        continue\n    \n    folder_serial = iter1%(N_data+1)\n    if folder_serial == N_data and row[6] == 'benign'and iter1%10 ==9: # benign validation images number reduced by 1/N_data times, roughly \n        out = Image_resize_crop512(img)\n        out.save(folderlocation+'validation/'+row[6]+'/'+row[0]+'.jpg', 'JPEG')\n    \n    if row[6] == 'malignant': # the same malignant image in different training with different augmentation\n        for irer3 in range(N_data):\n            out = Data_transform(img,(iter2%10)+1)\n            iter2 = iter2 +1\n            out.save(folderlocation+'tr' + str(irer3) + '/'+row[6]+'/'+row[0]+'.jpg', 'JPEG')\n            continue\n        \n    \n    if iter1%10 < 9 and folder_serial < N_data: # remaining benign images in different training folder\n        out = Image_resize_crop512(img)\n        out.save(folderlocation+'tr' + str(folder_serial) + '/'+row[6]+'/'+row[0]+'.jpg', 'JPEG')\n    \n    \n    \n    ","metadata":{"execution":{"iopub.status.busy":"2021-06-11T15:50:07.439729Z","iopub.execute_input":"2021-06-11T15:50:07.440111Z","iopub.status.idle":"2021-06-11T15:51:17.468782Z","shell.execute_reply.started":"2021-06-11T15:50:07.440078Z","shell.execute_reply":"2021-06-11T15:51:17.467956Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Step 6: Zipping","metadata":{}},{"cell_type":"code","source":"import shutil\nshutil.make_archive('Melanoma-JPEG-512', 'zip', folderlocation)\nshutil.rmtree(folderlocation)","metadata":{"execution":{"iopub.status.busy":"2021-06-11T15:48:24.495713Z","iopub.execute_input":"2021-06-11T15:48:24.496195Z","iopub.status.idle":"2021-06-11T15:48:24.712089Z","shell.execute_reply.started":"2021-06-11T15:48:24.496149Z","shell.execute_reply":"2021-06-11T15:48:24.711141Z"},"trusted":true},"execution_count":null,"outputs":[]}]}