人工知能で「ぬ」と「ね」を区別するための手書き文字データセットを作った

経緯

元ネタ

dic.pixiv.net

dic.nicovideo.jp

配布物

↓ここからダウンロードできます。

https://1drv.ms/u/s!Aj7CASq25UmWhT6bwZR8KnyG9VRb

「ぬ」が47枚,「ね」が50枚しかありませんが,機械学習の勉強用などにご自由にどうぞ。

データセットを作るのに使ったソースコード

# coding: UTF-8

import cv2
import os

# 開くファイルを指定する
FILENAME='20160714210454-0001.tif'
# 出力先のディレクトリ名
OUTDIR='nu'
# 矩形の幅と高さ (rectangleよりもsquareのほうが適切な気がする)
RECT=80
# 選択中の矩形の左上の座標
rectX, rectY = 0, 0

def main():
    # 関数内関数のスコープの謎
    global rectX, rectY
    src = cv2.imread(FILENAME, flags=0)

    def mouseCallback(event, x, y, flags, param):
        # 関数内関数のスコープの謎
        global rectX, rectY
        if event == cv2.EVENT_LBUTTONDOWN:
            # cv2.resizeでfx=0.5, fy=0.5にした分を戻す
            rectX, rectY = 2 * x, 2 * y
            print(repr((rectX, rectY)))

    cv2.namedWindow('clipper')
    cv2.setMouseCallback('clipper', mouseCallback)

    while True:
        disp = src.copy()

        # 選択中の座標を画面に表示する
        cv2.rectangle(disp, (rectX - RECT // 2, rectY - RECT // 2), (rectX + RECT // 2, rectY + RECT // 2), color=0)

        disp = cv2.resize(disp, dsize=(0, 0), fx=0.5, fy=0.5)
        cv2.imshow('clipper', disp)

        # keycode
        # 13   : enter
        # 63232: up
        # 63233: down
        # 63234: left
        # 63235: right
        key = cv2.waitKey(1000 // 30)
        if key == ord('q'):
            break
        elif key == 13:
            # ファイル名を連番にする
            i = 0
            while True:
                fname = os.path.join('ne', '{:0>2}.png'.format(i))
                if not os.path.exists(fname):
                    break
                i += 1
            print('save', fname)
            cv2.imwrite(fname, src[rectY - RECT // 2:rectY + RECT // 2, rectX - RECT // 2:rectX + RECT // 2])
        elif key == 63232:
            rectY -= 1
        elif key == 63233:
            rectY += 1
        elif key == 63234:
            rectX -= 1
        elif key == 63235:
            rectX += 1

if __name__ == '__main__':
    main()