Cntk 如何计算一组图像文件的图像平均值?

Cntk 如何计算一组图像文件的图像平均值?,cntk,Cntk,是否有人对如何计算一组图像的图像平均值(.jpg文件夹中的文件)并为ImageDeserializer生成正确格式的XML文件有较高的解释 我已经在CNTK_201A_CIFAR-10_数据加载器中看到了代码,它可以实现这一点。但是,那里的输入格式不同,因此不清楚如何将图像文件作为输入来处理。您可以按照下面的代码示例进行操作。基本上,它会遍历所有的训练图像并计算平均值。然后以OpenCV可以理解的格式将其写入文件中。第一部分因为numpy和PIL而简单,第二部分因为minidom而简单。 下面是

是否有人对如何计算一组图像的图像平均值(.jpg文件夹中的文件)并为ImageDeserializer生成正确格式的XML文件有较高的解释


我已经在CNTK_201A_CIFAR-10_数据加载器中看到了代码,它可以实现这一点。但是,那里的输入格式不同,因此不清楚如何将图像文件作为输入来处理。

您可以按照下面的代码示例进行操作。基本上,它会遍历所有的训练图像并计算平均值。然后以OpenCV可以理解的格式将其写入文件中。第一部分因为numpy和PIL而简单,第二部分因为minidom而简单。

下面是一个完整的解决方案,基于Nikos提供的链接,用于计算ZIP文件中存储的所有图像(如果您使用ZIP图像读取器)或图像文件列表中的平均值


关于您的问题:在DataLoader教程中,填充仅影响用于将图像保存到文件的代码路径,而不影响用于计算平均值的代码路径

导入zipfile
输入io
将numpy作为np导入
从PIL导入图像
从scipy.misc导入imread、imresize和fromimage
将xml.etree.cElementTree作为et导入
导入xml.dom.minidom
#saveMean函数取自
# https://github.com/Microsoft/CNTK/blob/v2.0.beta7.0/Examples/Image/DataSets/CIFAR-10/cifar_utils.py#L84
def saveMean(fname、data、imgSize):
root=et.Element('opencv_storage')
et.SubElement(根,'Channel')。text='3'
et.SubElement(根,'行').text=str(imgSize)
et.SubElement(根,'Col')。text=str(imgSize)
meanImg=et.SubElement(根'meanImg',type_id='opencv-matrix')
et.SubElement(meanImg,'rows')。text='1'
et.SubElement(意思是img,'cols')。text=str(imgSize*imgSize*3)
et.SubElement(平均值,'dt')。text='f'
et.SubElement(意思是img,'data')。text=''.join(['%e'%n代表n在np.reformate(data,(imgSize*imgSize*3))]))
tree=et.ElementTree(根)
tree.write(fname)
x=xml.dom.minidom.parse(fname)
将open(fname,'w')作为f:
f、 写入(x.toprettyxml(缩进=“”))
def加载和大小(f,网络大小):
im=图像打开(io.BytesIO(f))
n=fromimage(im).astype(np.float)
返回imresize(n,(networkSize,networkSize))
然后在函数中使用这些构建块,从ZIP文件或原始文件中将图像作为字节读取:

def meansfromzip(zipFile,networkSize):
imgSum=np.zero((networkSize,networkSize,3),np.float)
zipfile.zipfile(zipfile)作为z:
allFiles=z.namelist()
对于所有文件中的f:
imgSum=imgSum+loadAndResize(z.read(f),networkSize)
返回imgSum/len(所有文件)
def meanFromFiles(文件、网络大小):
imgSum=np.zero((networkSize,networkSize,3),np.float)
对于文件中的f:
以开放式(f,'rb')作为b:
imgSum=imgSum+loadAndResize(b.read(),networkSize)
返回imgSum/len(文件)
调用如下:

zipFile=“myImages.zip”
networkSize=224
mean=meanFromZip(zipFile,networkSize)
saveMean(“mean.xml”,mean,networkSize)
files=[“c:/temp/Column0_-Line16.jpg”,“c:/temp/Column0_-Line47.jpg”]
mean2=meanFromFiles(文件,网络大小)

您能再详细一点吗?正如我所说,我已经查看了所提供链接中引用的代码。然而,平均值计算有点卷积到saveImage函数中。CIFAR案例中的源格式似乎是一个文本文件,与使用PIL读取.jpg文件时得到的格式不同。我认为,如果平均值是根据完成的文件图像计算的,或者如果能够清楚地知道平均值计算是以什么格式执行的,那么本教程会更简洁一些。在CNTK_201A_CIFAR-10_数据加载器中的saveImage函数中,它看起来像是计算了平均值,然后有一些代码步骤不是很明显。看起来有些填充完成了。这会不会影响平均值计算的正确性,因为它看起来像是在不同的图像上计算的平均值?然后有两个嵌套的for循环,没有注释。如果函数逻辑解释得更详细一些,这会有所帮助。“关于您的问题:在DataLoader教程中,填充只影响将图像保存到文件的代码路径,而不影响计算平均值。”:是的,但平均值不应该根据保存到文件的内容计算吗?培训中输入的是文件,我本以为mean文件应该反映实际创建的文件的内容,而不是根据输入进行计算。我曾尝试使用您的代码生成mean XML文件,但我无法使其与作为CIFAR教程一部分提供的XML文件完全相同。提供的XML文件是基于32x32x3像素输入图像计算的。生成的.png文件是40x40x3像素,因此不可能生成这些文件的平均值,并使其与32x32x3图像上计算的平均值相同。我认为这里的教程可能有缺陷。