The jonki

呼ばれて飛び出てじょじょじょじょーんき

M5StackでLINE連携型のCO2センサー

はじめに

在宅勤務も長くなり部屋の換気もサボりがちでCO2センサーを買おうかなと思ったら,怪しい商品しかAmazonで見つけられず.それなら自分でM5Stackで作ってみようかなと思いました.久しぶりの電気工作.以前に話題になってて乗り遅れましたが,今更Join.Arduinoと同じ要領で開発できるのに加えて,ディスプレイ,WiFiBluetooth,SDカードスロットが標準搭載!Arduinoでこれをやろうとすると色々キットを購入したり自分で配線したりと大変なので,だいぶ楽になったもんです.人気なのも頷けます.

作ったものはCO2センサーとして屋内で動かし,不快指数に達したらLINEで通知する,という感じです. CO2濃度が高くなったら画面を黄色くして,LINEに自動で通知,という風にしました. 通知方法は,IFTTTで設定したWebhookにCO2の値をPOSTで送り,LINE通知を使います.LINE通知アカウントができるので,グループに入れて家族と共有することも可能です.

用意するもの

バッテリーモジュールは必要であれば.プロトボードも配線を外に出す場合は不要です.

www.switch-science.com

IFTTT (Webhook -> LINE通知)

特定のアドレスにHTTP POSTすると,LINEに通知を届くようにしておきます.設定方法等は,Webに大量に転がっているので省略します.設定したら生成されたURLをメモしておきます.

配線

配線はシリアル通信用のSCL, SDAと電源及びGNDの4本をつなぐだけです.配線はこちらの方の記事を参考にしました. cami.jp

私はブロック内に配線を隠したかったので,プロトボードにはんだ付けしました.適当なジャンパーで繋ぎます.いまいちプロトボードの使い方わからずむりやり.

コード

M5Stackのソフトウェアはそれなりに大きいのでArduino IDEでは,コンパイル及び転送がめちゃくちゃ遅いです.私のMacbook Pro環境で1回3分ぐらいかかります.ぐぐったところPlatformIOを使うと早くなるということで,VS Code + Platform IO拡張で試したところ30秒もかからなくなりました.すごい.シリアルモニターも使えるし,VS Codeでコードのフォーマットとかも効くのでArduino IDEを使う理由はもうないですね.

コードはこちら.あまりPlatformIOの使い方を分かっていませんが,プロジェクトを作ると main.cpp ができており,これにコードを書くようです.またWiFiSSID,パスワード,IFTTTのURLは,あらかじめSDカード内のテキストファイルに記載しておくことで,コード上のハードコードを避けました.まぁこれはこれで危ないけど. github.com

参考

こちらのサイトの情報を参考にさせて頂きました.CO2に関しては1500ppmを下回ってたほうが良さそうですね.

github.com CCS811 CO2 VOC センサーを制御

まとめ&要調査

エージング等必要なもようでCO2が正しい値を取れているかはまだ実験中.本当は気温や湿度をフィードバックしたほうが良いらしいけど,この辺も含めて調査中.とはいっても正解となるCO2センサーを買ったら元も子もないような汗.

torch.nn.ConvTransposeの可視化

アップサンプリングなどで使われるConvTransposeについて,イマイチ理解できていなかったように思えるので可視化した. Convolutionといえば,conv_arithmeticのGIFが分かりやすいが,ConvTransposeに関しては,通常のConvolutionのように見え,strideやpaddingが通常のConv時とどう違うのか分かりにくいように感じたので,How PyTorch Transposed Convs1D Workを参考に書いてみた.

可視化

これがその図である.Convを逆順にたどるとConvTranposeになっているのがわかると思う. ConvTranpose時のpaddingがやや分かりにくいかもしれないが,どんだけはみ出して始めるか?(はみ出た分は後で捨てる),という考えで見ると分かりやすいかもしれない.

f:id:jonki:20210104211215p:plain

  • 純化のためバッチサイズ及びチャンネル数は1,畳み込み時のチャンネル出力も1に固定.
  • データの流れがわかりやすくなるので,入力データ及びカーネルの値はすべて1に固定.
  • 今回1dだが,2dでも同様.

