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

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

タグ:manhole

昨年末、マンホールマップ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 配列の中身を順に調べていけば目的の結果を取り出せる、ということになります。上記のマンホールマップ内ページではその結果を表形式にして表示しています。

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


この記事の続きです:
2015 マンホーラー実態調査

恒例となりましたが、2015 年にマンホールマップで最も人気のあったマンホール蓋をベスト10と、今年新たに投稿された中で最も人気のあった蓋の「新人賞」を公開します。

ちなみに「人気があった」という基準は、2015/Jan/01~2015/Dec/19 の間にPC版およびスマホ版のマンホールマップにおいて、単独ページでの通算アクセス数でソートした結果をランキングとしています。

なお、昨年の結果についてはこちらを参照ください:



2015 年新人賞

今年マンホールマップに投稿された蓋の中で、最も多くのアクセス数を記録したのはこの蓋画像でした:
市区町村投稿者画像
中華人民共和国内蒙古自治区42ER03


実はこのモンゴルの蓋は今年の12月に投稿されたもので、通算アクセスランキング的には非常に不利な条件だったにも関わらずに最も多いアクセス数を記録しました。なお、この蓋の人気は全体での総合ランキングでも11位でした。ということはこの1ヶ月間だけでものすごいアクセスを稼いだことになります。 42ER03 さま、おめでとうございます。


2015 年総合ランキングベスト10

では 2015 年アクセスランキングのトップ10を発表します。まずは10位から4位まで:

順位昨年順位市区町村投稿者画像
10-秋田県南秋田郡tainoshippo

↑秋田県八郎潟町の「北前船マンホール」です。いきなり何故これが人気あったのか分からない蓋が出てきました(苦笑)。これだからマンホールは奥が深い(マンホールだけに)。


順位昨年順位市区町村投稿者画像
82東京都三鷹市kakuyodo

↑第8位は同数で2つありました。1つ目は三鷹にある「ジブリ博物館マンホール」でした。ここは東京の中でも比較的交通の便があまり良くない所にあるのですが、マンホール蓋の人気はコンスタントに高いようです。

なお、昨年も同じことを言いましたが、なぜこのデザインがジブリに関係があるのか、私は1年経っても答を調べることができませんでした。登場キャラクターじゃないよね?


順位昨年順位市区町村投稿者画像
8-神奈川県鎌倉市EkikaraManhole

↑もう1つの8位は鎌倉市が鎌倉町だったころの「月&星」の町章デザインマンホールです。鎌倉市が生まれたのが昭和14年なので必然的にその前に設置されたことになり、歴史的文化価値のあるものであると推測されます。 

ただ、残念ながらマンホールマップ上で見ることのできるこの蓋は現在は新しい別の蓋に交換されていることがわかっています。その意味でも資料価値の高い、幻のマンホールです。


順位昨年順位市区町村投稿者画像
7-東京都台東区EkikaraManhole

↑7位は蔵前水の館に展示されている東京都のカラーマンホールでした。サクラ(ソメイヨシノ)とイチョウとユリカモメに色を塗ったらこんな毒々しいデザインになるとは・・・


順位昨年順位市区町村投稿者画像
6-茨城県つくば市kenitirokikuti

↑6位はこれもコンスタントに人気の高い、つくば市のスペースシャトル蓋でした。背景にはシンボルとも言える筑波山と、そして謎の星(!?)がデザインされています。なんというか、理系っぽい感じのデザインです。


順位昨年順位市区町村投稿者画像
57石川県河北郡内灘町keymoyaking

↑5位は現在のマンホールマップにおける最高「ナイスマンホ」数を誇る石川県河北郡内灘町のマンホールでした。昨年も7位でしたが、現在の登録数が5000を超えるマンホールマップにおいて、2年連続でトップ10に入るというだけで「コンスタントに人気がある蓋」といえるのではないでしょうか? 皆さんも「推し蓋へのナイスマンホ!」を積極的によろしくお願いします。


順位昨年順位市区町村投稿者画像
4-埼玉県川越市EkikaraManhole

↑4位は川越市の「時の鐘マンホール」でした。このデザイン自体は特別に目新しいわけではないのですが、「雨水吸込槽」と書かれたマニアックな蓋でした。


ではランキングトップ3の発表です。

第3位

順位昨年順位市区町村投稿者画像
38大分県豊後大野市ueda63682587

昨年8位だった豊後大野市の公式ゆるキャラ「ヘプタゴンちゃん」のカラーマンホールが今年はトップ3入を果たしました。 実はこの蓋も何故人気があるのか、私は全く理解できていません(苦笑)。

第2位

順位昨年順位市区町村投稿者画像
2-群馬県高崎市TMW_papa

↑ぐんまちゃんがサッカーをしている高崎市の排水蓋が2位でした。ぐんまちゃんはこのデザイン以外でも何種類かのマンホールのデザイン内で使われています。大活躍です。


さて、昨年は第一位を残した時点でメジャーな蓋が2~10位に出てしまっていたのですが、今年はここまでにあまり顔を出していません。昨年のベスト10蓋は3つしか出ていません。そんな中での1位、予想できますか??

では栄えある 2015 MVM(Most Variable Manhole) に輝いた今年のアクセス数第一位のマンホールは、今年も超大穴(マンホールだけに)のこれでしたっ!





























順位昨年順位市区町村投稿者画像
16北海道岩見沢市yanapong


昨年6位だった旧栗沢町のマスコット「リスのクリちゃん」マンホールが 2015 MVM となりました。 このマンホールデザインも栗沢町が岩見沢市と合併したこともあり、現在では新たに設置されることのない幻のマンホールとなっています。

このマンホールは特別にアクセスが集中した日があったわけではなく、1年間を通じてコンスタントなアクセスが記録されていました(昨年のアクセス数一位だった蓋にも同じ傾向がありました)。その地道な結果が年間アクセス数第一位に結びついた、と考えられます:
2015122101


ただ、実はこのマンホールの特徴として、マンホールマップのゲーム機能の1つである「スライドパズル」でのアクセス数が非常に多く、これが票を稼いでいた、という背景がありました。 

そして結果的にですが、yanapong 様は2年連続での 2015 MVM 受賞となりました。おめでとうございます!



最後になりましたが、マンホールの活動をしていて、昨年くらいから少しずつ一般への認知度が高まりつつあることを感じています。「マンホールの写真を集めてます」と言うと、「ああ、色んなデザインがあるんですよね」とか言われることが確実に多くなりました。テレビや雑誌で紹介される機会も増え、マンホーラーの仲間たちを始めとする地味~な啓蒙活動が着実に実を結びつつあると実感しています。 また昨日の記事でも紹介しましたが、海外から日本のマンホールが注目されつつあることも非常に嬉しいことです。実際、ものすごく Cool だと思ってますし、日本独自の文化として世界に誇れる内容だと感じてます。マンホールマップがその手助けの一因になっていけたら嬉しいです。

今後もより便利なサービスを目指していきます。来年以降も引き続きマンホールマップをよろしくお願いします。

このページのトップヘ