Чтение огромных данных изображений для тренировочных классификаторов - PullRequest
0 голосов
/ 11 февраля 2019

Я новичок в питоне и машинном обучении.У меня есть огромный набор изображений автомобилей с более чем 27000 изображений и ярлыков.Я пытаюсь создать набор данных, чтобы использовать его в своем учебном классификаторе, но, конечно же, обработка этого количества данных станет настоящей болью для памяти, и вот где я застрял.Сначала я пытался сделать что-то вроде этого.

import os
import matplotlib.pyplot as plt
import matplotlib.image as mpg
import cv2
import gc
import numpy as np
from sklearn.preprocessing import normalize
import gc
import resource
import h5py

bbox = "/run/media/fdai5182/LAMAMADAN/Morethan4000samples/data/labels"
imagepath = "/run/media/fdai5182/LAMAMADAN/Morethan4000samples/data/image"



training_data = []
training_labels = []
count = 0


for root, _, files in os.walk(bbox):
    cdp = os.path.abspath(root)
    for rootImage , _ , fileImage in os.walk(imagepath):
        cdpimg = os.path.abspath(r) 
        for f in files:
            ct = 0
            name,ext = os.path.splitext(f)
            for fI in fileImage:
                n , e = os.path.splitext(fI)
                if name == n and ext == ".txt" and e == ".jpg":
                    cip = os.path.join(cdp,f)
                    cipimg = os.path.join(cdpimg,fI)
                    txt = open(cip,"r")
                    for q in txt:
                        ct = ct + 1
                        if ct == 3:
                            x1 = int(q.rsplit(' ')[0])
                            y1 = int(q.rsplit(' ')[1])
                            x2 = int(q.rsplit(' ')[2])
                            y2 = int(q.rsplit(' ')[3])  
                            try:
                                read_img = mpg.imread(cipimg)
                                read_img = read_img.astype('float32')
                                read_img_bbox = read_img[y1:y2, x1:x2,:]
                                resize_img = cv2.cv2.resize(read_img_bbox,(300,300))
                                resize_img /= 255.0 
                                training_labels.append(int(cipimg.split('\\')[4]))                                 


                                training_data.append(resize_img)
                                print("len Of Training_data",len(training_data))
                                training_labels.append(int(cipimg.split('/')[8]))
                                del resize_img
                                print("len Of Training Labels", len(training_labels))
                                gc.collect()                                    
                            except Exception as e:
                                print("Error",str(e), cip)
                            count = count + 1
                            print(count)    
                    txt.flush()
                    txt.close() 




np.save('/run/media/fdai5182/LAMA MADAN/Training_Data_4000Samples',training_data)
np.save('/run/media/fdai5182/LAMA MADAN/Training_Labels_4000Samples',training_labels)




print("DONE")

Но это всегда дает мне огромную ошибку памяти после чтения изображений даже на 32 ГБ ОЗУ.

Итак, для этого я хочу сделать некоторые другие шаги, которые могут быть полезны, занимая меньше памяти и заставить это работать.Шаги, которые я хочу сделать, следующие:

  1. выделить массив np X формы N, 150,150,3 / 300,300,3 типа float32 (не astype)
  2. перебирать изображенияи заполните каждую строку массива X 150 150,3 пикселями изображения
  3. нормализуйте на месте: X / = 255
  4. Запись в файл (формат .npy)

То, что я до сих пор делал, это

import cv2
import matplotlib.pyplot as plt
import matplotlib.iamge as mpg
import numpy as np

bbox = "/run/media/fdai5182/LAMAMADAN/Morethan4000samples/data/labels"
imagepath = "/run/media/fdai5182/LAMAMADAN/Morethan4000samples/data/image"

for root, _, files in os.walk(bbox):
    cdp = os.path.abspath(root)
    for rootImage, _, fileImage in os.walk(imagepath):
        cdpimg = os.path.abspath(rootImage)
        for f in files:
            ct = 0
            name,ext = os.path.splitext(f)
            for fI in fileImage:
                n , e = os.path.splitext(fI)
                if name == n and ext == ".txt" and e == ".jpg":
                   nparrayX = np.zeros((150,150,3)).view('float32')
                   cip = os.path.join(cdp,f)
                   cipImg = os.path.join(cdpimg,fI)
                   read_image = mpg.imread(cip)
                   resize_image = cv2.cv2.resize(read_image,(150,150))

Я на правильном пути?Кроме того, как я могу заполнить каждую строку формата изображения 150,150,3 пикселей изображения.Я больше не хочу использовать список, так как они занимают больше памяти и занимают много времени.Пожалуйста, помогите мне в этом.

Кроме того, как новый участник, если вопрос не подчиняется правилам и нормам StackOverflow, пожалуйста, сообщите мне, и я отредактирую его больше.

Спасибо,

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

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

import cv2
import matplotlib.pyplot as plt
import matplotlib.image as mpg
import numpy as np
import os

N = 0
training_labels = []

bbox = "D:/Morethan4000samples/data/labels"
imagepath = "D:/Morethan4000samples/data/image/"
for root, _, files in os.walk(imagepath):
        cdp = os.path.abspath(root)
        for f in files:
                name, ext = os.path.splitext(f)
                if ext == ".jpg":
                        cip = os.path.join(cdp,f)
                        N += 1  

print(N) 

imageX = np.zeros((N,227,227,3), dtype='float32')

i = 0

for root, _ , files in os.walk(imagepath):
        cdp = os.path.abspath(root)
        print(cdp)
        for f in files:
                ct = 0
                name, ext = os.path.splitext(f)
                if ext == ".jpg":
                        cip = os.path.join(cdp,f)
                        read = mpg.imread(cip)
                        cipLabel = cip.replace('image','labels')
                        cipLabel = cipLabel.replace('.jpg','.txt')
                        nameL , extL = os.path.splitext(cipLabel)
                        if extL == '.txt':
                                boxes = open(cipLabel, 'r')
                                for q in boxes:
                                        ct = ct + 1 
                                        if ct == 3:
                                                x1 = int(q.rsplit(' ')[0])
                                                y1 = int(q.rsplit(' ')[1])
                                                x2 = int(q.rsplit(' ')[2])
                                                y2 = int(q.rsplit(' ')[3])
                                            readimage = read[y1:y2, x1:x2]
                                            resize = cv2.cv2.resize(readimage,(227,227))
                        resize = cv2.cv2.GaussianBlur(resize, (5,5),0)
                                            imageX[i] = resize
                        #training_labels.append(int(cip.split('\\')[4]))
                        training_labels.append(int(cip.split('/')[8]))
                        print(len(training_labels), len(imageX))
                        i += 1  
                        print(i)


imageX /= 255.0
plt.imshow(imageX[10])
plt.show()

print(imageX.shape)
print(len(training_labels))

np.save("/run/media/fdai5182/LAMA MADAN/Morethan4000samples/227227/training_images", imageX)
np.save("/run/media/fdai5182/LAMA MADAN/Morethan4000samples/227227/trainin_labels",training_labels)

Сохранение каждого изображения в строке матрицы одинаковых размеров - наиболее эффективный способ сделать это.

0 голосов
/ 11 февраля 2019

Как tenorflow / keras, так и pytorch предоставляют классы наборов данных / генераторов, которые можно использовать для создания загрузчиков данных с эффективным использованием памяти.

Для тензорного потока / кераса есть превосходное учебное пособие, созданное Шервайн Амиди из Stanford..

Для pytorch вы найдете хороший учебник на странице руководства проекта .

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

...