【发布时间】:2019-02-11 17:13:41
【问题描述】:
我是 python 和机器学习的新手。我有一个庞大的汽车图像数据集,其中包含超过 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")
但即使在 32gb RAM 上读取图像后,它总是给我一个巨大的内存错误。
因此,为此我想做一些其他步骤,这些步骤可能有助于减少内存并使其正常工作。 我想做的步骤如下。
- 分配类型为 N,150,150,3/300,300,3 的 np 数组 X float32 (不是 astype)
- 遍历图像并用 150,150,3 个图像像素填充数组 X 的每一行
- 就地标准化: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 的规则和规定,请告诉我,我会进一步编辑。
谢谢你,
【问题讨论】:
-
通常在处理图像数据时,模型是分批训练的,而不是一次性训练的。
-
你用什么库来定义你的模型?
标签: python machine-learning label training-data