何もわからない

よくわからん

論文読み[AnoGAN]

はじめに

AnoGANの論文を読んだのでそれについて書いていきます.
間違いや勘違いがありましたらコメントかTwitterで知らせてください.
論文:Unsupervised Anomaly Detection with Generative Adversarial Networks to Guide Marker Discovery (https://arxiv.org/abs/1703.05921)
Chainerで書いたコード:(https://github.com/ihatasi/Learning/tree/master/Generation/GAN/AnoGAN)

概要

教師なしで正常データを学習し,正常データのみ生成できるDCGANを手に入れます(学習時に使った分布内ならどんなzの値を入れても正常データのような画像しか出力できない). 次にDCGANのDiscriminatorとGeneratorを用いて新しい入力xに対して最も近いx'を生成できるzの値を探索します.このとき,最適なzがうまく見つかれば正常データとでき,見つからなければ入力データxは学習していない(異常)データであるとできます. 入力xにできるだけ近づけようとしますが,正常データしか生成できないので結果的に入力(異常)データに最も近い正常データが出力され,差分を取ることによって正常データと比べてどこが異常であるかがわかります.

背景・提案

今までの医療データに対するAnomaly detectionのモデルは,annotateされた教師データの数に依存していました.そこで今回は以下の2点が提案されています.

  1. 大量の教師なしデータを使った異常の識別手法(AnoGAN)の提案.
  2. 異常のスコア付け枠組み(Anomaly scoring scheme)の提案.

学習

f:id:ihatasi:20190420005824p:plain
Fig.1. 引用(https://arxiv.org/pdf/1703.05921.pdf p.2)
今回は,Fig.1のような実際の医療データ(網膜)で実験しています.論文では以下のように,DCGANによる正常データの多様体の学習とAnoGANによるz値の探索のための学習の2段階の学習が行われています.

  1. パッチ処理した正常データの画像をDCGANに入力して学習させます(Fig.1.左側, Fig.2).
    f:id:ihatasi:20190420015755p:plain
    Fig.2.DCGANの学習モデル
  2. 1で得たDiscriminatorとGeneratorを更新なしで用いて入力データxに対して勾配降下法で最適なz値の探索をします.このとき,Generatorは正常個体しか生成できないため,入力画像xと生成画像G(z)の差分を取ることにより異常箇所を見つけることができます(Fig.1.右側, Fig.3).
    損失関数は以下のようになっています.

L_R({\bf z\_\gamma})=\sum{|{\bf x}-G({\bf z\_\gamma})|}...(1)
L\_R :Residual Loss, {\bf z\_γ} :γ回更新した{\bf z}の位置,γ=1,2,...,Γ(Γは最も{\bf x}らしいG({\bf z\_Γ}))
式(1)は元画像と生成画像の差をLossとし,入力画像xに最も似た画像を生成できるzのとき最小になります.

L_D({\bf z\_\gamma})=\sum{|{\bf f(x)}-{\bf f}(G({\bf z\_\gamma})|}...(2)
L\_D :Discrimination Loss, {\bf f()} :Discriminatorの中間層の出力
式(2)は入力画像xと生成画像G({\bf z\_\gamma})のDiscriminatorのfeature matchingです(feature matchingはGANの改善手法の1つ).
次の式(1)と式(2)を合わせたものを今回の損失関数とする. 
L({\bf z\_γ})=(1-λ)L\_R({\bf z\_γ})+λL\_D({\bf z\_γ})...(3)
λ :ハイパーパラメータ(今回は0.1)

f:id:ihatasi:20190420015631p:plain
Fig.3.AnoGANの学習モデル

z値を勾配降下法で求める際,ChainerではValiableに対してOptimizerを使えないため(TensorflowだとValiableに対してもOptimizerを使えるらしい?未確認),代わりにOptimizerで更新できるz'と同じサイズのFCを用意して2つ合わせたものを1つのzとして見ます(FCの重み初期値は1,バイアスはなし).

評価

Anomaly score:入力xがどれだけ正常かを示すスコア,低いほど正常であると言えます.


A({\bf x})=(1-λ)R({\bf x})+λD({\bf x})...(4)

このときのR({\bf x})は式(1)のResidual Loss,D({\bf x})は式(2)のDiscrimination Lossです.

結果

f:id:ihatasi:20190420022117p:plain
Fig.4.(https://arxiv.org/pdf/1703.05921.pdf, p9)
Fig.4のようにTrainデータやTestデータでも正常であるならばそれほど画像に差は見られませんが,異常データの場合は異常箇所が差として見られ,annotation画像とほとんど同じ箇所が色付けられることがわかります.

追試

今回はMnistの1を正常データとして学習し,出力画像とAnomaly scoreを求めました.

f:id:ihatasi:20190420022800p:plain
Fig.5.MnistでAnoGANの追試
Fig.5は,左側は同じ画像を入力しスコアが高かったものと低かったものをあげ,右側は7と9の画像を何回か入力しスコア最も低かったものあげています. 正常データで最もスコアが高かったものでも異常データよりはスコアが低く出ていることがわかります.

感想

AnoGANの難点として,AnoGAN自体の学習で1つのデータに対して最適なzを求める学習をするため効率が悪い(めんどくさい)と感じられました.また,数回試行してAnoGANはzの初期値に性能が依存し,局所解にもハマりやすいのではないかと思いました.次回も異常検知関係の論文を読みたいと思います.

Discord Botのプログラムを公開しました.

はじめに

私が身内で使っているPythonで書いたDisocrd Botのプログラムを https://github.com/ihatasi/Discord_bot に公開しました.自由にお使いください.
このプログラムを使用したことによって発生した問題は自己責任でお願いします. また,基本的にプログラムを直す予定もないので,間違いを発見したら自分で直してください.

機能

-hとdiscordにチャットを送ると以下のようなリストが返ってきて,機能の確認ができます. 8と9は友人作の部分です.

  1. DiscordにBotがログインする(最低限の機能).
  2. ボイスチャネルの人数が0から1になったとき,「〇〇(初めに入室した人)が通話を開始しました」と指定のテキストチャネルに送る.また,最後の一人が抜けたとき,「〇〇(最後に出た人)が通話を終了しました」と指定のテキストチャネルに送る. f:id:ihatasi:20190307162531p:plain
  3. 「こんにちは」と送ると「こんにち殺法!」とその画像を返してくる. f:id:ihatasi:20190307162628p:plain
  4. 「こんにち殺法」から始まる文を送ると「†こんにち殺法返し†」とその画像返す. f:id:ihatasi:20190307162644p:plain
  5. 10%の確率で自分のこんにち殺法にこんにち殺法返しをしてコンボが決まった画像を送る. f:id:ihatasi:20190307162734p:plain
  6. 「プニキ」と送るとプーさんのホームランダービーのURLを返す. f:id:ihatasi:20190307162956p:plain
  7. 「tenhou」と送ると自分たちがいつも使うテンホウの部屋URLを返す.
  8. 「アレが読みたい」と送るとなろうのURLを返す.
  9. 「今日のゲーム」と送るとすでに登録されているリストからゲームを一つ選ぶ.
  10. 「ynews」と送るとYahoo!ニュースのトップ記事を5つのタイトルと短縮URLを返す. f:id:ihatasi:20190307163125p:plain
  11. 「nnews」と送るとNHKニュースのトップ記事を5つのタイトルと短縮URLを返す. f:id:ihatasi:20190307163138p:plain
  12. Twitterの@UN_NERV(https://twitter.com/UN_NERV)のツイートを取得
    12-1. 「NHK」が入ったツイートを自動取得,指定チャネルに送信
    12-2. 「緊急地震速報 最終報」または「地震情報」を自動取得,指定チャネルに送信
    12-3. 「全国の天気」を自動取得,指定チャネルに送信

    終わりに

    良いDiscordライフを

Discord BotにNHKトップニュースをとってきてもらえるようにした話

はじめに

身内で使ってるDiscordサーバに最近(1週間ほど前)Botを追加しました.
以下は現在Pythonで実装されているBotの機能です.
1. DiscordにBotがログインする(最低限の機能).
2. ボイスチャネルの人数が0から1になったとき,「〇〇(初めに入室した人)が通話を開始しました」と指定のテキストチャネルに送る.また,最後の一人が抜けたとき,「〇〇(最後に出た人)が通話を終了しました」と指定のテキストチャネルに送る.
3. 「こんにちは」と送ると「こんにち殺法!」とその画像を返してくる.
4. 「こんにち殺法」から始まる文を送ると「†こんにち殺法返し†」とその画像返す.
5. 10%の確率で自分のこんにち殺法にこんにち殺法返しをしてコンボが決まった画像を送る.
6. 「プニキ」と送るとプーさんのホームランダービーのURLを返す.
7. 「tenhou」と送ると自分たちがいつも使うテンホウの部屋URLを返す.
8. 「自主規制が読みたい」と送るとなろうのURLを返す.
9. 「今日のゲーム」と送るとすでに登録されているリストからゲームを一つ選ぶ.
10. 「ynews」と送るとYahoo!ニュースのトップ記事を5つのタイトルと短縮URLを返す.
Botの機能は,身内の要望(自分たちで書いてほしい)や私の気分で増えています.
今回は,Yahoo!ニュースだけじゃなくてNHKニュースも見たいと思ったため,そのプログラムを書くことになりました.
今回の目的は,NHKトップニュースのタイトルとURLを取ってくることです.

NHKニュース取ってくる

スクレイピング初心者なので,スクレイピングの練習場Yahoo!ニュースで使ったプログラムを参考に作っていくことになります.
まず,NHKニュースのソースを見ましたが
何もわからない...
Yahoo!ニュースさんは,正面のhtmlにURL書いててそこから取ってくるだけだったのに,NHKニュースさんはどこに置いてるんでしょうね.わかんないですね.
困った顔をしながらソースを見ていると39行目のlinkにrel=alternateと書かれたURL(http://k.nhk.jp/knews/)が見つかったのでそちらを見にいくことにしました.こちらのサイトのソースはかなり簡単なもので記事への参照もそのまま貼ってあり,(https://www3.nhk.or.jp/news/html/)にくっつけたら記事へ飛べたのでここからURLをもらうことにしました.以下は使用したソースコードです.

import requests
import time
import urllib.request
from bs4 import BeautifulSoup

def get_nhk_news():
    # ニュース格納用リスト
    news_data = []
    # urlの指定
    url = 'http://k.nhk.jp/knews/index.html'

    # ユーザーエージェントを指定
    ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) '\
     'AppleWebKit/537.36 (KHTML, like Gecko) '\
     'Gecko/20100101 Firefox/60.0 '

    req = urllib.request.Request(url, headers={'User-Agent': ua})

    #htmlの取得
    html = urllib.request.urlopen(req)
    # htmlパース
    soup = BeautifulSoup(html, "html.parser")
    #標準形式のNHKnewsへの変換
    news_path = 'https://www3.nhk.or.jp/news/html/'
    all_a = soup.find_all('a')
    #トップ記事は7個ある
    all_a = all_a[:7]
    for index in (all_a):
        n_url = news_path+index.get('href')
        news_data.append([index.contents[0], n_url])
    return news_data

if __name__ == '__main__':
    get_nhk_news()

urlからhtmlを取得し,パースしてから普通の方のNHKnewsのURLにくっつけて返してもらえるようにしています. 今度は,Bot側に移ります. 以下はBotのプログラムです.

    if message.content.startswith('nnews'):
        news_id = '0000000000000000000'
        news_ch = client.get_channel(news_id)
        await client.send_message(news_ch, "今日のNHKニュースです.")
        # NHKトップのトピック記事を取得
        news_data = nhknews.get_nhk_news()
        top_news = ""
        # URL込みの時
        for news in news_data:
            news[1] = shortenURL.get_shortenURL(news[1])
            top_news += news[0]+'--<'+news[1]+'>--'+'\n'
        await client.send_message(news_ch, top_news)
        

これで,Bot君は記事のタイトルとURLをDiscordに送ってくれるようになりました.やったね. (get_shortenURLはshortenURL.pyにあるbitlyを使った短縮URL生成関数です.)
ここで私は(http://k.nhk.jp/knews/)の記事はほとんど140字以内に収まっていることから,ニュースのURLを貼るよりも簡易版の記事を貼り,urlを後ろにつける方が良いと考えました.以下は簡易版の記事を取ってくるコードです.

import requests
import time
import urllib.request
from bs4 import BeautifulSoup


def get_nhk_news():
    # ニュース格納用リスト
    news_data = []
    # urlの指定
    url = 'http://k.nhk.jp/knews/index.html'

    # ユーザーエージェントを指定
    ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) '\
     'AppleWebKit/537.36 (KHTML, like Gecko) '\
     'Gecko/20100101 Firefox/60.0 '

    req = urllib.request.Request(url, headers={'User-Agent': ua})

    #htmlの取得
    html = urllib.request.urlopen(req)
    # htmlパース
    soup = BeautifulSoup(html, "html.parser")
    #軽く中身だけを表示したいときはこっち
    #簡易型NHKnewsへの変換
    text_data = []
    news_path = 'http://k.nhk.jp/knews/'
    all_a = soup.find_all('a')
    all_a = all_a[:7]
    #対象のURLを獲得
    for index in (all_a):
        n_url = news_path+index.get('href')
        news_data.append([index.contents[0], n_url])
    for data in news_data:
        url = data[1]
        req = urllib.request.Request(url, headers={'User-Agent': ua})
        #htmlの取得
        html = urllib.request.urlopen(req)
        # htmlパース
        soup = BeautifulSoup(html, "html.parser")
        #title取得
        title_text = data[0]
        split_text = soup.text.split("\n")
        for target in range(len(split_text)):
            if(split_text[target].find("。")!=-1):
                main_text = split_text[target]
                date_text = split_text[target+2]+\
                    '--<'+shortenURL.get_shortenURL(data[2])+'>--'
        text_data.append([title_text, main_text, date_text, "-----"])
        time.sleep(1)
        print("*")
    print("-----")
    return text_data, news_data

if __name__ == '__main__':
    get_nhk_news()

先ほどのコードのURLをくっつける先を簡易版に変えて,そこからもう一度スクレイピングするようにしました.私は,対象コードから本文のみを持ってくる手法を知らなかったので,htmlを行ごとにsplitして「。」が含まれる文の行数を検索することにしました(何かいい方法があれば教えてほしい).さらに,本文の2行後に日付情報があったのでついでにとって,text_dataにタイトル・本文・日付(+標準版のURL)・境界線を入れて返すプログラムにしました. time.sleep(1)で1秒に1回アクセスするようにしています.それにより待ち時間が長くなってしまい,プログラムが正常に動いているか気になったのでアスタリスク(*)を表示しています.
これをBot側で受け取り,2重for文でリストを分解してメッセージとして送るように書き換えました.

    if message.content.startswith('nnews'):
        news_id = '000000000000000000'
        news_ch = client.get_channel(news_id)
        await client.send_message(news_ch, "今日のNHKニュースです.")
        # NHKトップのトピック記事を取得
        text_data, news_data = nhknews.get_nhk_news()
        # テキストデータのみの時
        text_ = ""
        for news in text_data:
            for target in news:
                text_ += target+'\n'
        await client.send_message(news_ch, text_)

以下に動作画像を貼ります.

f:id:ihatasi:20190306022755p:plain
Yahoo!ニュースとNHKニュースを流すBot
以上で,今回のDiscord BotNHKトップニュースをとってきてもらった話を終わります.
ありがとうございました.

ChainerCVでうまるちゃんを検出

はじめに


 この記事は「みゅーもり Advent Calendar 2018」19日目の記事です. 今回は,TL上でよく見る「干物妹!うまるちゃん」のキャラクタたちを画像内から検出します.私自身,物体検出は初めてで何もわからないのでChainerCVのexamples内のFaster R-CNNを借りてやっていきたいと思います.ChainerCVを使った理由は,たまたまChainerCVを見つけて私が普段からChainerを使っていたため.
今回はツールを使って検出しただけで,その検出アルゴリズムなどは理解していません(卒論が終わったら読みたい). 今回使用したプログラムはhttps://gitlab.com/ihatasi/umr_detectionに置いておきます.学習済みモデルは1つ500MBくらいあるので忘れていなければここに置いておきます.

データセット


元画像

 今回,ミニうまるちゃんFig1の検出器とうまるちゃんず(うまる・海老名・切絵・シルフィン)Fig2の検出器の2つを作りました.データは,アニメ「干物妹!うまるちゃん」のキャプチャ画像(600x388)をミニうまるちゃんは181枚,うまるちゃんずは398枚用意しました.どちらとも1期1話~2期6話までのものです.

f:id:ihatasi:20181212011847j:plain
Fig1. ミニうまるちゃん
f:id:ihatasi:20181212012108j:plain
Fig2. うまるちゃん

アノテーション

 学習させるために教師データ(画像・矩形・ラベル)を作る必要があります.この作業をアノテーションというらしい(?).私はlabelImgというツールを使ってアノテーションをしていきました.これはキャラクタの顔を囲ってラベルをつけていく無の作業です.今回はそんなにデータが多くないので数時間で終わりました.Fig3はツールを使っている様子です.

f:id:ihatasi:20181212013511p:plain
Fig3. アノテーション作業風景
labelImgはxmlファイル(初めて見た)を出力してくれる(設定による)ので,それを読み込んで画像とくっつけて学習に入れられる形にしていきます.

データセット作成

 xmlファイルを読み込むのに"xml.etree.ElementTree"を使います.初めて見たものなのでここを参考にしました.データセットの作り方はここを参考にしました.

学習


 データセットが作れたので学習させていきます.前述した通り,ChainerCV/examples/faster_rcnnを借りていきます. ただし,データセットはこちらで作ったものなのでいくらか書き換えます.GPUに投げて数時間待つとプログラムが終了します.

結果


 demo.pyを書き換えたpred.pyをpython pred.py hoge.jpg -m 1 -e 100のように実行します.

ミニうまるちゃん学習器

 ミニうまるちゃんのみを学習させたものです.Fig4は学習データで,Fig5はそこらへんから取ってきた未知のデータに対する検出です.

f:id:ihatasi:20181213225019p:plain
Fig4. 学習済みのうまるちゃん
f:id:ihatasi:20181213224846p:plain
Fig5. 未知のうまるちゃん
Fig4のように,学習器がミニうまるちゃんだと判別したところを矩形で囲み"ラベル"と"ミニうまるちゃん度合い(小数点第3位以下は四捨五入)"を表示してくれます.
Fig5ではうまるちゃんでないところが検出されています(コーラが90%でうまるちゃんと検出).

うまるちゃんず学習器

 うまるちゃんずの4人を学習させたものです.Fig6, 8は学習データで,Fig7はそこらへんから取ってきた未知のデータに対する検出です.

f:id:ihatasi:20181212024908p:plain
Fig6. 学習済みうまるちゃん
f:id:ihatasi:20181212025122p:plain
Fig7. 未知のうまるちゃん
f:id:ihatasi:20181212025648p:plain
Fig8. 学習済みデータでの誤検出
Fig8のように学習データでも誤検出をしてしまうこともあります.もちろんテストデータでも結構誤検出します.(追記12/19:Fig8の誤検出はsilfinの母親をkirieとして検出している.)

感想


 今回は初めて物体検出をやってみましたが,思っていたよりもうまく検出できてて驚きました.プログラムと学習モデルはアップする予定なのでみなさんも手元のうまる画像を入れてみてください(CPU環境でも実行可能だが,pipでChainer, ChainerCVのinstallが必要).この学習器を使ってうまるちゃんの顔を大量に集めて生成モデルでなにかするのもありかもしれない.
やがて君になる」観てください.アマゾンプライムビデオで観られるので.

自作キーボードを作ろう(GH60) ファームウェア編

はじめに


今回は,自作キーボードを製作したので過程と感想を書いていきます.自作キーボードは,店でゲーミングキーボードを買うより安く作れ(?),自分の思うようにキーマップを書き換えられるので大変オススメです.
組み立てたキーボードはSatan GH60 PCBです.予算は15,000円で考えましたが,ケース・はんだごて・テスターのせいで大きく超えてしまいました.次作るときは10,000円前後にしたいと思っています.
(追記2019/01/14:遊舎工房さんが実店舗をオープンしたそうです.おめでとうございます.)
本記事は以下の1~3の流れに沿って分割して書いていきます.今回の記事は3にあたります.
1. Aliexpressでキーボードを購入する.
2. キーボードを組み立てる.
3. ファームウェアを書き込む.←今回
Twitterのモーメントにも簡単にまとめてあるので,軽く流れを見たい方はこちらをご覧ください.

今回使用するサイト

キーマップを作成する. http://www.keyboard-layout-editor.com
作成したキーマップを.eepファイルに変換する. https://tkg.io
.eepファイルをキーボードに書き込む https://github.com/kairyu/tkg-toolkit
私が参考にしたサイト https://dionmunk.com/posts/2017/05/10/gh60-satan.html

3-1. キーマップを作成

http://www.keyboard-layout-editor.comを使い,キーマップの作成をします. 初めは下図のようなページになっていると思います. f:id:ihatasi:20181029010418p:plain GitHubのアカウントを持っている場合はページ右上のSign in with GitHubでログインしましょう.キーマップをGitHubアカウントで保存できるので便利です.(GitHubアカウントがない場合は作った方が良いと思うくらい便利)
では,キーマップを作成していきます.下図のようにPresetを開き,Default 60%を選択します. f:id:ihatasi:20181029011245p:plain これが基本的な60%キーボードの配置になります.
簡単な使い方をSPACEキーの追加を例に説明していきます.表示されているキーボードの編集したいキーをクリックするとキーが赤枠で囲まれます.そして,下のPropertiesが編集可能になるので,そこに割り当てたい名前のキーを書き込みます.Top, Center, Bottom, Front Legendは表示場所で,今回はCenterの真ん中にSPACEと書き込んでいます.下図のようになっています. f:id:ihatasi:20181029012345p:plain さらに色分けをしたいときは,先ほど書き込んだところの下にあるKey Colorをクリックして色を選択します.これはレイヤー分けをするときに,どのレイヤーかを識別する用に私は使っています.下図が色選択とその実行例になっています. f:id:ihatasi:20181029012721p:plain 基本的な使い方は以上です.右上のSaveを押して保存しましょう.新しいレイヤーを作るには左上のkeyboard-layout-editor.comをクリックして新しいページを開きます.下に私のキーマップを置いておきます.
http://www.keyboard-layout-editor.com/#/gists/9248296f484b1c6504ee76fb8373a93b f:id:ihatasi:20181029022635p:plain レイヤー1です.基本的なアルファベットの入力ができます.
http://www.keyboard-layout-editor.com/#/gists/bed4292589dd0b214ea1cd154617b795 f:id:ihatasi:20181029015116p:plain レイヤー2です.ページスクロールやescなどがあります.
http://www.keyboard-layout-editor.com/#/gists/2b40ee576eca5ad54e9c13c6a93eeabd f:id:ihatasi:20181029015154p:plain レイヤー3です.何か使うと思って作りましたが何にも使っていません.

3-2.eepファイルの作成

キーマップをファームウェアに書き込むためにhttps://tkg.ioを使います. 下図のようにレイヤー数を指定して,箱内に自分のkeyboard-layout-editor.comのリンクを貼り付けます. f:id:ihatasi:20181029023006p:plain 問題がなければ枠が緑色になり,あれば赤色でどのキーが使えないか表示されます.赤色になった場合はそのキーを直しましょう. 次に,FnキーとLEDの設定をします.下図のように設定しました. f:id:ihatasi:20181029032345p:plain Fn6とFn7のAlt+~の設定はWindowsでの日本語入力切替のために入れました. ここまでできたら.eepファイルを作成のボタンを押して.eepファイルをダウンロードします.

3-3.ファームウェアの書き込み

まずhttps://github.com/kairyu/tkg-toolkitをダウンロードします.
ここではMac版の解説をします.(Windowsでやろうとしたらなんかうまくいかなかった.おそらく実行権限の問題?Windowsの方はBash on Ubuntuなどを使えばLinux版を動かせるかもしれない.)
先にsetup.shを実行する場合は最初が2で後は全部1を選択します.
Mac版のREADMEに書いてある通りに,reflash.shにsudoをつけてsudo ./reflash.sh ./keymap.eepで実行します.すると下図のようになります. f:id:ihatasi:20181029023824p:plain
実行するためにYを入力します.resetボタンが押されてないと表示された場合はキーボードを裏返して,ケースにある穴からresetボタンを押しましょう. 下図のように進み,書き込みは数秒で終わります. f:id:ihatasi:20181029024552p:plain
これでファームウェアの書き込みまで終了しました.

自作キーボードを作ろう(GH60) 組み立て編

はじめに


今回は,自作キーボードを製作したので過程と感想を書いていきます.自作キーボードは,店でゲーミングキーボードを買うより安く作れ(?),自分の思うようにキーマップを書き換えられるので大変オススメです.
組み立てたキーボードはSatan GH60 PCBです.予算は15,000円で考えましたが,ケース・はんだごて・テスターのせいで大きく超えてしまいました.次作るときは10,000円前後にしたいと思っています.
(追記2019/01/14:遊舎工房さんが実店舗をオープンしたそうです.おめでとうございます.)
本記事は以下の1~3の流れに沿って分割して書いていきます.今回の記事は2にあたります.
1. Aliexpressでキーボードを購入する.
2. キーボードを組み立てる.←今回
3. ファームウェアを書き込む.
Twitterのモーメントにも簡単にまとめてあるので,軽く流れを見たい方はこちらをご覧ください.

2-1.開封

下図は全てのパーツが入っている写真です. f:id:ihatasi:20181028004911j:plain 1.キーキャップです.今回はUS配列にしました. f:id:ihatasi:20181028005145j:plain 2.キースイッチはGateronの茶軸を選びました. f:id:ihatasi:20181028005001j:plain 3.左上がスタビライザ,後は上からプレート・PCB・ケースになっています. f:id:ihatasi:20181028005200j:plain

2-2.通電確認

まず,キースイッチに不良品が入っていないかを確認します.不良品が入ってても交換するのが面倒なのでどうしようもない不良品があった場合はここで買えるかもしれません(買ったことがないのでわからない).
テスタを使って通電&個数確認をします.私はデジタルテスタを使いました.スイッチは全部で62個ありました. f:id:ihatasi:20181028010758j:plain 次にPCBの入力に問題がないかを確認します.Keyboard Testerというサイトでキースイッチ用の穴にはんだを触れさせて入力を確認します.キーボードをPCに繋ぐにはmini USBが必要になるので用意しておきましょう. http://www.keyboardtester.comwww.keyboardtester.com f:id:ihatasi:20181028011725j:plain

2-3.キースイッチはめ込み

PCBにスタビライザを装着してキースイッチをPCBに置く作業をします.
スタビライザは小さい穴と大きい穴がありますが,大きい穴にスタビライザの角爪をひっかけて小さい穴に丸爪を刺します.このときスタビライザがPCBに密着していることをしっかり確認しましょう
次にキースイッチをプレートにはめ込みPCB上に置き,はんだ付けの準備をします.私はこのとき3ピンで購入したのに,5ピンのスイッチが届いたことに気がつきました.今回は3ピンでないといけないのでいらない2ピン(プラスチック部分)は切り落とします.私はニッパーを持っていなかったので爪切りを使って切りましたが,飛び散るのでニッパーで切りましょう. 下図がプレートにはめてPCB上に置いた写真です. f:id:ihatasi:20181028012520j:plain 下図は裏面からキースイッチの金属爪が出ていることを確認した写真です.金属爪が出てない場合は,スイッチが5ピンである可能性があります. f:id:ihatasi:20181028012646j:plain ここでスタビライザが多少曲がっていたり,キースイッチの位置がずれていたりすることがあるので,キースイッチを装着してスイッチの位置と打ち心地を確かめましょう.(私は,はんだ付けしてから気がつき苦労した.)なんかシャカシャカするなと思ったらスタビライザが曲がっている可能性があります.

2-4.はんだ付け

次に,PCBにスイッチの金属爪をはんだ付けしていきます.下図ははんだ付け後の写真です. f:id:ihatasi:20181028014952j:plain はんだ付けは特に問題なく終わると思います.はんだ付け機を素手で触り火傷をしないようにしましょう.(私は火傷したが...)

2-5.LEDをつける

LEDは,キースイッチ上部の穴から刺していきます.刺した後,裏返して作業をするのでテープで止めたり,脚を曲げたりしましょう.プラスとマイナスは,長い方がプラスで短い方がマイナスです.ここで浅くはんだ付けをしてしまうとキーキャップがハマる原因になります. 下図はLEDを刺した写真です. f:id:ihatasi:20181028015520j:plain LEDは,一度はんだ付けをしたら取るのが大変です.ちゃんと全部点灯するか確認してからはんだ付けをしていきましょう.また,LEDの穴は小さく,はんだ付けするのは大変です.(このとき既にLEDをつけたことを後悔し始める.) 下図は全てはんだ付けが終わった写真です. f:id:ihatasi:20181028015704j:plain

2-6.キーキャップの装着

キーキャップをスイッチにつけていくだけですが,ここで問題が発覚しました.下図をご覧ください. f:id:ihatasi:20181028015843j:plain 見てわかるように,キーキャップがズレています.これは,キースイッチをずらしてはんだ付けしてしまったからです.このままではケースに収まらないので,はんだで加熱しながら,はんだ吸い取り線を使ってはんだを取り除きます.キースイッチはともかく,LEDを取るのはとても大変な作業でした.(ここでLEDをつけたことを完全に後悔した.)
下図はキースイッチを取り外した写真です. f:id:ihatasi:20181028020456j:plain この穴の右側にキースイッチをはめます.キーボード下にあるのは,キーキャップ取り外し機です.キースイッチを付け直し,下図は全ての過程が終わった写真です. f:id:ihatasi:20181028020807j:plain ここでキーを押したときにハマらないかをチェックします.LEDのはんだ付けが浅い場合は,キーキャップに引っかかりキーがハマってしまうので,LEDを強く押しながら裏のはんだを溶かし深く刺しましょう. 下図はLEDを光らせた写真になります. f:id:ihatasi:20181028021138j:plain これで組み立ては終了です.
次回ファームウェアの書き込みについて書いていきます.

自作キーボードを作ろう(GH60) 購入編

はじめに


今回は,自作キーボードを製作したので過程と感想を書いていきます.自作キーボードは,店でゲーミングキーボードを買うより安く作れ(?),自分の思うようにキーマップを書き換えられるので大変オススメです.
組み立てたキーボードはSatan GH60 PCBです.予算は15,000円で考えましたが,ケース・はんだごて・テスターのせいで大きく超えてしまいました.次作るときは10,000円前後にしたいと思っています.
(追記2019/01/14:遊舎工房さんが実店舗をオープンしたそうです.おめでとうございます.)
本記事は以下の1~3の流れに沿って分割して書いていきます.今回の記事は1にあたります.
1. Aliexpressでキーボードを購入する.←今回
2. キーボードを組み立てる.
3. ファームウェアを書き込む.
Twitterのモーメントにも簡単にまとめてあるので,軽く流れを見たい方はこちらをご覧ください.

1-1. Aliexpressでキーボードを購入する.


Aliexpress は,中国のAmazonのようなサイトで色々なものを扱っています.日本語に自動翻訳されて表示されていますが,変な日本語になっているので英語の方が読みやすいです.Aliexpressの登録や購入の手続きはここでは省きます. 私が購入した商品は以下のようになっています.
1.無刻印キーキャップ ja.aliexpress.com
2.アルミニウムキーケース

ja.aliexpress.com

3.Satan GH60 PCB DIY KIT

ja.aliexpress.com

合計16,510円の買い物です.いろんな店から買うのは怖かったのでJazz Cool Storeで統一しました.

1.無刻印キーキャップ

この商品にはかなり満足しています.無刻印にしたのは完成後にファームウェアを書き換えるため,刻印があると邪魔になると思ったからです.

2.アルミニウムケース

アルミニウムケースは重くて高くてあまりオススメできません.次は2,000円以下のプラスチックケースにしようと思っています.

3.Satan GH60 PCB DIY KIT

私はkit4を選び,オプションで stab:Transparent, sw:gateron brown, led:13, Plate:Black と指定しました. LEDがどうしても欲しい人でなければ,LEDはつけない方がいいです.後の組み立てで苦労することになります.私は次はつけません. messageから以下の画像のように指定しました.チャットは基本英語で打ちます.文法などは気にしなくていいと思います. f:id:ihatasi:20181027020556p:plain

1-2.到着を待つ.


ここが長いです.下の画像のような流れで届きます. f:id:ihatasi:20181027015845p:plain
私の場合は業者が発送を忘れており,messageで催促したら船便が航空便に変わりました.催促を強く言ってしまうと,業者側が厄介な客と認定することがあるかもしれないのでやんわりと言っています.messageは以下のようにやり取りされました. f:id:ihatasi:20181027020857p:plainf:id:ihatasi:20181027020918p:plain
このやり取りの3日後に発送され,1週間と少しで到着しました.8/31発注なので実際は3週間

次回は,組み立てについて書いていきたいと思います.