観照日記

主にIT・ゲームなどの日々の役に立ちそうなことを書いていきます

Switchの在庫入荷をLINEで通知するbotを作った

いきさつ

これは半年前の話である.

スプラトゥーン2の発売を2か月前に控えた5月,Nintendo Onlineストアでは熾烈なSwitch争奪戦が繰り広げられていた.確実にスプラトゥーン2を発売日にプレイするために,不本意ではあるが私もその闘いに参加する必要があった.

Switch争奪戦とはすなわち,「Nintendo OnlineストアにSwitchの在庫が復活したら,すぐに購入手続きを行う」というもので,一見なんの困難もないように思われる.

しかし,

  • 在庫復活のタイミングが日によってバラバラ
  • 在庫復活して早い段階でアクセスしないと,ウェブページにアクセスが集中してサーバがダウンする
  • 在庫復活して早い段階でアクセスしないと,すぐに在庫がなくなる

といった問題があった.とにかく,在庫の復活をいち早く知ることができれば,ほかの血に飢えたプレイヤーより優位に立てるのは間違いがなく,これが在庫状況を自動で通知するスクリプトを書こうと決意した経緯である.

 

システム概要

  1. Nintendoストアに定期的にアクセスして在庫状況を調べる
  2. 在庫があるなら,LINE notifyという通知APIで自分のLINEアカウントに通知

この図は当該システムを友人に説明した際の図である.3分で描いたにしてはよくできている.

f:id:kenmikanmi:20171121220128j:plain

 

通知がきたら,そこから先は自力で購入手続きをし,クレジット決済する(クレジット決済を以てSwitchの在庫確保が完了する).この購入手続きを自動化しようと試みたのだが,ログイン処理とかが簡単にはできなさそうだったのであきらめた.

 

事前準備

ボット自体は手持ちのPCで動くが,LINEで通知するためにはLINEが提供しているサービスを介する必要がある.そのサービスがLINE notifyというもので,自分のアカウントで利用するために個人のAPIキーを発行する必要がある。

 

運用した結果

通知がきても気づかない,通知がきてアクセスしたがすでにオンラインストアがダウンしていた,といったこともありましたが,そういった失敗を20回くらい繰り返したあと,無事購入できました.

 

余談

こういったアカウントもあり,わずかな遅延こそあるものの,様々なサイトの在庫状況を呟いている便利アカウント.

twitter.com

コード

github.com


 

 

論文紹介:Deepfashion

紹介論文

Z. Liu, P. Luo, S. Qiu, X. Wang, X. Tang. "Deepfashion: Powering robust clothes recognition and retrieval with richannotations". Proceedings of IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2016

 

いきさつ

ファッションドメインにおける画像認識の論文を読んでおり,紹介論文もそのうちのひとつ.

 

論文概要

論文の寄与をまとめると,以下の通り.

  • 従来のファッション画像データセットでは,アノテーションの項目数やデータ数の少なさから,現実の画像タスクに対応できるものが少ないという問題があった.そこで新たに画像データセットDeepFashionを提案した.
  • DeepFashionは,800,000枚のファッション画像のデータセットであり,アイテムのランドマーク,豊富なアノテーション,同一のアイテムを店舗や町中など異なるシナリオで撮った画像を含む.
  • DeepFashionでファッションの特徴を学習するCNNであるFashionNetを提案した.FashionNetでは,ファッションの属性推定と,ランドマーク推定を同時に行うことができる.

※ランドマーク:ここでは,ファッションアイテム(もしくは人間)の,肩,脇下,裾にあたる位置

f:id:kenmikanmi:20171119040030p:plain

 

データセット:DeepFashion

ファッションドメインのように,専門的な分野では画像データセットが少ないという問題がありました.とりわけ,パラメータの多い深層学習アーキテクチャでうまく学習を行うためには,膨大なデータが必要となります.そこで,従来よりも大規模で,アノテーションの量も豊富なファッション画像のデータセットDeepFashionを提案しています.

