経緯
パターン認識の講義で高次元データを用意して次元削減を適用する課題が出たので,FXで有り金全部溶かした人のためのデータセット作ってる pic.twitter.com/K6emS0YVXj
— しょラー (@shora_kujira16) 2016年7月14日
. @shora_kujira16 左:「ぬ」と「ね」の区別が付きそうなPCA
— しょラー (@shora_kujira16) 2016年7月15日
右:「ぬ」と「ね」の区別が付きそうなt-SNE pic.twitter.com/JHdNMFCI1c
元ネタ
配布物
↓ここからダウンロードできます。
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()