물리적 필기 문자 인식

소개



처음 뵙겠습니다.
평상시는 음성 처리와 키 배열과 Vim을 만지르고 있는 대학이 1회생입니다.
최초의 Qiita에의 투고라고 하는 것으로, 이번은 제가 좋아하는 키보드와 기계 학습에 관한 기사입니다.

2018/04/01, 만우절에 Google이 다음 동영상을 공개했습니다.


당시 고등학교 3학년이었던 저는 이것에 충격을 받았는데, 지식과 경험이 얕았기 때문에 구현을 포기했습니다.
대학생이 된 지금이라면 할 수 있다고 실장을 시도했으므로, 그것에 대해 정리합니다.

실행 환경


  • MacOS 10.15 (아마도 리눅스 시스템에서도 움직입니다)
  • Python 3.7.5
  • TensorFlow 2.1.0

  • 메커니즘



    소스 코드는 모두 GitHub에서 공개하고 있습니다.
    htps : // 기주 b. 코 m / 아 jx ぁ b / 엽서
    # clone repo
    $ git clone https://github.com/AjxLab/Tegaki
    $ cd Tegaki/
    # install python libs
    $ pip install -r lib/requirements.txt
    

    순서도



    전체적인 대략적인 흐름은 다음과 같습니다.


    키 입력



    입력 된 키는 키 코드 (숫자)로 입력 할 수 있습니다.
    이것을 입력 순서로 배열에 저장함으로써 이것을 벡터로 간주하여 DNN의 입력으로합니다.
    from getch import getch
    
    keys = [] # キーコードを格納する配列
    key = getch()
    keys.append(int(key.encode('utf-8', 'replace').hex(), 16))
    

    이것을 그대로 실행한 것만으로는 당연히 작동하지 않습니다.
    루프 처리를 더해 연속적으로 입력해 주기 위해서는 키 입력의 종료 조건이 필요합니다.

    이번에는 다음 중 하나를 만족하면 입력이 끝납니다.
  • 입력 문자가 30자를 초과했습니다
  • 마지막으로 입력한 지 1초 이상 경과했다

  • 교사 데이터 작성



    부위 LD. py을 실행하여 교사 데이터를 만들 수 있습니다. 명령행 인수는 등록할 문자를 지정합니다.
    # 「あ」を記録する場合
    $ python build.py あ
    「あ」を記録(Ctrl-Cで終了)
    Now:0 step
    # キーボードに「あ」となぞるように入力してください
    # data/${登録する文字}/${%Y-%m-%d--%H:%M:%S:%f}.csv というファイルが生成される
    

    기계 학습



    이번에는 물리 필기 인식을 사전에 등록한 문자의 클러스터링 문제로 공식화하고 있습니다.
    클러스터링에는 신경망을 사용합니다만, 여기서는 안직하게 DDN을 이용하는 것으로 합니다.
    from tensorflow.keras import Sequential
    from tensorflow.keras.layers import Dense, Dropout
    
    # 文字のクラス数
    # 例 : 「あ, い, う, え, お」 の5文字 => 5
    n_classes = 5
    
    # モデルを定義
    model = Sequential([
        Dense(128, input_shape=(30,), activation='relu'),
        Dropout(0.5),
        Dense(256, activation='relu'),
        Dropout(0.5),
        Dense(256, activation='relu'),
        Dropout(0.5),
        Dense(n_classes, activation='softmax')
    ])
    
    # モデルをコンパイル
    model.compile(
        optimizer='adam',
        loss='sparse_categorical_crossentropy',
        metrics=['accuracy']
    )
    
    # 学習
    # x : 30次元ベクトル(キーコード)
    # y : 正解ラベル
    self.__model.fit(x, y, epochs=200, batch_size=64)
    

    앞에서 얻은 30 차원 벡터 (30 키 분의 키 코드)를 DNN 입력으로 사용하여 문자를 클러스터링합니다.
    변수 x, y에는 각각 입력 벡터와 정답 라벨을 대입합니다만, 이번에 한정해서 정규화 등은 특별히 실시하고 있지 않습니다.

    시도해 보자.



    인퍼 r. py을 실행하여 물리적 필기 문자 인식을 시도 할 수 있습니다.
    정확도가 낮다면 모델을 변경하거나 교사 데이터를 늘려 보는 것은 어떻습니까?

    사이고에게



    주위의 친구가 Qiita 기사를 투고하고 있는 것을 손가락을 감싸면서 바라보고 있었습니다만, 슬슬 자신도...라고 생각했기 때문에 붓을 썼습니다.
    앞으로도 신경이 쓰이면 투고하겠습니다.

    참고


  • 소스 코드
  • Gboard 물리적 필기 버전
  • 좋은 웹페이지 즐겨찾기