LINUX.ORG.RU

конвертация 100 000 картинок в один csv файл

 


1

1

использую google colab + keras для распознавания изображений cifar

google colab не позволяет «хранить» данные между сессиями, вместо этого рекомендуется подключить google drive что я и сделал. Я скачал себе на компьютер архив который я распаковал и получил 100 000 картинок 32*32 (rgb) png

Я мог бы залить все эти картинки на гугл драйв, но субъективно мне показалось что он медленное работает когда много мелких файлов, по этому и подумал что лучше все картинки засунуть в один csv файл (в таком формате у меня был mnist, и он работал быстро без нареканий)

Первый вопрос: правильно ли я вообще поступаю что хочу много png -> один csv, получу ли я прирост производительности, может есть какие-то подводные камни?

Второй вопрос: как лучше это сделать, я поверхностно знаком с bash и python

[UPD] Третий вопрос, как лучше rgb сохранить в csv?

r00,g00,b00,r01,g01,b01...
или
r00, r01, r02 ... b01, b02,b03 
или как-то еще?

[UPD] как я хочу использовать данные, я только разбираюсь в keras, для mnist я использовал train_dataset = np.loadtxt('train.csv', skiprows=1, delimiter=',') по этому я и хочу сохранить картинки в csv.

★★★

Последнее исправление: abs (всего исправлений: 2)

Ответ на: комментарий от gedisdone

почитал, и не совсем понял какие преимущества я получу?

Щас добавлю уточнение как я хочу использовать данные

abs ★★★
() автор топика
Ответ на: комментарий от gedisdone

как я хочу использовать данные, я только разбираюсь в keras, для mnist я использовал train_dataset = np.loadtxt(‘train.csv’, skiprows=1, delimiter=‘,’) по этому я и хочу сохранить картинки в csv.

По этому я не совсем понял чем мне PPM облегчит жизнь?

abs ★★★
() автор топика
Ответ на: комментарий от abs

Возможностью конвертации через convert *.png *.ppm?

Я не работаю с numpy, поэтому я не знаю, что в нём требуется или не требуется. Я просто предлагаю простое решение под нужды.

gedisdone ★★★
()

правильно ли я вообще поступаю что хочу много png -> один csv, получу ли я прирост производительности, может есть какие-то подводные камни?

подводные камни - один побился - весь csv чинить, один обновился - весь csv перелопачивать чтоб обновить

хз как в ваших питонах, в яве есть удобный доступ к содержимому по индексу, но для этого надо знать точный индекс внутри файла т.е. если у тебя 1000 одинаковых по размеру png’шек то ты можешь изменить 500ый зная где лежат его данные, но это всё пойдёт по елде как только размеры станут не одинаковыми или вдруг к некоторым картинкам добавится альфа - вообщем положение 500ого станет не однозначным

Третий вопрос, как лучше rgb сохранить в csv?

csv строковый - соотв. хранить желательно так, что-бы при экспорте-импорте было минимальное количество преобразований строк из одного вида в другой - если у тебя конструктор png’шки принимает строку вида р,г,б то так и храни, в противном случае ты для каждого png будешь свои р0 р1 р2 г0 г1 г2 б0 б1 б2 перелопачивать в отдельные строки р,г,б пол часа, а так просто подпихивать кусочки (если правильно сделаешь то это почти бесплатно)

rukez ★★★★
()

Почему бы не засунуть все эти блобы в один pickle или hdf5 (без сжатия)? Ещё можно в архив какой-нибудь типа tar’а запихнуть и через tarfile выдёргивать.

много png -> один csv

Это странное решение. Хотя и оно, наверное быстрее будет работать, чем все файлы по-отдельности.

future_anonymous
()

Если Python, то он позволяет использовать mat-файлы для хранения произвольных данных произвольных размерностей. mat-файлы это от Matlab-а бинарные файлы, мне показалось это удобно, и можно обмениваться между моделями на Python и собственно Matlab

Возможно есть более удачные контейнеры

import scipy.io
mat = scipy.io.loadmat('file.mat') # + savemat

mat это dict, засунешь в него хоть миллион своих картинок, а лягут одним бинарным файлом

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
from PIL import Image
import numpy as np
import os

## SAVE TO NUMPY ARRAY FILE
images_list = []
for f in os.listdir('img'):
    images_list.append(np.array(Image.open(f'img/{f}')))
np.save('images.npy', np.array(images_list))


## READ NUMPY ARRAY FILE
a = np.load('images.npy')
print(a.shape)


## USAGE EXAMPLE
img0 = a[0]
for row in img0:
    for pix in row:
        if sum(pix) > 128*len(pix):
            print('#', end='')
        else:
            print(' ', end='')
    print()
    
anonymous
()

С точки зрения файловой системы один файл на 100000х32х32х4=400Мб это лучше чем 100 тыс файлов по 4Кб, даже сжатых.

csv формат тут не айс т.к. он будет вчетверо толще и главное значительно дольше читается-пишется. Лучше взять что то бинарное, да хоть просто байтики друг за другом положить.

Детали зависят от того что с этими данными делать.

AntonI ★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)

Второй вопрос: как лучше это сделать

Совсем все чтоле отупели? Такое всегда делается с помощью ’base64 -w 0 you.png`.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.