Better Engineer Life

記事を頻繁に書き直す性格なのでごめんなさい。

論文感想文「ラフスケッチを自動で綺麗な線画にする」

2017年のディープラーニング論文100選 - Qiitaに面白そうな論文がまとめてあったので、こちらの中で興味深いものをピックアップして読んでみることにしました。

選んだのはこちら。

Learning to Simplify:Fully Convolutional Networks for Rough Sketch Cleanup

そんなに英語得意ではありませんが、読んでみた感想を。

概要

Fully Convolutional Networkでラフスケッチを線画にするというものです。

論文に携わった一人であるシモセラ・エドガー氏が日本語で紹介していますので、これだけ見ても概要は把握できるかと思います。

esslab.jp

邦題としては「ラフスケッチの自動線画化」のようです。

詳細については、英語の論文を読むことになります。

論文のイメージとはかけ離れたアニメ絵が登場し、全11ページですので、とっつきやすいです。

一般的なCNN[Convolutional Neural Networks]との引き合い(in contract to the standard CNN models)に出しながら、このFully Convolutional Networkというアーキテクチャについて解説されています。

データセットと訓練

  • 5人のイラストレーターによって描かれた68のデータセット
  • サイズは630x630〜2416x3219
  • 使われている画像は人物だけではなく、建物、仮面もある。

そんなに書いてもらうのも大変ですが、68のデータセットとは想像以上に少ないですね。

よって、画像の訓練では、データ量を増やすようにしています。

前半では数式と図でこのネットワークについて論じてますが、後半はこのデータを増やす手段について述べられてます。

そのデータを増やす(Data Augmentation)手段については、フォトショップまで駆使して、研究者の創意工夫・努力が伝わってきます。

  • 424*424のサイズで使う
  • 元の画像のサイズを拡大(7/6,8/6,9/6,10/6,11/6,12/6,13/6,14/6を選んだのはなぜだろう?)
  • 縮小画像は使わない
  • 水平に反転
  • データを正規化して、0.9未満の値は0とみなす。何度か調整した結果、行き着いた秘伝の値。
  • フォトショップを使い、色調変化(tone)、画像スラー(slur)、ノイズ(noise)を使うと4枚分。

その他

  • GPUを使うと40倍以上のスピードアップ
  • 鉛筆と紙で書いた絵でもオッケー
  • Adobe TraceやPotraceより高いユーザー評価を得られた

文法

文法として、in order toという言い回しが多いですね。

日本語だと、〜ためにと訳されてしまうので、同じようなものかと思ってしまいました。in order toは目的(purpose)に対して使い、becauseは理由(reason)に対して使うものでした。

GitHub

GitHubでツールも公開されています。

github.com

PaintsChainerもありますし、絵(画像)が生成されるのは面白いですね。

残念ながら、肝心の元絵を私は書けないのですが。

政府統計窓口e-Stats APIを使ってみる

政府統計窓口e-Statsには(Web)API形式で提供されています。

こちらを使って分析してみたいと思います。

APIの利用の前に

まず、APIを利用するにはユーザー登録が必要です。

www.e-stat.go.jp

ソーシャルアカウント連携も扱っており、FacebookTwitterでログインすることも可能です。

政府の統計窓口にしては、かなり現代的な出来ですね。

マイページからアプリケーションIDを取得します。

f:id:rimever:20190113224659p:plain

URLは取得APIのURLではなく、利用する側のアプリケーションです。

3つまでしか登録出来ないですが、十分でしょう。

URLは下記のような形

http://api.e-stat.go.jp/rest/2.1/app/getStatsData?appId={アプリケーションID}&lang=J&statsDataId=0001455691&metaGetFlg=Y&cntGetFlg=N&sectionHeaderFlg=1

f:id:rimever:20190113224914p:plain

いけましたね。JSONでも取得できるようです。

詳しくは、公式ページを参考にしてください。

IT業界ではない方からすると、これで何が嬉しいんだ?と思われるかもしれませんが、これならばアプリケーション内部の処理で扱えるためです。

japandasを用いて分析

下記のサイトによると、japandasでestatから取得できる様子。

sinhrks.hatenablog.com

試してみることにします。

インストール

まず、japandasをインストールします。

pip install japandas

japandas.readthedocs.io

japandasライブラリはestats APIの利用だけでなく、日本の祝日カレンダーも扱っているようです。

読み込み

import japandas as jpd

key = "your application id"
df = jpd.DataReader("0001455693", 'estat', appid=key)
df.head()

