Фреймворк для работы с датасетами
Установить с помощью 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_modalities( 'tests/datasets/files_correct/data.csv', image_path_col='image_path', caption_col='caption' ) reader = DatasetReader() processor = reader.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_modalities( 'tests/datasets/shards_correct', image_name_col='image_name', caption_col='caption' ) reader = DatasetReader() processor = reader.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_modalities( 'tests/datasets/shards_correct', image_name_col='image_name', caption_col='caption' ) reader = DatasetReader() processor = reader.from_config(config)Чтобы начать работу с датасетом, нужно сначала создать конфиг DatasetConfig, описывающий датасет и его модальности. Для каждого формата данных нужно использовать соответствующий конфиг. Пример для формата shards:
from DPF.configs import ShardsDatasetConfig config = ShardsDatasetConfig.from_modalities( '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_modalities( 'examples/example_dataset/', image_name_col='image_name', caption_col='caption' ) reader = DatasetReader() processor = reader.from_config(config)Пример чтения датасета с видео в формате sharded files:
from DPF.configs import ShardedFilesDatasetConfig config = ShardedFilesDatasetConfig.from_modalities( 'examples/example_video_dataset/', video_name_col='image_name', caption_col='caption' ) reader = DatasetReader() processor = reader.from_config(config)Взаимодействие с датасетом происходит через интерфейс DatasetProcessor. DatasetProcessor дает возможность валидировать, просматривать, фильтровать датасеты.
Обработчик датасета (интерфейс DatasetProcessor) даёт возможность посмотреть статистику и информацию по датасету, а также посмотреть рандомные семплы данных.
Получить датафрейм датасета можно, обратившись к атрибуту df:
processor.dfВывести саммари о датасете:
processor.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 addedКонвертация в формат shards:
processor.to_shards( 'destination/dir/', filenaming="counter", # or "uuid" keys_mapping={"text": "caption"}, workers=4 )Конвертация в формат sharded files
processor.to_sharded_files( 'destination/dir/', filenaming="counter", # or "uuid" keys_mapping={"text": "caption"}, workers=4 )