나는 스도쿠 퍼즐에서 주어진 숫자를 인식하기 위해 CNN (Keras/Theano)을 사용한다. 솔루션을 "증강 현실"방식으로 표시하기 때문에 이미지 처리 작업 속도와 숫자 인식 작업 속도를 최소화하여 디스플레이가 부드럽게 유지되도록 노력하고 있습니다. 현재 초당 7 프레임의 속도를 얻었습니다 (여기에서 볼 수 있습니다 : Augmented Reality Sudoku solver : OpenCV, Keras)CNN : 예측 속도를 향상시키는 방법은 무엇입니까?
예측 작업에서 처리 시간의 대부분이 소비됩니다. 비어 있지 않은 모든 작은 정사각형에 대해 예측이 수행됩니다 그 안에 숫자가있는 사각형). 평균적으로 하나의 예측에는 3.6ms가 걸리며, 퍼즐에는 25 개가 아닌 비어있는 사각형이 있으므로 주어진 숫자를 인식하기 위해 이미지 당 약 90ms가 소요됩니다.
는내가 예측 작업에 사용하는 CNN 모델은 거의 정확하게 Keras MNIST example에 F.Chollet에 의해 제안 된 하나 :이 모델을 얻을 정확성은 궁금 너무 좋은, 아주 좋은
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'])
내가 "더 작은"모델로 동일한 정확도를 얻을 수 있다면. 나는 더 작은 모델이 또한 더 빠를 것을 상상한다 (나는 단지 예측 속도 향상에 집중한다, 훈련 속도는 중요하지 않다).
내 가정 ("더 작은 것은 더 빠름"을 의미)이 정확하고 더 작은 모델을 만드는 것이 가치 있다고 생각합니까? 회당 부분과 고밀도 부분 사이에서 어느 것이 더 작게 만들어야합니까?
예측 속도를 향상시키는 방법에 대한 다른 제안 사항이 있습니까?
감사합니다편집 :
내 CPU는 이전의 i5 4210U, 아니 엔비디아 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]
예측 작업 코드가 없습니다. 그리고 CPU/GPU (대기 시간!)를 사용한다면 우리에게 말하고 있습니까? 일반적으로 그렇습니다. 작을수록 빠르지 만 병렬 처리가 손상 될 수 있기 때문에 매우 넓고 소금으로 채취해야합니다. 한 번에 여러 예측을 호출 할 수 있다면 일괄 예측을 사용하고 있는지 확인하십시오! – sascha
sascha, 나는 내 질문을 편집하여 예측 코드를 추가했습니다. 예측 기능에서 batch_size의 중요성을 알지 못했습니다. 실제로 예측 과제에서 어떻게 사용하는지 명확하지 않습니다. 내가 지정하지 않았기 때문에 기본 batch_size는 32입니다. 지금까지는 이미지 당 이미지 (작은 사각형의 숫자가 있음)를 예상했습니다. 한 번에 여러 가지 예측을하고 알려주는 제안을 따를 것입니다. 감사합니다. – geaxgx
여러 예측을 사용하는 것이 좋습니다. 27 숫자 스도쿠의 경우 27 개의 단일 숫자 예측 대신 1 개의 다중 예측을 수행하려면 67 ms (97 ms 대신)가 필요하므로 30 ms의 이득을 얻습니다. 이제 초당 9 프레임의 세계 속도를 얻었습니다. 7 fps 대신 30 % 더 좋습니다! batch_size (32)의 기본값을 유지했습니다. – geaxgx