회화 소프트웨어를 만드는 김에 손으로 쓴 숫자를 식별하다
pyxel
에 대해 문장 끝에 참고 링크를 정리한다.)문자를 써서
s
누르면 그 숫자를 예측할 수 있다.전체 코드는 여기(pyxelDigitRecognition)주의: 기계학습을 사용하지만 게임의 보도이기 때문에 조금도 엄밀하지 않습니다.
이 문장의 대상 독자
환경
보도 절차
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를 줄인 거예요?감각적인 데이터 세트
분류는 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)
Reference
이 문제에 관하여(회화 소프트웨어를 만드는 김에 손으로 쓴 숫자를 식별하다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/odanny/items/eee3d99522bb01fdd111텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)