Я новичок в питоне и машинном обучении.У меня есть огромный набор изображений автомобилей с более чем 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 ГБ ОЗУ.
Итак, для этого я хочу сделать некоторые другие шаги, которые могут быть полезны, занимая меньше памяти и заставить это работать.Шаги, которые я хочу сделать, следующие:
- выделить массив np X формы N, 150,150,3 / 300,300,3 типа float32 (не astype)
- перебирать изображенияи заполните каждую строку массива X 150 150,3 пикселями изображения
- нормализуйте на месте: X / = 255
- Запись в файл (формат .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, пожалуйста, сообщите мне, и я отредактирую его больше.
Спасибо,