Python 对一幅大图像应用基于分片的convnet分类器

Python 对一幅大图像应用基于分片的convnet分类器,python,tensorflow,keras,deep-learning,computer-vision,Python,Tensorflow,Keras,Deep Learning,Computer Vision,我的任务是在文件的图片上找到某个字母。使用经典的计算机视觉,我将图像分割成字符。然后,我使用一个在25×25像素的字符图像上训练的神经网络,将它们分类为我想要的字符和所有其他字符。使用这个,我可以重建这些角色的位置 现在我想将convnet直接应用于整个图像,这样我就不必依赖于经典的分割。该网络是一个深度神经网络,由二维卷积、二维最大池层和稠密分类器组成。网络如下所示: Layer (type) Output Shape Param #

我的任务是在文件的图片上找到某个字母。使用经典的计算机视觉,我将图像分割成字符。然后,我使用一个在25×25像素的字符图像上训练的神经网络,将它们分类为我想要的字符和所有其他字符。使用这个,我可以重建这些角色的位置

现在我想将convnet直接应用于整个图像,这样我就不必依赖于经典的分割。该网络是一个深度神经网络,由二维卷积、二维最大池层和稠密分类器组成。网络如下所示:

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_61 (Conv2D)           (None, 23, 23, 32)        320       
_________________________________________________________________
max_pooling2d_50 (MaxPooling (None, 11, 11, 32)        0         
_________________________________________________________________
conv2d_62 (Conv2D)           (None, 9, 9, 64)          18496     
_________________________________________________________________
max_pooling2d_51 (MaxPooling (None, 4, 4, 64)          0         
_________________________________________________________________
flatten_46 (Flatten)         (None, 1024)              0         
_________________________________________________________________
dropout_5 (Dropout)          (None, 1024)              0         
_________________________________________________________________
dense_89 (Dense)             (None, 1)                 1025      
=================================================================
Total params: 19,841
Trainable params: 19,841
Non-trainable params: 0
我知道我可以用经过训练的滤波器将卷积部分应用于整个图像。这将以更大空间维度的张量形式给出对这些过滤器的响应。但是为了分类,我需要使用经过训练的分类器来获取固定数量的空间信息。输入不同大小的图像将打破这一局面

到目前为止,我最好的想法是将图像分割成块,并将每个固定大小的块送入分类器。这似乎就是问题的答案


是否存在更好的方法将经过训练的过滤器应用于整个图像,并可以使用经过训练的分类器进行某种局部分类?

作为一种解决方案,我建议您使用函数从图像中提取补丁,并将经过训练的分类器应用于每个补丁。这有几个好处:

  • 您将得到一个密集的响应图,您可以进一步处理该图,以准确确定字母在整个图像中出现的位置

  • 由于这是一个内置的TensorFlow Op,您可以通过将所有这些作为单个Keras模型实现和运行来简化流程,因此可以利用批处理以及加速的CPU/GPU处理

以下是解决方案的示意图:

将tensorflow导入为tf
从tensorflow.keras.layers导入输入、重塑、时间分布
整个图像=输入(形状=(img\u行,img\u列,1))
patches=tf.image.extract\u patches(
整体图像,
大小=[1,25,25,1],
步幅=[1,1,1,1],#如果不需要密集的分类图,可以选择增加步幅
利率=[1,1,1,1],
“一样”
)
#“补丁”的形状是“(批量大小,行数,列数,25*25)”。
#因此,我们对其进行重塑,以便我们可以将分类器独立应用于每个面片。
重塑面片=重塑(-1,25,25,1))(面片)
稠密_图=时间分布(字母_分类器)(重塑_面片)
#重新塑造它
密集贴图=重塑(tf.形状(面片)[1:-1])(密集贴图)
#构建模型
图像\分类器=模型(整个\图像,密集\贴图)
#在真实图像上使用它
输出=图像\分类器(我的\图像)

跟进:您是否尝试了建议的解决方案?它对你有用吗,还是你遇到了一些问题?我们非常感谢您提供一些反馈,以便为未来的读者改进/纠正答案(当然,这样做没有压力!)。谢谢