読者です 読者をやめる 読者になる 読者になる

ytbilly3636’s 研究備忘録

機械学習,Python,ガンダムなど

CIFAR-100のスーパークラスを調べた

こんにちは.
このブログを始めた当初は週一くらいのペースで更新するつもりでしたが, 先週はうっかり更新を忘れていました. まぁ気楽に行きましょう.

ChainerからCIFAR-100を読み込む

ChainerにはMNISTやCIFAR-10,CIFAR-100などといったよく使われているデータセットを読み込む機能が実装されています.

import chainer
from chainer import datasets

train, test = datasets.get_cifar100()

中身を覗いてみます.画像の出力にはOpenCVを使いました.

#さっきの続き

import cv2
import numpy as np

image = train[0][0]    # trainの0番目の画像
label = train[0][1]    # trainの0番目のラベル

print label

# 画素が0~1に正規化されているので255倍
cv2.imwrite("image.jpg", np.rollaxis(image, 0, 3) * 255)

以下の画像が出力されました.
f:id:ytbilly3636:20170408223036j:plain
なんでしょうか.牛ですかね.ラベルは19番でした.

CIFAR-100のスーパークラス

CIFAR-100は100クラスの画像データセットになっていますが, これは20のスーパークラスに分類されており, 各スーパークラスは5クラスが内包されています.

CIFAR-10 and CIFAR-100 datasets

ところがどっこい, Chainerのget_cifar100()から取得したデータにはこのスーパークラスの情報が(多分)含まれていません. 私はデータがスーパークラスに分かれた状態のデータセットが欲しかったので, なんとかスーパークラスにに振り分ける方法はないものか,と調べてみたものの結局見つからず…….

手動でクラスを調べてやりましたよ

OpenCVで画像を可視化して,0番がリンゴで1番が観賞魚で……と一枚一枚確認していきました. 以下に私の努力の成果(笑)を示します.間違いがあったらごめんなさい.

Superclass Classes
aquatic mammals beaver(4), dolphin(30), otter(55), seal(72), whale(95)
fish aquarium fish(1), flatfish(32), ray(67), shark(73), trout(91)
flowers orchids(54), poppies(62), roses(70), sunflowers(82), tulips(92)
food containers bottles(9), bowls(10), cans(16), cups(28), plates(61)
fruit and vegetables apples(0), mushrooms(51), oranges(53), pears(57), sweet peppers(83)
household electrical devices clock(22), computer keyboard(39), lamp(40), telephone(86), television(97)
household furniture bed(5), chair(20), couch(25), table(84), wardrobe(94)
insects bee(6), beetle(7), butterfly(14), caterpillar(18), cockroach(24)
large carnivores bear(3), leopard(42), lion(43), tiger(88), wolf(97)
large man-made outdoor things bridge(12), castle(17), house(37), road(68), skyscraper(76)
large natural outdoor scenes cloud(23), forest(33), mountain(49), plain(60), sea(71)
large omnivores and herbivores camel(15), cattle(19), chimpanzee(21), elephant(31), kangaroo(38)
medium-sized mammals fox(34), porcupine(63), possum(64), raccoon(66), skunk(75)
non-insect invertebrates crab(26), lobster(45), snail(77), spider(79), worm(99)
people baby(2), boy(11), girl(35), man(46), woman(98)
reptiles crocodile(27), dinosaur(29), lizard(44), snake(78), turtle(93)
small mammals hamster(36), mouse(50), rabbit(65), shrew(74), squirrel(80)
trees maple(47), oak(52), palm(56), pine(59), willow(96)
vehicles 1 bicycle(8), bus(13), motorcycle(48), pickup truck(58), train(90)
vehicles 2 lawn-mower(41), rocket(69), streetcar(81), tank(85), tractor(89)

※かっこ内が0~99のラベル番号になります.

Pythonによる画像の二値化

こんにちは.久しぶりの技術系ネタです.

先日研究室でこのような会話がありました.

メンバ「Pythonで画像の二値化ってどうやってる?」
わたし「OpenCVのメソッドを使ってます」
メンバ「そっか……OpenCV入れないといけないのか」
わたし「あ,ちょっと待ってください!」
(しばらく経って)
わたし「OpenCV無しでもできました」
メンバ「ありがとう,お礼にお菓子をあげよう」

