#python #image-processing #parallel-processing #neural-network #computer-vision
Вопрос:
Я пытаюсь реализовать параллельную обработку в проекте компьютерного зрения, над которым я работаю для своей диссертации. У меня есть сотни тысяч изображений для анализа, и я надеюсь, что параллельная обработка позволит мне анализировать несколько изображений одновременно, чтобы сократить общее количество времени, которое это займет. Вот моя первая попытка.
from deepface import DeepFace
import os
import pandas as pd
from time import process_time
import multiprocessing as mp
data = []
for file in sorted(os.listdir("C:\Dissertation\UWD Test")):
data.append((file))
Здесь данные представляют собой просто список имен файлов в небольшой папке с образцами, содержащими около 50 изображений.
def imcat(imname):
try:
obj = DeepFace.analyze(img_path = imname, actions = ['age', 'gender', 'race', 'emotion'])
filename = imname
age = (list(obj.values())[0])
sex = (list(obj.values())[1])
race = (list(obj.values())[3])
emotion = (list(obj.values())[5])
catdict = {}
for variable in ['filename', 'age', 'sex', 'race', 'emotion']:
catdict[variable] = eval(variable)
return catdict
except:
pass
Я пытаюсь использовать архитектуру DeepFace для извлечения атрибутов для каждого отдельного изображения и сохранения их в словаре, catdict. Функция возвращает словарь.
pool = mp.Pool(8)
templist = []
t1_start = process_time()
pool = mp.Pool(processes = 8)
results = [pool.apply(imcat, args=(data[i])) for i in range(0, len(data))]
templist.append(results)
t1_stop = process_time()
print("Elapsed time:", t1_stop, t1_start)
print("Elapsed time during the whole program in seconds:",
t1_stop-t1_start)
Здесь я пытаюсь использовать определенную функцию imcat для анализа каждого имени файла в списке «данные», сохранить этот анализ в словаре catdict и добавить словарь для каждого изображения в список «templist».
К сожалению, я получаю следующую ошибку.
Не удается получить атрибут «imcat» в <модуле «основной» (встроенный)>
Может кто-нибудь сказать мне, что я здесь делаю не так? Я относительно новичок в python, поэтому буду признателен за любую помощь. Спасибо!
Ответ №1:
Здесь может быть несколько вещей, играющих роль.
- Вы должны использовать
if __name__ == '__main__'
конструкцию для многопроцессорного кода. Вы можете найти подробную информацию в документации: https://docs.python.org/3/library/multiprocessing.html - Ошибка пытается сообщить вам, что она не может найти
imcat
вmain
модуле (который, вероятно, является текущим запущенным модулем, в котором находится ваш код). У вас могут возникнуть проблемы при запуске с ноутбука Jupyter из-за пункта 1. - Если ошибки сохраняются, вы можете попробовать поместить эту функцию в другой модуль и импортировать ее перед использованием.