我使用CNN(Keras / Theano)识别数独谜题中的给定数字。因为我在"增强现实中显示解决方案"我正在寻找最小化图像处理任务和数字识别任务的速度,以便显示保持平滑。目前,我获得每秒7帧的速率(您可以在这里查看:Augmented Reality Sudoku solver : OpenCV, Keras)
处理时间的很大一部分花费在预测任务上:对每个小的非空方块(其中带有数字的正方形)进行预测。平均来说,一个预测需要3.6毫秒,一个拼图有大约25个非空方块,所以每个图像大约90毫秒只是为了识别给定的数字。
我用于预测任务的CNN模型几乎就是F.Chollet在Keras MNIST example中提出的模型:
img_rows, img_cols = 28, 28 # Image size of the small square
num_classes = 9 # We want to recognize the numbers from 1 to 9
input_shape = (1, img_rows, img_cols)
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])
我使用这个模型获得的准确度非常好,非常好,我想知道我是否可以使用"更小的"模型。我认为较小的模型也意味着更快(我只关注预测速度的提高,训练速度并不重要)。
你认为我的假设("较小意味着更快")是正确的,是否值得尝试制作更小的模型?在卷积部分和密集部分之间,哪个(s)我应该尝试缩小?
关于如何提高预测速度的其他建议?
谢谢
编辑:
我的CPU是旧的i5 4210U,没有nvidia GPU。
预测代码:
def predict(img): # img: 28x28 binary image
img = img.astype('float32')
img /= 255.
result=model.predict(np.array([[img]]))
result=result[0]
idx=np.argsort(result)
best=idx[-1]+1
return best,result[best-1]