Готовим данные

Урок 3 из 32 курса «Llama: сценарии использования»: официальный курс Llama Cookbook (Мета Лама) на русском языке. Этот урок бесплатный.

Блокнот для подготовки данных

Для обеспечения единообразия мы будем использовать эту ссылку для доступа к нашему набору данных. Выражаем благодарность автору здесь за предоставление.

В знак благодарности оригинальному автору — пожалуйста, проголосуйте за версию набора данных на 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)

Полезные гиды