ごはんと飲み物は紙一重

このブログはモチベーションアップのために情報工学関連について記事を更新していこうと思います。三日坊主にならないよう頑張ります。

今後の進路とかいろいろ

今後の進路とかいろいろ

この一週間はわりと自分の進路を見直していた気がする.就職するのか院進するのかどうするのか.時期は3年前期なので早いかって言われちゃ早いのかなと思いつつも,かと言って研究室配属されて後ではだいぶ遅いような気も・・・
とりあえず自分の中で見つめ直したのが,

  • なぜ院進したいのか
  • インターンシップ等就職準備を並行でやっている自分は本当に必要なのか

主にこの2点.
院進する理由として,

  • 自分の機械学習に関する知識をもっと深めたい
  • できることなら学会など公の場で結果を残して目立ちたい

っていうのが心のなかにはあったのですが,もっと根本にまでもどると,

  • 実績を残すことによってより大企業に入社できる足掛けになる
  • 大企業に入社できれば給料も多くもらえる
  • 給料を多くもらってこれから担うであろう家族を養っていきたい

ってのが本当の理由って感じかな.当たり前っちゃ当たり前だけどこんなところが自分の院進したい理由.

大学卒業でそのまま就職してもいいだろうけど,機械学習エンジニアが本格的に需要が増えてくるにはあと2年ほど必要なんじゃないかと踏んでる(今でも大企業やIT系統はどんどん取り入れてはいるのですが).

1年浪人して今のB4に遅れを取るわけにはいかない(ただの負けん気)のでこれからタスクが増えては来るけどもっと頑張らなくちゃとなった.

技術書の2週目(ゼロから学ぶディープラーニング)

この本わかりやすくていいですね(n回目).微分積分の知識と行列の内積の最低限の知識があれば理解できる感じなので難易度的にもすごく助かってます.

6月のPythonBeginnersに向けた読書です.そろそろ本格的に研究には取り掛かっていきたいので,基礎勉強と研究への着手を少しづつ進めている感じ.先週金曜日には実際に研究室の学部ゼミに聴講(という名のがっつり参加)して,B4と遜色なくゼミをこなしました笑

B4は優秀なメンバーがそろっていてみんなちゃんと研究テーマをしっかりと固めている模様.私も負けてられない.

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 | 斎藤 康毅 |本 | 通販 | Amazon

【俺妹】俺の黒猫をディープラーニングで精度を高めないわけがない No.1

1年勉強した成果を見せる

去年の夏,深層学習のコトハジメとして初めて自分自身でオリジナルとしてやってみた画像認識だけど,初めて触ることが多く結局ソースや学習など様々な面で課題を残したままスルーしてしまったので再挑戦をしてみようかと.

データセットの見直し

正直データを回転したデータはあまり結果としてかさ増しした意味はなかったので,別の方法で整えてみようと思う.

回転のデータを削除(かさ増しした分の削除)

とりあえずはデータ整理.貴重なデータはしっかり活用していかないと.というわけでここはシェルさんに頼る形で.

num=`ls -1 | wc -l`
start=`expr $num \/ 5 \* 2`
for i in `seq $start $num`
    do
        rm $i.jpg
    done

まずはかさ増しした分を削除.数値とかはうまい具合に調整して使った.なんで2/5が良かったのかはわかんね.

学習画像の生成

今回見直す箇所としては,

  • データのかさ増し(様々な方法で)
  • 画像の正規化

前回制度が96.9%といえど本当にその精度なのか?と疑ってしまうような結果だったので,まずは学習データの見直しから.

画像の正規化

前回のデータはカラーのまま学習データとして通したので,今回はよりデータを学習しやすいように,

  • 画像の明度(輝度)の調整
  • グレースケール化

の2個を行う.正規化はそんなに難しくなかったので,dataset_adjust.ipynbに記述して変換.

変換前

