OpenCV imread и imwrite слишком медленно на Google Диске с использованием CoLab - PullRequest
0 голосов
/ 14 июля 2020

Я использую Google CoLab и запускаю фрагмент кода, который выполняет итерацию более 170–190 тыс. Изображений, считывает их по пути вроде gdrive / My Drive / folder1 / img.jpg с использованием функции cv2.imread , затем изменяет их размер с помощью функции cv2.resize, а затем записывает их по пути типа gdrive / My Drive / folder2 / img.jpg используя cv2.imwrite.

Но это СЛИШКОМ МЕДЛЕННО . Раньше я запускал на своем устройстве Jupyter Notebook в ОС Linux Ubuntu LTS18.04, и это быстро повторялось. Теперь каждая итерация занимает около 30 секунд, из чего следует, что код займет около 65 дней?!

Что заставляет его работать так медленно в CoLab и как я могу сделать это быстрее?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Это проблема не OpenCV, а Google Drive. Доступ к файлам с Google Диска очень медленный, даже если вы работаете в Google Colaboratory.

Лучше всего скопировать файлы в хранилище Colab, тогда вы получите более высокую производительность, которая будет зависеть от времени выполнения (CPU / GPU / TPU), который вы используете.

Для копирования файлов вы можете использовать библиотеку shutil ( Документация Shutil ):

import shutil

# To copy files
shutil.copyfile('source_file_location', 'destination_file_location')

# To copy multiple files of folder with some conditions
import os
for file in os.listdir('folder_path'):
    if file.endswith('.jpg'):
        shutil.copyfile('folder_path' + file, 'desination_folder_path' + file)

# To copy folders
shutil.copytree('source_path', 'destination_path')  

Поскольку у вас их много в одной папке на Google Диске, доступ ко всем файлам может быть неудачным (иногда). Рекомендуется хранить файлы группами во многих папках (это устранит некоторые ошибки при использовании Google Диска через Colab). Подробнее об этом

0 голосов
/ 14 июля 2020

Причина этого - накладные расходы на пути и чтение с диска.

Я нашел лучший способ сделать это быстрее, это иметь файлы, которые я читаю, в самом хранилище CoLab.

Это можно сделать двумя способами: один - скопировать файлы с помощью команд Linux в среде CoLab с диска в основной каталог хранилища. Что-то вроде !cp <source directory> <destination directory>

Например, в нашем случае: !cp "gdrive/My Drive/datasets/imdb_crop" "imdb_crop".

В противном случае, если ваши данные сжаты, чтобы сэкономить время распаковки, распакуйте их прямо в CoLab storage.

При использовании tar-файла:

from google.colab import drive
import tarfile
drive.mount('/content/gdrive')
fname = 'gdrive/My Drive/IMDB_Dataset.tar'
tar = tarfile.open(fname, "r:")
tar.extractall()
tar.close()

При использовании zip-файла:

from google.colab import drive
drive.mount('/content/gdrive')

import zipfile
filename = "drive/My Drive/IMDB_Dataset.zip"
with zipfile.ZipFile(filename, 'r') as zipp:
zipp.extractall()
zipp.close()

Чтобы убедиться, что это работает, вы найдете в файлах окружение CoLab - которое вы можете видеть на боковой вкладке - что есть папка imdb_crop (например) в основном каталоге, за пределами gdrive.

Когда я читаю файлы непосредственно из папки imdb_crop, он был намного быстрее.

...