卒研だけをしていたらB4が終わっていた

はじめに

この記事は,TDU CPSLab Advent Calendar 2019 21日目の記事です.

自分が研究室に配属されて,研究会で発表するまでに意識してやったことをポエムにしていきます.

対象読者

  • B3,B4
  • 院試する人
  • 卒研何をしたら良いのか悩んでいる人

おもに「こうすると多分効率が良いよね」って言っているだけです.

自分はどうだったか

先に言っておくと,この記事に書いたことの半分ぐらいしか守れなかったです. 今思えばこうすればよかったなーと思ったことを記事にしました. ただ運がよく,B3から研究を始めたため時間をたっぷり使って,なんとか形にすることが出来ました.

間違った研究の進め方

CPSLabに集まった我々オタクは,作ることにとても長けています.

しかし,卒研ではオタクならではのサイクルに陥ってしまう人が多いのです.

f:id:aj1m0n:20191222015231j:plain
オタクの進め方

この進め方の問題点は論文を書く段階になって初めて,「ああすればよかった,これはやる必要が無かった」という改善点が出てくることです.

こうなるとどうしようもなくなります.せっかく1年近く掛けて研究をしたんだから,良い論文を書きたくないですか?

f:id:aj1m0n:20191222015236j:plain
正しい進め方

とりあえずアイディアを出したらググろうねってことです.No 車輪の再開発

ちなみに,卒論とは少し違いますが先輩の記事 にも同様のことが書かれています.

卒研の大まかな流れ

CPSLabのB3はタームプロジェクトがあります.運が良ければこのタームプロジェクトで論文を書くことが出来ます.

ただしほとんどの人は,研究室のプロジェクトにアサインするか,独自で設定した研究を行います.

進捗は1ヶ月1回発表するであろうmeetingを目安に出していきましょう.

前半

就活,進学準備で大変だと思いますが,これらのことだけをやればいいんです.

先生に相談だ (~4月)

タームプロジェクトが終わったらまずは先生に相談しましょう. 先生の知識とコネは絶大です.たまに変なことを言うこともありますが,非常に的をついたことを言ってくれます.

大まかなアイディアを出す (~6月)

このシーズンはまともな人間なら就活か進学準備に追われていると思います.隙間時間を見つけてアイディアを5個以上出しましょう.

アイディアを固める (~7月)

大まかに出したアイディアの中から一つずつググったりします.これなら行けそうだっていうものが見つけられたら先生や同期,先輩に相談しましょう.

地獄のサーベイ(~8月)

google scholarで,自分のアイディアについて検索していきます.

絶対にそのアイディアと同じようなことをしている論文が見つかります.(見つからない場合は探し方が間違っている可能性が高い)

関連の論文はもちろんのこと,その参考文献の論文を読んでいきます.(斜め読みでいいから国内外問わず最低15本)

そして読んだ論文はなんでも良いのでまとめます.

f:id:aj1m0n:20191222023855j:plain
超理想の進め方

ここで大事なのが,この段階で論文を書いてみることです. 論文と言っても論文風にwordにレポートを書いていくのです.

概要,提案手法,検証方法,検証結果まででいいです.

最終的に,結果のテーブルに数字を埋めるだけにすれば,無駄なことをせずに最短で論文を書くことができます. また,書いている途中で必ず詰まる部分があります.この気付きが大切で,サーベイが足りていないことを教えてくれます.

後半

後半は人によって変わるので一概に言えませんが,こんな感じを目標にしてみてください.

実装 (1~2ヶ月)

皆さん得意な実装です.

デモ重視の研究会(ECなど)へ報告する場合は作り込む必要がありますが,デモをやらない研究会への報告であれば作り込む必要はありません.ちゃちゃっと実装します.

目的と手段を逆にしないように意識しましょう.

検証(~1ヶ月)

いよいよ検証を行っていきます.自分の研究が有意であることを証明しなくてはなりません.評価を取る方法はこちら が参考になるかもしれません.

評価を取ったらいよいよ研究会を決定します.先生に相談しましょう.

結果がだめだったみたいな論文も新規性として大切です.それが意味のある結果なのかをしっかりと検証しましょう.

論文原稿を書く(1ヶ月)

投稿締め切り1ヶ月前から書いていきましょう.(研究会によっては2日でも書けるらしい!?!?)

1週間に一度ぐらいのペースで先輩に見てもらうとクオリティが上がると思います.

締め切り1週間前になったら必ず先生に見せましょう.締め切りギリギリだと先生も忙しかったりして見ることが出来ない場合があります.

発表資料を作る(2週間)

論文原稿を投稿した後は,完全燃焼になりがちですが,ここで気合をいれて発表資料を作ります. 予想質問を考えながら,発表資料を作りましょう.理論でガチガチに固めれば何も怖くありません.

