Фреймворк для работы с датасетами
Установить с помощью pip:
pip install git+https://github.com/ai-forever/DataProcessingFrameworkУстановка из исходников:
git clone https://github.com/ai-forever/DataProcessingFramework cd DataProcessingFramework pip install -r requirements.txtФреймворк ориентирован на работу с мультимодальными данными и поддерживает следующие возможности:
- Чтение датасетов
- Фильтрация датасетов с помощью различных моделей
- Конвертация датасетов в другие форматы хранения
- Валидация датасетов
- Тексты
- Изображения
- Видео
Фреймворк поддерживает работу с комбинацией перечисленных выше модальностей, например, текст-изображение или текст-видео.
- Files
- Shards
- ShardedFiles
Формат files это csv файл с метаданными и путями к изображениям, видео и др. CSV файл может выглядеть примерно так:
image_path,text,width,height images/1.jpg,caption,512,512 Чтение датасета из формата files:
from DPF.configs import FilesDatasetConfig from DPF.dataset_reader import DatasetReader config = FilesDatasetConfig.from_path_and_columns( 'tests/datasets/files_correct/data.csv', image_path_col='image_path', caption_col='caption' ) reader = DatasetReader() processor = reader.read_from_config(config)В этом формате датасет разделяется на шарды по N сэмплов в каждом. Файлы в каждом шарде лежат в tar архиве, а метаинформация лежит в csv файле. tar архив и csv файл каждого шарда должны иметь одинаковые имена (индекс шарда).
Пример структуры:
0.tar 0.csv 1.tar 1.csv ... Файл 0.csv:
image_name, caption 0.jpg, caption for image 1 1.jpg, caption for image 2 ... Чтение датасета из формата shards:
from DPF.configs import ShardsDatasetConfig from DPF.dataset_reader import DatasetReader config = ShardsDatasetConfig.from_path_and_columns( 'tests/datasets/shards_correct', image_name_col='image_name', caption_col='caption' ) reader = DatasetReader() processor = reader.read_from_config(config)Этот формат похож на формат sharsd, но вместо tar архивов файлы лежат в папках.
Пример структуры:
. ├── 0/ │ ├── 0.jpg │ ├── 1.jpg │ └── ... ├── 0.csv ├── 1/ │ ├── 1000.jpg │ ├── 1001.jpg │ └── ... ├── 1.csv └── ... Чтение датасета из формата sharded files:
from DPF.configs import ShardedFilesDatasetConfig from DPF.dataset_reader import DatasetReader config = ShardedFilesDatasetConfig.from_path_and_columns( 'tests/datasets/shards_correct', image_name_col='image_name', caption_col='caption' ) reader = DatasetReader() processor = reader.read_from_config(config)Чтобы начать работу с датасетом, нужно сначала создать конфиг DatasetConfig, описывающий датасет и его модальности. Для каждого формата данных нужно использовать соответствующий конфиг. Пример для формата shards:
from DPF.configs import ShardsDatasetConfig config = ShardsDatasetConfig.from_path_and_columns( 'examples/example_dataset/', # путь к датасету image_name_col='image_name', # название колонки в csv с названием изображения video_name_col='video_name', # название колонки в csv с названием видео caption_col='caption' # название колонки в csv с кэпшенами )Считать датасет можно с помощью класса DatasetReader, передав конфиг в метод from_config:
from DPF.configs import ShardsDatasetConfig from DPF.dataset_reader import DatasetReader config = ShardsDatasetConfig.from_path_and_columns( 'examples/example_dataset/', image_name_col='image_name', caption_col='caption' ) reader = DatasetReader() processor = reader.read_from_config(config)Пример чтения датасета с видео в формате sharded files:
from DPF.configs import ShardedFilesDatasetConfig config = ShardedFilesDatasetConfig.from_path_and_columns( 'examples/example_video_dataset/', video_name_col='image_name', caption_col='caption' ) reader = DatasetReader() processor = reader.read_from_config(config)Взаимодействие с датасетом происходит через интерфейс DatasetProcessor. DatasetProcessor дает возможность валидировать, просматривать, фильтровать датасеты.
Обработчик датасета (интерфейс DatasetProcessor) даёт возможность посмотреть статистику и информацию по датасету, а также посмотреть рандомные семплы данных.
Получить датафрейм датасета можно, обратившись к атрибуту df:
processor.dfВывести саммари о датасете:
processor.print_summary()Обновить существующие или добавить новые колонки:
processor.update_columns(['column_to_update', 'new_column'])Переименовать колонки:
processor.rename_columns({'old_column': 'new_columns'})Удалить колонки:
processor.delete_columns(['column_to_delete'])Получить рандомный семпл из датасета:
modality2bytes, metadata = processor.get_random_sample()Фильтры - это модели или алгоритмы, которые позволяют посчитать некоторый набор метрик для датасета. Фильтры обрабатывают данные и добавляют новые колонки с посчитанными метриками.
Список фильтров:
images:- ImageInfoFilter - получение базовой информации (высота, ширина) об изображениях
- PHashFilter - подсчет PHash изображений
- ImprovedAestheticFilter - модель определения эстетичности изображений
- BLIPCaptioningFilter - кэпшенинг моделью BLIP
- CLIPLabelsFilter - определение близости изображения с набором текстов с помощью модели CLIP
- LLaVaCaptioningFilter - кэпшенинг моделью LLaVA-13b
- NSFWFilter - детекция NSFW изображений
- CRAFTFilter - детекция текста
- OCRFilter - распознавание текста
- WatermarksFilter - детекция водяных знаков на изображении
text-image:- BlipFilter - определение близости между картинкой и кэпшеном моделью BLIP-2
- CLIPFilter - определение близости между картинкой и кэпшеном моделью CLIP
- RuCLIPFilter - определение близости между картинкой и кэпшеном моделью ru-clip
texts:- LangFilter - определение языка текста
- RegexFilter - фильтрация регулярными выражениями
videos:- VideoInfoFilter - получение информации о видео (ширина, высота, fps, длительность)
- ImageFilterAdapter - адаптер картиночных фильтров к одному кадру видео
Применение фильтра:
from DPF.filters.images.base_images_info_filter import ImageInfoGatherer datafilter = ImageInfoGatherer(workers=8) processor.apply_data_filter(datafilter) processor.df # new columns ['width', 'height', 'is_correct'] are addedfrom DPF.filters.images.llava_captioning_filter import LLaVaCaptioningFilter from DPF.filters.multigpu_filter import MultiGPUDataFilter multigpufilter = MultiGPUDataFilter( ['cuda:0', 'cuda:1', 'cuda:2', 'cuda:3'], LLaVaCaptioningFilter, dict( pbar=True, workers=8, prompt='short', batch_size=16 ) ) processor.apply_multi_gpu_data_filter(multigpufilter)С помощью DPF можно изменять данные в датасете, например, изменить размер каждого видео или каждого фото. Для этого используется трансформации DPF.transforms.
Уменьшить все изображения до 768 пикселей по минимальной стороне с сохранением соотношения сторон:
from DPF.transforms import ImageResizeTransforms, Resizer, ResizerModes transforms = ImageResizeTransforms(Resizer(ResizerModes.MIN_SIZE, size=768)) processor.apply_transform(transforms)Уменьшить все видео до 768 пикселей по максимальной стороне с сохранением соотношения сторон:
from DPF.transforms import VideoResizeTransforms, Resizer, ResizerModes transforms = VideoResizeTransforms(Resizer(ResizerModes.MAX_SIZE, size=768)) processor.apply_transform(transforms)Конвертация в формат shards:
processor.save_to_shards( 'destination/dir/', filenaming="counter", # or "uuid" rename_columns={"text": "caption"}, workers=4 )Конвертация в формат sharded files
processor.save_to_sharded_files( 'destination/dir/', filenaming="counter", # or "uuid" rename_columns={"text": "caption"}, workers=4 )