ということで,お菓子をもらえたのでここで共有しておきます.

実装したコード

実行にはNumpyとOpenCVの導入が必要です.

$ sudo apt-get install python-numpy
$ sudo apt-get install libopencv-dev python-opencv

下記のコードでは, 画像(image_example.jpg)をグレースケールモードで読み込み, OpenCVの二値化処理とOpenCVを使わない二値化処理を行っています. 閾値は適当に127としました.

#!/usr/bin/python
#-*- coding:utf-8 -*-

import numpy as np
import cv2

# original image (gray scale image)
org_img = cv2.imread('image_example.jpg', 0)

# preference
THRESHOLD = 127
MAXVALUE  = 255

# binarization using opencv
_, bin_cv2 = cv2.threshold(org_img, THRESHOLD, MAXVALUE, cv2.THRESH_BINARY)

# binarization not using opencv
bin_npy = np.zeros(org_img.shape, org_img.dtype)
bin_npy[np.where(org_img > THRESHOLD)] = MAXVALUE

# check
cv2.imwrite('original.png',   org_img)
cv2.imwrite('binary_cv2.png', bin_cv2)
cv2.imwrite('binary_npy.png', bin_npy)

結果

入力画像(image_example.jpg)には昨年タイに行ったときに撮影した遺跡の写真を使いました. f:id:ytbilly3636:20170325234024j:plain

original.png f:id:ytbilly3636:20170325234130p:plain

binary_cv2.png f:id:ytbilly3636:20170325234158p:plain

binary_npy.png f:id:ytbilly3636:20170325234216p:plain

簡単な解説

OpenCVの二値化はthresholdというメソッドに画像を渡すだけです. このメソッドの返り値は2つありますが,処理後の画像は2番目になるようです. 引数の詳細については下記リンクを参照してください.

Miscellaneous Image Transformations — OpenCV 2.4.13.2 documentation

OpenCVを使わない場合は,numpy.whereというメソッドを活用します. このメソッドは引数の条件を満たすインデックスを返却します. つまり上記の例ではorg_imgの中から閾値よりも大きい要素のインデックスを返却しています. そのインデックスの部分を255,それ以外を0にすることで二値化画像を生成しています.

ガンダムエクシアダークマター2 ゲート処理

こんにちは.

今回の日記は先日購入したエクシアダークマターの作成記録その1です. 実を言うとこちらのガンプラは既に組み上がっているのですが,写真を撮るだけ撮って忘れていましたので久しぶりの更新です. さて,今回は作業工程の一つ「ゲート処理」について紹介いたします.

ゲート処理の必要性

ゲート処理を行った結果を示す前に,その必要性について紹介しておきます. まずはゲート処理というものを私が知らなかった時に組み立てたガンプラの写真を御覧ください. f:id:ytbilly3636:20170319202653j:plain こちらはグラハム・エーカー専用ユニオンフラッグの足先のパーツになります. 所々にポツポツと白い凸が見えるかと思います. これはパーツをランナーから切り離す際に切れ味の悪いニッパーで切断したため, パーツが白色化したことによって出来たものです.

基本的にニッパーでパーツを切断すると断面が白色化します. 切れ味の良いニッパーを使うと白色化は軽減されますが, ニッパーの切れ味は永遠に持続するわけではありません.

この部分をヤスリで削り落としてから,塗装をすればそれなりに目立たなくはなると思います. しかし,ヤスリがけは非常に手間のかかる作業ですし,私の場合塗装までは行わないので, ヤスリをかけてしまうとその周りのパーツの色までもが落ちてしまうため, 余計にその部分が目立ってしまいます.

デザインナイフによるゲート処理

では,エクシアダークマターの事例を用いてゲート処理を紹介いたします.

まずニッパーでパーツをランナーから切り離してみます. f:id:ytbilly3636:20170319203942j:plain 写真の左下部分と右下部分に切り離した後が見えるかと思います. こちらの場合も切断面がやや白くなっています. この部分をゲート処理によってきれいに仕上げていきます.

