我试图迭代超过100,000个图像并捕获一些图像功能,并将所得的dataFrame作为pickle文件存储在磁盘上。
不幸的是,由于RAM的限制,我被迫将图像分成20,000个大块并对其进行操作,然后再将结果保存到磁盘上。
在开始循环以处理下一个20,000图像之前,下面编写的代码应该保存20,000图像的结果数据框。
但是-这似乎没有解决我的问题,因为在第一个for循环结束时内存没有从RAM中释放
因此,在处理第50,000条记录时,该程序由于内存不足错误而崩溃。
在将对象保存到磁盘并调用垃圾收集器后,我尝试删除这些对象,但是RAM使用率似乎并未下降。
我想念什么?
#file_list_1 contains 100,000 images
file_list_chunks = list(divide_chunks(file_list_1,20000))
for count,f in enumerate(file_list_chunks):
# make the Pool of workers
pool = ThreadPool(64)
results = pool.map(get_image_features,f)
# close the pool and wait for the work to finish
list_a, list_b = zip(*results)
df = pd.DataFrame({'filename':list_a,'image_features':list_b})
df.to_pickle("PATH_TO_FILE"+str(count)+".pickle")
del list_a
del list_b
del df
gc.collect()
pool.close()
pool.join()
print("pool closed")
Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何在jupyter笔记本上工作时释放python对象占用的空间。
在特定的场景中,我正在处理多个大型数据框,完成一些计算后,我想加载一个新的数据框。
但是,这总是会导致内存错误,并且我的系统开始冻结。
所以我想我将尝试删除python对象。
到目前为止我尝试过的事情:
1.使用del并调用垃圾收集器
del pyobject
import gc
gc.collect()
Run Code Online (Sandbox Code Playgroud)
使用IPython Magic命令
%reset_selective -f pyobject
这两种方法均无法真正释放内存。查看htop命令后,我发现jupyter笔记本计算机仍在使用20GB的RAM。仅当我重新启动内核时,它们的内存才被释放(但是后来我失去了下一步数据分析所需的所有其他变量)
看起来我似乎在理解图像在 numpy 数组中的表示方式方面存在一些根本性的差距。
img = np.ones([100,100,3], dtype=np.uint8)*255
plt.imshow(img)
Run Code Online (Sandbox Code Playgroud)
上面的代码创建了一个“白色”的 3 通道图像。
每个像素都有值 [255,255,255]
明白了。
现在我想创建一个“白色”灰度图像。我真的不需要 RGB 通道来存储白色图像,是吗?
img_bw = np.ones([100,100], dtype=np.uint8)*255
plt.imshow(img_bw, cmap = "gray")
Run Code Online (Sandbox Code Playgroud)
即使每个像素位置的值为 255,这也会创建一个“黑色图像”?
好的,让我拿我之前的 3 通道白色图像并将其转换为灰度,看看 numpy 数组是什么样的。
img_bw1 = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
plt.imshow(img_bw1, cmap = "gray")
Run Code Online (Sandbox Code Playgroud)
这也给了我一个“黑色图像”?
那么灰度“白色图像”的 numpy 矩阵到底是什么样的呢?
img = io.imread("https://www.colorcombos.com/images/colors/FFFFFF.png" , as_grey=True)
plt.imshow(img*255, cmap = "gray")
Run Code Online (Sandbox Code Playgroud)
这是一张白色的图像。该矩阵中的每个像素的值都为 216 及以上
plt.imshow(img, cmap = "gray")
Run Code Online (Sandbox Code Playgroud)
这也是一个白色的图像。该矩阵中的每个像素的值都为 0.86 及以上。
我完全迷路了。
问题 -
如何在 numpy 中创建灰度二维白色图像?
为什么不使用 cv2.Color 将 numpy 中的 3 通道白色图像转换为灰度图像给我一个白色图像?
我正在使用Google Text检测API对图像执行OCR。
我发现当我使用opencv对图像进行一些预处理时,OCR结果要好得多。
我的问题是-我如何在内存中以Numpy数组的形式调用Google cloud Vision API?官方的Google文档仅显示视觉api接受磁盘中的图像作为输入。
我想避免不必要的磁盘写入。
python numpy google-api google-compute-engine google-cloud-functions