f:id:rimever:20190113230700p:plain

DataReader関数の0001455693って何?と思ったのですが、統計表IDのことを指します。

統計表のAPIのURLを取得してみると、下記のように表示され、statsDataIdのパラメータを指定すれば良いようです。

http://api.e-stat.go.jp/rest/2.1/app/getStatsData?appId=&lang=J&statsDataId=0001455691&metaGetFlg=Y&cntGetFlg=N§ionHeaderFlg=1

japandasライブラリでは8桁の数字となっているので、おそらく、ライブラリが開発された以降でe-Stats側のAPIの仕様に変更があったと考えられます

私のこの記事も数年後には、過去の資料になるので注意が必要です。

使ってみた感想

使ってみたのですが、一度csvでダウンロードして、整形した方が、私の目的には使いやすいかなと。

pandas.DataFrameのcorr関数について

pandas.DataFrameのcorr関数は、相関係数を求める関数です。

pandas.pydata.org

ここから、seabornでヒートマップで表示というのは私はよくやるのですが、相関を求めるとはいえ、具体的に何をやっているのかはよく理解してませんでした。

相関係数にもいくつか方法がある

www.monotalk.xyz

上記サイトにまとめてあり、pandas.DataFrame.corrを今後も使っていけば良さそうです。

この関数はmethod引数の指定で、3種類の相関関数を算出することができます。

  • ピアソンの積立相関係数 pandasDataFrame.corr(method="pearson") もしくは method引数を省略
  • スピアマンの順位相関係数 pandasDataFrame.corr(method="spearman")
  • ケンドールの順位相関係数 pandasDataFrame.corr(method="kendall")

実際にピアソンの積率相関係数を実装してみる

Pythonで実装しようとすると甘えが出てコピペで終わりそうなので、C#で実装することにします。

f:id:rimever:20190114170529p:plain

Wikipediaより

数式だけ見ると、「うわっ」という感じですね。

/// <summary>
/// ピアソンの積率相関係数を計算します。
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public static double SampleCorrelationCoefficient(IList<double> x, IList<double> y)
{
    var averageX = x.Average();
    var averageY = y.Average();

    var numerator = Enumerable.Range(0, x.Count).Sum(i => (x[i] - averageX) * (y[i] - averageY));
    var denominator = Math.Pow(x.Sum(i => Math.Pow(i - averageX, 2)) * y.Sum(i => Math.Pow(i - averageY, 2)), 0.5);
    return numerator / denominator;
}

実装自体はそこまで難しくありませんでした。

数式を見ると投げ出したくなるので、今後もプログラムに書き起こして、数式と向き合う努力をした方が良さそうですね。

取りうる値は-1〜1です。

片方の値が増えるに従い、もう片方も比例的に増加するのであれば、1となります。片方の値が増えるに従い、もう片方が比例的に減少するのであれば-1となります。

このあたりも、値を調整して動きを観察すると、理解が深まります。

f:id:rimever:20190114173400p:plain

最後に

スピアマンの順位相関係数については、順位を元に算出します。

タイになった場合の計算がややこしそうです。

スピアマンの順位相関係数 - Wikipedia

算出方法を見た感じだけで判断すると、当面はピアソンの積率相関係数で良さそう。

使って見て良さがわかるフラットデザインのアイコン

私のアバターは下記のサイトの素材を利用させていただいてます。

flat-icon-design.com

当初は社内でアバターが必要な機会があって、こちらの素材を使ってました。が、GitHubTwitterはてなと統一してしまうことにしました。

アバター画像は様々な形で表示されます。

f:id:rimever:20190112141404p:plain
画面ヘッダー

f:id:rimever:20190112141527p:plain
GitHubのプロフィール

どうしても写真などですと縮小すると何がなんだかわからなくなってしまいます。

フラットデザインだと大きくしても小さくしてもパッと見で、判別がつきます。

その良さに気づき、使い込んでいるうちにしっくりきたので統一するようになりました。

もちろん提供してくださる方のアイコンのクオリティーの素晴らしさもありますが、フラットデザインの良さなのだなと改めて実感することができました。

Blazorは、まず楽しめばいい

Blazorは、WebAssemblyという仕組みを用いて、C#のコードをブラウザ上で動作するフレームワークです。

Blazorの発表のために昨年夏にとある勉強会に参加したのですが、発表者の方が欠席となってしまい、聞くことが出来ませんでした。

