Miyabiarts.net

一年に一度の更新頻度

カテゴリーアーカイブ: python

第6回 入門自然言語処理読書会

ブログを書くのは参加してから、大体1日経ってからです。

どうもごきげんよう。

今回はナディアパーク9階の研修室に行ってきました。

 

今回は、第6章に入って教師あり学習です。

画像認識でも同じフレームワークで行っているので、理解しやすかったです。

何だか過度に期待されていたようで、隠れマルコフモデルの説明を頑張ってしていましたが、もう少し分かりやすく説明できれば良かった。

あと、私はパターン認識で用いるために機械学習まわりは一通り勉強はしていますけど、純粋な機械学習の人間ではないですよ。

 

終了後は、メイド居酒屋 黒兵衛に行ってきました。

額に思いっきりゆで卵を打ちつけられました。

オムライスにケチャップで「λ」と書いてもらいました。

楽しかったです。

Panoramioからの写真収集

写真共有サイトPanoramio(http://www.panoramio.com/)は、ユーザがアップロードした写真を地図(Google Maps)上に重畳して表示するサービスです。
APIが用意されており、プログラムからアクセスすることが出来るため、今回はPythonを用いて写真を収集するコードを掲載します。
なお、基本的にLinuxを想定しており、画像のダウンロードにはwgetが必要となります。

Panoramioでは、APIに任意の範囲(経度・緯度)を与えることにより、その範囲内の画像を収集することができます。
ただし、全世界を含むような範囲を指定したら、全ての写真を収集できるというわけでなく、指定した範囲の大きさに応じてある程度収集する写真が選別されます。

下のコードでは、output_jsonに写真のメタデータをJSON形式で保存します。
メタデータには、写真のタイトルや写真が撮影された経度・緯度情報が保存されています。
また、output_image_dirに写真そのものをダウンロードすることができます。
各写真のファイル名は、写真のIDとなり、メタデータと対応付いています。
これらの保存先の変数と、経度・緯度範囲を示すminx、maxx、miny、maxyを指定してやることにより写真を収集します。
今回のコードでは、名古屋周辺をデフォルトの値として指定しています。


#!/usr/bin/python
# -*- coding: utf-8 -*-

import urllib
import json
import os

# 出力パラメータ
# 写真データ(JSON形式)
output_json = 'output.json'
# 写真(画像)を収集するかのフラグ
isCollectImage = True
# 写真(画像)の出力先ディレクトリ
output_image_dir = './images/'


# 収集パラメータの設定
# 収集する写真の種類(public/full/ユーザID)
type = 'public'
# 収集する範囲を設定
# 経度
minx = 136.56143
maxx = 137.38540

# 緯度
miny = 34.85550
maxy = 35.52887


# 写真のサイズ(small/medium/large)
size = 'medium'
# 収集するループ1回の写真の収集枚数(写真を分割収集するため)
span = 100


# 緯度・経度の大小関係を合わせる
if minx > maxx:
    minx, maxx = maxx, minx

if miny > maxy:
    miny, maxy = maxy, miny

# panoramioのURL
url = 'http://www.panoramio.com/map/get_panoramas.php'

# 収集結果
photos = []

i = 0
while True:
    # パラメータを設定
    params = urllib.urlencode( { 'set' : type,
                                 'minx' : minx,
                                 'miny' : miny,
                                 'maxx' : maxx,
                                 'maxy' : maxy,
                                 'size' : size,
                                 'from' : span * i,
                                 'to' : span * ( i + 1 ) } )

    # panoramioにリクエスト
    f = urllib.urlopen( url + '?' +  params )
    buf = f.read()
    j = json.loads( buf )

    photos += j[ 'photos' ]

    if j[ 'has_more' ] == False:
        break

    i += 1

# JSON形式でファイル出力
fp = open( output_json, 'w' )
fp.write( str( photos ) )
fp.close()

# 画像を収集
if isCollectImage == True:
    for photo in photos:
        print photo[ 'photo_url' ]
        cmd = 'wget ' + photo['photo_file_url' ] + ' -O ' + output_image_dir + '/' + str( photo['photo_id'] ) + '.jpg'
        os.system( cmd )

おまけ:写真のテキストタグの収集

以上のコードで、写真、およびメタデータを収集することができるのですが、写真に付随しているテキストタグは収集することができません。
そのため、無理やりですが、写真のIDを用いて、写真が掲載されているWebページのHTMLを解析することでテキストタグを取得するコードを示します。
下のコードでは、関数宣言のみなので、実際に使うときには呼び出すようにしてください。
また、HTML解析にはBeautifulSoupを用いているため、必要に応じてインストールしてください。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import urllib
from BeautifulSoup import BeautifulSoup

# idの写真のテキストタグを取得
def get_tag( id ):
    # panoramioの写真ページアクセス
    # HTMLを取得
    url = 'http://www.panoramio.com/photo/' + str( id )
    f = urllib.urlopen( url )

    # HTML解析
    soup = BeautifulSoup( f.read() )

    # タグを取得
    taglst = []
    tags = soup.findAll( 'ul', {'id':'tags'} )
    for tag in tags:
        for t in tag.findAll( 'a' ):
            if t[ 'href' ] != '#':
                taglst.append(  t.contents[ 0 ].strip() )
    return taglst

以上がPanoramioからの写真収集となります。
気をつけることとして、一度に大量の写真を取得しようとして、Paranomioに負荷をかけ過ぎにようにしてください。