회화 소프트웨어를 만드는 김에 손으로 쓴 숫자를 식별하다

Python으로 손으로 쓴 문자 식별을 하는 강좌는 종종 있지만, 기존의 데이터 그룹을 사용하는 것은 단지 "예측 정밀도 90%"이며, "내 숫자도 식별해 주세요!"이렇게 됐어.모처럼 스스로 숫자를 써서 AI가 인식할 수 있는 애플리케이션을 만든다.(창의 묘사에 사용되는 게임 엔진pyxel에 대해 문장 끝에 참고 링크를 정리한다.)

문자를 써서 s 누르면 그 숫자를 예측할 수 있다.전체 코드는 여기(pyxelDigitRecognition)
주의: 기계학습을 사용하지만 게임의 보도이기 때문에 조금도 엄밀하지 않습니다.

이 문장의 대상 독자

  • 회화 소프트웨어를 만들고 싶은 사람
  • 필기 문자 인식을 하고 싶은 사람
  • (적절한 설치가 가능한 사람)
  • 환경

  • scikit-learn 0.21.3
  • pyxel 1.2.4
  • Windows 10
  • 보도 절차

  • Pyxel로 회화 소프트웨어 제작
  • digit 데이터 집중 학습
  • 예측 시도
  • 1. Pyxel 제작 회화 소프트웨어


    우선 간단한 회화 소프트웨어를 만든다.
    제작 방법은 상당히 간단하다. 아래와 같다.
    画面の各ピクセルを表す二次元配列を作る(今回は64x64)
    
    WHILE True: # 各フレームで
        if マウスをドラッグ中:
            マウスの座標の色を変える
        二次元配列をもとに画面を描画
    
    설치 시 마우스 좌표 주위에서도 색상을 변경하여 굵은 선을 그립니다 (아래 그림).

    소프트웨어 그리기(확장 클릭)
    # constants
    WINDOW_SIZE = 64
    
    # 0 white, -1 black ウィンドウの色情報
    
    windowData = [[0]*WINDOW_SIZE for _ in range(WINDOW_SIZE)]
    
    pyxel.init(WINDOW_SIZE, WINDOW_SIZE) # window 初期化
    pyxel.mouse(visible=True)
    
    def update():
        if pyxel.btnp(pyxel.MOUSE_LEFT_BUTTON, hold=2, period=1):
            # マウスの座標の色を変える
            x, y = pyxel.mouse_x, pyxel.mouse_y
                if 0 <= x < pyxel.width and 0 <= y < pyxel.height:
                    windowData[y][x] = -1
    
    def draw():
        pyxel.cls(pyxel.COLOR_WHITE)
        for y in range(pyxel.height):
            for x in range(pyxel.width):
                if windowData[y][x]==-1:
                    pyxel.pix(x, y, pyxel.COLOR_BLACK)
    
    pyxel.run(update, draw)
    
    잘 된 건 이거야.

    2.digit 데이터 집합을 통해 학습


    데이터 수집이 번거롭기 때문에sklearn의디지털 데이터 세트를 사용합니다.
    이게 핸드폰 숫자 인식에 많이 쓰이는 MNIST를 줄인 거예요?감각적인 데이터 세트
  • 8 x 8 픽셀
  • 16레벨 그레이스케일
  • 10종류(0-9)
  • 데이터 수: 1797
  • 태그 요소의 표시 속성을 수정합니다.공식 문서에 이러한 이미지가 있습니다.

    분류는 k근린법을 사용했다.앞사람이 이미 k근린법을 설명했기 때문에 링크만 붙입니다.
    ● 알고리즘
    OpenCV documentation
    ● 아이리스 데이터에 대한 예시
    K근린법(다중 분류)
    학습할 코드 (확장 클릭)
    def train():
        digits = load_digits()
        X = digits.data
        y = digits.target
        X_train,X_test,y_train,y_test = train_test_split(X, y)
        knn = KNeighborsClassifier()
        knn.fit(X_train, y_train)
        print(knn.score(X_test, y_test)) # 0.98
    
        # save model
        with open('knn_digit.pkl', 'wb') as f:
            pickle.dump(knn, f)
    
    교차 검증은 안 했지만 노는 거니까 이렇게 했으면 좋겠어요.(정밀도 98%!)

    3. 예측해 보자


    () 을 배웠기 때문에 실제로 예측해 보세요.
    회화 화면은 64x64, RGB이기 때문에 예측하기 전에 8x8, 16단계의 그레이스케일로 전환하는 것을 주의해야 한다.이번에는 8x8의 이미지 저장 창으로 읽어서 디지털 식별을 합니다.
    예측할 코드 (확장 클릭)
    def predict() -> int:
    
        with open('knn_digit.pkl', 'rb') as f:
            loaded_model = pickle.load(f)
    
        img = Image.open("images/screen_shot.png") # ウィンドウの画像
        img = img.convert('L') # convet (r,g,b) to 0-255
        img = (255 - np.array(img))//16 + 1 # convert to 0-15
        img = img.reshape(1, 64)
    
        pred = loaded_model.predict(img)[0] # np.array to int
        return pred
    
    이렇게 하면 디지털 식별을 할 수 있다.크고 자세하게 쓰면 잘 알 수 있어요!
    다만 8x8로 압축되었기 때문에 작은 숫자와 가는 문자를 예측할 수 없습니다. 용서해 주십시오.

    위의gif의 "8"은 너무 작아서 8x8 픽셀이면 붕괴됩니다.

    마지막


    간단히 정리하지만 pickle에서 학습 모형을 읽으면 Pyxel 창이 떨어진다. 치유할 수 없어 괴롭다.(다른 python 파일에서 모델을 읽었을 때 왠지 순조롭게 진행되었다...)
    이번 알고리즘과 데이터 집합은 모두 실용성을 전혀 감당할 수 없지만 응용 프로그램으로서 매우 재미있다!
    주의할 점이 있으면 당신의 의견을 기다리세요.

    참조 링크


    kitao/pyxel (Github)
    복고 게임 엔진인 Pyxel로 프로그래밍을 시작합시다!
    PyxelDigitRecognition (Github)

    좋은 웹페이지 즐겨찾기