それから.NET ConfなどのMicrosoftのイベントでこのBlazor関する情報は得ていたのですが、実際に、手を動かしてませんでした。

ふと、下記のチュートリアルを実際に動かしてみることにしました。

Build your first Blazor app

英語ですが、プログラムがわかるなら、なんとかなります。

f:id:rimever:20190115210116p:plain

.NET Coreのコマンドラインを使えば、たった4行ですぐにサンプルアプリケーションが生成されます。

chrome で.dllがインストールされるのを確認します。

f:id:rimever:20190115215806p:plain
Microsoftの井上さんが、何度かこんなデモをしていたのを思い出します。

修正後の対応

cshtmlファイルを編集しても再ビルド必要なのか、と。

というのもASP.NET MVCではサーバーサイドのクラスの処理などについてはビルドが必要ですが、 ViewとなるRazorの.cshtmlファイルの修正についてはいちいちビルドせずとも、ブラウザを再読み込みすれば修正が反映されます。

ですので、ここは、おや?と思うところはありました。

もちろん、クライアント側のページ再読み込みも必要です。

対応ブラウザ

私が試したところ、 IE11は途中で進まなくなってしまいました。

EdgeとChromeは大丈夫でした。

新しいWeb開発を体験して欲しい

そもそもBlazorは何をもたらしたいのだろうと考えてみると、C#だけでWeb開発が出来るということ。

Java,Ruby,Go,Pythonなど様々な言語の中でどれが良いのかと議論されたりもしますが、Web開発をする上ではjavascriptなしには語れません。

そのjavascriptなしで、Webが開発出来る。やはり、これは斬新なことだなと。

www.publickey1.jp

C#の仕事をしている人は、デスクトップアプリを開発する方が多いため、そういった人がWebアプリケーション開発に少ない学習量でシフトするための道を作りたいのかなとも思ったりします。

ともあれ、今回、Blazorのチュートリアルをやってみて、一番私が強調したい点は、

開発していて楽しかった!!!

ということです。

  • オンプレ時のデプロイ方法はどうするの?
  • 同じ.NET Core Versionでなくても大丈夫なの?
  • 既存のjavascriptライブラリとの共存は出来ないの?
  • 使うとしてもゲームとかの分野じゃない?
  • 結局、流行らないんでしょう?

とかこんな闇が心の中で渦めく中でチュートリアルを進めていたのですが、サクサク実装出来てしまい楽しんでしまいました。

ASP.NET MVCのRazorというアーキテクチャが私が好きだから、特にそう感じたのかもしれません。

VBの対応については考えておらず、現在C#のみをターゲットに進めているようですし、こうしたWeb開発体験が出来るのはC#だけです。

新鮮な感覚で、このBlazorに触れることができました。

興味を持った方は、あれこれ調べるだけで、評論家で終わってしまわないでください。

チュートリアルを実際にやって、このBlazorという新しいWeb開発を一度体験していただきたい! 

せっかく、C#にこうしたアーキテクチャが与えられたんだから、ハナっから芽を摘まずに温かく見守ろうじゃないかというのが私の感想です。

わかさ生活、始めてみました。〜ブルーベリーアイ

どうしても、パソコンを使った仕事ですので目が気になります。

眼科に通院したこともありますし。

やはり、目にはブルーベリーと言うのは前々から知っていました。

冷凍のブルーベリーだとお手軽でお安く行けることは確かです。

そんな味しないので、食べていて辛かったです。

そこで、わかさ生活ブルーベリーアイを試して見ることにしました。

わかさ生活

支払いは?

商品が着いてからの後払いです。代引だけでなく、コンビニなどでも同様です。普通は先に払って、製品が発送されるものですが、なんと良心的な。

間違って注文したら、キャンセルしないとダメですね。

商品は

結構小さいです。

1日1粒。30粒で1700円です。1日分に換算すると60円弱。

これを高いと思うか、安いと思うかは、効果で判断したいと思います。

下記サイトを参考にさせていただいたところ、朝飲むと良いようです。

beaute.googirl.jp

また、飲み過ぎはダメで、24時間で体外に排出されるので飲み続けることが大事です。

わかさ生活の社長とか

送られた商品と共に、社長からのメッセージが入っていました。

わかさ生活の角谷社長は、若い時に、手術で視野の半分を失い、ご自身も必要だからとブルーベリーアイを開発されたそう。

ご自身も飲まれているというのは、なかなか説得力のある製品ですね。

詳しいことは以下で角谷社長の半生がマンガで紹介されているので読んでみてください。

