顔検出WebAPIで、顔を中心に画像をサムネイル化するAPI

この記事は次のブログに引っ越しました。

顔を中心に正方形に画像をサムネイル化するWebAPIを作る 富士フイルム 顔ラボ 終了 2015/03/31 追記 顔ラボは2013/07/31を持って終了したそうです。残念。 経緯 先日、富士フイルムが提供する「顔ラボ」(http://kaolabo.com/webapi)で、画像から顔を自動検出するAPIが公開されたことを"Web Design"の3月号で知った。顔ラボ「これは面白そうだ」とサイトを見ると、マッシュアップも積極的に進めているようなので、この仕組みを使って、何かできないかなと考えた。最初に出たアイデアは、心霊写真を見つけるAPI しかし、これには心霊か人間かを判断する仕組みを考えないといけないだけでなく、1枚1枚投稿するなら見たほうが早い。Flickr APIPicasa APIなどを利用すれば大量に画像を自動処理できるとしても、うちのサーバではいささか怖い。そこで、普通の写真を投稿すると心霊写真付きになるAPIは作れないかと、考えてみた。画像のURLをフォームから投稿画像を解析、顔と目の位置の座標を取得(顔ラボWebAPIより)この座標から、心霊写真らしい位置をパターンから取得 アルファチャンネル化した心霊写真をパターンにあわせて拡大or 縮小 オリジナルに心霊写真を重ね出力 こういったものは勢いで作れる範囲でないといけないとも思うのだが、以前から自分のブログに欲しい機能があった。 そう、それが表題でもあるAPIだ。 利用目的 ネットで見つけてきた面白い画像などは、トリムされていたりしてサイズや比率がまちまちで、また、デジカメで撮った写真は比率は固定であっても人が写っている位置はまちまちだったりする。しかも、集合写真だったりすると、サムネイル化すると小さすぎて誰の写真かわからんこともよくある。 しかし、私は記事の一覧では、サムネイルは正方形に統一するのが好きなのだ。できれば白い余白なく。そして、できれば、サムネイルは一部だけキャッチとして表示して、その全貌は記事の中で見て欲しい。まぁ、mixiのPRやエロサイトで、かわいい娘の意味深長なアップのサムネイルを見かけてはクリックしてガッカりするようなもんだが、よく見かける手法ではある。ってか、そんなコンテンツ扱ってないし、楽しそうな顔のある記事を見て欲しいので。顔ラボのWebAPIの仕組み 顔ラボのWebAPIの概要を見ると、このWebAPIは、https通信によるREST形式のWebAPIです。指定された画像に対して顔検出を行い、検出した顔に関する情報をXMLで返します。画像の指定方法は、URLによる指定と、POSTメソッドによる直接送信との2種類を用意しています。とある。つまり、このWebAPIは、https環境から、GETもしくはPOSTで画像をAPIに送る。
すると、画像を解析して、顔の位置と両目の位置をXMLで返します。画像がURLである場合はGET。サーバから画像を送りたい場合はPOSTで利用できます。ということだ。phpでGETで利用する場合、httpsが使える環境からfile_get_contents()を使って画像のURLを含めたクエリを送れば、画像の中の顔情報をXMLで取得できるというわけです。触ってみる 何はともあれ、顔ラボのサイトにユーザ登録してAPIキーを取得しておくことをおすすめする。まずは、ターゲットとなる画像のURLを用意する。■ターゲット画像のURL http://static.flickr.com/93/218028477_8c4a0a958d_m.jpg ■顔検出WebAPIにGETで解析結果をリクエストするといっても、https://kaolabo.com/api/detect?url=<ターゲット画像のURL>&apikey=<取得したAPIキー>でブラウザに入力すれば下記のような結果を取得できる。これをPHPだけでやると、ロリポップとかのサーバだと大変なんだけど。 xml version="1.0" encoding="UTF-8" standalone="no"? results version="1.0" xmlns="http://xmlns.kaolabo.com/detect" faces face height="40" score="556" width="40" x="137" y="45" left-eye x="164" y="57"/ right-eye x="149" y="57" /face face height="32" score="358" width="32" x="31" y="61" left-eye x="46" y="69" right-eye x="36" y="69" face /faces /results 上記ターゲット画像のオバチャンとオッチャンの顔と両目の位置(座標)が取得できる。すばらしい。 仕様 写真に一人(つまり顔が1つ=faceアイテムが1つ)の場合は、その顔の座標に正方形になるようにトリムすればいいし、複数人いる場合(faceアイテムが複数の場合)は、それらを含むエリアを算出して、同じく正方形になるようにトリムする。顔と顔の位置が全体の横幅から見て離れすぎているようであれば、中央に近い顔のアップだけをサムネイル化するなど、処理をしていく感じだ。さて、もう少し書きたいところだが、お腹が減ったので、また後日