Блокнот для подготовки данных
Для обеспечения единообразия мы будем использовать эту ссылку для доступа к нашему набору данных. Выражаем благодарность автору здесь за предоставление.
В знак благодарности оригинальному автору — пожалуйста, проголосуйте за версию набора данных на Kaggle, если вам понравится этот курс.
Очистка данных
Удаление поврежденных изображений
Мы начнем с очистки набора данных и проверки на наличие поврежденных изображений.
Переменные и пути
Сначала загрузим набор данных и настроим наши переменные так, чтобы они указывали на него.
Помните, это то, что вы будете менять, не спешите нажимать shift+enter! Пожалуйста, также установите свой hf-token в строке ниже
DATA = "./DATA/"
META_DATA = f"{DATA}images.csv/"
IMAGES = f"{DATA}images_compressed/"
hf_token = "" # Установите свой hf-token здесь
model_name = "meta-llama/Llama-3.2-11b-Vision-Instruct"
Все импорты
Здесь мы импортируем все библиотеки.
- PIL: Для обработки изображений, передаваемых нашей модели Llama
- Huggingface Transformers: Для запуска модели
- Библиотека Concurrent: Для более быстрой очистки
import os
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from PIL import Image as PIL_Image
from PIL import Image
from tqdm import tqdm
from concurrent.futures import ProcessPoolExecutor
import multiprocessing
import torch
from transformers import MllamaForConditionalGeneration, MllamaProcessor
Очистка поврежденных изображений
Это может занять несколько минут, так как в нашем наборе данных 5000 изображений.
def is_image_corrupt(image_path):
try:
with Image.open(image_path) as img:
img.verify()
return False
except (IOError, SyntaxError, Image.UnidentifiedImageError):
return True
def find_corrupt_images(folder_path):
image_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path)
if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
num_cores = multiprocessing.cpu_count()
with ProcessPoolExecutor(max_workers=num_cores) as executor:
results = executor.map(is_image_corrupt, image_files)
corrupt_images = [img for img, is_corrupt in zip(image_files, results) if is_corrupt]
return corrupt_images
folder_path = IMAGES # Замените на путь к вашей папке
corrupt_images = find_corrupt_images(folder_path)
print("Corrupt images:")
for img in corrupt_images:
print(img)
print(f"Total corrupt images found: {len(corrupt_images)}")
Corrupt images:
./DATA/images_compressed/d028580f-9a98-4fb5-a6c9-5dc362ad3f09.jpg
./DATA/images_compressed/784d67d4-b95e-4abb-baf7-8024f18dc3c8.jpg
./DATA/images_compressed/b72ed5cd-9f5f-49a7-b12e-63a078212a17.jpg
./DATA/images_compressed/1d0129a1-f29a-4a3f-b103-f651176183eb.jpg
./DATA/images_compressed/c60e486d-10ed-4f64-abab-5bb698c736dd.jpg
./DATA/images_compressed/040d73b7-21b5-4cf2-84fc-e1a80231b202.jpg
Total corrupt images found: 6
corrupt_images
['./DATA/images_compressed/d028580f-9a98-4fb5-a6c9-5dc362ad3f09.jpg',
'./DATA/images_compressed/784d67d4-b95e-4abb-baf7-8024f18dc3c8.jpg',
'./DATA/images_compressed/b72ed5cd-9f5f-49a7-b12e-63a078212a17.jpg',
'./DATA/images_compressed/1d0129a1-f29a-4a3f-b103-f651176183eb.jpg',
'./DATA/images_compressed/c60e486d-10ed-4f64-abab-5bb698c736dd.jpg',
'./DATA/images_compressed/040d73b7-21b5-4cf2-84fc-e1a80231b202.jpg']
Загрузим метаданные изображений и удалим строки с поврежденными изображениями
df = pd.read_csv("./DATA/images.csv")
df.head()
image sender_id label kids
0 4285fab0-751a-4b74-8e9b-43af05deee22 124 Not sure False
1 ea7b6656-3f84-4eb3-9099-23e623fc1018 148 T-Shirt False
2 00627a3f-0477-401c-95eb-92642cbe078d 94 Not sure False
3 ea2ffd4d-9b25-4ca8-9dc2-bd27f1cc59fa 43 T-Shirt False
4 3b86d877-2b9e-4c8b-a6a2-1d87513309d0 189 Shoes False
| image | sender_id | label | kids | |
|---|---|---|---|---|
| 0 | 4285fab0-751a-4b74-8e9b-43af05deee22 | 124 | Not sure | False |
| 1 | ea7b6656-3f84-4eb3-9099-23e623fc1018 | 148 | T-Shirt | False |
| 2 | 00627a3f-0477-401c-95eb-92642cbe078d | 94 | Not sure | False |
| 3 | ea2ffd4d-9b25-4ca8-9dc2-bd27f1cc59fa | 43 | T-Shirt | False |
| 4 | 3b86d877-2b9e-4c8b-a6a2-1d87513309d0 | 189 | Shoes | False |
corrupt_filenames = [os.path.splitext(os.path.basename(path))[0] for path in corrupt_images]
# Выведем имена поврежденных файлов для проверки
print("Corrupt filenames:")
print(corrupt_filenames)
Corrupt filenames:
['d028580f-9a98-4fb5-a6c9-5dc362ad3f09', '784d67d4-b95e-4abb-baf7-8024f18dc3c8', 'b72ed5cd-9f5f-49a7-b12e-63a078212a17', '1d0129a1-f29a-4a3f-b103-f651176183eb', 'c60e486d-10ed-4f64-abab-5bb698c736dd', '040d73b7-21b5-4cf2-84fc-e1a80231b202']
Теперь мы можем «очистить» dataframe, исключив поврежденные изображения.
df_clean = df[~df['image'].isin(corrupt_filenames)]
# Выведем количество удаленных строк
print(f"Number of rows removed: {len(df)