{"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":"code","source":"import numpy as np\nimport pandas as pd\n%matplotlib inline\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport cv2\nimport os\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.preprocessing import OneHotEncoder\nimport time\nfrom skimage.feature import blob_doh\nfrom statistics import mean\n\nstart = time.time()\n\ntrain_image_path = '../input/resized-plant2021/img_sz_256/' #uses smaller version of dataset for efficiency\ntest_image_path = '../input/plant-pathology-2021-fgvc8/test_images/'\ntrain_df_path = '../input/plant-pathology-2021-fgvc8/train.csv'\ntest_df_path = '../input/plant-pathology-2021-fgvc8/sample_submission.csv'\n\ntrain_df = pd.read_csv(train_df_path)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-12-05T09:13:29.199297Z","iopub.execute_input":"2021-12-05T09:13:29.200407Z","iopub.status.idle":"2021-12-05T09:13:29.230174Z","shell.execute_reply.started":"2021-12-05T09:13:29.200344Z","shell.execute_reply":"2021-12-05T09:13:29.22916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"blue_minimums = []\nblue_maximums = []\nblue_means = []\nn_blue_blob = []\nblue_max_blob = []\nblue_mean_blob = []\n\ngreen_minimums = []\ngreen_maximums = []\ngreen_means = []\nn_green_blob = []\ngreen_max_blob = []\ngreen_mean_blob = []\n\nred_minimums = []\nred_maximums = []\nred_means = []\nn_red_blob = []\nred_max_blob = []\nred_mean_blob = []\n\ndef get_max_by_col(li, col):\n    # col - 1 is used to 'hide' the fact lists' indexes are zero-based from the caller\n    if not li.any():\n        return 0\n    else:\n        return max(li, key=lambda x: x[col - 1])[col - 1]\n\ndef get_mean(li):\n    # col - 1 is used to 'hide' the fact lists' indexes are zero-based from the caller\n    if not li.any():\n        return 0\n    \n    s = 0\n    n = 0\n    for l in li:\n        s += l[2]\n        n += 1\n    return s/n\n\nn = 0\n\nfor image_path in train_df['image'].tolist():\n    img = cv2.imread(train_image_path + image_path) #cv2 reads image into numpy array\n    \n    #adapted from https://www.kaggle.com/shikhar0051/plant-disease-detection\n    edges = cv2.Canny(img, 100, 200)\n    edge_coors = []\n    for i in range(edges.shape[0]):\n        for j in range(edges.shape[1]):\n            if edges[i][j] != 0:\n                edge_coors.append((i, j))\n    \n    row_min = edge_coors[np.argsort([coor[0] for coor in edge_coors])[0]][0]\n    row_max = edge_coors[np.argsort([coor[0] for coor in edge_coors])[-1]][0]\n    col_min = edge_coors[np.argsort([coor[1] for coor in edge_coors])[0]][1]\n    col_max = edge_coors[np.argsort([coor[1] for coor in edge_coors])[-1]][1]\n    new_img = img[row_min:row_max, col_min:col_max]\n    \n    #openCV uses BGR image formatting, so\n    blue_channel = new_img[:,:,0]\n    green_channel = new_img[:,:,1]\n    red_channel = new_img[:,:,2]\n    \n    blobs_blue = blob_doh(blue_channel)\n    blobs_green = blob_doh(green_channel)\n    blobs_red = blob_doh(red_channel)\n    \n    #extract features\n    blue_minimums.append(np.min(blue_channel))\n    blue_maximums.append(np.max(blue_channel).astype(np.int16))\n    blue_means.append(np.mean(blue_channel))\n    n_blue_blob.append(len(blobs_blue))\n    blue_max_blob.append(get_max_by_col(blobs_blue, 3))\n    blue_mean_blob.append(get_mean(blobs_blue))\n    \n    green_minimums.append(np.min(green_channel))\n    green_maximums.append(np.max(green_channel).astype(np.int16))\n    green_means.append(np.mean(green_channel))\n    n_green_blob.append(len(blobs_green))\n    green_max_blob.append(get_max_by_col(blobs_green, 3))\n    green_mean_blob.append(get_mean(blobs_green))\n\n    red_minimums.append(np.min(red_channel))\n    red_maximums.append(np.max(red_channel).astype(np.int16))\n    red_means.append(np.mean(red_channel))\n    n_red_blob.append(len(blobs_red))\n    red_max_blob.append(get_max_by_col(blobs_red, 3))\n    red_mean_blob.append(get_mean(blobs_red))\n    \n    n+=1\n    if n == 3000:\n        break","metadata":{"execution":{"iopub.status.busy":"2021-12-05T09:13:29.23212Z","iopub.execute_input":"2021-12-05T09:13:29.232429Z","iopub.status.idle":"2021-12-05T09:13:29.796725Z","shell.execute_reply.started":"2021-12-05T09:13:29.232391Z","shell.execute_reply":"2021-12-05T09:13:29.795798Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"colour_features = pd.DataFrame(\n    {     \n    'blue_minimums' : blue_minimums,\n    'blue_maximums' : blue_maximums,\n    'blue_means' : blue_means,\n    'n_blue_blob':  n_blue_blob,\n    'blue_max_blob': blue_max_blob,\n    'blue_mean_blob' : blue_mean_blob,\n    \n    'green_minimums' : green_minimums,\n    'green_maximums' : green_maximums,\n    'green_means' : green_means,\n    'n_green_blob':  n_green_blob,\n    'green_max_blob': green_max_blob,\n    'green_mean_blob' : green_mean_blob,\n\n    'red_minimums' : red_minimums,\n    'red_maximums' : red_maximums,\n    'red_means' : red_means,\n    'n_red_blob':  n_red_blob,\n    'red_max_blob': red_max_blob,\n    'red_mean_blob' : red_mean_blob\n    })\n\ny_train = train_df['labels'].astype('category')\n\ny_train = y_train[y_train.index.isin(range(3000))]\n\nlinreg = LogisticRegression(solver='liblinear')\nlinreg.fit(colour_features, y_train)","metadata":{"execution":{"iopub.status.busy":"2021-12-05T09:13:29.797978Z","iopub.execute_input":"2021-12-05T09:13:29.798208Z","iopub.status.idle":"2021-12-05T09:13:29.819391Z","shell.execute_reply.started":"2021-12-05T09:13:29.798181Z","shell.execute_reply":"2021-12-05T09:13:29.817144Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df = pd.read_csv(test_df_path)\n\nblue_minimums = []\nblue_maximums = []\nblue_means = []\nn_blue_blob = []\nblue_max_blob = []\nblue_mean_blob = []\n\ngreen_minimums = []\ngreen_maximums = []\ngreen_means = []\nn_green_blob = []\ngreen_max_blob = []\ngreen_mean_blob = []\n\nred_minimums = []\nred_maximums = []\nred_means = []\nn_red_blob = []\nred_max_blob = []\nred_mean_blob = []\n\n\nfor image_path in test_df['image'].tolist():\n    print(image_path)\n    img = cv2.imread(test_image_path + image_path) #cv2 reads image into numpy array\n    \n    img = cv2.resize(img, (256,171))\n    \n    #adapted from https://www.kaggle.com/shikhar0051/plant-disease-detection\n    edges = cv2.Canny(img, 100, 200)\n    edge_coors = []\n    for i in range(edges.shape[0]):\n        for j in range(edges.shape[1]):\n            if edges[i][j] != 0:\n                edge_coors.append((i, j))\n    \n    row_min = edge_coors[np.argsort([coor[0] for coor in edge_coors])[0]][0]\n    row_max = edge_coors[np.argsort([coor[0] for coor in edge_coors])[-1]][0]\n    col_min = edge_coors[np.argsort([coor[1] for coor in edge_coors])[0]][1]\n    col_max = edge_coors[np.argsort([coor[1] for coor in edge_coors])[-1]][1]\n    new_img = img[row_min:row_max, col_min:col_max]\n    \n    #openCV uses BGR image formatting, so\n    blue_channel = new_img[:,:,0]\n    green_channel = new_img[:,:,1]\n    red_channel = new_img[:,:,2]\n    \n    blobs_blue = blob_doh(blue_channel)\n    blobs_green = blob_doh(green_channel)\n    blobs_red = blob_doh(red_channel)\n    \n    #extract features\n    blue_minimums.append(np.min(blue_channel))\n    blue_maximums.append(np.max(blue_channel).astype(np.int16))\n    blue_means.append(np.mean(blue_channel))\n    n_blue_blob.append(len(blobs_blue))\n    blue_max_blob.append(get_max_by_col(blobs_blue, 3))\n    blue_mean_blob.append(get_mean(blobs_blue))\n    \n    green_minimums.append(np.min(green_channel))\n    green_maximums.append(np.max(green_channel).astype(np.int16))\n    green_means.append(np.mean(green_channel))\n    n_green_blob.append(len(blobs_green))\n    green_max_blob.append(get_max_by_col(blobs_green, 3))\n    green_mean_blob.append(get_mean(blobs_green))\n\n    red_minimums.append(np.min(red_channel))\n    red_maximums.append(np.max(red_channel).astype(np.int16))\n    red_means.append(np.mean(red_channel))\n    n_red_blob.append(len(blobs_red))\n    red_max_blob.append(get_max_by_col(blobs_red, 3))\n    red_mean_blob.append(get_mean(blobs_red))\n    \ncolour_features = pd.DataFrame(\n    {     \n    'blue_minimums' : blue_minimums,\n    'blue_maximums' : blue_maximums,\n    'blue_means' : blue_means,\n    'n_blue_blob':  n_blue_blob,\n    'blue_max_blob': blue_max_blob,\n    'blue_mean_blob' : blue_mean_blob,\n    \n    'green_minimums' : green_minimums,\n    'green_maximums' : green_maximums,\n    'green_means' : green_means,\n    'n_green_blob':  n_green_blob,\n    'green_max_blob': green_max_blob,\n    'green_mean_blob' : green_mean_blob,\n\n    'red_minimums' : red_minimums,\n    'red_maximums' : red_maximums,\n    'red_means' : red_means,\n    'n_red_blob':  n_red_blob,\n    'red_max_blob': red_max_blob,\n    'red_mean_blob' : red_mean_blob\n    })","metadata":{"execution":{"iopub.status.busy":"2021-12-05T09:13:29.822019Z","iopub.execute_input":"2021-12-05T09:13:29.822721Z","iopub.status.idle":"2021-12-05T09:13:31.647946Z","shell.execute_reply.started":"2021-12-05T09:13:29.822628Z","shell.execute_reply":"2021-12-05T09:13:31.647073Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds = linreg.predict(colour_features)\ntest_df['labels'] = preds\n    \ntest_df.to_csv('submission.csv', index=False)\n\nend = time.time()\nprint(end - start)","metadata":{"execution":{"iopub.status.busy":"2021-12-05T09:13:31.649194Z","iopub.execute_input":"2021-12-05T09:13:31.649408Z","iopub.status.idle":"2021-12-05T09:13:31.659539Z","shell.execute_reply.started":"2021-12-05T09:13:31.649383Z","shell.execute_reply":"2021-12-05T09:13:31.658639Z"},"trusted":true},"execution_count":null,"outputs":[]}]}