まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:manhole

今年もマンホーラー実態調査の結果発表の季節がやってまいりました! 2016/Jan/01 から 2016/Dec/19 までのマンホールマップと連携した Google Analytics とアクセスログ、そして実データを使って、2016 年のマンホーラー(注 マンホールが好きな人)の実態と傾向を浮き彫りにする、というビッグデータ解析企画です。ちなみに昨年と一昨年の結果はこちらから参照ください:
 2014 マンホーラー実態調査
 2015 マンホーラー実態調査


2016 マンホールマップ利用動向

2016122002

1回のセッションでの平均ページ数は 4.69、直帰率は 53.53% 、平均セッション時間は 4 分 43 秒でした。昨年は 4.65 と 56.77%、4分22秒だったので全ての数字が改善の方向で推移しています。昨年と比較して、マンホールマップを訪れたユーザーが、より多くのページに移動して長く楽しんでいただいている、ということになります。直帰率 50% 切りも視野に入ってきました。

なお、アクセス数は非公開ですが、昨年比で倍近いページビュー数があった、ということを報告しておきます。


利用者の国、言語

今年は 62 の国/地域からマンホールマップをご利用いただきました(昨年は 65):
2016122012


国別のアクセス数1位はダントツで日本ですが、2位以下は毎年変化しています。さて 2016 年はというと・・・
2016122003


2位は UK(イギリス)からのアクセスでした。なんでだろう?ポンド安でみんな旅行してた?3位アメリカ、4位ロシアあたりは上位の常連国です。 今年目立って高かったのは8位イラク、11位タイ、14位ミャンマーあたりでしょうか。水道関係者やインフラ整備で派遣されている皆様がこれらの国々で活躍されている姿が目に浮かんできます。。



日本国内の市区町村別アクセスランキング

では日本国内の市区町村別ではどのようなランキングだったかを調べてみました:
2016122004


見やすいように日本語で表にして、昨年からの順位推移を含めてみました:
1大阪市
2横浜市
3加古川市
4港区
5新宿区
6名古屋市
7(取得不可) -
8さいたま市
9札幌市
10市川市
11(東京都)中央区
12京都市
13新潟市
14千葉市
15福岡市
16世田谷区
17渋谷区
18神戸市
19船橋市
20江東区


アクセス記録一位は大阪市の2連覇。関西マンホールサミットの影響なのでしょうか?そしていわゆる「大都市」が軒並みランクを下げる中で加古川市や船橋市、市川市といった衛星都市が順位を挙げています。マンホール界では地方分権が進んでいるようです。


利用環境

利用しているブラウザ環境を同様の表にまとめてみるとこんな感じです:
1Chrome34.26%
2Internet Explorer23.34%
3Safari17.13%
4モバイル Safari11.47%
5Edge6.18%
6FireFox4.20%
7モバイル Chrome2.74%
8(クローラーボット)0.24% -
9Opera 0.17%
10Mozilla 互換0.09%


1位は推奨環境でもある PC の Chrome、非推奨環境と明確に言っているにも関わらず2位が IE、3位は Safari、ここまでは昨年と同順位です。変わったのはその下でモバイル Safari が伸びているのは iPhone 利用者が増えていることを意味しています(逆にモバイル Chrome が落ちているので Android 利用者は減っている)。このあたりはグローバルスタンダードを逆行しています(苦笑)。また昨年は 0.55% だった Edge が FireFox を抜いている点も見逃せません。。

なお、10位の "Mozilla 互換" というのは、ネットテレビだったり、ゲーム機だったりが考えられます。まだまだ少ないのですが、いずれこういう環境も増えていくのでしょうか?テレビだと画面が広くて便利そうではありますよね。



まとめ

以上の内容から 2016 年のマンホーラーの実態は以下のようなものであったと推測されます:
・イギリスが EU から分離して、ポンド安に笑いが止まらない人がいる
・マンホーラーは昨年以上に世界中に広まっている。そして日本では地方分権が進んでいる
・マンホーラーは iPhone 派
・大阪熱い!
・Internet Explorer は不滅



