2017-09-07 3 views
0

나는 스도쿠 퍼즐에서 주어진 숫자를 인식하기 위해 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] 
+1

예측 작업 코드가 없습니다. 그리고 CPU/GPU (대기 시간!)를 사용한다면 우리에게 말하고 있습니까? 일반적으로 그렇습니다. 작을수록 빠르지 만 병렬 처리가 손상 될 수 있기 때문에 매우 넓고 소금으로 채취해야합니다. 한 번에 여러 예측을 호출 할 수 있다면 일괄 예측을 사용하고 있는지 확인하십시오! – sascha

+0

sascha, 나는 내 질문을 편집하여 예측 코드를 추가했습니다. 예측 기능에서 batch_size의 중요성을 알지 못했습니다. 실제로 예측 과제에서 어떻게 사용하는지 명확하지 않습니다. 내가 지정하지 않았기 때문에 기본 batch_size는 32입니다. 지금까지는 이미지 당 이미지 (작은 사각형의 숫자가 있음)를 예상했습니다. 한 번에 여러 가지 예측을하고 알려주는 제안을 따를 것입니다. 감사합니다. – geaxgx

+0

여러 예측을 사용하는 것이 좋습니다. 27 숫자 스도쿠의 경우 27 개의 단일 숫자 예측 대신 1 개의 다중 예측을 수행하려면 67 ms (97 ms 대신)가 필요하므로 30 ms의 이득을 얻습니다. 이제 초당 9 프레임의 세계 속도를 얻었습니다. 7 fps 대신 30 % 더 좋습니다! batch_size (32)의 기본값을 유지했습니다. – geaxgx

답변

0

은 어쩌면 당신은, 그리고 0과 1 사이에 데이터를 정상화하지 않고 네트워크를 훈련하고 'UINT8'유형을 예측하는 시도해야합니다. float32 이미지는 빠른 예측 성능을 위해 '크게'될 수 있습니다. 이것은 단지 가정이지만 시도해 볼 수 있습니다.

+0

CNN 파이프 라인에서는 입력 유형에 관계없이 데이터가 떠돌아 다 그렇지?이 경우 float 대신 int를 사용하면 속도가 향상된다면 그다지 작지는 않습니까? – geaxgx