f:id:ST_ha1cyon:20170516232443j:plainf:id:ST_ha1cyon:20170516232444j:plainf:id:ST_ha1cyon:20170516232655j:plainf:id:ST_ha1cyon:20170516232656j:plainf:id:ST_ha1cyon:20170516232657j:plainf:id:ST_ha1cyon:20170516232658j:plain

変換後

f:id:ST_ha1cyon:20170516232536j:plainf:id:ST_ha1cyon:20170516232635j:plainf:id:ST_ha1cyon:20170516232537j:plainf:id:ST_ha1cyon:20170516232637j:plainf:id:ST_ha1cyon:20170516232638j:plainf:id:ST_ha1cyon:20170516232639j:plain

かなりいい感じ.次はいろいろなフィルタを使ってデータのかさ増しをやっていこうと思う.

↓一応githubで管理もどきしてみてる. github.com

Stepmania5.0.12 for mac が起動しない.

No NoteSkins found

と出てきてしまって.起動しない.

なんでじゃ,とおもってgithubのissueを見ることに.

github.com

すると,

I used

xattr -dr com.apple.quarantine /path/to/StepMania

で通ったらしい.私もそれで出来た.英語ページ読めるからいいけど日本語がないからなんだかんだ時間取られたな.

新入生歓迎LT大会2017 まとめ

準備について

参加募集ページの作成 ◎

  • 1ヶ月前からイベントページをイベントンにて作成
  • News-ieでも発表者登録ページを認知させるために1週間毎に更新させた.
  • イベントンについて
    • タイムテーブルや様々な情報をイベントページに載せることができたから使いやすさ○
    • 発表者登録後の運営からの連絡だったり,個人個人に対する連絡もイベント管理ページから全部できたので比較的使いやすかった.
    • イベントページ概要は普通に書くこともできるけどhtml記法でもかけるから自分は後者の方をつかって編集した.

教室予約・機材準備(外部配信) △

  • 今年はnkさんが長期休暇になってたのでongさん頼りなかんじだったので教室予約・機材準備はメール通してなんとかなった.機材準備についてはongさんにほぼ任せっきりな感じだったけどだいたい機材準備は20分位で終わったよ.
  • 外部配信について
    • なんと今回は機材の使い方を運営がわからない自体になってしまい,外部配信を行うことができなかった!!(白目)
    • そして毎年参加しているongさんが今回は用事で参加できていなかったため誰も使い方がわからないような状態に・・・
    • 運営の力量不足があったけど,正直機材準備はongさんに任せっきりではなくてこうなったらどうしたらいいっていうのをある程度聞いていてくれると本番で困ることはないと思う.今回のLT大会の一番の失態.(追記,USTでは配信されていたみたいだから単純にリンクが違っていた可能性)

告知 △

  • 超重要
  • 開催時はNews-ietwitterをつかって念入りに告知をした
    • が,今年は1年生の参加が10名くらいだった(かなり少ない・・・)
  • B2以上のメンバーはNews-ietwitterの告知で十分周知するけど,B1は2週間前くらいから週1~2回のペースで講義間の休み時間で口頭で告知をしたほうが良かったように感じた.無念

開催中について