コード

この図をpytorchで書くとこうなる.

import torch
import torch.nn as nn

x = torch.ones(1,1,6)

enc = nn.Conv1d(1,1,kernel_size=3,padding=2,stride=3,bias=False)
enc.weight.data = torch.ones(1, 1, 3)
dec = nn.ConvTranspose1d(1,1,kernel_size=3,padding=1,stride=2,bias=False)
dec.weight.data = torch.ones(1, 1, 3)

enc(x)
h = enc(x) # shape: (1, 1, 3), data: [[[1,3,2]]]
print('h:', h)
out = dec(h) # shape: (1, 1, 5), data: [[[1,4,3,5,2]]]
print('out:', out)

参考

medium.com

// ちなみに畳み込み全然初心者なので嘘ついてたら教えて下さい.

2020年にやってよかった教材(機械学習関連の入門多め)

今年は仕事内容も変わって,いろいろなものを勉強した気がします.ということで買ってよかったもの,とは別に.やってよかった教材(書籍,オンライン教材,ブログ等)を紹介しようと思います.入門系多めです.

Andrew Ng先生

今年はAndrew Ng(アンドリュー・エング)先生の大ファンになりました.Twitter界隈でまずNg先生のCourseraやCS229をやれ,という話は時折上がってくるので見てみたらハマりました.私は2017年ぐらいからNLPを始めて,機械学習の知識は必要に応じて勉強していたので,体系だってあまり学んで来ませんでした(高村先生の機械学習入門ぐらい). そこでゼロから勉強し直そうと思い,Andrew Ng先生の教材をやってみました.

結論から言うと非常に良かったです.これから機械学習始めたいという方に特にオススメ,というかこれ以外から始めない方が良いかも,と強く言いたいぐらい良かったです.いきなりDNNに飛びついてしまう人も最近は多いのかなと思うのですが,ここでロジスティック回帰や評価の仕方などしっかり学んだほうがよいです.授業では各項目に対して深入りするわけではないですが,考え方のエッセンスのようなものをAndrew Ng先生がわかりやすく説明してくれます.これがこの授業の最大の魅力です. Courseraには確認テストがあって,選択・記入式のチェックテストとOctaveによる実装テストがあります.どちらもそんなに難しくないので,良い復習になると思います.え,Octave?と思うかもしれませんが,OctavePythonMatlabの文法に馴染みがあれば,ちょっとしたチュートリアルもあるので問題になりません.実装もロジックの部分だけ実装する形式なので,Octaveの言語に精通している必要はまったくありません. コースは11週と長く見えますが,まったくの初心者でなければ授業は1.5倍速ぐらいで,1ヶ月ぐらいで終わると思います.授業は英語ですが,リスニングに自信がなくても板書がしっかりしてるので十分ついていけると思います.日英の字幕もあります.非常に有名な授業なので,修了証の権利も購入してLinkedinに貼るつもりでやると,モチベーションも続くかもしれません.

www.coursera.org

この授業の後は,CS229というスタンフォードでの授業を見てみました.Youtubeで2018年度に行われたものが今年4月に無料で公開されています.Courseraの授業は完全に入門編でしたが,こちらは入門ではありますが,範囲をやや広げ(EMアルゴリズム強化学習等),数式的な踏み込みもかなりしています.こちらはシラバスを見てもらえればわかりますが,動画での授業だけでなく,多くのLecture NotesがPDFとしてまとまっています.動画中での導出は時間上カットしてたりするのですが,ちゃんとその導出などもLecture Notesに書いています.シラバス上はリンク切れの資料も多いのですが,世界中で人気の授業なのでGithubなどで探せばいくらでも関連資料は出てきます.またこの授業のテストもあって,Problem Setsというのがあります.こちらもネットを探せば,元の課題が転がっているので挑戦してみても良いかもしれません.が,結構重たかったので,私は動画→Lecture Note読む,で先に進んじゃいました. www.youtube.com