発表練習(1週間)

発表原稿を作ります.一人で練習します.発表原稿を直します.練習します.を繰り返します. そして,必ず誰かに発表を聞いてもらいましょう.直近のmeetingで発表できると色々コメントが貰えていいと思います. 最低でも3回発表すると感覚をつかめると思います.

発表当日

ここまで完璧にこなすと多分何も怖くないと思います. 研究会の飲み会で他大生と酒を交わすのが楽しいです.

お前はアインシュタインにはなれない

たまにノーベル賞級の研究をしたいと言い出す人が居ます. 無理です.少なくともその手の研究は博士過程に行ってから考えてください. アインシュタイン特殊相対性理論の論文を出したのは,彼が大学を卒業して就職した後の話です.

必要最低限で終わらせる

何事もこれに尽きると思います.卒論においてはどの大学生もこんな感じです.

人に頼る

めちゃくちゃ大事です.何事においても.卒論を一人で抱えて辛そうにしている人を何人も見ました.

だからといって,わざわざ声を掛けて大丈夫って心配してくれる人は居ません. 自分から解決できそうな人に声を掛けて,アドバイスをもらいましょう

自分は卒研のことは共同研究先の人に聞いて,開発に関してはもっぱら@unotoviveに聞いていました. 他にも構築に詰まったりしたらインフラ系が得意な人に聞いたり,電子工作のさしすせそを先輩から聞いたりして色々身につけました.

ググり倒す

実装する前にサーベイする,これに時間をかけましょう.(限度はある) 無駄な実装や検証は徹底的に排除して,自分がやるべきただ一つのことだけに集中しましょう.

発表の質疑をやり過ごす方法

発表は質問にどう答えられるかがポイントになります.

理論武装

的はずれ質問や,既存の理論について質問してくる人が居ます.その時は「こんなことも知らないんですか?」的なスタンスで答えてあげましょう.

噛み合わない回答をする

たまに質問と回答が全く噛み合っていないことがあります. 回答者がなんとなく頑張っていれば,質問者が折れてくれたりします.

強靭な精神を手に入れる

研究に興味がなくて,適当に実装して適当に論文原稿書いてしまいたい人はこの一年で精神を鍛えましょう. 強靭な精神の前では誰も突っ込めません.突っ込まれても「課題とさせていただきます」で全ての質疑を終えることが出来ます.

共著のせいにする(禁忌)

まず研究のことをよく分かっていない後輩を共著にぶち込みます. 後は実装面で質問が来たら全て「共著の彼がやったことなので,よくわかりません」的なことを言えば,責任転換することが出来ます.

研究会の雰囲気

研究会がどんな雰囲気なのかは論文を読めばすぐにわかると思います. ユルふわなところが穴場です. 先生に聞くのもいいと思います.研究者としてのライフハック的なことを知っていることが先生の強みです.

まとめ

結局泥臭くやるか,適当にやるかの二択なんです.中途半端が一番精神的にきます.→研究をしたくない人へ

就職なら適当にやってしまうのが良いと思いますし,院進なら泥臭くやってみてください. それで研究が嫌になったひとは開発を極めればいいし,そこで楽しいと感じた人は研究を突き詰めればいいと思います.

TF-IDFを用いたCPS月別流行語大賞2018

この記事は、CPS Lab Advent Calendar 2018の21日目の記事です。

adventar.org

はじめに

本記事では「slackのログデータから流行語を決定する」という題材に取り組みます.

データ

この記事を参考にしました. motemen.hatenablog.com

とれました.

f:id:aj1m0n:20181221090842p:plain
データ

1万件の制約上8月までしか遡れませんでした.

データ加工

本題ですね.

ここを参考にしてスプレッドシートと対話していきます. note.nkmk.me

会話本文を抽出してリストで管理します.

wb = {}
for i in [8,9,10,11,12]:
    wb[i] = openpyxl.load_workbook("../input/iwailab/2018-%s.xlsx"%(str(i).zfill(2)))
test = {}
for i in [8,9,10,11,12]:
    test[i] = []
    sheets = wb[i].sheetnames
    sheets.remove("シート1")
    for sheet in sheets:
        wb_sheet = wb[i][sheet]
#         print(wb_sheet)
        for cell_obj in list(wb_sheet.columns)[2]:
            test[i].append(cell_obj.value)

分かち書きをして,単語を抽出します.

df = {}
import sys
import MeCab
mecab = MeCab.Tagger ("-Owakati")
for i in [8,9,10,11,12]:
    df[i] = []
    for textdata in test[i]:
    #   print(textdata)
        text = mecab.parse(str(textdata))
        df[i].extend(text.split(' '))

TF-IDF

