{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":118703,"databundleVersionId":14250429,"sourceType":"competition"}],"dockerImageVersionId":31193,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"\nimport numpy as np\nimport cv2\nimport time\nimport csv\nimport pandas as pd\nimport glob\nfrom tqdm.autonotebook import tqdm\nfrom sklearn.model_selection import cross_val_predict ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-01T15:29:59.623679Z","iopub.execute_input":"2025-12-01T15:29:59.624389Z","iopub.status.idle":"2025-12-01T15:29:59.628098Z","shell.execute_reply.started":"2025-12-01T15:29:59.624363Z","shell.execute_reply":"2025-12-01T15:29:59.627515Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"folder = '/kaggle/input/egco-486-quiz-2025/car_color'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-01T15:30:00.540059Z","iopub.execute_input":"2025-12-01T15:30:00.540699Z","iopub.status.idle":"2025-12-01T15:30:00.543943Z","shell.execute_reply.started":"2025-12-01T15:30:00.540675Z","shell.execute_reply":"2025-12-01T15:30:00.543257Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def Hu_moment(img):\n    img = cv2.bitwise_not(img)\n    hu = cv2.HuMoments(cv2.moments(img))\n    for i in range(0,7):\n        hu[i] = -1 * np.sign(hu[i]) * np.log10(np.abs(hu[i]))\n    hu = hu.reshape((1,7)).tolist()[0]\n    return hu","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-01T15:30:02.619953Z","iopub.execute_input":"2025-12-01T15:30:02.620526Z","iopub.status.idle":"2025-12-01T15:30:02.624727Z","shell.execute_reply.started":"2025-12-01T15:30:02.620503Z","shell.execute_reply":"2025-12-01T15:30:02.624154Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from skimage import feature\n\nclass LocalBinaryPatterns:\n    def __init__(self, numPoints, radius):\n        self.numPoints = numPoints\n        self.radius = radius\n    def describe(self,image,eps = 1e-7):\n        lbp = feature.local_binary_pattern(image,self.numPoints,self.radius,method=\"uniform\")\n        (hist,_) = np.histogram(lbp.ravel(),bins=np.arange(0,self.numPoints+3), range = (0,self.numPoints+2))\n        hist = hist.astype(\"float\")\n        hist /= (hist.sum()+eps)\n        return hist","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-01T15:41:39.139419Z","iopub.execute_input":"2025-12-01T15:41:39.140118Z","iopub.status.idle":"2025-12-01T15:41:39.144681Z","shell.execute_reply.started":"2025-12-01T15:41:39.140091Z","shell.execute_reply":"2025-12-01T15:41:39.144059Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"desc = LocalBinaryPatterns(24,8)\nhist = desc.describe(gray).reshape(1,26)\nhist","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-01T15:32:45.511471Z","iopub.execute_input":"2025-12-01T15:32:45.512088Z","iopub.status.idle":"2025-12-01T15:32:45.622367Z","shell.execute_reply.started":"2025-12-01T15:32:45.512064Z","shell.execute_reply":"2025-12-01T15:32:45.62145Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load train folder file\ntrain_img = glob.glob(folder + '/train/**/*.jpg', recursive=True)\nlbp_fields = [f\"lbp{i}\" for i in range(26)]\n\n# Write Feature Extraction file\nwith open('feature_extraction.csv', mode='w') as csv_file:\n  fieldnames = ['red_mean','green_mean','blue_mean','red_var','green_var','blue_var','red_std','green_std','blue_std'\n                ,'hu0','hu1','hu2','hu3','hu4','hu5','hu6'\n                ,'class'] + lbp_fields\n  writer = csv.DictWriter(csv_file, fieldnames=fieldnames)\n  writer.writeheader()\n\n  desc = LocalBinaryPatterns(24, 8)\n  \n  for file in tqdm(train_img):\n      \n    image = cv2.imread(file)\n    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n    image1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    hu = Hu_moment(gray)\n    lbp_hist = desc.describe(gray)\n    row = {'red_mean':str(np.mean(image1[:,:,0])), 'green_mean':str(np.mean(image1[:,:,1])), 'blue_mean':str(np.mean(image1[:,:,2]))\n                     ,'red_var':str(np.var(image1[:,:,0])), 'green_var':str(np.var(image1[:,:,1])), 'blue_var':str(np.var(image1[:,:,2]))\n                     ,'red_std':str(np.std(image1[:,:,0])), 'green_std':str(np.std(image1[:,:,1])), 'blue_std':str(np.var(image1[:,:,2]))\n                     ,'hu0' :str(hu[0]), 'hu1' :str(hu[1]), 'hu2' :str(hu[2])\n                     ,'hu3' :str(hu[3]), 'hu4' :str(hu[4]), 'hu5' :str(hu[5])\n                     ,'hu6' :str(hu[6])\n                     ,'class': str(file.split('/')[-2])}\n    \n    for i in range(26):\n        row[f\"lbp{i}\"] = lbp_hist[i]\n\n    writer.writerow(row)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-01T16:00:01.225349Z","iopub.execute_input":"2025-12-01T16:00:01.226111Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load train folder file\ntrain_img = glob.glob(folder + '/train/**/*.jpg', recursive=True)\nlbp_fields = [f\"lbp{i}\" for i in range(10)]\n\n# Write Feature Extraction file\nwith open('feature_extraction.csv', mode='w') as csv_file:\n  fieldnames = ['red_mean','green_mean','blue_mean','red_var','green_var','blue_var','red_std','green_std','blue_std'\n                ,'hu0','hu1','hu2','hu3','hu4','hu5','hu6'\n                ,'class'] + lbp_fields\n  writer = csv.DictWriter(csv_file, fieldnames=fieldnames)\n  writer.writeheader()\n\n  desc = LocalBinaryPatterns(8, 1)\n\n  data = []\n    \n  for file in tqdm(train_img):\n      \n    image = cv2.imread(file)\n    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n    image1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    hu = Hu_moment(gray)\n    lbp_hist = desc.describe(gray)\n    row = {'red_mean':str(np.mean(image1[:,:,0])), 'green_mean':str(np.mean(image1[:,:,1])), 'blue_mean':str(np.mean(image1[:,:,2]))\n                     ,'red_var':str(np.var(image1[:,:,0])), 'green_var':str(np.var(image1[:,:,1])), 'blue_var':str(np.var(image1[:,:,2]))\n                     ,'red_std':str(np.std(image1[:,:,0])), 'green_std':str(np.std(image1[:,:,1])), 'blue_std':str(np.var(image1[:,:,2]))\n                     ,'hu0' :str(hu[0]), 'hu1' :str(hu[1]), 'hu2' :str(hu[2])\n                     ,'hu3' :str(hu[3]), 'hu4' :str(hu[4]), 'hu5' :str(hu[5])\n                     ,'hu6' :str(hu[6])\n                     ,'class': str(file.split('/')[-2])}\n\n\n    hu_fet = {f'hu{i}':hu[i] for i in range(hu)}\n\n    com = {**row, **hu_fet}\n\n    data.append(com)\n\n\n    df = pd.DataFrame(data)\n      \n    for i in range(10):\n        row[f\"lbp{i}\"] = lbp_hist[i]\n\n    writer.writerow(row)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-01T15:57:32.20921Z","iopub.execute_input":"2025-12-01T15:57:32.209509Z","iopub.status.idle":"2025-12-01T15:57:34.818135Z","shell.execute_reply.started":"2025-12-01T15:57:32.209489Z","shell.execute_reply":"2025-12-01T15:57:34.817275Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load train folder file\ntrain_img = glob.glob(folder + '/train/**/*.jpg', recursive=True)\n\n# Write Feature Extraction file\nwith open('feature_extraction.csv', mode='w') as csv_file:\n  fieldnames = ['red_mean','green_mean','blue_mean','red_var','green_var','blue_var','red_std','green_std','blue_std'\n                ,'hu0','hu1','hu2','hu3','hu4','hu5','hu6'\n                ,'class']\n  writer = csv.DictWriter(csv_file, fieldnames=fieldnames)\n  writer.writeheader()\n  \n  for file in tqdm(train_img):\n      \n    image = cv2.imread(file)\n    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n    image1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    hu = Hu_moment(gray)  \n    writer.writerow({'red_mean':str(np.mean(image1[:,:,0])), 'green_mean':str(np.mean(image1[:,:,1])), 'blue_mean':str(np.mean(image1[:,:,2]))\n                     ,'red_var':str(np.var(image1[:,:,0])), 'green_var':str(np.var(image1[:,:,1])), 'blue_var':str(np.var(image1[:,:,2]))\n                     ,'red_std':str(np.std(image1[:,:,0])), 'green_std':str(np.std(image1[:,:,1])), 'blue_std':str(np.var(image1[:,:,2]))\n                     ,'hu0' :str(hu[0]), 'hu1' :str(hu[1]), 'hu2' :str(hu[2])\n                     ,'hu3' :str(hu[3]), 'hu4' :str(hu[4]), 'hu5' :str(hu[5])\n                     ,'hu6' :str(hu[6])\n                     ,'class': str(file.split('/')[-2])})","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-01T13:38:56.609533Z","iopub.execute_input":"2025-12-01T13:38:56.609834Z","iopub.status.idle":"2025-12-01T13:43:06.227334Z","shell.execute_reply.started":"2025-12-01T13:38:56.609797Z","shell.execute_reply":"2025-12-01T13:43:06.226391Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load train folder file\ntrain_img = glob.glob(folder + '/train/**/*.jpg', recursive=True)\n\n# Write Feature Extraction file\nwith open('feature_extraction.csv', mode='w') as csv_file:\n  fieldnames = ['red_mean','green_mean','blue_mean','red_var','green_var','blue_var','red_std','green_std','blue_std','gray_mean', 'gray_std', 'gray_var','class']\n  writer = csv.DictWriter(csv_file, fieldnames=fieldnames)\n  writer.writeheader()\n  \n  for file in tqdm(train_img):\n      \n    image = cv2.imread(file)\n    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n    image1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    writer.writerow({'red_mean':str(np.mean(image1[:,:,0])), 'green_mean':str(np.mean(image1[:,:,1])), 'blue_mean':str(np.mean(image1[:,:,2]))\n                     ,'red_var':str(np.var(image1[:,:,0])), 'green_var':str(np.var(image1[:,:,1])), 'blue_var':str(np.var(image1[:,:,2]))\n                     ,'red_std':str(np.std(image1[:,:,0])), 'green_std':str(np.std(image1[:,:,1])), 'blue_std':str(np.var(image1[:,:,2]))\n                     ,'gray_mean':str(np.mean(gray)), 'gray_std':str(np.std(gray)), 'gray_var':str(np.var(gray))\n                     ,'class': str(file.split('/')[-2])})","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-18T02:53:55.559394Z","iopub.execute_input":"2025-11-18T02:53:55.560143Z","iopub.status.idle":"2025-11-18T02:59:07.063678Z","shell.execute_reply.started":"2025-11-18T02:53:55.560116Z","shell.execute_reply":"2025-11-18T02:59:07.062993Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load train folder file\ntrain_img = glob.glob(folder + '/train/**/*.jpg', recursive=True)\n\n# Write Feature Extraction file\nwith open('feature_extraction.csv', mode='w') as csv_file:\n  fieldnames = ['red_mean','green_mean','blue_mean','red_var','green_var','blue_var','red_std','green_std','blue_std', 'red_median','green_median','blue_median','gray_mean', 'gray_std', 'gray_var', 'gray_median','class']\n  writer = csv.DictWriter(csv_file, fieldnames=fieldnames)\n  writer.writeheader()\n  \n  for file in tqdm(train_img):\n      \n    image = cv2.imread(file)\n    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n    image1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    writer.writerow({'red_mean':str(np.mean(image1[:,:,0])), 'green_mean':str(np.mean(image1[:,:,1])), 'blue_mean':str(np.mean(image1[:,:,2]))\n                     ,'red_var':str(np.var(image1[:,:,0])), 'green_var':str(np.var(image1[:,:,1])), 'blue_var':str(np.var(image1[:,:,2]))\n                     ,'red_std':str(np.std(image1[:,:,0])), 'green_std':str(np.std(image1[:,:,1])), 'blue_std':str(np.var(image1[:,:,2]))\n                     ,'red_median':str(np.median(image1[:,:,0])), 'green_median':str(np.median(image1[:,:,1])), 'blue_median':str(np.median(image1[:,:,2]))\n                     ,'gray_mean':str(np.mean(gray)), 'gray_std':str(np.std(gray)), 'gray_var':str(np.var(gray)), 'gray_median':str(np.median(gray))\n                     ,'class': str(file.split('/')[-2])})","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-18T03:07:05.858285Z","iopub.execute_input":"2025-11-18T03:07:05.859234Z","iopub.status.idle":"2025-11-18T03:13:55.328556Z","shell.execute_reply.started":"2025-11-18T03:07:05.859199Z","shell.execute_reply":"2025-11-18T03:13:55.327772Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load train folder file\ntrain_img = glob.glob(folder + '/train/**/*.jpg', recursive=True)\n\n# Write Feature Extraction file\nwith open('feature_extraction.csv', mode='w') as csv_file:\n  fieldnames = ['red_mean','green_mean','blue_mean','red_var','green_var','blue_var', 'gray_mean', 'gray_std', 'gray_var', 'gray_median','class']\n  writer = csv.DictWriter(csv_file, fieldnames=fieldnames)\n  writer.writeheader()\n  \n  for file in tqdm(train_img):\n      \n    image = cv2.imread(file)\n    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n    image1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    image2 = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)\n    writer.writerow({'red_mean':str(np.mean(image1[:,:,0])), 'green_mean':str(np.mean(image1[:,:,1])), 'blue_mean':str(np.mean(image1[:,:,2]))\n                     ,'red_var':str(np.var(image1[:,:,0])), 'green_var':str(np.var(image1[:,:,1])), 'blue_var':str(np.var(image1[:,:,2]))\n                     ,'gray_mean':str(np.mean(gray)), 'gray_std':str(np.std(gray)), 'gray_var':str(np.var(gray)), 'gray_median':str(np.median(gray))\n                     ,'class': str(file.split('/')[-2])})","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-18T03:28:18.158257Z","iopub.execute_input":"2025-11-18T03:28:18.158939Z","iopub.status.idle":"2025-11-18T03:32:33.553872Z","shell.execute_reply.started":"2025-11-18T03:28:18.158913Z","shell.execute_reply":"2025-11-18T03:32:33.553032Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load train folder file\ntrain_img = glob.glob(folder + '/train/**/*.jpg', recursive=True)\n\n# Write Feature Extraction file\nwith open('feature_extraction.csv', mode='w') as csv_file:\n  fieldnames = ['red_mean','green_mean','blue_mean','red_var','green_var','blue_var','red_std','green_std','blue_std','red_Hu','green_Hu','blue_Hu','class']\n  writer = csv.DictWriter(csv_file, fieldnames=fieldnames)\n  writer.writeheader()\n  \n  for file in tqdm(train_img):\n      \n    image = cv2.imread(file)\n    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n    image1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    image2 = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)\n    writer.writerow({'red_mean':str(np.mean(image1[:,:,0])), 'green_mean':str(np.mean(image1[:,:,1])), 'blue_mean':str(np.mean(image1[:,:,2]))\n                     ,'red_var':str(np.var(image1[:,:,0])), 'green_var':str(np.var(image1[:,:,1])), 'blue_var':str(np.var(image1[:,:,2]))\n                     ,'red_std':str(np.std(image1[:,:,0])), 'green_std':str(np.std(image1[:,:,1])), 'blue_std':str(np.std(image1[:,:,2]))\n                     ,'red_Hu':str(Hu_moment(image1[:,:,0])), 'green_Hu':str(Hu_moment(image1[:,:,1])), 'blue_Hu':str(Hu_moment(image1[:,:,2]))\n                     ,'class': str(file.split('/')[-2])})","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-18T03:55:09.104161Z","iopub.execute_input":"2025-11-18T03:55:09.104491Z","iopub.status.idle":"2025-11-18T03:59:38.246283Z","shell.execute_reply.started":"2025-11-18T03:55:09.104434Z","shell.execute_reply":"2025-11-18T03:59:38.24547Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load train folder file\ntrain_img = glob.glob(folder + '/train/**/*.jpg', recursive=True)\n\n# Write Feature Extraction file\nwith open('feature_extraction.csv', mode='w') as csv_file:\n  fieldnames = ['red_mean','green_mean','blue_mean','red_var','green_var','blue_var','red_std','green_std','blue_std','red_median','green_median','blue_median','H_mean','S_mean','V_mean','H_var','S_var','V_var','H_std','S_std','V_std','class']\n  writer = csv.DictWriter(csv_file, fieldnames=fieldnames)\n  writer.writeheader()\n  \n  for file in tqdm(train_img):\n      \n    image = cv2.imread(file)\n    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n    image1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    image2 = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)\n    writer.writerow({'red_mean':str(np.mean(image1[:,:,0])), 'green_mean':str(np.mean(image1[:,:,1])), 'blue_mean':str(np.mean(image1[:,:,2]))\n                     ,'red_var':str(np.var(image1[:,:,0])), 'green_var':str(np.var(image1[:,:,1])), 'blue_var':str(np.var(image1[:,:,2]))\n                     ,'red_std':str(np.std(image1[:,:,0])), 'green_std':str(np.std(image1[:,:,1])), 'blue_std':str(np.std(image1[:,:,2]))\n                     ,'red_median':str(np.median(image1[:,:,0])), 'green_median':str(np.median(image1[:,:,1])), 'blue_median':str(np.median(image1[:,:,2]))\n                     ,'H_mean':str(np.mean(image2[:,:,0])), 'S_mean':str(np.mean(image2[:,:,1])), 'V_mean':str(np.mean(image2[:,:,2]))\n                     ,'H_var':str(np.var(image2[:,:,0])), 'S_var':str(np.var(image2[:,:,1])), 'V_var':str(np.var(image2[:,:,2]))\n                     ,'H_std':str(np.var(image2[:,:,0])), 'S_std':str(np.var(image2[:,:,1])), 'V_std':str(np.var(image2[:,:,2]))\n                     ,'class': str(file.split('/')[-2])})","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-18T04:20:29.505143Z","iopub.execute_input":"2025-11-18T04:20:29.505403Z","iopub.status.idle":"2025-11-18T04:28:28.728046Z","shell.execute_reply.started":"2025-11-18T04:20:29.505383Z","shell.execute_reply":"2025-11-18T04:28:28.727278Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load train folder file\ntrain_img = glob.glob(folder + '/train/**/*.jpg', recursive=True)\n\n# Write Feature Extraction file\nwith open('feature_extraction.csv', mode='w') as csv_file:\n  fieldnames = ['red_mean','green_mean','blue_mean','red_var','green_var','blue_var','red_median','green_median','blue_median','H_mean','S_mean','V_mean','H_var','S_var','V_var','H_median','S_median','V_median','class']\n  writer = csv.DictWriter(csv_file, fieldnames=fieldnames)\n  writer.writeheader()\n  \n  for file in tqdm(train_img):\n      \n    image = cv2.imread(file)\n    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n    image1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    image2 = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)\n    writer.writerow({'red_mean':str(np.mean(image1[:,:,0])), 'green_mean':str(np.mean(image1[:,:,1])), 'blue_mean':str(np.mean(image1[:,:,2]))\n                     ,'red_var':str(np.var(image1[:,:,0])), 'green_var':str(np.var(image1[:,:,1])), 'blue_var':str(np.var(image1[:,:,2]))\n                     ,'red_median':str(np.median(image1[:,:,0])), 'green_median':str(np.median(image1[:,:,1])), 'blue_median':str(np.median(image1[:,:,2]))\n                     ,'H_mean':str(np.mean(image2[:,:,0])), 'S_mean':str(np.mean(image2[:,:,1])), 'V_mean':str(np.mean(image2[:,:,2]))\n                     ,'H_var':str(np.var(image2[:,:,0])), 'S_var':str(np.var(image2[:,:,1])), 'V_var':str(np.var(image2[:,:,2]))\n                     ,'H_median':str(np.median(image2[:,:,0])), 'S_median':str(np.median(image2[:,:,1])), 'V_median':str(np.median(image2[:,:,2]))\n                     ,'class': str(file.split('/')[-2])})","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-18T04:40:23.825167Z","iopub.execute_input":"2025-11-18T04:40:23.82546Z","iopub.status.idle":"2025-11-18T04:47:04.313432Z","shell.execute_reply.started":"2025-11-18T04:40:23.825417Z","shell.execute_reply":"2025-11-18T04:47:04.312692Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load train folder file\ntrain_img = glob.glob(folder + '/train/**/*.jpg', recursive=True)\n\n# Write Feature Extraction file\nwith open('feature_extraction.csv', mode='w') as csv_file:\n  fieldnames = ['red_mean','green_mean','blue_mean','red_var','green_var','blue_var','red_std','green_std','blue_std','class']\n  writer = csv.DictWriter(csv_file, fieldnames=fieldnames)\n  writer.writeheader()\n  \n  for file in tqdm(train_img):\n      \n    image = cv2.imread(file)\n    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n    image1 = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb)\n    writer.writerow({'red_mean':str(np.mean(image1[:,:,0])), 'green_mean':str(np.mean(image1[:,:,1])), 'blue_mean':str(np.mean(image1[:,:,2]))\n                     ,'red_var':str(np.var(image1[:,:,0])), 'green_var':str(np.var(image1[:,:,1])), 'blue_var':str(np.var(image1[:,:,2]))\n                     ,'red_std':str(np.std(image1[:,:,0])), 'green_std':str(np.std(image1[:,:,1])), 'blue_std':str(np.std(image1[:,:,2]))\n                     ,'class': str(file.split('/')[-2])})","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-18T04:49:17.785076Z","iopub.execute_input":"2025-11-18T04:49:17.785598Z","iopub.status.idle":"2025-11-18T04:53:04.977404Z","shell.execute_reply.started":"2025-11-18T04:49:17.785571Z","shell.execute_reply":"2025-11-18T04:53:04.97666Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Read feature extraction in csv file\nfeature = pd.read_csv('feature_extraction.csv', delimiter=',')\nfeature","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-01T13:43:14.786402Z","iopub.execute_input":"2025-12-01T13:43:14.787116Z","iopub.status.idle":"2025-12-01T13:43:14.837871Z","shell.execute_reply.started":"2025-12-01T13:43:14.787082Z","shell.execute_reply":"2025-12-01T13:43:14.83707Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"feature_cols = ['red_mean','green_mean','blue_mean','red_var','green_var','blue_var','red_std','green_std','blue_std'\n                ,'hu0','hu1','hu2','hu3','hu4','hu5','hu6']\nX = feature [feature_cols]\ny = feature['class']\n\nprint(X)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-01T13:44:07.785428Z","iopub.execute_input":"2025-12-01T13:44:07.786077Z","iopub.status.idle":"2025-12-01T13:44:07.801053Z","shell.execute_reply.started":"2025-12-01T13:44:07.78604Z","shell.execute_reply":"2025-12-01T13:44:07.800285Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# evaluate a Decision Tree model using k-fold cross-validation\nfrom numpy import mean\nfrom numpy import std\nfrom sklearn.datasets import make_classification\nfrom sklearn.model_selection import KFold\nfrom sklearn.model_selection import cross_val_score\nfrom sklearn.tree import DecisionTreeClassifier\n# prepare the cross-validation procedure\ncv = KFold(n_splits=10, random_state=1, shuffle=True)\n# create model\nmodel = DecisionTreeClassifier()\nmodel = model.fit(X, y)\n# evaluate model\nscores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)\n\n# report performance\nprint('(Decision Tree) Accuracy: %.3f +-(%.3f)' % (mean(scores*100), std(scores*100)))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-01T13:44:28.23485Z","iopub.execute_input":"2025-12-01T13:44:28.235419Z","iopub.status.idle":"2025-12-01T13:44:30.477421Z","shell.execute_reply.started":"2025-12-01T13:44:28.235395Z","shell.execute_reply":"2025-12-01T13:44:30.476475Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import csv\nfrom tqdm import tqdm\nimport glob\nimport cv2\nimport pandas as pd\nimport numpy as np\nimport pickle\n\n\nwith open('./submission.csv', 'w', newline='') as outcsv:\n    writer = csv.writer(outcsv)\n    writer.writerow([\"Id\", \"Category\"])\n\n    for file in tqdm(glob.glob(folder + '/test/*.jpg')):\n        \n        # Read image in test folder\n        img = cv2.imread(file)\n        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n        image1 = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)\n\n        # Feature extraction\n        df_test = pd.DataFrame(columns=feature_cols)\n        df_test.loc[0] = [str(np.mean(image1[:,:,0])), str(np.mean(image1[:,:,1])), str(np.mean(image1[:,:,2]))\n                          , str(np.var(image1[:,:,0])), str(np.var(image1[:,:,1])), str(np.var(image1[:,:,2]))\n                          , str(np.std(image1[:,:,0])), str(np.std(image1[:,:,1])), str(np.std(image1[:,:,2]))]\n\n        # Model predict\n        predict_classes = model.predict(df_test)\n\n        # Write result to csv\n        writer.writerow([ file.split('/')[-1], predict_classes[0]])    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-18T04:54:16.125127Z","iopub.execute_input":"2025-11-18T04:54:16.125795Z","iopub.status.idle":"2025-11-18T04:55:56.664231Z","shell.execute_reply.started":"2025-11-18T04:54:16.125771Z","shell.execute_reply":"2025-11-18T04:55:56.663463Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}