DeepFashionデータセットに含まれるアノテーションは以下の通りです.

  • 50のカテゴリ(セーター,パーカー,…)
  • 1000の属性(素材,柄,形状,…)
  • 座標(ランドマーク点,アイテムを囲うバウンディングボックス)
  • 同一のファッションアイテムの画像ペア

既存のファッション画像データセットとの比較が以下の表です.

f:id:kenmikanmi:20171119041149p:plain

f:id:kenmikanmi:20171119041946p:plain

DeepFashionデータセットの属性別の画像例

 

データ収集

データは,Forever21とMogujieという2つのオンラインショッピングのサイトから収集しています.後者のサービスには,ショップで撮られた画像と,その商品を買ったユーザが撮った画像が含まれており,それらを組の画像として結びつけています。

余談ですが,「ショップなど,理想的な状況で撮影されたファッション画像」と,「ユーザが撮ったノイズを含んだファッション画像」というサブドメインがあります.それらのドメインを越えた特徴表現,つまり,ファッションアイテムの背景や,アイテムの角度の違いといったノイズに対してロバストな特徴表現を学習したいというモチベーションがあり,そうしたタスクに対応できるように意識しているのだと思います.

 

上記のサイトから1,320,078枚,391,482アイテムの画像を収集したらしいです.

 

つぎに,Google検索で”animal print dress”のような,ユニークなクエリを12,654個作って検索エンジンに投げ1,273,150枚の画像を集めます.

 

データクリーニング

収集したデータのうち被った画像を消すために,画像をAlexNetにフィードさせ,fc7層で抽出した特徴量を比較しています.それ以上の技術的なことは書いていませんが,(憶測ですが)特徴ベクトルの類似度を計算し,ある閾値以上の類似度をもつものを除去しているのでしょう.

そして,低解像度だったり,適していない画像を人手で(!)選別し,最終的に800,000枚の画像にします.

 

画像へのアノテーション

  • 50のカテゴリ:”コート”,”シャツ”などを人手でアノテーション
  • 1000の属性:検索クエリやメタデータをもとに自動でアノテーション
  • ランドマーク点:襟,裾,袖の座標のアノテーション.ランドマーク点が隠れて見えない場合は,見えていないというラベルを割り振る.
  • ペア画像の結び付け:前述のとおり,同一ファッションアイテム同士をペアとして結び付ける.

FashionNet

この論文では,膨大なコストをかけて集められた画像データセットDeepFashionを学習するためのCNNアーキテクチャFashionNetも提案しています.

このFashionNetの入出力は,

  • 入力:ファッション画像
  • 出力:ファッション画像のカテゴリ推定,属性推定,ランドマーク点推定

です.ファッションアイテムのランドマーク点を推定できるのが,この論文のデータセットアーキテクチャの新規性です.

 

FashionNetは,画像認識で良い性能を出しているVGG16*1をベースにしており,VGG16の最終層を本タスクに特化した構造にしています.最終層は下図のように3つに枝分かれした構造になっています.

 

f:id:kenmikanmi:20171119051037p:plain