さて、次回のブログでは 2016 年マンホールマップ蓋別アクセスランキングを発表します。2016年の MVM(Most Variable Manhole) の行方は!? やなぽんさん、3連覇なるか!? お楽しみに。


昨年末、マンホールマップIBM Watson の画像認識機能を組み込んだ、という記事を紹介しました:
マンホールマップに画像認識機能を組み込む

この記事を作成した当時、Visual Recognition(画像認識)の API は V2 というバージョンでしたが、その後のバージョンアップで V3 になりました。ただその時点では V2 もしばらく使えるということだったのでマンホールマップ側は放っておいたのですが、いつの間にか V2 は使えなくなっており、マンホールマップの画像認識機能が動かなくなってしまっていました(要するに僕の手抜きでした、失礼しました)。

改めて V3 に対応させようとして、上記リンク先で紹介したような手順でマンホール画像の学習をさせて・・・と思っていたら信じられないことが!!!

上記リンク先ページ内でも説明しているのですが、もともと IBM Watson の画像認識サービスでは「マンホール」を識別する機能(正確には classifier)がありませんでした。そのため(自分でカスタマイズする classifier に)「マンホール画像を学習」させて、「その上で(自分でカスタマイズした classifier を使って)マンホール識別」を行う、という手順が必要になり、その内容を紹介したのが上記リンク先ページでした。

が、今回 V3 を試してみて気付いたのは「バージョン V3 では始めからマンホールが識別できるようになっている!」ということです。要するに学習などのカスタマイズを行うまでもなく、標準機能としてマンホールが識別対象として登録されていたのでした。ワトソンに何が起こったのか・・・


