写真からの付箋検出について
前置き
この記事は圧倒的令和ッ!!ぴょこりんクラスタ Advent Calendar 2019 - Adventarのために書かれたものです。ちなみにこのACが何なのかについては、ぴょこりんクラスタ Advent Calendar is 何? - ぴょこりんブログが詳しいです。
前提
紙の付箋に書いたものが、自動的に電子化されて処理がなされたりしたら、ちょっと楽しいかもという思いつきがありました。電子で完結させろよという話もありますが、ちょっとしたメモは紙の方が楽なような。ということで、写真にうつった付箋を検出することにトライしてみました。
ぶっちゃけこのようなアプリがあり、
apps.apple.com例えば写真からの付箋の認識→切り出して電子化→trelloへの投げ込みのようなことはやってくれるので、ゼロベースで作るのもどうかなという思いはありますが、画像認識系の練習をかねて。
データセット
このような写真を使いました。
やったこと1(グレースケールからの画像二値化)
labs.eecs.tottori-u.ac.jp
上記のチュートリアル等を眺めると、画像を二値化してcv2.findContours()を使えばよさそうだと思う。
なので、グレースケール→二値化という方針でトライしてみる。
#!/usr/bin/python # -*- Coding: utf-8 -*- import numpy as np import cv2 TARGET_DIR = "./" TARGET_PATH = "sample1.jpg" im_sample = cv2.imread(TARGET_DIR + TARGET_PATH) im_gray = cv2.cvtColor(im_sample,cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(im_gray,180,255,0) #180は閾値です。べた書きですみません・・・
で2値化した画像を表示すると。。。
あっ。。。
グレースケール化してしまうと、背景と付箋の分離が困難なようです。
やったこと2(色情報に基づく画像二値化)
という反省をいかし、付箋の色情報を分離に使うようにします。色情報にはRGBなどいくつかの表現方法がありますが、今回はHSVを使います。なぜこれが便利かというと、白~黒の無彩色について彩度(S)が0になるという特徴があるからです。色相(H)は使わなくてもよかったかもしれませんが、適当に閾値を設定してしまいました。彩度の低い領域を白に飛ばすようにします。
#Threshold Paramters #For binarization TH_H = 20 TH_S = 20 TARGET_DIR = "./" TARGET_PATH = "sample1.jpg" im_sample = cv2.imread(TARGET_DIR + TARGET_PATH) im_hsv = cv2.cvtColor(im_sample,cv2.COLOR_BGR2HSV) thresh = cv2.inRange(im_hsv, (0,0,0),(TH_H,TH_S,255)) thresh_not = cv2.bitwise_not(thresh)
で2値化した画像を表示すると。。。
壁の模様が結構厳しいですが、付箋はきれいに黒になっていることがわかります。
やったこと3(二値画像からの輪郭検出)
二値画像から、輪郭を検出します。
contours, hierarchy = cv2.findContours(thresh_not,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) #filter Contours area_pic = im_sample.shape[0]*im_sample.shape[1] threshold_cont_min = area_pic/200 contours = list(filter(lambda x: cv2.contourArea(x) > threshold_cont_min , contours)) im_cont = im_sample.copy() im_cont = cv2.drawContours(im_cont, contours,-1,(0,255,0),3) rect_num = 0 for i in range(len(contours)): x,y,w,h = cv2.boundingRect(contours[i]) cv2.rectangle(im_sample,(x,y),(x+w,y+h),(0,255,0),2) rect_num = rect_num + 1; cv2.imwrite(TARGET_DIR + "cut/" + str(rect_num) + ".jpg", im_sample[y:y+h,x:x+w])
findContoursの第二引数は輪郭同士の階層構造を保持するかで、今回は一番外側のみひろうようにしました。
で、輪郭内の領域の広さでフィルタをかける。
フィルタをかける前だと、
こんな感じで、かけた後は
でした。いくつか壁の模様で誤爆していてつらい。。。(面積での閾値でははじけなかった)
で外接する矩形を求めて、その領域を切り出す。
何個か誤爆してますが、付箋の切り出しには成功しています。
たのしいりょこう
GWに旅行した。
コンセプト
桜と鉄道の旅(ちょっと過酷)
メモ
1日め
2日め
備忘(随時更新)
前置き
GWの実施事項(学び)を可視化することで、無為にGWを溶かさないようにする。
(訳:広告よけ)
やったこと
雑用
お勉強
- プログラミングコンテスト(ABC)参加
- ABC 1問(上の最中に解いたもの除く)
趣味
- 自炊3回(野菜炒め、塩焼きそば、小松菜と豚肉の煮物)
- 水出しコーヒーチャレンジ
- 東北旅行
やること(随時追加)
雑用
- クリーニング→3月にだしたからまあいいや感。。。
お勉強
- ABC 10問くらい
趣味
- 近場の温泉
- 運動(とってつけた感)
2018ねんのおわりと、2019ねんのはじまり
前文
あけてしまっておめでとうございました。今更ですが、今年もよろしくお願い致します。
2018年はどうだったか
労
仕事は自分の興味とあっているかというと微妙。必要性はわかるので、まあ学んでおいてもよいのではという一方、それだけではどうしようもない感。とはいえ、自分自身何がしたいのか。少なくとも魅力を感じる技術者・技術を尊重するというスタンスは死守する。
仕事の出来については、前提・ゴールを描くという点はまあまあいけるようになってきた一方、ゴールへの至り方がきちんと設計できずに迷走しがちだった。周囲を振り回しがちで反省(現在進行系で燃えてる)。自分自身で仕事を抱え過ぎという指摘もあったのですが、メンバのロールに基づいて設計すると仕方ないのではという気持ち。
趣味:旅行
年始に沖縄までP28旅割でいって「今年はANAプラチナいけるんじゃね!?」といっていた、そんな時期もありました(遠い目)。結局その後一回も飛行機に乗りませんでした(死んだ目)。旅行先は以下の通り。旅行先が近場に集中したのは私の無計画さか、気力不足か。
趣味:楽器
データサイエンティスト(?)なので、定量的な指標を出すと、楽団への練習出席率(活動期間5月~10月)は13/18(72%)。例年に比べると低かった気もするが記録がなく、今後の推移を見定めたい。去年に比べると、個人練習の量も減ったし、ちょいモチベーション維持に苦しんだ。とはいえ、楽器吹きたいのも事実。
雑感
上記ルーチン的な人生に多少飽きてきたような、そうでないような。あるいはそう思いたがってるだけか。
2019年はどうありたいか
労系
振り回される系シャインとして、かくあるべきか悩ましい。問題解決とか合意のとり方とか、必要最低限のスキルを労で得るというスタンスにして、別途自分で努力したい。困りごとを技術で解決するという大上段のモチベーションはあるのだが、具体的に何がしたいといわれると悩む。
趣味:旅行
- 飛行機乗りたい。一回くらい海外に行きたい。
- 行ったことない都道府県にいきたい(通ってもいない:和歌山・宮崎・秋田、通過のみ:岡山・滋賀)。
- 温泉にいきたい。
他
新しいことをはじめたい。
タイトルでネタばらしをしない(2017年記事の再掲)
前置き
(リバイバル版作成時に、古い記事を上書きするという情弱プレイをしてしまったので再掲)
この記事はまたまた!ぴょこりんクラスタ Advent Calendar 2017 - Adventarのために書かれたものです。
前置きその2
ぴょこりんをフィーチャーするということを念頭に置きました。
本文
鶏肉と玉ねぎですね。
バターとケチャップ(ハインツ)で炒めるとこうなりました。
これは卵ですね。
つらい…
つらい!!!
・・・
・・・・・・
オムライス featuring ぴょっこりん
あとがき
- ほんとは絵を書くつもりだったが、卵が破れた時点で諦めました。
- チキンライスが多すぎたのが全ての敗因でした、多分。
- オムライスを作るのは2度めですが、1回めはチキンライスの上に卵をかぶせるというやる気のない仕様でした。(こっちの方が良かった疑惑はある)
- オムライスはスタッフ(私)がおいしくいただきました(味は良好)。
Pairwise Ranking Aggregationについて
前置き
この記事はカレーのち ぴょこりんクラスタ Advent Calendar 2018 - Adventarのために書かれたものです。ちなみにこのACが何なのかについては、ぴょこりんクラスタ Advent Calendar is 何? - ぴょこりんブログが詳しいです。
サマリ
本文
論文の内容
データから順序関係を学習することを目的とする。例えば、画像が10枚あったとして、(画像1)>(画像10)>...>(画像8)のような好みのランキングを学習することが目的。
この論文はCrowdSouringによりデータを取得することを目的とする。問題設定には以下のように反映される。
- 評価者の負荷を鑑み、入力を2オブジェクト間の比較結果(一対比較)の組とする。すなわち画像が10枚あったときに10枚すべての順序関係ではなく、(画像1)>(画像7)のような1対の比較を入力とする。
- 適当に入力するspammerがいることを前提とする。この評価者はあてにならないみたいことがある。
詳細は論文にゆずるが
- 評価者kが順序関係を正しく評価する確率を
とする。
順序関係をつけるべきオブジェクト、評価者K人がいたもとで、
入力データである(評価者, 一対比較結果)の組に対して正則化付き対数尤度
を最大化することで、パラメータを推定する。
(は正則化に関わるパラメータ、は評価者iによる一対比較結果の集合)
第一項が対数尤度、第二項が正則化項。
なお、論文では、逐次的な入力に対するオンライン推定についても提案しているが、今回の実装は一括での推定である。
実装
試しに遊んでみるデータとしてsushi preference datasetを用いる。
www.kamishima.net
2種類のアイテム集合に対するデータセットがあるが、今回はAのもの(sushi3a.5000.10.order)を用いる。
これは10種類の寿司ネタの好みのランキングを含んだデータセットである。
0 10 5 0 3 4 6 9 8 1 7 2
0 10 0 9 6 3 7 2 8 1 5 4
0 10 7 0 2 3 8 4 5 1 9 6
1行が1人に対応、最初の0はヘッダ、次は集合の要素数10、以降が寿司ネタ好みのランキングである。
ちなみに寿司ネタのidは
である。
これだと今回の問題設定に合わないので、(情報量は落ちるが)一対比較の組として作りなおす。
github.com
0 0 2
0 1 2
0 5 4
0 8 1
0 4 2
のような(評価者、一対比較結果)の形に変換した。一対比較はもとのデータセットからランダムに2つ選択して生成した。
試しに評価者20人、1人あたり30組の一対比較結果をサンプルして、手法を適用してみた。
ソース下記。
github.com
#評価者が正しく評価する確率
[0.43379004 0.22232044 0.79776574 1. 0.19814816 0.22618328
1. 0.33754379 0.82956798 0.42050427 0.63106899 0.94282202
1. 0.5472771 0.74122849 1. 0.41946646 1.
0.96373038 1. ]
#学習されたランキング:
[7 4 5 1 0 3 2 8 6 9]
とろ、ウニ、いくらが上位とあるように、なんとなくみんなの好みにあった結果になっているように見える。
例として、正しく評価する確率が低い(が低い)評価者の内容を、元データから眺めると、
0 10 0 9 6 3 7 2 8 1 5 4
確かに、えびが1位、かっぱ巻が2位で好みの傾向が異なるので、それっぽく挙動しているように思う。
備考
- 定式化のすっきり度合がすごい好み。
- この手法は明確な正解があるケースを前提としているように思い、今回のように評価がばらけるようなタスクだとちょっと違うのかなあと思った。
- 最適化はscipyで1発だったのでしゅごい。
スマートリモコンの活用と効果検証
前置き
この記事はカレーのち ぴょこりんクラスタ Advent Calendar 2018 - Adventarのために書かれたものです。ちなみにこのACが何なのかについては、ぴょこりんクラスタ Advent Calendar is 何? - ぴょこりんブログが詳しいです。
サマリ
スマートリモコンを買って睡眠環境の改善を図った。ついでに効果測定をしてみた。
施策の導入
私には電気をつけたまま寝落ちをする癖があった。そのまま寝てしまうのがわかっていながら、お布団でスマホをいじったり、タブレットで動画を見ていたりするうちに、気づいたら朝になっているのである*1。さすがにまずいなと思い、面白半分でスマートリモコンを買ってみることにした。これである。
Nature Remo mini 家電コントロ-ラ- REMO2W1
- 出版社/メーカー: Nature, Inc.
- メディア: エレクトロニクス
- この商品を含むブログを見る
- スマートフォン等から一括して家電を操作できる。家電のリモコンをスマートリモコンに向けてボタンを押すと、波形を覚えてくれ、以降はスマートリモコンで操作可能となる。という仕組み。スマートリモコン側でのプリセットの機器はあまり多くないので、だいたいボタンを一つずつ覚えさせないといけないのでやや大変。
- 特定の条件下で、リモコン操作ができる。例えば「XX度以下になったらエアコンをつける」とか「自宅に近づいたらエアコンをつける」等が可能。
ということで、これを使って毎日AM0時になったら、シーリングライトを自動で消すことにした。これで寝落ちしても寝ている間に電気が消えてくれるというわけである。なお、うちのシーリングライトはリモコン操作は可能であるがタイマー等の機能がないため、そこをスマートリモコンで補う形をとった。
これで安眠が約束できる気がする。
効果測定
ということで、施策を導入したのでその効果を測ってみることとした*2。私はfitbitをつけているので、毎日の睡眠時間を記録できている。スマートリモコン導入前後で睡眠時間がどのように変わったのかみてみよう*3。
ソースはこれ。
github.com
データの収集は2年前のぴょこりんクラスタアドベントカレンダーでやったので、こちらを参照。ただし、使っているpythonクライアントが対応しているfitbit APIが古いバージョンであるのがちょっと気になる。(単に叩くURLが変わるだけなので自分で直せという話だが)
darumap.hatenablog.com
darumap.hatenablog.com
これを単にpandasのhistを使って可視化するだけである。ばばーん。
あ・・・れ・・・、変わってなくね・・・*4。