ゲート処理には切れ味の良いデザインナイフを使います. 私はタミヤのデザインナイフを使っています. 替刃がたくさんついているので,時々交換して切れ味の良い状態を保っています. f:id:ytbilly3636:20170319204200j:plain ナイフを使って先程のゲート部分を徐々に徐々に削っていきます. ポイントとしては,ニッパーで切り離す際に少し余裕を持って切り離しておくことと, ナイフで削る際には焦らずに少しずつ削っていくことです.

詳しいやり方については下記の動画がわかりやすいかと思われます. 私はこちらの動画を見てゲート処理を勉強させていただきました. www.youtube.com

以上の方法でゲート処理を施したのが下記の写真になります. f:id:ytbilly3636:20170319204602j:plain ほとんどゲート跡が目立たなくなっているのがお分かりいただけるでしょうか. この処理を全てのパーツについて行っていきます.

但し,組み上がった際にどう考えても表に出ないであろう部分には処理を施しません. なんだかんだ言ってゲート処理はめんどくさいですからね.

フライパンで広島のお好み焼きをつくった

こんにちは.

年度末ということで最近研究室がバタバタとしています. バタバタとしてくると平日は帰りが遅くなり食生活も乱れてきます. 休みの日くらいはヤサイをきっちりと摂りたいところですね. ということで,今日はヤサイをたっぷり摂れるお好み焼きをつくりました.

材料は以下の通りです. キャベツは自分で刻んでもいいですし,豚肉をシーフードに変えても美味しいです. 既に切ってあるキャベツを使うと包丁を使わなくてよいので楽です.

  • キャベツの千切り 150g
  • もやし 適量
  • 豚バラ肉 適量
  • 小麦粉 50g
  • 卵 2個
  • そば 1玉
  • ソース 適量

f:id:ytbilly3636:20170312210034j:plain

まずは生地を作ります. 小麦粉約50gと水70ccとみりん少々をダマが出来ないようにしっかりと混ぜます.

f:id:ytbilly3636:20170312210519j:plain

油を引いたフライパンに生地を伸ばします. ここで生地を使い切らず少しだけ残しておいてください. ちなみに写真のフライパンは直径20cmの小さめのフライパンです.

f:id:ytbilly3636:20170312210709j:plain

生地の上にキャベツともやしと豚バラ肉を重ねていきます. ここで適当に塩コショウを振っておきます. その上から先ほど残しておいた生地をかけます. 本来であればもう1枚か2枚ほど豚バラをのせたいところですが, お昼ごはんに食べてしまって2枚しか残ってませんでした.

f:id:ytbilly3636:20170312211020j:plain

広島のお好み焼きはパリっと焼くと非常に美味しいです. 生地をパリッと焼きたいので生地にしっかりと焼き目がつくまで待ちます. 但し,焦げてしまうと台無しになるので弱火から中火くらいでじっと待ちます. 時々フライ返しで裏面の様子を見て,適当なところでひっくり返します.

f:id:ytbilly3636:20170312211316j:plain

上手くひっくり返すポイントは以下のとおりです.

  • くっつきにくいフライパンを使う
  • 鍋を振りながら勢いをつけてひっくり返す

ひっくり返したら形を整えながらフライ返しで押さえつけます. 関西のお好み焼きでは生地を押さえつけてはいけないというのは有名な話です. それは生地をふっくらと焼き上げたいからです. 広島の場合はパリッとした仕上がりにしたいので, しっかりと押さえつけてヤサイの水分を飛ばします.

f:id:ytbilly3636:20170312211819j:plain

しっかりと水分を飛ばすためにじっくりと時間をかけます. 焦がさなければ大丈夫です. 具材の水分を飛ばし,ある程度かさが減ってきたら一度お皿にあげておきます.

f:id:ytbilly3636:20170312212038j:plain

次はそばを焼きます. ほぐれやすくするために予め電子レンジである程度温めておくことをオススメします. 私の場合,そばに少量のケチャップを入れます. ここで入れすぎるとナポリタンのようになってしまうので気をつけてください. あとは適当にオタフクソースをかけてしっかりと混ぜます. そばも軽く焼き目をつけて,パリッとさせましょう.

f:id:ytbilly3636:20170312212401j:plain

最後に卵を焼きます. 卵は1個で十分だと思いますが,私は卵が好きなので2個使います.