また本授業を担当したTAの方が俯瞰図を作っているので,どのあたり勉強できそうか眺めても面白いです. github.com

機械学習の入門が終わったら,DNNやNLPなどを勉強しても面白いかもしれません.同じStanfordでの授業はいっぱい転がっているので,自分にあったものをやると楽しそうです.

Stanford CS230: Deep Learning | Autumn 2018 | Lecture 1 - Class Introduction and Logistics - YouTube

Stanford CS224N: NLP with Deep Learning | Winter 2019 | Lecture 1 – Introduction and Word Vectors - YouTube

NLPだとCMUのGraham Neubig先生も毎年授業を即公開しており,最新の論文のキャッチアップもできて良いですね.

Graham Neubig - YouTube

線形代数

色々論文などを読む上で線形代数の基礎力がまったく足りてないなと反省し,色々線形代数もあさりました.

こちらもCourseraであった線形代数の授業です.こちらも演習とセットになっていて,短いのでよいです.

www.coursera.org

またヨビノリシリーズも良かったです.書籍は動画と基本的に同じなので,動画を見た後に書籍を見ると良い復習になります.

www.youtube.com

予備校のノリで学ぶ線形代数

予備校のノリで学ぶ線形代数

音声信号処理

今年はNLPだけでなく,音声系の内容にも手を出しました.といっても大学以来,まったくやってこなかったので基礎の基礎から色々勉強しましたが,中でも良かったものを紹介します.

まず東北大の鏡先生のディジタル信号処理はかなり良かったです.会話形で進むタイプなので,疑問に思いやすい点などしっかりとやる夫が突っ込んでくれて面白かったです.これで完全に忘れていたフーリエ系の扱いを大学時代以上に思い出せました. www.ic.is.tohoku.ac.jp

あとは本もいくつか買いましたが,サクッと入門系だとこの辺がわかりやすかったです.やる夫シリーズはFFTの解説があえてないのですが,この本はFFTの解説(というか計算)がわかりやすかったです.

道具としてのフーリエ解析

道具としてのフーリエ解析

またどうしても信号処理を扱う上で,複素数は外せないところなので,これも読みました.こういうシリーズはイラストで安心感を装い,中身はあまり...という場合が多いのですが,これは良書だと思いました.ちなみに漫画部分も普通に面白かったです笑

マンガでわかる虚数・複素数

マンガでわかる虚数・複素数

  • 作者:相知 政司
  • 発売日: 2010/11/12
  • メディア: 単行本(ソフトカバー)

次にプログラミングでデジタル信号処理できないとまずいので,こちらも一通りやりました.実際に音声ファイルを読み込んで周波数解析をして可視化して,という一連の流れをサクッと学べます. aidiary.hatenablog.com

また,音声を扱う上で,人の聴覚や発声の仕組みも知りたくなりました.デジタル信号処理は音声とは限らないので,このあたりの情報はあまり載っていません.そこで良い書籍ないかなといろいろ探していましたが,この本は非常に読み物としても面白かったです.音声系の教科書,堅苦しい(失礼)のが多いんですが,これは読みやすい上にタメになる知識が多かったので,また読みたいところ.目次見て面白そうと思ったら買いでしょう.

ゼロからはじめる音響学 (KS理工学専門書)

ゼロからはじめる音響学 (KS理工学専門書)

プログラミング

これずっと前に購入して積んでいたので読んでみたのですが,アルゴリズムの勉強を初めてするときなどに読んでおきたかったです.大学時代にアルゴリズムの授業というとまったく楽しめなかったので,こういった実用的にアルゴリズムがどこで活躍しているか分かる本に出会いたかった.

またけんちょんさんの本も買っていて,冬休み時間が取れたのでやってみました.競プロをやる上で,アルゴリズムの勉強をする→AtCoderで実力を試す,など考えられますが,体系的にアルゴリズムを俯瞰して勉強でき,更に実装にも踏み込んだ入門書はこれまでなかったように感じるので新鮮でした.入門〜緑ぐらいの人向けのイメージです.アルゴリズム何も知らんという人は,アルゴリズム図鑑から入ったほうが良いかもしれないです.