最低限の処理を施します.

  • 自然言語処理の世界ではStop wordsと呼ばれるような単語の除去

  • 単純な登場回数ではなく、他の年にあまり出てこない単語を重要視して評価

slothlib_path = 'http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt'
slothlib_file = urllib.request.urlopen(slothlib_path)
slothlib_stopwords = [line.decode("utf-8").strip() for line in slothlib_file]
slothlib_stopwords = [ss for ss in slothlib_stopwords if not ss==u'']
slothlib_stopwords.append("です")
slothlib_stopwords.append("ます")

結果発表

どの月でも出てくる単語を除き,その月を振り返りながら流行語を決定します.

それでは,発表したいと思います!!

8月「遅れ」

f:id:aj1m0n:20181221093339p:plain
8月
ミーティングに遅刻していることが容易に想像できてしまいます.

9月「研究」

f:id:aj1m0n:20181221093041p:plain
9月
後期に入って焦っている先輩がいましたね.

10月「16」

f:id:aj1m0n:20181221094311p:plain
10月
ちょうど16生の配属が決定した時期でもありました.

11月「発表」

f:id:aj1m0n:20181221093120p:plain
11月
11月に入ると学会発表をする先輩がチラホラと

12月「画像」

f:id:aj1m0n:20181221093114p:plain
12月
12月の表は正直良くわからないです.輪郭,関数,抽出など何か画像系の作業をしている人がいるんでしょうか?

まとめ

いかがでしたか?CPS内の素性を知ることができたような気がしますね.

今回はデータが半年分しかなかったので,月毎という形になりました.

来年はログがいい感じに溜まっていると思うので,アドベントカレンダー2019でリベンジしたいと思います!

コードはgithub上で公開しています

github.com

おわり

Labmartの顔認証を実装してみる

この記事は,CPS Labo Advent Calendar 2018の14日目の記事です.

adventar.org

13日目の記事はこちら

qiita.com

 

ご挨拶

こんにちは,B3のanzyです.この度無事CPSに配属されました.よろしくお願いします.

Labmart is 何?

こちらをご覧ください.

unotovive.hatenablog.jp

顔認証システム

流れはこうです.

webcamが起動 → 顔検出 → 予測 → いわいっぺい!

開発環境

python3.5.2

ubuntu16.04

webカメラから画像を抽出

import cv2 # OpenCV のインポート
cap = cv2.VideoCapture(int(cameraid))

簡単ですね.あとはcap.read()をすれば1フレームを読み込むことが可能です.

リサイズとグレースケール化

frame = cv2.resize(frame, (int(frame.shape[1]*0.7), int(frame.shape[0]*0.7)))
 
# 処理速度を高めるために画像をグレースケールに変換したものを用意
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

画像サイズが大きいと処理が重くなってしまいます.リサイズとグレースケール化してあげます.

顔検出

cascade = cv2.CascadeClassifier('models/haarcascade_frontalface_default.xml')
facerect = cascade.detectMultiScale(gray)

簡単ですね.これだけで顔を検出できます.

Haar like特徴量とは(専門でなければ飛ばす)

Haar like特徴量とは,よくわかりませんがここが全てです.

簡単に説明すると,

  • 探索窓の任意の位置に矩形領域を配置する.
  • 矩形領域に任意のパターンを設定する.
  • パターンの黒領域、白領域それぞれの画素値の和の平均A_1, A_2を求める.
  • それらの差を特徴量Hとする.
  • 矩形領域の位置・サイズ・パターンを変えて繰り返す.
  • 検索窓の位置を変えて上記を繰り返す.

こうして無数の特徴量Hを得られました.お疲れ様です.

予測

recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read("models/test/LBPHF.xml")
def test_get_images_and_labels(image):
face = np.array(image, 'uint8')
label, confidence = recognizer.predict(face)
return label, confidence
 
label,con = test_get_images_and_labels(cv2.resize(face_gray,(200, 200),
interpolation=cv2.INTER_LINEAR))

LBPHとはLocal Binary Patterns Histogramの略です.顔を小さなセルに分割し、それぞれのエリアのヒストグラムを比較します。

参考記事

towardsdatascience.com

 labelが特定した人のid,conが信頼度みたいなものです.

conの閾値を設けることで,よりセキュア(?)な認証になります.今回は経験則から60以下としました.

さらに,labelが30フレーム連続で同一人物であるなどの条件をいくつか設けています.

 

いわいっぺい

こうして,ボスイケボな「いわいっぺい」を聞くことができます.

まとめ

まだまだ,決算システムとしては未熟です.

顔を登録して顔認証してもらうと分かると思いますが,高確率で私のidになってしまいます.顔が平べったいからかもしれない

 vueオタクとまた残留して頑張りたいと思います.

おわり