EDA tasty fruit
Датасет был взят отсюда https://drive.google.com/file/d/1c5oqLhDaKxxZMC5LiC1sYY6I8QvwdEb6/view?usp=drive_link
In [1]:
Copied!
import zipfile
import os
import matplotlib.pyplot as plt
from PIL import Image
import random
import numpy as np
import cv2 as cv
import zipfile
import os
import matplotlib.pyplot as plt
from PIL import Image
import random
import numpy as np
import cv2 as cv
In [2]:
Copied!
# Выводим размер изображений в указанной папке
def get_size_img(NAME_DIR):
image_paths = set()
widths = []
heights = []
for root, dirs, files in os.walk(NAME_DIR):
for file in files:
if file.lower().endswith((".png", ".jpg", ".jpeg")):
image_paths.add(os.path.join(root, file))
for image_path in image_paths:
with Image.open(image_path) as img:
widths.append(img.width)
heights.append(img.height)
return widths, heights
# Выводим среднее и стандартное отклонение по каждому из трех каналов для изображений в указанной папке
def get_mean_std_rgb(NAME_DIR):
sum_mean_r = 0
sum_mean_g = 0
sum_mean_b = 0
sum_std_r = 0
sum_std_g = 0
sum_std_b = 0
counts = 0
temp_paths = set()
for root, dirs, files in os.walk(NAME_DIR):
for file in files:
if file.lower().endswith((".png", ".jpg", ".jpeg")):
temp_paths.add(os.path.join(root, file))
for image_path in temp_paths:
image = cv.imread(image_path)
b, g, r = cv.split(image)
sum_mean_r += np.mean(r)
sum_mean_g += np.mean(g)
sum_mean_b += np.mean(b)
sum_std_r += np.std(r)
sum_std_g += np.std(g)
sum_std_b += np.std(b)
counts += 1
return (
sum_mean_r / counts,
sum_mean_g / counts,
sum_mean_b / counts,
sum_std_r / counts,
sum_std_g / counts,
sum_std_b / counts,
)
# Рисуем первые 5 картинок какждого класса тренировчного датасета
def draw_5_image_all_classes():
for class_name in os.listdir(TRAIN_DIR):
class_path = os.path.join(TRAIN_DIR, class_name)
image_files = [file for file in os.listdir(class_path) if file.lower().endswith(("png", "jpg", "jpeg"))]
image_files = image_files[:5]
fig, axes = plt.subplots(1, 5, figsize=(15, 3))
fig.suptitle(class_name)
for idx, image_file in enumerate(image_files):
image_path = os.path.join(class_path, image_file)
image = Image.open(image_path)
axes[idx].imshow(image)
axes[idx].axis("off")
plt.show()
# Выводим размер изображений в указанной папке
def get_size_img(NAME_DIR):
image_paths = set()
widths = []
heights = []
for root, dirs, files in os.walk(NAME_DIR):
for file in files:
if file.lower().endswith((".png", ".jpg", ".jpeg")):
image_paths.add(os.path.join(root, file))
for image_path in image_paths:
with Image.open(image_path) as img:
widths.append(img.width)
heights.append(img.height)
return widths, heights
# Выводим среднее и стандартное отклонение по каждому из трех каналов для изображений в указанной папке
def get_mean_std_rgb(NAME_DIR):
sum_mean_r = 0
sum_mean_g = 0
sum_mean_b = 0
sum_std_r = 0
sum_std_g = 0
sum_std_b = 0
counts = 0
temp_paths = set()
for root, dirs, files in os.walk(NAME_DIR):
for file in files:
if file.lower().endswith((".png", ".jpg", ".jpeg")):
temp_paths.add(os.path.join(root, file))
for image_path in temp_paths:
image = cv.imread(image_path)
b, g, r = cv.split(image)
sum_mean_r += np.mean(r)
sum_mean_g += np.mean(g)
sum_mean_b += np.mean(b)
sum_std_r += np.std(r)
sum_std_g += np.std(g)
sum_std_b += np.std(b)
counts += 1
return (
sum_mean_r / counts,
sum_mean_g / counts,
sum_mean_b / counts,
sum_std_r / counts,
sum_std_g / counts,
sum_std_b / counts,
)
# Рисуем первые 5 картинок какждого класса тренировчного датасета
def draw_5_image_all_classes():
for class_name in os.listdir(TRAIN_DIR):
class_path = os.path.join(TRAIN_DIR, class_name)
image_files = [file for file in os.listdir(class_path) if file.lower().endswith(("png", "jpg", "jpeg"))]
image_files = image_files[:5]
fig, axes = plt.subplots(1, 5, figsize=(15, 3))
fig.suptitle(class_name)
for idx, image_file in enumerate(image_files):
image_path = os.path.join(class_path, image_file)
image = Image.open(image_path)
axes[idx].imshow(image)
axes[idx].axis("off")
plt.show()
In [3]:
Copied!
try:
# Если мы можем импортировать google.colab, значит код запускается на Colab
from google.colab import drive
drive.mount("/gdrive", force_remount=True)
BASE_DIR = os.path.join("/gdrive", "My Drive", "my_project")
except ImportError:
# Если не получается импортировать, значит код запускается локально
BASE_DIR = os.getcwd() # Используем текущую рабочую директорию
# Указываем директорию для датасета
DATASET_DIR = os.path.join(BASE_DIR, "tasty_fruit")
print(DATASET_DIR)
# Путь к архиву и распаковка
with zipfile.ZipFile(os.path.join(DATASET_DIR, "tasty_fruit.zip"), "r") as zip_ref:
zip_ref.extractall(BASE_DIR)
try:
# Если мы можем импортировать google.colab, значит код запускается на Colab
from google.colab import drive
drive.mount("/gdrive", force_remount=True)
BASE_DIR = os.path.join("/gdrive", "My Drive", "my_project")
except ImportError:
# Если не получается импортировать, значит код запускается локально
BASE_DIR = os.getcwd() # Используем текущую рабочую директорию
# Указываем директорию для датасета
DATASET_DIR = os.path.join(BASE_DIR, "tasty_fruit")
print(DATASET_DIR)
# Путь к архиву и распаковка
with zipfile.ZipFile(os.path.join(DATASET_DIR, "tasty_fruit.zip"), "r") as zip_ref:
zip_ref.extractall(BASE_DIR)
Mounted at /gdrive /gdrive/My Drive/my_project/tasty_fruit
In [4]:
Copied!
TEST_DIR = os.path.join(DATASET_DIR, "test")
TRAIN_DIR = os.path.join(DATASET_DIR, "train")
PREDICT_DIR = os.path.join(DATASET_DIR, "predict")
widths, heights = get_size_img(DATASET_DIR)
size = np.array(list(zip(widths, heights)))
print(f"Количество изображений в {DATASET_DIR}: {size.shape[0]}")
print(f"Cредняя ширина: {int(np.mean(widths))}")
print(f"Cредняя высота: {int(np.mean(heights))}")
print(f"Минимальная ширина: {np.min(widths)}")
print(f"Минимальная высота: {np.min(heights)}")
print(f"Максимальная ширина: {np.max(widths)}")
print(f"Максимальная высота: {np.max(heights)}")
TEST_DIR = os.path.join(DATASET_DIR, "test")
TRAIN_DIR = os.path.join(DATASET_DIR, "train")
PREDICT_DIR = os.path.join(DATASET_DIR, "predict")
widths, heights = get_size_img(DATASET_DIR)
size = np.array(list(zip(widths, heights)))
print(f"Количество изображений в {DATASET_DIR}: {size.shape[0]}")
print(f"Cредняя ширина: {int(np.mean(widths))}")
print(f"Cредняя высота: {int(np.mean(heights))}")
print(f"Минимальная ширина: {np.min(widths)}")
print(f"Минимальная высота: {np.min(heights)}")
print(f"Максимальная ширина: {np.max(widths)}")
print(f"Максимальная высота: {np.max(heights)}")
Количество изображений в /gdrive/My Drive/my_project/tasty_fruit: 3274 Cредняя ширина: 253 Cредняя высота: 204 Минимальная ширина: 139 Минимальная высота: 111 Максимальная ширина: 453 Максимальная высота: 363
In [5]:
Copied!
mean_r, mean_g, mean_b, std_r, std_g, std_b = get_mean_std_rgb(DATASET_DIR)
print(f"Средние значение во всем датасете: Red {round(mean_r, 2)}, Green {round(mean_g, 2)}, Blue {round(mean_b, 2)}")
print(
f"Стандартное отклонение во всем датасете: Red {round(std_r, 2)}, Green {round(std_g, 2)}, Blue {round(std_b, 2)}"
)
mean_r, mean_g, mean_b, std_r, std_g, std_b = get_mean_std_rgb(DATASET_DIR)
print(f"Средние значение во всем датасете: Red {round(mean_r, 2)}, Green {round(mean_g, 2)}, Blue {round(mean_b, 2)}")
print(
f"Стандартное отклонение во всем датасете: Red {round(std_r, 2)}, Green {round(std_g, 2)}, Blue {round(std_b, 2)}"
)
Средние значение во всем датасете: Red 167.1, Green 145.83, Blue 109.98 Стандартное отклонение во всем датасете: Red 56.6, Green 60.33, Blue 66.7
In [6]:
Copied!
for class_train in os.listdir(TRAIN_DIR):
mean_r, mean_g, mean_b, std_r, std_g, std_b = get_mean_std_rgb(os.path.join(TRAIN_DIR, class_train))
print(
f"Средние значение в классе {class_train}: Red {round(mean_r, 2)}, Green {round(mean_g, 2)}, Blue {round(mean_b, 2)}"
)
print(
f"Стандартное отклонение в классе {class_train}: Red {round(std_r, 2)}, Green {round(std_g, 2)}, Blue {round(std_b, 2)}\n"
)
for class_train in os.listdir(TRAIN_DIR):
mean_r, mean_g, mean_b, std_r, std_g, std_b = get_mean_std_rgb(os.path.join(TRAIN_DIR, class_train))
print(
f"Средние значение в классе {class_train}: Red {round(mean_r, 2)}, Green {round(mean_g, 2)}, Blue {round(mean_b, 2)}"
)
print(
f"Стандартное отклонение в классе {class_train}: Red {round(std_r, 2)}, Green {round(std_g, 2)}, Blue {round(std_b, 2)}\n"
)
Средние значение в классе Apple: Red 183.53, Green 144.32, Blue 123.59 Стандартное отклонение в классе Apple: Red 53.0, Green 70.51, Blue 73.84 Средние значение в классе avocado: Red 144.07, Green 145.66, Blue 109.77 Стандартное отклонение в классе avocado: Red 62.61, Green 60.68, Blue 64.23 Средние значение в классе Banana: Red 170.9, Green 163.83, Blue 111.9 Стандартное отклонение в классе Banana: Red 50.74, Green 51.3, Blue 63.15 Средние значение в классе cherry: Red 148.08, Green 122.83, Blue 106.32 Стандартное отклонение в классе cherry: Red 59.74, Green 69.48, Blue 67.29 Средние значение в классе kiwi: Red 164.84, Green 158.31, Blue 113.52 Стандартное отклонение в классе kiwi: Red 53.6, Green 55.48, Blue 66.88 Средние значение в классе mango: Red 166.42, Green 140.7, Blue 87.47 Стандартное отклонение в классе mango: Red 58.27, Green 56.56, Blue 61.11 Средние значение в классе orange: Red 187.23, Green 153.04, Blue 102.27 Стандартное отклонение в классе orange: Red 49.75, Green 52.41, Blue 70.62 Средние значение в классе pinenapple: Red 162.35, Green 155.99, Blue 123.96 Стандартное отклонение в классе pinenapple: Red 57.97, Green 55.25, Blue 64.36 Средние значение в классе strawberries: Red 166.06, Green 112.25, Blue 92.4 Стандартное отклонение в классе strawberries: Red 57.0, Green 66.3, Blue 63.0 Средние значение в классе watermelon: Red 159.38, Green 139.74, Blue 113.63 Стандартное отклонение в классе watermelon: Red 61.3, Green 63.3, Blue 65.7
In [7]:
Copied!
draw_5_image_all_classes()
draw_5_image_all_classes()
Можем увидеть, в классах cherry и strawberries приобладает красный цвет, в orange - желтый цвет, в других классах явного преобладания определенного цвета визуально замечено не было.
In [8]:
Copied!
classes = os.listdir(DATASET_DIR + "/train")
counts = []
for img in classes:
counts.append(len(os.listdir(os.path.join(DATASET_DIR + "/train", img))))
plt.figure(figsize=(15, 5))
plt.bar(classes, counts)
plt.grid()
plt.text(-1.5, max(counts), f"Max: {max(counts)}", color="red")
plt.axhline(y=max(counts), color="r", linestyle="--")
plt.title("Количество изображений в каждом классе тренировочного набора")
plt.show()
classes = os.listdir(DATASET_DIR + "/train")
counts = []
for img in classes:
counts.append(len(os.listdir(os.path.join(DATASET_DIR + "/train", img))))
plt.figure(figsize=(15, 5))
plt.bar(classes, counts)
plt.grid()
plt.text(-1.5, max(counts), f"Max: {max(counts)}", color="red")
plt.axhline(y=max(counts), color="r", linestyle="--")
plt.title("Количество изображений в каждом классе тренировочного набора")
plt.show()
Количество изображений в каждом классе тренировочного набора составило 230. Датасет сбалансирован. Метаданные в изображениях отсутствуют.