アルゴリズム図鑑 絵で見てわかる26のアルゴリズム

アルゴリズム図鑑 絵で見てわかる26のアルゴリズム

Youtuber

最後にYoutubeで見つけた良いチャンネルです.CS229しかりでYoutubeに良い教材が大量にあふれる良い時代になりました.論文の解説などもあったりするので,本当にYoutubeよく見るようになりました. ということで登録しておいて面白い動画がよく流れてくるチャンネルを共有しておきます.

www.youtube.com

www.youtube.com

www.youtube.com

良いお年を!

2020年に買ってよかったもの(日用品編・ガジェット編)

今年も振り返りしようと思います.今年は2年近くやっていたPodcastを休止し,ブログもなかなか書けませんでした.忙しかったというよりは,仕事で色々と新しい環境をエンジョイしていたので,なかなかprivateでアウトプットする場がなかったですね.

今年は日用品編・ガジェット編をまとめます.技術書編は長くなったので別記事で今日明日に出します.→書きました.

www.jonki.net

www.jonki.net www.jonki.net

日用品

今年はコロナということもあり,基本的に在宅勤務でした.その在宅勤務を支えてくれた品物が多いです.

まずは夏頃ですが,私はホットコーヒーからアイスコーヒーを作っていたので,氷をガツンと入れてストローで気軽に飲めるタンブラーを探していて見つけた商品がこれ.Klean Kanteenのタンブラーです.金属ストローが結構クセになります.蓋をしたまま飲めるのでよいです.

KEENのサンダル.春〜秋の外出するときは基本これ履いていました.フィット感が素晴らしいのでスニーカーのように履けるサンダルです.KEENのサンダルはマジでいいよ.

次は冬場に入って買った保温ポットです.1Lのポットなので卓上においても邪魔じゃないサイズで絶妙です.継ぎ足し継ぎ足しでお茶,白湯,カモミールティー飲んでます.

最後はパタゴニアのレフュジオです.最高です.サイズがそこそこあって,PCやガジェットの収納ができて,軽くて,しっかりしてる,という製品を探した先にたどり着いた商品です.アークテリクスやノースフェイスもちょっと浮気しましたが,どちらも重かったり,使い勝手悪かったりするんですよね. 仕事も旅行もコイツです.

ガジェット編

Thinkpadのキーボード使ってましたが,久しぶりにHHIKBに手を出しました.打ち心地は最高ですが,キーがやはり少なすぎるので,配列はThinkpadキーボードの方が好みです.

接続マシンを切り替えられるKVMです.在宅勤務ということもあり,日中は会社のWindows PC,仕事後は家のMacに切り替え,というのが面倒すぎて購入.ショートカットキーで切り替えられて便利です.

ラジオです.昔からラジオが結構好き(interfmしか聞かないけど)なのでつい購入.アナログチューンで音もしっかり出るので楽しいです.これも卓上に置いています.

次はサイレントギター.あまり外にもでなくなったので,大学以来,久しぶりにギターでも弾きたいなと思い,突発的に購入.スチール弦も良かったけど,クラシックギターの指弾きが好きだったのでナイロン弦のモデルを購入.これだけでも良いのですが,ヤマハさんがエレガット用の卓上アンプを出しててこれもウッカリ購入.最高か.

Apple Watchの信者と成り果てたので購入.軽くて数回は余裕で充電できるので,旅行時などに重宝しました.

また無駄にヘッドフォンを増やしました.用途に合わせて色々使っているんですが,音楽をしっかり聞くというよりは最近はかけ流しのときが多いので,開放型以外のヘッドフォンはAirpods Proを除いてなかなか使わなくなりました.MDR-MA900というソニーの開放型で軽いヘッドフォンがあるのに買ったのはご愛嬌で(次世代機出ないかなぁ).見た目はそれなりにごっついですが,軽くてつけ心地はよいので冬にピッタリのヘッドフォンです.ATHシリーズは大学時代に始めて自分で買ったヘッドフォン以来,2つ目ですが相変わらず良いですね.

