我有灰度图像上手写数字(0-9)的未知频率。
我正在尝试构建一个机器学习模型,该模型确定:
- 每个数字的x、y坐标。
- 数字标签(即0-9)。
(我无法上传灰度图像,所以假设.
表示"黑色背景",数字代表它们自己):
Image1: Image2: Image3:
7....... .2...... ........
........ .....3.. ........
....1... ........ ........
........ ....2... ........
因此,让f
表示我的机器学习模型/函数,我们应该有:
f(Image1) = [ label0:[], f(Image2) = [ label0:[], f(Image3) = [ label0:[],
label1:[(x=4,y=2)], label1:[], label1:[],
label2:[], label2:[(x=1,y=0), label2:[],
(x=1,y=3)],
label3:[], label3:[(x=5,y=1)], label3:[],
label4:[], label4:[], label4:[],
label5:[], label5:[], label5:[],
label6:[], label6:[], label6:[],
label7:[(x=0,y=0)], label7:[], label7:[],
label8:[], label8:[], label8:[],
label9:[], label9:[], label9:[],
]
我试图使用Keras应用深度学习方法同时解决这两个问题,但我正在努力设置我的标签,因为每个图像有未知数量的标签。
有谁知道我该如何为深度学习设置这样的问题吗?我是否应该将问题分成两个阶段(定位然后分类——但是定位问题仍然有未知数量的标签)?谢谢!
你可以把这个问题分成两部分。
在第一部分中,您应该创建一个方法来检测图像中是否为数字。为此,你可以使用一种叫做"滑动窗口"的方法(观看Andrew Ng解释这种方法的视频)。假设您有一个大小为200x200的图像,每个数字的大小约为20x20。您可以创建一个大小为20x20的窗口,并且在每次迭代中窗口向右移动20像素(或更少/更多),如果窗口到达图像的右侧,它将移回左侧,并向下移动20像素(或更少/更多)。每次移动窗口后,你都在裁剪图像,使用神经网络检查裁剪图像上是否有数字。如果有数字,你将保存窗口和裁剪图像的x, y坐标到图像数组。第二部分应该很简单,你把数字传递给神经网络,神经网络决定数字的标签。
所以,你应该训练两个神经网络——一个用于检测图像上是否有数字,另一个用于确定数字的标签。
还有第二种方法来找到图像上的数字,你可以训练神经网络来确定图像上的数字数量(这可能很难),然后,通过使用k-means(你应该设置簇的数量到你从神经网络得到的数字的数量),你可以找到数字的位置,如果它们彼此不太接近。我在一个项目中这样做了,它工作了,但你应该有纯背景的图像,你必须创建一个像素位置的数组,亮度超过一些阈值。