company.wakasa.jp

心エコー図のデータセット「echocardiogram-UCI」による分析。ウォールモーションって何?

Kaggle上で「Health」で検索しても医療に関するデータセットがヒットしますね。

www.kaggle.com

職業柄、心エコーとか、ウォールモーションって聞いたことあるけど、なんだ?と思ったので心エコー図のデータセットを見てみることにしました。

データセットについて

  • 心臓発作を起こしたことのある患者について1年間生存したかというデータセットです。
  • データセットが132行と多くない
  • 生存していないケースを正しく予測したい(救えなかった命について治療を検討しなければならないということでしょう)

詳細

項目名 説明
survival 生存期間(月)
alive 生存期間の終わりに死亡=0 生存=1
age 心臓発作が発生した年齢
pericardialeffusion 心外液が流動的か(0/1)
fractionalshortening 心臓の周囲の収縮性の尺度。低いほど異常
epss E点中隔分離、収縮性のもう1つの尺度。大きいほど異常
lvdd 左室拡張末期寸法。これは拡張末期の心臓の大きさの尺度。大きいほど病気になりやすい
wallmotion-score 心室のセグメントでどのように動いているかの尺度
wallmotion-index ウォールモーションスコアを見たセグメント数で割った値。心エコー図では12~13のセグメントを見る。wallmotion-scoreの代わりにこちらを使う
mult 無視していい値
name 患者名。置換済み。(よって、不要な変数
group 無視していい値
aliveat1 0=患者が1年以内に死亡/1=患者が1年は生存していた

相関図

ウォールモーションスコアとの相関図が高いようです。

f:id:rimever:20190106195021p:plain

ウォールモーション

このウォールモーションについて調べて見たのですが、かなり専門的な内容のようです。

http://jams.med.or.jp/symposium/full/122040.pdfより

2)16 分画左室壁運動スコア(Wall Motion Score Index : WMSI)

局所的な機能低下が出現する例では,局所的な機能評価が必要である.

一般に左室を 16セグメントに分割し,それぞれの分画で壁運動をスコア化し,評価する.

正常=1,低収縮=2,無収縮=3,外側運動=4,心室瘤=5 点とし,

このスコアの平均値が Wall Motion ScoreIndex(WMSI)である.

WMSI は健常例では1.0 であり,心機能低下が高度なほど高値となる

ただし、上記の引用した内容とは異なり、データセットの場合は、値が高い方が、生存するようなので、計測方法は異なると思われます。

心エコーとは

超音波検査(エコー)の一種です。

超音波で心臓の大きさ、動き、弁の状態、血液の流れを検査します。

目標変数のばらつき

偏ったりしてないだろうかと思ったのですが、そこまでは偏ってませんでした。

f:id:rimever:20190108075555p:plain

このデータを機械学習する難しさ

相関図を出そうとしたら

import seaborn as sns
k  = 8
target_col = 'aliveat1'
corrmat = df.corr()
cols = corrmat.nlargest(k, target_col)[target_col].index
cm = np.corrcoef(df[cols].values.T)
plt.subplots(figsize=(9, 9))
sns.set(font_scale=1.25)
hm = sns.heatmap(cm, cbar = True, annot = True, square=True, fmt='.2f', annot_kws={'size':10},yticklabels=cols.values,xticklabels=cols.values)
plt.show()

Traceback (most recent call last): at cell 7, line 9 at /opt/anaconda3/envs/datalore-user/lib/python3.6/site-packages/seaborn/matrix.py, line 517, in heatmap at /opt/anaconda3/envs/datalore-user/lib/python3.6/site-packages/seaborn/matrix.py, line 167, in init at /opt/anaconda3/envs/datalore-user/lib/python3.6/site-packages/seaborn/matrix.py, line 206, in determine_cmap_params at /opt/anaconda3/envs/datalore-user/lib/python3.6/site-packages/numpy/core/methods.py, line 32, in _amin ValueError: zero-size array to reduction operation minimum which has no identity

となってしまいました。欠損値があるようです。

データセットの説明にもデータの少なさという課題については触れられてました。

一応、機械学習をしてみることにしました。

f:id:rimever:20190113203508p:plain

ううーん。28%は、かなり酷い値。2値問題の結果として、50%を下回るというのは、マズイですね。

f:id:rimever:20190113203903p:plain

散布図にしてみると、ウォールモーションスコアも年齢も、この値以降ならば、aliveat1が1になるという切れ目もない様子。