・・・唯一思い当たる節があるとすれば、私ですw σ(^^; 先程から紹介しているように、V2 の頃にマンホールを学習させ、識別機能をマンホールマップに組み込みました。マンホールマップはそこそこ(苦笑)のアクセス数を誇る位置情報付きマンホール情報サイトであり、マンホール情報ページへのアクセスがある度に画像認識の識別 API が実行され、そしてその多くは「マンホール」として認識されていたはずでした。要するに「マンホール」と認識されるアクセスがワトソン側にもそこそこあったはずなのです。元々の機能ではマンホールを対象としていなかったはずなのですが、カスタマイズされた結果のマンホールがそれだけの人気があったとすると・・・ と都合よく妄想しただけですが、可能性がないとは言い切れないではないですかっ!


というわけで、現在のマンホールマップでは V3 に対応した識別機能が復活しています。そしてこのマンホール識別はワトソンの標準識別対象になっているものをそのまま使っている、ということを付け加えておきます。
2016090601


マンホールマップ(PC版)
マンホールマップ(スマホ版)


マンホール、およびマンホールマップの話です。


マンホールマップでは登録されたマンホール写真が地図上のどこにあるのか、を調べるだけでなく、どの都道府県のどの市区町村にどんなマンホールがあるか、といった逆引き(?)の検索も可能です:
http://manholemap.juge.me/mc.jsp


こういう話題の際に必ず出てくるのが「市町村合併」の話です。1995年に成立した合併特例法により、2005年から2006年にかけて市区町村の合併がピークを迎えました。俗にいう「平成の大合併」です。法律の変更によって、市になる条件が緩和された上に、財政支援策が拡充されたことで、町や村が合併して市になる(あるいは既存の市の一部として合併する)という動きが見られました。 こういった合併が行われると、合併前の(無くなってしまった)自治体のマンホールは新たに製造されることがなくなるので、「レア物」という形で、ある意味での昇格をする形になります。

↑旧埼玉県浦和市(現さいたま市)のマンホール


で、この市町村合併が行われる際には、同一の都道府県内の市町村が合併する、というのが一般的ですが、ごく稀に例外があります。つまり都道府県を越えた合併が行われることがあります。これが越境合併です。ある日を境に○○県民が住居を変えずに××県民になる、ということが発生します。

比較的最近では 2005 年2月13日、それまでは長野県木曽郡山口村と呼ばれていた地域がこの日から岐阜県中津川市に編入する形で合併が行われました。長野県がちょっとだけ小さくなり、その分岐阜県が大きくなったわけです。

なお、この直前の越境合併は1959年なので、実に46年ぶりの越境合併が行われたことになります。ちなみにこの越境合併によって、旧山口村の郵便番号と自動車のナンバープレート(の管轄支局)も中津川市のものに変わったようです。なぜか市外局番は変わらなかったらしいです。

で、そのような背景を持つ、超レアな旧山口村のマンホールがこちらです。村の木であったツバキと、同じく村の花であったムラサキツツジをあしらったデザインになっています:



財政的な理由もあって、今でも市町村合併や市政への移行は多く発生していますが、道にはその名残が残り続けるわけです。そんな歴史の道しるべという意味でもマンホールは面白いです。デザインの華やかさだけがファンの心を掴んでいるわけではない、ということを紹介したかったのでした。

2016年のコード書き初めで新しいマンホール関連ウェブサービスを作ったので早速公開します。


まず、今回作成したサービスの元ネタアイデアはこの1枚の写真でした:
2016010107
 ↑下水道広報プラットフォームの中山様 元ネタはこちら


この写真自体は、昨年11月に行われた「第7回マンホールナイト」の中で撮影したものです。マンホールを型どった「ミニ顔はめ」を用意し、これと一緒に記念写真を撮ってもらおう、というものでした。これによって誰でも大津市の下水道マスコット「ホール・まん蔵」のような姿に変身することができます:



これ、なかなか面白いアイデアだと思い、もっとどこでも手軽に楽しめないだろうかと考えていました。そのアイデアと、AlchemyAPI が提供する写真の顔認識 API 機能を使い、任意の顔写真画像にマンホールをはめ込んだ合成画像を作るサービスを作れないかと考えたものが、今回実装した誰でもマンホールになれる「マンホライザー(Manholizer)」です:

http://manholizer.mybluemix.net/
2016010101


このマンホライザーは最初の画面で、顔が写っている写真の URL を指定します。例えばこの画像で試してみます:
http://codezine.jp/static/images/article/8900/8900_001.jpg

 ↑翔泳社様の、昨年の夏サミのセッションレポートで使っていただいた画像です


こんな感じで URL 欄に画像の URL を(コピペなどで)指定してください:
2016010102


で Submit すると、指定した画像から顔の位置や、その人の性別・年齢を推測して、マンホール画像の大きさを調整して合成する、というサービスです。女性と判断した場合はピンクの、男性と判断した場合は青いマンホールが合成されます:
2016010103
 ↑ちゃんと顔の位置が認識できてます。また青マンホールなので男性と認識されています。


なお、マンホール上部にはその人の推測年齢帯も表示されるようになっています:
2016010104
 ↑この画像では 18~24 歳と認識された模様です。ありがとうございます(笑)


もちろん1枚の画像に複数人が写っていても構いません。その場合はそれぞれの顔にマンホールを合わせて合成します:


http://uzukin-news.com/wp/wp-content/uploads/2014/09/AKB48-11-HD-Wallpaper.jpg
2016010105

 ↑この画像は、こうなりました↓

2016010106


誰でもホール・まん蔵のようになれる写真合成サービス「マンホライザー」、IBM Bluemix 上で絶賛稼働中です!
http://manholizer.mybluemix.net/



先日紹介した、この↓ IBM Watson の画像認識機能(のバージョンアップ)を Java で実装して、マンホールマップに組み込んでみました:
IBM Watson の Visual Recognition(画像認識)サービスにマンホール画像を学習させる


実を言うと、この画像認識機能自体は以前からマンホールマップのベータ機能として実装していました。が、期待通りの認識結果にならず、むしろ自虐的な「ネタ機能」としての位置付けだったのですが、上記ページで紹介した学習機能のバージョンアップとその実装により、とりあえず「マンホール画像」だと認識できそうなレベルにすることができたので、その報告です。

まず、実際の認識結果が今回の改良前後でどのように変わったかを紹介します。試したのはこのつくば市のスペースシャトル・マンホール蓋画像です:
2015122201


以前のバージョン(v1)でこの画像を認識させた時の結果がこちらでした。「Brown(茶色)」とか「Food(食べ物)」とか「Arthropod(節足動物)」とか・・・ Brown はともかくとして、それ以外に正解といえるものがないような状態でした。もちろん「マンホール」とは判定されていません:

2015122202


このロジックを変更して、前回紹介した方法でマンホールを学習させた上で新しい v2 の API を呼び出すようにした結果がこちらです。1位は見事「Manhole(マンホール)」、それ以外にも「Carpenter_Plane(手作り飛行機)」とか近い結果も出ていますし、「Catacomb(カタコンブ=地下納骨堂)」のようなマニアック(笑)な学習もされている様子が確認できます:

2015122203


この機能はマンホールマップの個別ページで確認することができます。上記のスペースシャトル蓋であればこれです:
http://manholemap.juge.me/page.jsp?id=84004


PC版であれば画面右下の "Visual Recognition" と書かれた箇所をクリックすると認識結果が展開表示されます(認識に少し時間がかかるので、ロード後少しだけ待ってからクリックしてください):
2015122204


スマホ版であれば個別詳細ページ下のここをクリックすると認識結果が展開されます:
2015122205



この機能を実装するには、まずこちらの記事を参考にマンホールを学習させておく必要があります。 その上で /api/v2/classify に対して目的の画像データを POST して、その結果の JSON を取得して解析する、という内容になります。Java であればこんな感じになります:
byte[] img = null;
    :
    :
(img に目的画像のバイナリを読み込む)
    :
    :

PostMethod post = new PostMethod( "https://gateway.watsonplatform.net/visual-recognition-beta/api/v2/classify?version=2015-12-02" );
Part[] parts = new Part[]{ 
	new FilePart( "images_file", new ByteArrayPartSource( "imgFile.jpg", img ) )
};
byte[] b64data = Base64.encodeBase64( ( "(username):(password)" ).getBytes() );
post.setRequestHeader( "Authorization", "Basic " + new String( b64data ) );
post.setRequestEntity( new MultipartRequestEntity( parts, post.getParams() ) );

int sc = client.executeMethod( post );
String json = post.getResponseBodyAsString();
    :
    :

この方法を実装すると、String 型の json 変数には以下のような値が入ってきます:
{"images":[
	{"image":"imgFile.jpg",
	 "scores":[
		 {"classifier_id":"Manhole_1277505833","name":"Manhole","score":0.799763},
		 {"classifier_id":"Brown","name":"Brown","score":0.634311},
		 {"classifier_id":"Carpenter_Plane","name":"Carpenter_Plane","score":0.620247},
		 {"classifier_id":"Wallet","name":"Wallet","score":0.599018},
		 {"classifier_id":"Chocolate_Mousse","name":"Chocolate_Mousse","score":0.582803},
		 {"classifier_id":"Chocolate_Mousse","name":"Chocolate_Mousse","score":0.582803},
		 {"classifier_id":"Diving","name":"Diving","score":0.570293},
		 {"classifier_id":"White","name":"White","score":0.554109},
		 {"classifier_id":"Desert","name":"Desert","score":0.532132},
		 {"classifier_id":"Cliff_Diving","name":"Cliff_Diving","score":0.531722},
		 {"classifier_id":"Zoo","name":"Zoo","score":0.524164},
		 {"classifier_id":"Bottle_Storage","name":"Bottle_Storage","score":0.518594},
		 {"classifier_id":"Catacomb","name":"Catacomb","score":0.512115}]}]
}

あとはこの JSON をデコードして、images 配列最初の要素の、scores 配列の中身を順に調べていけば目的の結果を取り出せる、ということになります。上記のマンホールマップ内ページではその結果を表形式にして表示しています。

画像を扱うウェブページやウェブサービスを運用している皆さま、是非色々試してみてください。


このページのトップヘ