枝の1つは上流のCNNの出力をそのまま流す層(Figure 5. 赤部分

もう1つは,ランドマーク点の出力を行う層(Figure 5. 青部分)

最後に,ランドマーク点の周辺から特徴抽出を行う層(Figure 5. 緑部分)です.

 

FashionNetの学習

FashioinNetは次の損失関数を最適化する学習を行います.

以下の損失関数における, j, D, {\bf x}_jはそれぞれ, j番目のサンプル,訓練サンプル数, j番目の画像に対応します.

ランドマークの位置の距離の二乗誤差

 L_{landmark}=\sum_{j=1}^{|D|} ||{\bf{v}_j} \cdot (\hat{l_j}-l_j)||_{2}^{2}

  {\bf{v}_j}は, j番目のサンプルの各ランドマーク点が画像において見えているかどうかの2値ラベルを保持したベクトルで,見えていないランドマーク点に対応するベクトルの成分は 0となり, i番目のランドマーク点の誤差 ||{v_{ij}} \cdot (\hat{l_j}-l_j)||_{2}^{2} 0となります.

 

属性の分類学習のクロスエントロピー損失

  L_{attributes}=\sum_{j=1}^D (w_{pos} \cdot {\bf a}_j {\rm log} p({\bf a}_j | {\bf x}_j)  + w_{neg} \cdot (1-{\bf a}_j) {\rm log} (1-p({\bf a}_j | {\bf x}_j)))

  w_{pos},w_{neg}は,属性ラベルが割り当てられたサンプル数の割合に対応しています.すなわち

 w_{pos}:その属性が訓練サンプル全体に占める割合

 w_{neg} 1-w_{pos}

直感的には,特定の属性をもつサンプルが多く,特定の属性をもつサンプルが少ない場合に,それらの損失の割合が属性ごとのサンプル数によって偏ってしまうのを避ける,みたいな意味がありそうなのですが,なぜこのように重み付けするのかよくわかりません…

 

ランク学習の損失

 L_{triplets}=\sum_{j=1}^{|D|} {\rm max}\{ 0,m+d({\bf x}_j,{\bf x}_j^+ )-d({\bf x}_j,{\bf x}_j^-)\} 

式中の d(・,・)は,特徴量間のユークリッド距離を求める関数です.

ランク学習とは,簡単に言えば,「類似した画像同士の特徴量は特徴空間で近くなってほしいが,まったく異なる画像同士は特徴空間上で離れていてほしい.つまり,学習のコンセプトは,類似画像同士の距離が近くなるように,非類似画像同士の距離が遠くなるようにパラメータを更新する」というものです.下図に概念図を示します.

 

f:id:kenmikanmi:20171119130002p:plain

Anchor画像(基準)に対してPositiveな画像は学習後により近くなり,Negativeな画像は特徴空間上でより遠くなる学習を行う

損失関数では, ({\bf x}_j,{\bf x}_j^+)同士が離れるほど損失が増え, ({\bf x}_j,{\bf x}_j^-)同士が離れるほど損失が減る.というのを数式で表現しています.


DeepFashionデータセットには,もともとファッションアイテムのペアとなる画像がリンク付けされていますから,それらの類似画像対を ({\bf x}_j,{\bf x}_j^+)として選びます.非類似画像対 ({\bf x}_j,{\bf x}_j^-)の選び方は論文中には記載がありませんでしたが,ランダムに選んだり,属性やカテゴリの一致しない画像を選んだりしているものと思われます.

 

・カテゴリの分類学習の損失

出力をソフトマックス関数で [0,1]正規化して,一般的な分類学習と同じクロスエントロピー損失を求めます.

 

実験

データ

DeepFashion 300,000枚を学習,50,000枚でテストする.

比較手法

以下が比較手法.上2つが従来手法で,下4つはFashionNetの学習に用いるアノテーションを変更したもの.アノテーションの質が異なると,精度がどれだけ異なるかを検証している.

  • Where To Buy It(WTBI) *2
  • Dual Attribute-aware Ranking Network *3
  • FashionNet+100: L_{attribute}の学習で,分類に利用する属性数を100とした
  • FashionNet+500: L_{attribute}の学習で,分類に利用する属性数を500とした
  • FashionNet+Joints:ランドマークを,人の姿勢推定手法*4アノテーションしたもの
  • FashionNet+Poselets:ランドマークを,人の姿勢推定手法*5アノテーションしたもの

実験結果

以下の図は,学習済みのFashioNetから抽出した特徴量を使って,画像検索をしたときの出力例とtop- kの検索精度です.グラフの赤い線がFashionNetの推移を示しています.この画像検索では,ショップ画像*6をクエリとして,ショップ画像を検索しています.

f:id:kenmikanmi:20171119131217p:plain

画像検索の実験結果.図は論文より.

これも同じく画像検索ですが,アイテムの購入者が撮ったノイジーな画像をクエリにしたときの検索結果です.精度は下がりますが,背景や人物に対するロバスト性があることがわかります.

f:id:kenmikanmi:20171119131221p:plain

画像検索の実験結果.図は論文より.

==============

ほかにも書きたいことがあるのですが,数日以内に加筆します…


*1:K. Simonyan and A. Zisserman. Very deep convolutional networks for large-scale image recognition. arXiv preprint arXiv:1409.1556, 2014

*2:M. H. Kiapour, X. Han, S. Lazebnik, A. C. Berg, and T. L. Berg. Where to buy it: Matching street clothing photos in online shops. In ICCV, 2015

*3:J. Huang, R. S. Feris, Q. Chen, and S. Yan. Cross-domain image retrieval with a dual attribute-aware ranking network. In ICCV, 2015.

*4:Y. Yang and D. Ramanan. Articulated pose estimation with flexible mixtures-of-parts. In CVPR, pages 1385–1392, 2011

*5:L. Bourdev and J. Malik. Poselets: Body part detectors trained using 3d human pose annotations. In ICCV, pages 1365–1372, 2009

*6:ショップ画像とは,オンラインショップなどで見られる理想的な環境で撮られた画像のことです.

ニューラルネットワークで2クラス分類してみた

概要

  • ニューラルネットワークで2クラス分類器を実装した
  • よい精度が出なかった(識別精度58.9%)
  • よい精度が出なかったのは、そもそも分類に有用な特徴がデータセットに含まれていなかったからであった(以下の図は、8つの特徴と、それに対応した2クラス(赤・青)の散布図行列)

f:id:kenmikanmi:20170712121940j:plain

 

 

いきさつ

『ゼロから作るDeep Learning』(斎藤 康毅 著/オライリー・ジャパン)という本がラボの書架にあり、ニューラルネットワークの仕組みとPythonでの実装との対応の説明が詳しくなされていたので、知識の確認と、それを実際に動かす目的で読んでいました。

 本ブログでは、実際にニューラルネットワークを学習させ、分類させてみた話をします。

 

実験

UCIカルフォルニア大学アーバイン校)が公開している機械学習用のデータセットUCI Machine Learning Repository)の一つに、Abalone(アワビ)のサイズと年齢に関するデータセット Abalone Data Set  があります。

