{"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":"none","dataSources":[{"sourceId":118703,"databundleVersionId":14250429,"sourceType":"competition"}],"dockerImageVersionId":31193,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# 1. Importing the necessary libraries","metadata":{}},{"cell_type":"code","source":"import 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":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-11-18T04:10:29.946123Z","iopub.execute_input":"2025-11-18T04:10:29.946508Z","iopub.status.idle":"2025-11-18T04:10:29.951721Z","shell.execute_reply.started":"2025-11-18T04:10:29.946481Z","shell.execute_reply":"2025-11-18T04:10:29.950522Z"}},"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-11-18T04:10:30.1342Z","iopub.execute_input":"2025-11-18T04:10:30.13493Z","iopub.status.idle":"2025-11-18T04:10:30.140061Z","shell.execute_reply.started":"2025-11-18T04:10:30.134886Z","shell.execute_reply":"2025-11-18T04:10:30.139056Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 2. Feature Extraction","metadata":{}},{"cell_type":"markdown","source":"## 2.1 Color Feature - Statistic (mean)","metadata":{}},{"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 = ['mean_gray', 'max_gray', 'min_gray','mean_r', 'mean_g', 'mean_b','min_r', 'min_g', 'min_b', 'max_r', 'max_g', 'max_b', 'mean_y', 'min_y', 'max_y','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    rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    ycrcb = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb)\n    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n    writer.writerow({\n        'mean_gray':str(np.mean(gray)), \n        'max_gray':str(np.max(gray)), \n        'min_gray':str(np.min(gray)), \n\n        \n        'mean_r':str(np.mean(rgb[:,:,0])), \n        'mean_g':str(np.mean(rgb[:,:,1])), \n        'mean_b':str(np.mean(rgb[:,:,2])), \n        'min_r':str(np.min(rgb[:,:,0])), \n        'min_g':str(np.min(rgb[:,:,1])), \n        'min_b':str(np.min(rgb[:,:,2])), \n        \n        'max_r':str(np.max(rgb[:,:,0])), \n        'max_g':str(np.max(rgb[:,:,0])), \n        'max_b':str(np.max(rgb[:,:,0])), \n        \n        'mean_y':str(np.mean(ycrcb[:,:,0])), \n        'min_y':str(np.min(ycrcb[:,:,0])), \n        'max_y':str(np.max(ycrcb[:,:,0])), \n        \n        # 'mean_h':str(np.mean(hsv[:,:,0])), \n        # 'mean_s':str(np.mean(hsv[:,:,1])), \n        # 'mean_v':str(np.mean(hsv[:,:,2])),\n        'class': str(file.split('/')[-2])})","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-18T04:33:29.887714Z","iopub.execute_input":"2025-11-18T04:33:29.888071Z","iopub.status.idle":"2025-11-18T04:38:30.006972Z","shell.execute_reply.started":"2025-11-18T04:33:29.888046Z","shell.execute_reply":"2025-11-18T04:38:30.005885Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 3. Preparing the data for training the model","metadata":{}},{"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-11-18T04:38:32.795359Z","iopub.execute_input":"2025-11-18T04:38:32.795704Z","iopub.status.idle":"2025-11-18T04:38:32.824986Z","shell.execute_reply.started":"2025-11-18T04:38:32.795679Z","shell.execute_reply":"2025-11-18T04:38:32.824241Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"feature_cols = ['mean_gray', 'max_gray', 'min_gray','mean_r', 'mean_g', 'mean_b','min_r', 'min_g', 'min_b', 'max_r', 'max_g', 'max_b', 'mean_y', 'min_y', 'max_y']\nX = feature [feature_cols]\ny = feature['class']\n\nprint(X)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-18T04:38:48.802317Z","iopub.execute_input":"2025-11-18T04:38:48.802672Z","iopub.status.idle":"2025-11-18T04:38:48.815013Z","shell.execute_reply.started":"2025-11-18T04:38:48.802644Z","shell.execute_reply":"2025-11-18T04:38:48.814025Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 4. Model Classification","metadata":{}},{"cell_type":"markdown","source":"## 4.1 Decistion tree","metadata":{}},{"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-11-18T04:38:51.369428Z","iopub.execute_input":"2025-11-18T04:38:51.370372Z","iopub.status.idle":"2025-11-18T04:38:53.385221Z","shell.execute_reply.started":"2025-11-18T04:38:51.370334Z","shell.execute_reply":"2025-11-18T04:38:53.384215Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 5. Submission file","metadata":{}},{"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        rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n        ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)\n        \n        # Feature extraction\n        df_test = pd.DataFrame(columns=feature_cols)\n        df_test.loc[0] = [\n            np.mean(rgb[:,:,0]), \n            np.mean(rgb[:,:,1]), \n            np.mean(rgb[:,:,2]),\n            np.mean(ycrcb[:,:,0]),\n            np.mean(ycrcb[:,:,1]),\n            np.mean(ycrcb[:,:,2]),\n            ]\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:08:02.727248Z","iopub.execute_input":"2025-11-18T04:08:02.72754Z","iopub.status.idle":"2025-11-18T04:10:17.896662Z","shell.execute_reply.started":"2025-11-18T04:08:02.72752Z","shell.execute_reply":"2025-11-18T04:10:17.895741Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub = pd.read_csv('submission.csv', delimiter=',')\nsub","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-18T04:07:56.630995Z","iopub.status.idle":"2025-11-18T04:07:56.631353Z","shell.execute_reply.started":"2025-11-18T04:07:56.631138Z","shell.execute_reply":"2025-11-18T04:07:56.631154Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}