Итак, я пытался сгенерировать наборы данных изображений для вычитания фона с помощью сверточной нейронной сети на основе бумаги. Для начала, я пытаюсь выполнить вычитание фона на 300-кадровом видео, процесс, в котором я сейчас застрял, - это то, где я пытаюсь извлечь набор фрагментов изображения 27x27 из сложенного изображения 300 изображений в оттенках серого 266x346 и 300 изображений в оттенках серого 266x346. Но я продолжаю получать ошибку памяти, которая гласит, как на картинке ниже:
Вот мой код:
import cv2
import numpy as np
import statistics
import os
from sklearn.feature_extraction import image
from matplotlib import pyplot as plt
def rgb2gray(img):
temp=np.zeros((len(img),len(img[0])),dtype=np.uint8)
for row in range(len(img)):
for col in range(len(img[0])):
temp[row][col]=img[row][col][0]*0.299+img[row][col][1]*0.587+img[row][col][2]*0.114
return temp
def load_images_from_folder(folder):
images = []
for filename in os.listdir(folder):
img = cv2.imread(os.path.join(folder,filename))
if img is not None:
images.append(img)
return images
def tdataset_gen(img):
temp=[]
ret=True
c=0
while ret:
c+=1
print(c)
ret,frame=img.read()
if frame is None:
return temp
else:
frame=frame/255
gray = rgb2gray(frame)
temp.append(gray)
def zpad(datas,xleft,xtop,xright,xbot):
return np.pad(datas,((xtop,xbot),(xleft,xright)),'constant')
def concat(img1,img2):
temp=np.zeros((img1.shape[0],img1.shape[1],2))
temp[:,:,0]=img1
temp[:,:,1]=img2
return temp
def scene_spec_genx(datas,backgrounds):
backgrounds=zpad(backgrounds,13,13,13,13)
temp=[]
for i in range(len(datas)):
print(i)
temp2=zpad(datas[i],13,13,13,13)
temp2=concat(temp2,backgrounds)
temp2=image.extract_patches_2d(temp2,(27,27))
temp.append(temp2)
# temp.append(image.extract_patches_2d(concat(zpad(datas[i],13,13,13,13),backgrounds),(27,27)))
return temp
def bg_init(dataset,fr,cntr):
bg=np.zeros((len(dataset[0]),len(dataset[0][0])),dtype=np.uint8)
for row in range(len(bg)):
for col in range(len(bg[0])):
tempv=[]
cntr=0
while cntr!=fr:
tempv.append(dataset[cntr][row][col])
cntr+=1
bg[row][col]=statistics.median(tempv)
return bg
img = cv2.VideoCapture("D:\playground\\background subtraction\\reduced\\input\\reduced.mp4")
datasets=tdataset_gen(img)
interval=300
background=bg_init(datasets,interval,interval)
trainx=scene_spec_genx(datasets,background)
Что-то не так с моим кодом? Если нет, есть ли любое решение, кроме запуска его на компьютере с большим объемом памяти / ОЗУ, например, сделать код более эффективным для памяти? Потому что я также пробовал Google Collab, но ядро продолжает давать сбой. Я также проверил, когда извлекается патч cra sh, кажется, он всегда cra sh на моем компьютере, когда он уже извлекает 40-42 данных (из общего числа 300). Так что это действительно может быть проблема с памятью. Если вопрос непонятен, спрашивайте.