Как правильно использовать класс Parallels Joblib с большим вложенным списком в Python? - PullRequest
0 голосов
/ 17 октября 2019

У меня есть CSV-файл, который содержит 3 столбца данных (имя, путь к изображению и индекс). У меня есть функция с именем Do_Training () , которая читает из файла CSV, а затем преобразует файл CSV в большой вложенный список (то есть: " [[name1, path1,1], [name2», path2,2], ....]").

Когда я попытался использовать класс Parallel () (из библиотеки Joblib) с методом Delayed () , я получил "Не удалосьвыберите задачу, чтобы отправить ее рабочим. " ошибка.

Когда я удаляю метод Delayed () , функция Process_Training_Image () работает должным образом, пока не будет достигнут конец вложенного списка, но, наконец, "не может распаковать не повторяемый объект NoneType" исключение.

Функция Process_Training_Image () не должна ничего возвращать, но во избежание исключения, когда я пытаюсь вернуть значения из этой функции, я получаю множество ошибок.

Функция Do_Training ()

#Train all images in a given CSV file of correct format
def Do_Training(csv_file_path):
    print("Starting Training...")
    start_time=time.time()

    with open(csv_file_path,'r') as csvFile:
        csvReader=csv.reader(csvFile,delimiter=',')
        csvLines=list(csvReader)

        process=Parallel(num_cores) ((Process_Training_Image)(row) for row in csvLines)


        #threads=[]
        #for name,path,idx in csvLines:
        #    #t= threading.Thread(target=Process_Training_Image,args=(name,path,idx))
        #    threads.append(t)

        #for t in threads:
        #    t.result()
        #for t in threads:
        #    t.join()

        end_time=time.time()
        print("Training Done!")
        print("Time Elapsed: {}".format(end_time-start_time))
        print("Number of Valid Training Images: {}".format(len(trFaceVectors)))

Функция Process_Training_Image ()

#Process Training Image
def Process_Training_Image(row):
    print("\nTraining on image: {} @ {}".format(row[0],row[1]))
    #Load Image From File
    image=cv2.imread(row[1])
    #Convert BGR to RGB
    face_image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
    #Detect Faces from 'face_image'. Upscaling =1 
    det_faces=face_detector(face_image,1)
    #There should be atleast on Face.
    #Traning images has one face per image.
    if len(det_faces)==0:
        print("Face Image invalid or not found!")
    if len(det_faces)>0:
        for i,d in enumerate(det_faces):
            #Print Face Details
            print("Face Found! Left: {} Right: {} Top: {} Bottom: {}".format(d.left(),d.right(),d.top(),d.bottom()))
            #Detect Landmarks on Face
            landmarks=shape_predictor(face_image,d)
            #Compute Face_Descriptor Vector
            face_descriptor=face_recognizer.compute_face_descriptor(face_image,landmarks)
            #Append Lists
            trFaceNames.append(row[0])
            trFaceVectors.append(face_descriptor)
    #return {'a':row[0],'b':row[1],'c':row[2]}

Все изображения должны быть обработаны, и все соответствующие списки должны быть заполнены без ошибок.

...