f:id:ytbilly3636:20170312212624j:plain

黄身を割って均等にほぐします.

f:id:ytbilly3636:20170312212713j:plain

その上に焼きそば,最初に焼いた生地とヤサイの順で重ねます. ここまでくれば後はひっくり返すだけです.

f:id:ytbilly3636:20170312212837j:plain

最後にソースをかければ完成です. またお好みで青のりや青ネギ,ゴマ,紅ショウガなどを加えるといいかと思います. またここで少し火を通すと生地がパリッと仕上がる上に, ソースに少し焦げがついて香ばしい香りをつけることが出来ます.

f:id:ytbilly3636:20170312205736j:plain

ということで,お好み焼きの作り方を紹介しました. かなりボリュームがあって,宅配ピザのSサイズくらいはあるかと思われます. パリッと焼き上げることができれば,かなり本格的な味に近くなるので, 試してみてはいかがでしょうか……

このブログ,どこが研究の備忘録なんだろう…….

学会に参加したときに必ずやること

こんにちは.

先週,学会で研究の発表をしてきました.
一人で見知らぬ地への参加は少し不安がありましたが,
日本語の発表かつそれなりに見知った方もいらっしゃったので,
緊張することなく無難に発表を終えることができました.

さてタイトルに書きましたように,
今回は私が「学会に参加したときに必ずやること」
についてお話したいと思います.

実を言うと,今回の内容の一部はとある先生の受け売りです.
その先生に教わって以来,学会参加の度に試してきましたが,
これがなかなかいい感じなのでご紹介したいと思います.

1.発表練習は数十回する

発表前には練習をして制限時間内に話せるようにしておくのは当たり前です.
しかし,数回しか練習をしないという方もいらっしゃるのではないでしょうか.
発表練習がどれくらい必要かというのは人それぞれだとは思いますが,
たった数回の練習で十分なパフォーマンスを発揮できる人は極稀かと思います.

私の場合,通し練習を20回以上は行います.
ある先生曰く40回は必要らしいです.

回数を重ねていくと徐々に余裕が生まれてきます.
初期段階では詰まらずに話せるようになり話すスピードが上がります.
次の段階では話す内容やスライドを覚えてくるのでカンペに頼らなくなります.
カンペに頼らなくなれば聴衆を意識しながら話せるようになります.
……

といったように発表がうまくなっていきます.
私は聴衆の反応を見ながら話し方を変える余裕が生まれるまで練習します.

また,手元にストップウォッチを置きながら練習すると,
自分の発表のペースを確認することができるので,
スライドの時間間隔を把握しながら発表できてオススメです.

2.座長に挨拶をしておく

発表の練習をすれば,残る不安要素は質疑応答だと思います.

こればかりは自分の研究や関連研究について
しっかりと把握する以外対策がないと思いますが,
座長に事前に挨拶をしておくと精神的に少し楽になります.

セッションの合間の休憩中が挨拶のチャンスで,
「プレゼンのテストをさせていただいてよろしいでしょうか」
と座長に一言かけ,
「質疑応答の際にはよろしくお願い申し上げます」
と言っておけば,優しく質問をしてくれると思います……,多分.

3.懇親会に積極的に出る

もし,時間的・金銭的に余裕があればの話です.

私は人見知りをするタイプで,
よく知らない人とご飯へ行くのは苦痛に感じるのですが,
いざ参加すれば同世代の学生が多く,
アルコールが入った大人たちの中には学生のようになる方もいらっしゃるので,
最終的には楽しかったなと思えることが多いです.

また,似たような学会に参加すると,
参加者はオーバーラップするので,
懇親会で仲良くなっておけばまたどこか出会えたりします.

また,ここで座長の先生にビールをついでおけば完璧でしょう……,多分.


というところで今回の話は以上になります.
これから初めて学会に参加する方は実践してみてはいかがでしょうか.

それではさようなら.

紺ちゃんはいけないことをしてしまったのか

こんにちは.

私は週に数本の深夜アニメを観る習慣があるのですが,
昨日観た『うらら迷路帖』というアニメの八占(第8話)に気になることがあったので, そのことについてお話します.