audio-technica エアーダイナミック オープン型ヘッドホン ATH-AD900X

audio-technica エアーダイナミック オープン型ヘッドホン ATH-AD900X

  • 発売日: 2020/08/04
  • メディア: エレクトロニクス

今年はそこまで大物は買わなかったですかね. このリストの中から1つでも響くものがあれば幸いです.それでは.

pudbをもっともっと活用する

以前,pudbの記事を書きましたが,あの時より更に使うようになっていたので,更に色々と便利な機能を紹介したいと思います. pudb?という方は下記の記事をまず御覧ください.今回は発展編ですが,前回の記事の続きというだけで,別に難しいことはありません. www.jonki.net

移動編

  • V, S, B, CCtrl-X での移動

基本的な移動操作になります.Variables, Stack, Breakpoints, Codeのフィールドを自由に移動できます.Ctrl-xでちょっとしたコードを動かしたり確認したりします.各フィールドでの上下移動はj/kが使えます.

  • H: 現在の実行ラインまで戻る

デバッグ中に色々移動したあとに,現在の実行ラインまで戻ります.

  • u/d: スタックの上下移動

スタックトレースを行き来できます.ライブラリの実行などで層が深くなった場合でも,簡単にスタックレイヤー層を上下に移動できます.Stackフィールドにおいて,直接行きたいレイヤー層を選択することが可能です.

実行編

  • t: カーソルのある行まで実行

ブレークポイントを貼って実行 bcでもいけますが,無駄にブレークポイントが増えて不便です.これを覚えておくと地味に便利です.

  • f : 現在の関数の最後まで行く

関数最後までサクッと移動できます.tなどでも代用できますが,「このどうでも良い関数はいいから次!」っていうときに便利です.

Variablesフィールド

  • n: 変数ウォッチ

pudbでも変数のウォッチは可能です!特定条件でのデバッグなどにとても強力です.下記ではミニバッチのインデックスに対してウォッチ変数を作ってみました.

  • custom stringifier設定

Variablesフィールドの表示方法を変更できます.例えば無理やりPytorchのTensorのshapeを表示するようにするとしましょう.~/.config/pudb/custom_stringifier.pyを用意します.

def pudb_stringifier(obj):
    try:
        return (list(obj.shape), 'tensor')
    except:
        return type(obj)

Ctrl-pでVariablesフィールドの設定で,Customのところに先程のファイルを指定します.

そうすることで,Variablesフィールドの各変数を選択した状態でcを押すと,先程のコードが走り,PytorchのTensor変数のshapeが表示されるようになりました.tで型表示,rで中の値を展開という感じにいろいろな表示を切り替えられます.ちなみに先程の設定では,デフォルトはtypeにチェックが入っていますが,Customのところにチェックを入れれば,自動でcキーを押した状態となり,PytorchのTensorであれば,勝手にshapeが表示されます.

Breakpointフィールド

先程のウォッチ変数と似ていますが,ブレークポイントの発動条件を設定できます.コードがある程度進まないと発生しないバグなどの調査時などに便利です.ちなみにdブレークポイントは消せます.

カスタムテーマ

実はカラーテーマも設定できます.方法としては,先程のVariablesフィールドの設定と同様,テーマ設定ファイルを用意して,Ctrl-pで設定画面に行き,ThemeのCustomのところに,そのテーマファイルを指定すればよいです.

公式がテーマのサンプルを公開しています.paletteという辞書型の変数を更新すればよいだけです.フルスクラッチだと辛いので,公式が用意しているテーマからコピペし,気に入らないところだけを書き換えるのが楽です.指定できるカラーは,基本的にXterm colorの256色からです.

例えばブレークポイントのマークとブレークポイント箇所ラインの背景色を変えてみるとこんな感じに変わります.

まとめ

前回の基本的なコマンドに対して,今回はかなり実践的な機能を多く紹介してみました.ショートカットはデフォルトで覚えやすいようになっているので,すぐに覚えられると思います.カスタム機能なども色々いじれて面白いですね.

Enjoy coding!