Многопроцессорная обработка и (фрейм данных pandas обработка изображений)

#python #python-3.x #pandas #multiprocessing #pool

#python #python-3.x #pandas #многопроцессорная обработка #Бассейн

Вопрос:

У меня есть pandas фрейм данных, который выглядит следующим образом:

 image_id    category    sub image_path
1000        A           HH  images/ID_1000.png
512         A           HH  images/ID_512.png
1002        C           CC  images/ID_1002.png
236         B           XX  images/ID_236.png
...        ...          ...  .....
 

Какова конечная цель?

  • Группируйте изображения по category .
  • Прочитайте все изображения в категории. Преобразуйте его и сохраните на диске с помощью skimage .
  • Скопируйте все значения, соответствующие строке, в которой встречается изображение, в новый фрейм данных и измените его соответствующим image_path образом, чтобы указать на преобразованное изображение.
  • Поскольку фрейм данных является объятием, мне нужно распараллелить этот процесс.

Короче говоря, я хочу распараллелить эту функцию, используя pool :

 def transform_and_save(df, to_generate=5000):
    categories = {"A":0, "B":1, "C":2}
    save_dir_path = "new_images/"
    new_df = pd.DataFrame(columns=df.columns)
    final_count=0

    for cls in classes_to_aug.keys():
        orig_images = df[df["category"]==cls].reset_index(drop=True)

        orig_count = len(orig_images)
        nb_images_to_gen = to_generate - orig_count

        counter = 0
        stop = False

        while counter < nb_images_to_gen:
            for i in range(len(orig_images)):
                all_values = orig_images.loc[i]

                img = Path(orig_images["image_path"][i])
                img_name = img.name
                save_name = save_dir_path    "newimg_"   str(counter)   img_name
                img = imread(img)
                img = resize(img, (200, 200))

                imsave(fname=save_name, check_contrast=False, arr=img)

                all_values["image_path"] = save_name               
                new_df.loc[final_count] = all_values 

                counter  = 1
                final_count  = 1
                if counter > nb_images_to_gen:
                    stop=True
                    break
            if stop:
                break
    return new_df
 

Комментарии:

1. Вы проверили swifter ? Его цель — распараллелить операции над pd.DataFrame объектами (если это помогает в производительности), возможно, стоит это проверить.

2. Ммм, я могу попробовать, но я думаю, что это не решит ту часть, где мне нужно обновить значение, поскольку в этом случае для переменной может быть условие гонки final_count

3. Конечно, просто выставляю это как возможное жизнеспособное решение.