{ "cells": [ { "cell_type": "markdown", "id": "9f07e299", "metadata": {}, "source": [ "# Video Oyunlarını Yüksek ve Düşük Çözünürlüklü Olarak Ayırma - How to Separate Video Games into High and Low Resolution" ] }, { "cell_type": "markdown", "id": "747abe3a", "metadata": {}, "source": [ "TR = Her yorum satırı kendisini üstündeki koda aittir. İlk olarak Türkçe, son olarak İngilizce yazıldı.\n", "\n", "EN = Each comment line belongs to the code above it. It was first written in Turkish and lastly in English.\n", "\n", "TR = Bu proje, video oyunları görsellerini yüksek çözünürlük (HD) ve düşük çözünürlük (SD) olarak sınıflandırmayı amaçlamaktadır. Oyun endüstrisinde, farklı çözünürlük seviyeleri, oyun deneyimi ve performansı önemli ölçüde etkileyebilir. Derin öğrenme teknikleri kullanarak, video oyunlarına ait görsellerin çözünürlük kalitesini belirlemek için bir sınıflandırma modeli geliştirilecektir. Bu proje, yüksek ve düşük çözünürlüklü görüntüleri ayırt ederek, grafik kalitesini optimize etmeye yönelik stratejiler geliştirmeyi hedeflemektedir.\n", "\n", "EN = This project aims to classify video game images into high resolution (HD) and low resolution (SD). In the gaming industry, different resolution levels can significantly affect the gaming experience and performance. Using deep learning techniques, a classification model will be developed to determine the resolution quality of video game images. This project aims to develop strategies to optimize graphic quality by distinguishing between high and low resolution images.\n", "\n", "Kaynak/Source = https://www.kaggle.com/competitions/super-resolution-in-video-games/overview" ] }, { "cell_type": "code", "execution_count": 19, "id": "c75cab6c", "metadata": { "execution": { "iopub.execute_input": "2024-09-28T15:07:05.366358Z", "iopub.status.busy": "2024-09-28T15:07:05.365004Z", "iopub.status.idle": "2024-09-28T15:07:05.373890Z", "shell.execute_reply": "2024-09-28T15:07:05.372295Z", "shell.execute_reply.started": "2024-09-28T15:07:05.366306Z" } }, "outputs": [], "source": [ "import pandas as pd\n", "import os\n", "import cv2\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import random\n", "import matplotlib.image as mpimg\n", "import warnings\n", "warnings.filterwarnings('ignore') \n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Dense, Conv2D, InputLayer, MaxPooling2D, Flatten\n", "from sklearn.model_selection import train_test_split\n" ] }, { "cell_type": "code", "execution_count": 20, "id": "492f60d9", "metadata": { "execution": { "iopub.execute_input": "2024-09-28T15:07:05.377841Z", "iopub.status.busy": "2024-09-28T15:07:05.377275Z", "iopub.status.idle": "2024-09-28T15:07:05.387969Z", "shell.execute_reply": "2024-09-28T15:07:05.386655Z", "shell.execute_reply.started": "2024-09-28T15:07:05.377785Z" } }, "outputs": [], "source": [ "img_path_train = '/kaggle/input/super-resolution-in-video-games/train/'\n", "img_path_test = '/kaggle/input/super-resolution-in-video-games/test/'\n", "labels = ['hr', 'lr']\n", "labels_test = ['lr']" ] }, { "cell_type": "code", "execution_count": 21, "id": "7137056d", "metadata": { "execution": { "iopub.execute_input": "2024-09-28T15:07:05.390051Z", "iopub.status.busy": "2024-09-28T15:07:05.389499Z", "iopub.status.idle": "2024-09-28T15:07:05.436931Z", "shell.execute_reply": "2024-09-28T15:07:05.435385Z", "shell.execute_reply.started": "2024-09-28T15:07:05.389998Z" } }, "outputs": [], "source": [ "def load_image_data(img_path, labels):\n", " img_list, label_list = [], []\n", " for label in labels:\n", " for img_file in os.listdir(img_path + label):\n", " img_list.append(img_path + label + '/' + img_file)\n", " label_list.append(label)\n", " return img_list, label_list\n", "\n", "img_list_train, label_list_train = load_image_data(img_path_train, labels)\n", "img_list_test, label_list_test = load_image_data(img_path_test, labels_test)\n" ] }, { "cell_type": "code", "execution_count": 22, "id": "71fa7160", "metadata": { "execution": { "iopub.execute_input": "2024-09-28T15:07:05.439210Z", "iopub.status.busy": "2024-09-28T15:07:05.438722Z", "iopub.status.idle": "2024-09-28T15:07:05.455626Z", "shell.execute_reply": "2024-09-28T15:07:05.453940Z", "shell.execute_reply.started": "2024-09-28T15:07:05.439156Z" } }, "outputs": [], "source": [ "df_train = pd.DataFrame({'img': img_list_train, 'label': label_list_train})\n", "df_test = pd.DataFrame({'img': img_list_test, 'label': label_list_test})" ] }, { "cell_type": "code", "execution_count": 23, "id": "9467fa74", "metadata": { "execution": { "iopub.execute_input": "2024-09-28T15:07:05.460798Z", "iopub.status.busy": "2024-09-28T15:07:05.459855Z", "iopub.status.idle": "2024-09-28T15:07:05.474758Z", "shell.execute_reply": "2024-09-28T15:07:05.473125Z", "shell.execute_reply.started": "2024-09-28T15:07:05.460751Z" } }, "outputs": [], "source": [ "label_dict = {'hr': 1, 'lr': 0}\n", "df_train['encode_label'] = df_train['label'].map(label_dict)\n", "df_test['encode_label'] = df_test['label'].map(label_dict)" ] }, { "cell_type": "raw", "id": "c97c394d", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "d2068b7f", "metadata": {}, "source": [ "## EDA Keşif Amaçlı Veri Analizi - EDA - Exploratory Data Analysis " ] }, { "cell_type": "code", "execution_count": 24, "id": "1b6fa15a", "metadata": { "execution": { "iopub.execute_input": "2024-09-28T15:07:05.476762Z", "iopub.status.busy": "2024-09-28T15:07:05.476307Z", "iopub.status.idle": "2024-09-28T15:07:05.545874Z", "shell.execute_reply": "2024-09-28T15:07:05.543264Z", "shell.execute_reply.started": "2024-09-28T15:07:05.476720Z" } }, "outputs": [ { "ename": "NameError", "evalue": "name 'df' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[24], line 5\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m label \u001b[38;5;129;01min\u001b[39;00m labels: \n\u001b[1;32m 2\u001b[0m \u001b[38;5;66;03m# TR = Her etiket için döngü başlatılır \u001b[39;00m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;66;03m# EN = Start loop for each label\u001b[39;00m\n\u001b[0;32m----> 5\u001b[0m label_images \u001b[38;5;241m=\u001b[39m \u001b[43mdf\u001b[49m[df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlabel\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m==\u001b[39m label][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mimg\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mtolist() \n\u001b[1;32m 6\u001b[0m \u001b[38;5;66;03m# TR = İlgili etiketle eşleşen tüm görüntü yolları bir listeye alınır \u001b[39;00m\n\u001b[1;32m 7\u001b[0m \u001b[38;5;66;03m# EN = All image paths matching the label are retrieved into a list\u001b[39;00m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(label_images) \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m9\u001b[39m: \n\u001b[1;32m 10\u001b[0m \u001b[38;5;66;03m# TR = Eğer görüntü sayısı 9 veya daha fazlaysa işlem devam eder \u001b[39;00m\n\u001b[1;32m 11\u001b[0m \u001b[38;5;66;03m# EN = Proceed if there are 9 or more images\u001b[39;00m\n", "\u001b[0;31mNameError\u001b[0m: name 'df' is not defined" ] } ], "source": [ "for label in labels: \n", " # TR = Her etiket için döngü başlatılır \n", " # EN = Start loop for each label\n", " \n", " label_images = df[df['label'] == label]['img'].tolist() \n", " # TR = İlgili etiketle eşleşen tüm görüntü yolları bir listeye alınır \n", " # EN = All image paths matching the label are retrieved into a list\n", "\n", " if len(label_images) >= 9: \n", " # TR = Eğer görüntü sayısı 9 veya daha fazlaysa işlem devam eder \n", " # EN = Proceed if there are 9 or more images\n", "\n", " selected_images = random.sample(label_images, 9) \n", " # TR = Görüntüler arasından rastgele 9 tanesi seçilir \n", " # EN = Randomly select 9 images from the list\n", " \n", " plt.figure(figsize=(15, 15)) \n", " # TR = 15x15 boyutlarında bir figür oluşturulur \n", " # EN = Create a figure of size 15x15\n", " \n", " for i, img_path in enumerate(selected_images): \n", " # TR = Seçilen her bir görüntü için döngü başlatılır \n", " # EN = Loop through each selected image\n", " \n", " img = mpimg.imread(img_path) \n", " # TR = Görüntü dosyası okunur \n", " # EN = Read the image file\n", " \n", " plt.subplot(3, 3, i + 1) \n", " # TR = 3x3'lük bir yerleşimde görüntü konumlandırılır \n", " # EN = Place the image in a 3x3 grid\n", " \n", " plt.imshow(img) \n", " # TR = Görüntü ekranda gösterilir \n", " # EN = Display the image\n", " \n", " plt.title(label) \n", " # TR = Her görüntüye ait başlık olarak etiket eklenir \n", " # EN = Set the label as the title for each image\n", " \n", " plt.axis('off') \n", " # TR = Eksenler gizlenir \n", " # EN = Hide the axes\n", " \n", " plt.show() \n", " # TR = Görüntüler ekranda gösterilir \n", " # EN = Display the images on the screen\n", " \n", " else: \n", " # TR = Eğer yeterli görüntü yoksa uyarı verir \n", " # EN = If not enough images are available, show a warning message\n", " \n", " print(f\"Yeterli görüntü bulunamadı/Not enough images found: {label}\") \n", " # TR = Ekranda yeterli görüntü bulunamadığını belirtir \n", " # EN = Print a message that not enough images were found" ] }, { "cell_type": "code", "execution_count": 25, "id": "18231852", "metadata": { "execution": { "iopub.execute_input": "2024-09-28T15:08:33.447675Z", "iopub.status.busy": "2024-09-28T15:08:33.446582Z", "iopub.status.idle": "2024-09-28T15:08:33.456446Z", "shell.execute_reply": "2024-09-28T15:08:33.454543Z", "shell.execute_reply.started": "2024-09-28T15:08:33.447620Z" } }, "outputs": [], "source": [ "def preprocess_images(image_paths, size=64):\n", " # TR = Görüntülerin yeniden boyutlandırılacağı hedef boyutu belirler.\n", " # EN = Sets the target size to which images will be resized.\n", " \n", " images = []\n", " # TR = Görüntüleri saklayacak bir liste oluşturur.\n", " # EN = Creates a list to store the images.\n", " \n", " for img_path in image_paths:\n", " img = cv2.imread(str(img_path))\n", " img = cv2.resize(img, (size, size))\n", " img = img / 255.0 # Normalize\n", " images.append(img)\n", " return np.array(images)" ] }, { "cell_type": "raw", "id": "76e10276", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "7354e091", "metadata": {}, "source": [ "## Öznitelik Mühendisliği - Feature Engineering" ] }, { "cell_type": "markdown", "id": "139ef08f", "metadata": {}, "source": [ "### Model - Modelling " ] }, { "cell_type": "code", "execution_count": null, "id": "23ea2dc4", "metadata": { "execution": { "iopub.execute_input": "2024-09-28T15:08:33.459676Z", "iopub.status.busy": "2024-09-28T15:08:33.459176Z" } }, "outputs": [], "source": [ "x_train = preprocess_images(df_train['img'])\n", "x_test = preprocess_images(df_test['img'])\n", "y_train = df_train['encode_label'].values\n", "y_test = df_test['encode_label'].values" ] }, { "cell_type": "code", "execution_count": null, "id": "a151e0d7", "metadata": {}, "outputs": [], "source": [ "x_train,x_test,y_train,y_test=train_test_split(x_train, y_train,test_size=.20,random_state=42)\n", "# TR = modelimizi eğittik. \n", "# EN = We trained our model." ] }, { "cell_type": "code", "execution_count": null, "id": "c178100a", "metadata": {}, "outputs": [], "source": [ "model = Sequential()\n", "# TR = Ardışık bir model oluşturur, katmanlar sıralı olarak eklenir.\n", "# EN = Creates a sequential model where layers are added in a linear stack.\n", "\n", "model.add(InputLayer(input_shape=(size, size, 3)))\n", "# TR = Modelin giriş katmanını tanımlar ve veri boyutunu belirtir, bu durumda her görüntü 64x64x3 pikseldir.\n", "# EN = Defines the input layer of the model, specifying the input shape as 64x64x3 pixels.\n", "\n", "model.add(Conv2D(filters=12, kernel_size=(3,3), activation='relu'))\n", "# TR = Konvolüsyon işlemi ile özellikleri çıkarır, filtreler görüntüdeki desenleri öğrenir ve 'relu' aktivasyon fonksiyonu ile doğrusal olmayan ilişkileri modellemesini sağlar.\n", "# EN = Extracts features via convolution; filters learn patterns in the image and 'relu' activation function introduces non-linearity.\n", "\n", "model.add(MaxPooling2D(pool_size=(2,2)))\n", "# TR = Özellik haritasını küçültür ve en belirgin özellikleri seçer, böylece hesaplama maliyeti azalır ve modelin genelleştirme yeteneği artar.\n", "# EN = Reduces the feature map size and selects the most prominent features, reducing computation and improving the model’s ability to generalize.\n", "\n", "model.add(Flatten())\n", "# TR = Çok boyutlu veri kümesini tek boyutlu bir vektöre dönüştürür, tam bağlantılı katmanlarla işlem için uygun hale getirir.\n", "# EN = Converts the multi-dimensional feature map into a one-dimensional vector to be processed by fully connected layers.\n", "\n", "model.add(Dense(1, activation='sigmoid'))\n", "# TR = Sonuçları 1 sınıfa dönüştüren bir tam bağlantılı katman ekler, bu da modelin ikili sınıflandırma yapmasını sağlar.\n", "# EN = Adds a fully connected layer with 1 unit to output results for binary classification.\n", "\n", "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n", "# TR = Modeli 'adam' optimizasyonu ile derler, bu optimizasyon algoritması öğrenmeyi iyileştirir, ve 'binary_crossentropy' kayıp fonksiyonunu kullanarak ikili sınıflandırma yapar, doğruluk metriğiyle model performansını değerlendirir.\n", "# EN = Compiles the model with the 'adam' optimizer, uses 'binary_crossentropy' loss function for binary classification, and evaluates performance with the accuracy metric.\n", "\n", "model.fit(x_train, y_train, validation_split=(x_test,y_test), epochs=10)\n", "# TR = Modeli eğitim verileri (x_train_rgb) ve etiketleri (y_train) ile eğitir, %10'luk bir doğrulama seti kullanır ve 10 dönem boyunca eğitir.\n", "# EN = Trains the model with the training data (x_train_rgb) and labels (y_train), uses 10% of the data for validation, and trains for 10 epochs." ] }, { "cell_type": "code", "execution_count": null, "id": "5ced2cd2", "metadata": {}, "outputs": [], "source": [ "model.summary()" ] }, { "cell_type": "code", "execution_count": null, "id": "c80aef9f", "metadata": {}, "outputs": [], "source": [ "loss, _accuracy = model.evaluate(x_test, y_test)\n", "# TR = Test verileri (test_images) ve etiketleri (test_labels) ile modelin performansını değerlendirir, kayıp ve doğruluk değerlerini döndürür.\n", "# EN = Evaluates the model's performance using test data (test_images) and labels (test_labels), returning loss and accuracy values." ] }, { "cell_type": "code", "execution_count": null, "id": "4dab6f14", "metadata": {}, "outputs": [], "source": [ "pred = model.predict(x_test)" ] }, { "cell_type": "code", "execution_count": null, "id": "5531aa5d", "metadata": {}, "outputs": [], "source": [ "pred = (pred > 0.5).astype(int).flatten()" ] }, { "cell_type": "code", "execution_count": null, "id": "081f5adc", "metadata": {}, "outputs": [], "source": [ "unique_values, counts = np.unique(pred, return_counts=True)\n", "print(\"Unique values:\", unique_values)\n", "print(\"Counts of each value:\", counts)" ] }, { "cell_type": "code", "execution_count": null, "id": "13d83ae8", "metadata": {}, "outputs": [], "source": [ "model.save('Video_CNN_model.h5')" ] }, { "cell_type": "code", "execution_count": null, "id": "dd1db3cd", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kaggle": { "accelerator": "none", "dataSources": [ { "databundleVersionId": 7863244, "sourceId": 71750, "sourceType": "competition" } ], "dockerImageVersionId": 30763, "isGpuEnabled": false, "isInternetEnabled": true, "language": "python", "sourceType": "notebook" }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.4" } }, "nbformat": 4, "nbformat_minor": 5 }