うらら迷路帖 公式ホームページ|TBSテレビ

ネタバレを含むのでご注意ください

まずは,簡単な設定から.

このアニメは「うらら」と呼ばれる占い師の女の子達のお話です.
うららは神様の力を借りて占いをすることができます.
うららにはいくつかルールがあるのですが,
その中に神様について占っては(知ろうとしては)いけないというルールがあり,
もし占ってしまえばうららの力を失ってしまいます.

ストーリーは4人の見習いうららを中心に展開されていきます.

第8話は,女の子たちが泉に遊びに行くところから始まります.
※いわゆる水着回でした.
そんな中,1人の女の子「紺」が「いけないこと」を試してみたいと申し出ます.
「いけないこと」とは「泉中術」という占いのことでした.
これは泉の中に2人のうららが潜り,力を合わせて占いを行うというもので,
強力な力を使うことができるが,なんらかの危険が伴う占いのようです.

「千夜」と「紺」は2人の力を合わせて泉中術をやってみることにしました.
泉中術は成功したかのように思われましたが,ここで問題発生.
2人は泉の中でお化けに出会ってしまい,あわてた「紺」は溺れてしまいます.
※その後普通に助かります.

なんやかんやあって一行は泉から帰るのですが,
紺は泉の中で出会ったのはおばけではなくて神様で,
泉中術を通じて神様のことについて占ってしまったのではと心配になります.

そんな紺を心配した他の3人は紺を元気づけ,
最終的に紺が占いをできるかどうかを試して,無事成功.
紺はうららの掟を破ってない,めでたしめでたしと言うお話でした.

さて,前置きが長くなってしまいましたが,
私が気になったのは紺が占いをできるかどうかを確認したという部分です.

占いができるかどうかを確認=出会ったのが神様かどうかを確認

ということは間接的に神様について占いで調べようとしたことになります.
これはうららのルールに反するのではないかと疑問に思った次第です.

ストーリーでは,紺が見たのは神様じゃなかったからセーフという判定でしたが,

Q.これが神様ですか?
A.違います

という問答を繰り返せば,
いつかは神様を探り当てることができてしまうかもしれないので,
神様の判定は少しゆるいのではないでしょうか.

つまり,紺がお化けが神様かどうかを疑った時点で,
なんらかの占いを行えばうららのルールを破ってしまうことになるので,
結果がどうであれ占いを行うことはできなくなります.
うららとして詰みです.

と,なんやかんや申し上げましたが,
このアニメはそういう部分を気にしながら観るアニメではなく,
可愛い女の子のうららとしての日常を楽しむものなので,
はっきり言って紺ちゃんが掟を破ったのどうのはどうでもいいことです.

ちなみに私はノノちゃんが好きです.
以上です.

Raspberry PiにChainerを入れた話

小ネタです.

先日Raspberry PiにDeep LearningのライブラリChainerをインストールしました. Raspberry PiのスペックではDeep Learningは全く実用的ではありません.
ただのお遊びです.

私が持っているRaspberry Piはおそらく初期のモデルBです.
確信がないのは貰い物だからです.

インストールはpipで簡単にできます(すぐに出来るとは言っていない).

$ sudo apt-get install python-pip
$ pip install chainer

Chainerがインストールできたら(数時間かかりました),早速MNISTのベンチマークを走らせます.

import chainer
from   chainer import datasets

train, test = datasets.get_mnist()

#中略

学習が始まらない…….

Chainerの場合,get_mnist()を初めて呼ぶとデータのダウンロードから始まります. (正確には「./chainer/」下にデータが有るかどうかを見る.) ダウンロードされたデータはnpz形式で「./chainer/」下に保存され, 次回からはそこから読み出されます. つまりデータセットの準備に時間がかかりすぎているのでした.

今回はその初回のダウンロードにどれだけ時間がかかるかを測ってみました.

結果:3767.43秒

結論は「やめておいたほうが良い」です. Raspberry Piのスペックやインターネット回線の環境にも依りますが,とにかく遅いです. どうしてもRaspberry PiでMNISTを読み込みたいのなら, 普通のパソコンでget_mnist()を実行してダウンロードしてから, Raspberry Piの「./chainer」フォルダに直接入れてしまいましょう.