我想创建一个AI来检测图像中的文本,该图像包含一个或多个字符的字符串,这些字符来自100个可能的字符列表。我希望AI输出一个字符串,其中包含它预测的文本,以及其中每个字符的置信度值。
我的问题是,我不知道如何有一个可变数量的输出。
我已经弄清楚了如何通过为每个可能的字符找到置信度值来检测单个字符,但我希望它能为包含多个图像的图像中的每个字符找到置信度值。
我能想到的唯一解决方案是让它为每个字母返回一个二进制数,长度与字符串相同。每个1
将表示该位置中存在的字符。但是,我不知道如何从中获得置信度值。
我拥有的:
这就是目前的AI。它获取包含单个字符的图像,并为每个可能的字符输出置信度值。
范例:
输入:
包含字母B
的图像
输出量:
| 信心| Confidence |
| --| ------------ |
| 0.05| 0.05 |
| 0.80| 0.80 |
| 0.05| 0.05 |
等等
我想要的:
我想它采取一个包含多个字符的图像,并为图像中的每个字符输出每个可能的字符的置信度值。
实施例1:(3字符串)
输入:
包含字符串ABC
的图像
输出量:
| 人物1|人物2|人物2| Character 2 |
| --|--|--| ------------ |
| 0.80| 0.05| 0.05| 0.05 |
| 0.05| 0.80| 0.05| 0.05 |
| 0.05| 0.05| 0.80| 0.80 |
等等
实施例2:(2个字符串)
输入:
包含字符串BA
的图像
输出量:
| 人物1|人物2| Character 2 |
| --|--| ------------ |
| 0.05|零点八五| 0.85 |
| 0.80| 0.05| 0.05 |
| 0.05| 0.05| 0.05 |
等等
注意输出数组的长度如何根据输入而变化。
这是我第一次用Python创建AI,所以我还没有真正使用sci-kit learn或Keras。我很好使用任何一个,但我目前的解决方案使用Keras。
1条答案
按热度按时间sgtfey8w1#
你需要把你的问题分成两个步骤:
**第一步:**查找所有字符。
**步骤2:**裁剪步骤1中的每个字符,并预测它是哪种字符。
注意:有一些方法可以将所有内容组合到一个步骤中(YOLO架构可能可以做到这一点,但是,由于第2步已经解决,并且您是初学者,如果您暂时将步骤分开,可能更容易理解和调试)。
你可以使用一个非常简单的U-net架构,来找到字符的位置。Here这是为keras解释的。结果将是热图,其中包含字符的区域具有高值。这些热图可以被视为图像,并且允许容易地解释。然后你可以找到波峰(=字符的中心),切割波峰周围的区域(例如,64 x64 px),并将每个峰输入到您的第2步网络中。峰可以很容易地用this procedure找到。
skimage
函数peak_local_max
允许定义阈值以及到边界和其他峰值的最小距离。请注意,您的第2步网络需要相同大小的图像(例如64 x64 px),所以当裁剪靠近边框的字符时,您将需要用零填充以给予所需的大小。editstep-1-network的训练数据是一个黑色图像,字符中心有白色圆圈。第二步网络的训练数据是一个居中的、固定大小的字符图像,它是一个独热编码的字符标签。在这里,为“不是字符”添加一个额外的类来纠正step-1-network所犯的错误可能是有用的。