運営について ○

  • LT大会の進行役(司会)
  • タイムキーパー(発表者に向けて時間を表示する)
  • TL担当(twitterにて#ieLTのツイートを表示する係

前年よりも役割を減らしたがしっかり動けたかな.ただ去年みたいに会場係を設置しなかったせいで当日の機材トラブルは非常に苦労した・・・

前年との変更点

  • イイネボタンの廃止 ○

    • 先輩からも意見をもらったけど,結局テンポ悪くなるからいらないんじゃないかってなったから消した
    • なくても十分な盛り上がりを見せたので結果的には良かった.
  • 質問タイムの廃止 ◎

    • 今年は質問タイムを廃止して,発表者をどんどん発表させていったおかげで時間はスムーズ(むしろ早いくらい)でLT祭りを締めることができた.
    • 多分質問タイムはいると物によってはグダるからおすすめはしないかな.発表者に楽しんで発表してもらうことが成功への架け橋になると思う.
  • 発表に特別な準備が必要な人以外はすべて1台のPCで発表させた ◎

    • これによって発表は非常にスムーズになった!(大きな成果)
    • 今年は発表者に厳し目の条件を提示して募ったけど4分の3の学生はちゃんと守ってくれたから次回以降もそれなりに厳しくていいと思うんだ.
    • 発表日が近づくたびに運営の連絡を入れたりして,提出日をしっかりと把握させたのはちまちましたところだったけど結果的に良くなった.
    • 提出日に間に合わないor連絡がない人は正直バッサリ切っていいと思う.提出日はちなみにLT祭りの2日前までにした.
      • 2日前にする理由としては,内容にかぶりがないかどうかの確認や,当日のタイムテーブルの決め方を事前に運営が考えられるってのが大きかった.
      • 実際,LT祭り当日は前半はみんな聞いててくれるけど10名過ぎたあたりからみんな疲れてくるので発表順をある程度カテゴライズする必要があった.
      • カテゴライズすることによってスライドの内容が真面目なのかネタなのかわかるため前半に真面目な内容,後半にネタの内容の発表者を降ることで最後まで飽きさせないような結果を出せた.
    • Unityや音楽を流した実演系統はちゃんと自分のPCを使いたいっていう連絡を入れてくれるから,必要な人とはちゃんと連絡を取ること.
    • ネタカブりする可能性があるので,万が一発表者でネタかぶりしてしまった場合はその発表者向けに連絡を取って内容を調整する必要がありそう.

開催後

不参加勢への対応

  • スライドの公開

    • これは参加登録時に先に聞いておくとgood
    • 学内向けに早めに公開していきたいなと感じた.
  • #ieLTのまとめたtogetterの作成

    • 不参加勢があとから雰囲気を知るために,TLを見返す可能性があるから開催後作成しよう

LT祭り開催まとめをかこう

祭りが終わったら,今回のLT祭りがどうだったかを客観的に分析して,来年に活かせるようにまとめを作成しよう.

年明けて・・・

気づけばもう年明けの更新になってしまうみたいですね.あけましておめでとうございます.まさか2016年最後の投稿が俺妹のディープラーニング関連の記事になるとは・・・せめて1年位しめくくれよって話ですが・・・


今年の目標

今年の目標としては

  • 取捨選択をしっかり見極めて実行していく

ですかね.今年に関してはこの目標がすごく大事なところで,今の学期が一番忙しいので,どこに力をそそいでどこで力を抜くかを自分なりに明確化しないといけないなと思いました.

大学入学してからは「何事にも全力でとりくむ!」って感じだったのですが,学年が上がり専門性が徐々に上がってくるに当たって自分のやりたいこととそうではないことの2つに別れるようになってきました.

もちろんどれも大事なことでいずれつながってくることではあるのですが,その全てを習得するためには時間と努力がどれだけあっても足りないです.

だからこそ,本当に必要なこと必要じゃないことを短時間でなおかつしっかりと判断できるように1年間頑張ってみようかなと思います.

現在進行中の目標

今年は一つ決めていることがあって,FIT2017に参加する予定です.成果がうまく残せなかった場合には聴講でのかたちで参加したいと思っているのですが,個人的には何か結果を残して発表する形で参加したいなと考えております.

自分の実力や勉強したことが全国的にどこまでのレベルなのか,またいろいろと知見を増やしていきたいと思っているのでもっともっと挑戦していかないといけないです.

そのために,今目の前に見える課題や,交友関係等,きっちり考えていく必要があるんじゃないかと思いました.

どの理由から辿っても最終的には自分のこの1年の目標にたどり着くんじゃないかと思います.もともと自分は天才型ではなく努力型であることは目に見えてわかっているので,自分を活かすためにも自分を見つめ直したいと思います.

今年も機械学習に深層学習に頑張っていきたいと思います!

【俺妹】大好きな黒猫をディープラーニングで認識しないわけがない【分類編】


前回の記事

twdlab.hatenablog.com


今度こそ最後です.長かった学習もこれにて一区切りです.やっと目的としていた,「大好きな黒猫をディープラーニングで認識」をしていきます!

分類器はそもそもどんな仕組みなのかを知らずに右往左往していたのですが,結局のところざっくりと仕組みを分けると・・・

  • OpenCVでキャラクターの顔認識をする
  • 未知のデータから切り取ったキャラクターに対してテストを行う

の2点になる形です.ん?あれ?えっと・・・

これ簡単に作れないか?

データ下準備編から見てくれた方は察すると思いますが,今回のこの学習までの過程で上記の2つのプログラムは作成してあるんです!つまりこの2つのプログラムを組み合わせて,学習したデータを読み込めば分類が可能ってわけです.

そうこうして組み合わせたプログラムがこちら.

# -*- coding: utf-8 -*-
import sys
sys.path.append("/usr/local/lib/python2.7/site-packages")
import numpy as np
import cv2
import os
import oreimoface as of
import cnn_keras_model as ckm
from keras.utils import np_utils

# #(0)keras関連のモジュール読み込み
from keras.models import Model
from keras.models import model_from_json
from keras.layers import Input, Dense, Dropout, Flatten, Convolution2D, MaxPooling2D

# 最適化手法に使うクラスを読み込む
from keras.optimizers import SGD, Adadelta, Adam, RMSprop

# 引数でファイル名を取得
filename = sys.argv[1]

# クラス数
nb_classes = 8

##(1)モデル準備
#model = Model(inputs, outputs)
json_string = open('1000learn/oreimo_cnn_model.json', 'r').read()
model = model_from_json(json_string)
model.load_weights('1000learn/oreimo_cnn_last_weight.hdf5')

# キャラクターのラベル
chara_name = np.loadtxt("labels.txt", str, delimiter="\t")

# 伝播の設定
def forward(x_data):
    ##(1)予測式(モデル)の構築
    # イメージのピクセルサイズ
    img_rows, img_cols = 28,28
    # 畳み込みフィルタの数
    nb_filters = 32
    # max poolingのサイズ
    nb_pool = 2
    # 畳み込みカーネルのサイズ
    nb_conv = 3

    ##入力を画像データ(配列でいれたい)
    # データの入力
    inputs = Input(shape=(3,img_rows, img_cols)) # 1はチャンネル数

    # 畳み込みによるConvolution Layerの作成(Reluによる正規化(0より小さい値を0とする関数))
    x = Convolution2D(nb_filters, nb_conv, nb_conv, border_mode='valid', activation='relu')(inputs)
    x = Convolution2D(nb_filters, nb_conv, nb_conv, border_mode='valid', activation='relu')(x)

    # MaxPoolingによって各領域の最大値をとって画像を圧縮する
    x = MaxPooling2D(pool_size=(nb_pool, nb_pool))(x)

    # 過学習を防ぐためにデータに対し制約をかける(1/4だけ減らす)
    x = Dropout(0.25)(x)

    x = Flatten()(x)

    x = Dense(128, activation='relu')(x)
    x = Dropout(0.5)(x)

    outputs = Dense(nb_classes, activation='softmax')(x)

##(2)予測式(モデル)のコンパイル
    #sgd_nesterov=SGD(lr=0.01, momentum=0.9, nesterov=True)

    model.compile(loss='categorical_crossentropy', # 誤差関数
            optimizer='adadelta',# 最適化手法(デフォルト設定)
            #optimizer=sgd_nesterov, # 最適化手法(手動設定)
            metrics=['accuracy'] # 評価指標
            )

    import matplotlib.pyplot as plt

# 読み込んだデータを0~1に正規化,numpy.arrayに変換
    X_test = []
    y_test = []
    for f in range(len(x_data)):
        X_test.append(x_data[f])
        y_test.append(f)

    X_test = np.array(X_test).astype(np.float32).reshape((len(X_test), 3, 28, 28)) / 255
    Y_test = np_utils.to_categorical(y_test, nb_classes)
##(4)学習結果の評価
# テストデータに対する評価値
    Y_test_pred = model.predict(X_test)
    #print(Y_test_pred.shape)

    plt.imshow(Y_test_pred, cmap = 'gray', interpolation='nearest', vmin=0, vmax=1)
    plt.show()

    return Y_test_pred

# 顔検出関数
def detect(filename, cascade_file="lbpcascade_animeface.xml"):
    if not os.path.isfile(cascade_file):
        raise RuntimeError("%s: not found" % cascade_file)

    # カスケード分類器の特徴量を取得
    cascade = cv2.CascadeClassifier(cascade_file)

    # ファイル読み込み
    img = cv2.imread(filename)

    # グレースケール変換
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # ヒストグラム表示用のイメージ作成
    gray = cv2.equalizeHist(gray)

    faces = cascade.detectMultiScale(gray,
            scaleFactor = 1.1,
            minNeighbors = 5,
            minSize = (24,24))

    return img, faces

# 検出された顔を識別する関数
def recognition(image,faces):
    face_images = []
    i=0
    for (x, y, w, h) in faces:
        dst = image[y:y+h, x:x+w]#切り取り
        dst = cv2.resize(dst, (28, 28))#リサイズ
        face_images.append(dst)#配列に落とす
        i += 1

    return forward(face_images), image

#識別結果を描画する関数
def draw_result(image, faces, result):
    count = 0
    for (x, y, w, h) in faces:
        classNum = 0
        result_data = result[count]
        rate = np.sort(result_data)[::-1]
        score = rate[0]
        classNum = result_data.argmax()
        recognized_class = chara_name[result_data.argmax()]
        if classNum == 0:
            color = (255,255,51)
            cv2.rectangle(image, (x, y), (x+w, y+h), color, 3)
            cv2.putText(image,"KosakaKirino",(x, y+h+15),cv2.FONT_HERSHEY_COMPLEX, 0.5 ,color)
            cv2.putText(image,"%4.1f%%" %(score*100),(x,y+h+30),cv2.FONT_HERSHEY_COMPLEX, 0.5 ,color)
        elif classNum == 1:
            color = (0,0,0)
            cv2.rectangle(image, (x, y), (x+w, y+h), color, 3)
            cv2.putText(image,"KosakaKyosuke",(x, y+h+15),cv2.FONT_HERSHEY_COMPLEX, 0.5 ,color)
            cv2.putText(image,"%4.1f%%" %(score*100),(x,y+h+30),cv2.FONT_HERSHEY_COMPLEX, 0.5 ,color)
        elif classNum == 2:
            color = (255,0,255)
            cv2.rectangle(image, (x, y), (x+w, y+h), color, 3)
            cv2.putText(image,"GokoRuri",(x, y+h+15),cv2.FONT_HERSHEY_COMPLEX, 0.5 ,color)
            cv2.putText(image,"%4.1f%%" %(score*100),(x,y+h+30),cv2.FONT_HERSHEY_COMPLEX, 0.5 ,color)
        elif classNum == 3:
            color = (255,255,255)
            cv2.rectangle(image, (x, y), (x+w, y+h), color, 3)
            cv2.putText(image,"AragakiAyase",(x, y+h+15),cv2.FONT_HERSHEY_COMPLEX, 0.5 ,color)
            cv2.putText(image,"%4.1f%%" %(score*100),(x,y+h+30),cv2.FONT_HERSHEY_COMPLEX, 0.5 ,color)
        elif classNum == 4:
            color = (255,0,0)
            cv2.rectangle(image, (x, y), (x+w, y+h), color, 3)
            cv2.putText(image,"TamuraManami",(x, y+h+15),cv2.FONT_HERSHEY_COMPLEX, 0.5 ,color)
            cv2.putText(image,"%4.1f%%" %(score*100),(x,y+h+30),cv2.FONT_HERSHEY_COMPLEX, 0.5 ,color)
        elif classNum == 5:
            color = (153,51,255)
            cv2.rectangle(image, (x, y), (x+w, y+h), color, 3)
            cv2.putText(image,"KurusuKanako",(x, y+h+15),cv2.FONT_HERSHEY_COMPLEX, 0.5 ,color)
            cv2.putText(image,"%4.1f%%" %(score*100),(x,y+h+30),cv2.FONT_HERSHEY_COMPLEX, 0.5 ,color)
        elif classNum == 6:
            color = (0,0,255)
            cv2.rectangle(image, (x, y), (x+w, y+h), color, 3)
            cv2.putText(image,"MakishimaSaori",(x, y+h+15),cv2.FONT_HERSHEY_COMPLEX, 0.5 ,color)
            cv2.putText(image,"%4.1f%%" %(score*100),(x,y+h+30),cv2.FONT_HERSHEY_COMPLEX, 0.5 ,color)
        elif classNum == 7:
            color = (0,255,0)
            cv2.rectangle(image, (x, y), (x+w, y+h), color, 3)
            cv2.putText(image,"Other",(x, y+h+15),cv2.FONT_HERSHEY_COMPLEX, 0.5 ,color)
            cv2.putText(image,"%4.1f%%" %(score*100),(x,y+h+30),cv2.FONT_HERSHEY_COMPLEX, 0.5 ,color)

        count+=1

    return image

#ファイル読み込み
img, faces = detect(filename)

result, image = recognition(img, faces)

image = draw_result(image, faces, result)

cv2.imwrite(filename + '_detect.png',image)

完成まで気が焦っていたのもあってほぼやっつけで作ってました((((爆

基本的にはほとんどプログラムの再利用です.ここをオブジェクトごとに分離できていれば完璧だったのですが・・・

分類器の作成には以下のサイトを参考にいたしました.

ket-30.hatenablog.com

先人たちの知恵の結晶は本当に素晴らしいものですね.そして分類した結果がこちら!

f:id:ST_ha1cyon:20161031135935p:plain

100%は言いすぎでしょう・・・w

f:id:ST_ha1cyon:20161031140102p:plain

うををををを!!

f:id:ST_ha1cyon:20161031140151p:plain

だいぶいい感じに分類できているのではないでしょうか!(一部プログラム修正前の画像混じってますがあってるからいいでしょ(((((()

まぁもちろん失敗例もあり・・・

f:id:ST_ha1cyon:20161031140254p:plain

f:id:ST_ha1cyon:20161031140307p:plain

どうしてもちょこちょこバジーナさんの眼鏡を顔と誤認識してしまう時があるようです.ここはOpenCVのパラメータチューニングのところですので,しっかり調整せねば・・・

そんなこんなで無事目標を達成できたのですが,正直この結果にはまだまだ改良点がいっぱいあってもうすこし綺麗にしていかないといけないです.さらにいうなれば,コードもゴミがぼろぼろしてたりと公開できるような内容としてはほど遠いです.しかし,こうして自分のやってきた勉強が結果として現れることはすごく嬉しいことですし,なによりも次のモチベーションへとつながっていきます!

なので,まだまだの内容ではあるのですが公開という形にしました.ですので,指摘とかあればたくさんくれると非常に嬉しいです!この結果を踏まえた上でまた新たな方向へ挑戦していこうかなと考えています!

さぁ次は何を勉強しましょうかね!

おまけ

f:id:ST_ha1cyon:20161031140959p:plain

顔さえ認識してくれれば,なんでも分類はしてくれるみたいなので応用はできそうですw