このデータセットは、次のような属性から成ります。

f:id:kenmikanmi:20170712023736p:plain

 

この実験では、上8つのアワビの身体的特徴を用いて、そのアワビのSex(雌雄)を分類してみます。つまり、与えられたアワビの身体的情報から、そのアワビがオスかメスかを分類します。

ネットワークは次のように構成します。

 

f:id:kenmikanmi:20170712025851p:plain

 

学習用データ数2552、テストデータ数283として、次の表に示すパラメータで学習します。

 

f:id:kenmikanmi:20170712030055p:plain

 

ネットワークの出力層にSoftmax関数を用いることで、2ユニットの出力は[0,1]のレンジをとるように正規化されます。これを入力データ(を与えるアワビ)が、雌である確率p(m)、雄である確率p(f)のようなものとして考えることができ、分類は

 p(m)≧p(f) ならば 雄

 p(m)<p(f) ならば 雌

として行うことができます。

 

実験結果

雌雄の分類精度は、テストデータに対して58.9%でした。

 

考察

 入力によらずランダムにクラスを判定する分類器があるとすれば、そのような2クラス分類器は50%の精度を出すでしょう。このようなランダムな分類器が、283個のテストデータのうち58.9%を正しいクラスに分類する確率は計算により0.00275(0.275%)となります。よって、今回実験によって学習したネットワークは、統計的有意に、ランダムな分類器よりは高い精度を持つと言えます(統計にはあまり自信がありませんので間違っているかもしれません)。しかし,この58.9%というのは高い識別精度であるとは言えません。


 以下の図は,このデータセットの散布図行列を示しており、赤青のプロットは雌雄に対応しています。対角線上の分布が示すように、これらの8つの特徴は、雌雄を分類するうえであまり有用ではないことがわかります。つまり、そもそも雌雄の2クラス分類が困難なデータセットであったと言えます。

f:id:kenmikanmi:20170712121940j:plain

結論

最初から散布図行列を可視化するといったことをして,果たして予測が可能なデータなのか,有用な特徴が含まれているデータなのかを知ることが必要だとわかりました!