{"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"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"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\nfrom skimage import feature","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-11-18T04:10:06.889143Z","iopub.execute_input":"2025-11-18T04:10:06.889407Z","iopub.status.idle":"2025-11-18T04:10:10.307041Z","shell.execute_reply.started":"2025-11-18T04:10:06.889383Z","shell.execute_reply":"2025-11-18T04:10:10.306341Z"}},"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:10.30903Z","iopub.execute_input":"2025-11-18T04:10:10.30949Z","iopub.status.idle":"2025-11-18T04:10:10.31368Z","shell.execute_reply.started":"2025-11-18T04:10:10.309467Z","shell.execute_reply":"2025-11-18T04:10:10.312715Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Hu\ndef hu(img) :\n    img = cv2.bitwise_not(img)\n    hu = cv2.HuMoments(cv2.moments(img))\n\n    for i in range(0,7) :\n        hu[i] = -1 *np.sign(hu[i]) * np.log(np.abs(hu[i]))\n    hu = hu.reshape((1,7)).tolist()[0]\n    return hu","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-18T04:10:10.314676Z","iopub.execute_input":"2025-11-18T04:10:10.314962Z","iopub.status.idle":"2025-11-18T04:10:10.337717Z","shell.execute_reply.started":"2025-11-18T04:10:10.31494Z","shell.execute_reply":"2025-11-18T04:10:10.33671Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_img = glob.glob(folder + '/train/**/*.jpg', recursive=True)\ndata = []\nlabel = []\nfor file in tqdm(train_img):\n        image = cv2.imread(file)\n        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n\n        n = [\n             np.median(image[:,:,0]), np.median(image[:,:,1]), np.median(image[:,:,2]), \n             np.mean(image[:,:,0]), np.mean(image[:,:,1]), np.mean(image[:,:,2]),\n             np.std(image[:,:,0]), np.std(image[:,:,1]), np.std(image[:,:,2]), \n             np.var(image[:,:,0]), np.var(image[:,:,1]), np.var(image[:,:,2])]\n        n = n + hu(gray)\n        data.append(n)\n        label.append(str(file.split('/')[-2]))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-18T04:10:10.33877Z","iopub.execute_input":"2025-11-18T04:10:10.33912Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\n# Convert to DataFrame\ndf = pd.DataFrame(data)\n\n# Add label column\ndf['label'] = label\n\n# Optional: give feature columns names\nnum_color_stats = 18             # max, min, median, mean, std, var for 3 channels\nnum_hu_all = 7 * 4               # 7 Hu moments × 4 images (R,G,B,gray)\ntotal_features = num_color_stats + num_hu_all\n\ndf.columns = [f'f{i}' for i in range(total_features)] + ['label']\n\ndf\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X = data\ny = label","metadata":{"trusted":true},"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},"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        image = cv2.imread(file)\n        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n        # Feature extraction\n        # df_test = pd.DataFrame(columns=feature_cols)\n        df_test = []\n        # np.max(image[:,:,0]),np.max(image[:,:,1]),np.max(image[:,:,2]),\n        #      np.min(image[:,:,0]),np.min(image[:,:,1]),np.min(image[:,:,2]),\n       n = [\n             np.median(image[:,:,0]), np.median(image[:,:,1]), np.median(image[:,:,2]), \n             np.mean(image[:,:,0]), np.mean(image[:,:,1]), np.mean(image[:,:,2]),\n             np.std(image[:,:,0]), np.std(image[:,:,1]), np.std(image[:,:,2]), \n             np.var(image[:,:,0]), np.var(image[:,:,1]), np.var(image[:,:,2])]\n        n = n + hu(gray)\n        df_test.append(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},"outputs":[],"execution_count":null}]}