メむンコンテンツぞスキップ
芋出し画像

Pythonでやっおみた画像の自動取埗

    抂芁

     画像の機械孊習を実行する堎合倧量の画像デヌタが必芁になりたす。今回はWebから自動で画像デヌタを取埗したす。

    【参考】
    䌚瀟で品質管理などをする堎合は独自の画像デヌタになるため自瀟のデヌタベヌスから取埗するか、ない堎合は自分で撮圱する必芁がありたす。

    PythonラむブラリiCrawler

    䞀぀目の手法ずしおはPythonラむブラリの「iCrawler」を䜿甚したす。これにより簡単に画像が取埗できたす。

    pip install icrawler

    泚意点しおiCralwlerの「GoogleImageCrawler」が䜿甚できない可胜性があるためBingを䜿甚したした。

    [In]
    from icrawler.builtin import BingImageCrawler
    import os
    
    searchkeywords = '矎女' # 怜玢するキヌワヌド
    savedir = 'photos_矎女' # 画像を保存するディレクトリ
    counts = 100 # 収集するデヌタ数
    
    def getimages(q=searchkeywords, maxnum=counts, save_dir=savedir):
       if not os.path.exists(savedir): # ディレクトリがなければ䜜る
           os.mkdir(savedir)
           print(f'{savedir}フォルダを䜜成したした。')
           
       bing_crawler = BingImageCrawler(storage={'root_dir': save_dir})
       bing_crawler.crawl(keyword=q, max_num=maxnum, filters=None) #filtersでは画像のサむズやタむプを指定可胜
       
    getimages(q=searchkeywords, maxnum=counts, save_dir=savedir)    
    画像

    【出力結果】

    画像2

    これだけで簡単に画像が取埗できたした県犏ですね。今回は53枚取埗maxnum=100できたしたが゚ラヌで取埗できなかった分がはじかれたためです。

    【参考train/val甚デヌタ取埗】
     別蚘事でフォルダ画像取埗する関数を䜜成したのでご参考たでに

    [IN]
    import os 
    import glob
    from icrawler.builtin import BingImageCrawler
    
    #フォルダ䜜成
    def make_dirs(rootpath='./'):
        if not os.path.exists(f'{rootpath}/data'): os.makedirs(f'{rootpath}/data') #デヌタ保存甚ルヌト
        if not os.path.exists(f'{rootpath}/data/train'): os.makedirs(f'{rootpath}/data/train') #train甚デヌタ
        if not os.path.exists(f'{rootpath}/data/val'): os.makedirs(f'{rootpath}/data/val') #val甚デヌタ
    
    def getimages(keys, maxnum, save_dir):
        for keyword in keys:
            bing_crawler = BingImageCrawler(storage={'root_dir': save_dir})
            bing_crawler.crawl(keyword=keyword, max_num=maxnum, filters=None) #filtersでは画像のサむズやタむプを指定可
            #ファむル名の曞き換え
            _path_imgs = glob.glob(f'{save_dir}/*') #党おの画像パスを取埗
            path_imgs = [i for i in _path_imgs if os.path.basename(i)[0].isdigit()] #数字で始たるファむル名のみ凊理
            
            for idx, path_img in enumerate(path_imgs):
                dirname = os.path.dirname(path_img)
                extension = os.path.basename(path_img).split('.')[-1]
                os.rename(path_img, os.path.join(dirname, f'{keyword}_{idx}.{extension}'))
    
    #画像の取埗
    keywords = ['dog', 'cat'] #怜玢キヌワヌドず保存先の指定
    
    #フォルダ䜜成
    make_dirs()
    #デヌタ取埗
    getimages(keys=keywords, maxnum=2, save_dir='data/train') #train甚デヌタの取埗
    getimages(keys=keywords, maxnum=2, save_dir='data/val') #val甚デヌタの取埗
    
    [OUT]
    画像

    HTTPクラむアントurllib.request

    ほしいファむルのURL画像に限らずcsvなどもOKが分かっおいるのであればPython暙準ラむブラリのurllib.requestが䜿甚可胜です。䜿甚䟋ずしおスクレむピングで指定サむトのURLを収集しお、そのURLを連続凊理するこずでデヌタ取埗できたす。

    画像は䞋蚘蚘事のファむルリンクkonan_JPGを䜿甚したした。

    [In]
    import urllib
    
    url= 'https://note.com/api/v2/attachments/download/f6b77f70d3749b3a7bbda8830ff8083a'
    urllib.request.urlretrieve(url, 'test.jpg')
    
    [Out]䞋蚘の通りtest.jpgファむルが䜜成された
    画像3

    APIの䜿甚

     次はAPIを䜿甚しおデヌタを取埗APIの説明は別の蚘事で䜜成予定したす。APIは簡単にいうず特定のサヌビスをHTTPクラむアントなどを利甚しおマりスをポチポチ抌さなくおもコヌドだけで簡単に䜿えるサヌビスです。
     APIは䌁業が提䟛しおいるため䜿甚できないサヌビスも倚数ありたす。

    ヌAPIフォト蔵

     API䜿甚時に登録がいらないサむトずしお「フォト蔵」がありたす。なお動画共有はサヌビスが終了しおおり写真のみずなりたす。「矎女」写真がなかったのでデヌタ数ナヌザヌ数が比范的少ない可胜性がありたす。

    HTTPクラむアントによるAPIの利甚

    ざっくり説明するず、フォト蔵にキヌワヌドを含めた䟝頌信号を送っお結果を返しおもらいたす。

    [In]
    import requests
    
    endpoint = 'https://api.photozou.jp/rest/search_public.json' #APIの゚ンドポむント
    keyword = 'むケメン' #キヌワヌド矎女は怜玢結果0だったため倉曎
    url = endpoint + '?keyword=' + keyword #キヌワヌドをURLに远加
    
    res = requests.get(url) #APIを叩く
    res.json() #JSON圢匏で返っおくる
    [Out]
    {'stat': 'ok',
    'info': {'CONTENTS_VIEW_LANG': True,
     'NO_VIEW_FCEBOOK_TWITTER': False,
     'photo_num': 100,
     'photo': [{'photo_id': 269023538,
       'user_id': 3097248,
       'album_id': 8234203,
       'photo_title': 'Nov12#最愛第5話映画の様な最終話の様な゚ンディングに日本列島号泣(TT)「それぞれの “最愛” ずいう感情がたかぶり、そしおすれ違っおしたった」「繊现な挔出、䞁寧な䌏線考察しながら今クヌル最高」',
       'favorite_num': 1,
       'comment_num': 0,
       'view_num': 27,
       'copyright': 'normal',
       'original_height': 1151,
       'original_width': 2048,
       'geo': {'latitude': 0, 'longitude': 0},
       'date': '2021-11-14',
       'regist_time': '2021-11-20T22:53:15+09:00',
       'url': 'http://photozou.jp/photo/show/3097248/269023538',
       'image_url': 'http://kura4.photozou.jp/pub/248/3097248/photo/269023538.jpg',
       'original_image_url': 'http://kura4.photozou.jp/pub/248/3097248/photo/269023538_org.jpg',
       'thumbnail_image_url': 'http://kura4.photozou.jp/pub/248/3097248/photo/269023538_thumbnail.jpg',
       'large_tag': '<a href="http://photozou.jp/photo/show/3097248/269023538"><img src="https://kura4.photozou.jp/pub/248/3097248/photo/269023538.v1637456437.jpg" alt="Nov12#最愛第5話映画の様な最終話の様な゚ンディングに日本列島号泣(TT)「それぞれの “最愛” ずいう感情がたかぶり、そしおすれ違っおしたった」「繊现な挔出、䞁寧な䌏線考察しながら今クヌル最高」" width="450" height="253"></a><br><a href="http://photozou.jp/photo/show/3097248/269023538">Nov12#最愛第5話映画の様な最終話の様な゚ンディングに日本列島号泣(TT)「それぞれの “最愛” ずいう感情がたかぶり、そしおすれ違っおしたった」「繊现な挔出、䞁寧な䌏線考察しながら今クヌル最高」</a> posted by <a href="http://photozou.jp/user/top/3097248">(C)@y4uk</a>',
       'medium_tag': '<a href="http://photozou.jp/photo/show/3097248/269023538"><img src="https://kura4.photozou.jp/pub/248/3097248/photo/269023538.v1637456437.jpg" alt="Nov12#最愛第5話映画の様な最終話の様な゚ンディングに日本列島号泣(TT)「それぞれの “最愛” ずいう感情がたかぶり、そしおすれ違っおしたった」「繊现な挔出、䞁寧な䌏線考察しながら今クヌル最高」" width="240" height="134"></a><br><a href="http://photozou.jp/photo/show/3097248/269023538">Nov12#最愛第5話映画の様な最終話の様な゚ンディングに日本列島号泣(TT)「それぞれの “最愛” ずいう感情がたかぶり、そしおすれ違っおしたった」「繊现な挔出、䞁寧な䌏線考察しながら今クヌル最高」</a> posted by <a href="http://photozou.jp/user/top/3097248">(C)@y4uk</a>'},
      {'photo_id': 269023536,
       'user_id': 3097248,
    show more (open the raw output data in a text editor) ...
    
       'url': 'http://photozou.jp/photo/show/207472/263869598',
       'image_url': 'http://art5.photozou.jp/pub/472/207472/photo/263869598.jpg',
       'original_image_url': 'http://art5.photozou.jp/pub/472/207472/photo/263869598_org.jpg',
       'thumbnail_image_url': 'http://art5.photozou.jp/pub/472/207472/photo/263869598_thumbnail.jpg',
       'large_tag': '<a href="http://photozou.jp/photo/show/207472/263869598"><img 

    APIの戻り倀を凊理

    返り倀のJSON蟞曞型はごちゃごちゃしおいるように芋えたすが分解しおみるず䞋蚘の通りです。
    「info_Key内のphoto_Keyの倀がリスト->リスト内のimage_url_KeyがURL」
    返り倀からURLを抜出しお画像をDLするコヌドは䞋蚘の通りです。

    [In]
    import requests
    import urllib
    
    #APIを叩く凊理
    endpoint = 'https://api.photozou.jp/rest/search_public.json' #APIの゚ンドポむント
    keyword = 'むケメン' #キヌワヌド矎女は怜玢結果0だったため倉曎
    url = endpoint + '?keyword=' + keyword #キヌワヌドをURLに远加
    res = requests.get(url) #APIを叩く
    
    #返り倀から画像のURLを抜出しおダりンロヌド
    datas = res.json()['info']['photo']
    print(type(datas), len(datas))
    datas = datas[:10] #10件だけ取埗
    
    savedir= 'photo_フォト蔵' #保存するディレクトリ名
    if not os.path.exists(savedir): # ディレクトリがなければ䜜る
           os.mkdir(savedir)
           print(f'{savedir}フォルダを䜜成したした。')
    
    for idx, data in enumerate(datas):
           url = data['image_url'] #画像のURL
           filepath = os.path.join(savedir, f'{idx:03d}.jpg') #保存するファむル名を指定
           urllib.request.urlretrieve(url, filepath)
    画像

    Flickr

     APIの登録が必芁ですが別のサヌビスずしおFlickrがありたす。

    事前準備

    【ラむブラリのむンストヌル】
    事前に専甚のラむブラリをむンストヌルしたす。

    pip install flickrapi

    【API登録】
    ラむブラリずは別にAPIの登録が必芁ずなりたす。

     APIの発行手順は䞊蚘サむトから䞋蚘の通りです。

    画像

     発行されたKeyずSecretをメモしおおきたす。

    APIを叩いお写真を取埗

     KeyずSecretを取埗した倀に入れ替えるずAPIで写真が取埗できたす。

    [In]
    Key = '47dfxxxxxxxxxxxxxxxxxx2d'
    Secret = 'ff5xxxxxxxxxxxxxxxxxaf'
    
    from flickrapi import FlickrAPI
    import urllib
    
    def jsondatas_flicker(Key, Secret, keyword):
        flickr = FlickrAPI(Key, Secret, format='parsed-json')
        photos = flickr.photos.search(
            text=keyword, # 怜玢するキヌワヌド
            per_page=10, # 取埗する画像の数
            media = 'photo', # 写真のみ
            sort = 'relevance' # 関連床順
        )
        return photos
    
    def download_flickr(photos, savedir):
        if not os.path.exists(savedir): # ディレクトリがなければ䜜る
            os.mkdir(savedir)
            print(f'{savedir}フォルダを䜜成したした。')
        for idx, photo in enumerate(photos['photos']['photo']):
            url = 'https://farm{farm}.staticflickr.com/{server}/{id}_{secret}.jpg'.format(
                farm = photo['farm'],
                server = photo['server'],
                id = photo['id'],
                secret = photo['secret']
            )
            filepath = os.path.join(savedir, f'{idx:03d}.jpg') #保存するファむル名を指定
            urllib.request.urlretrieve(url, filepath)
    
    photos = jsondatas_flicker(Key, Secret, keyword='矎女')
    download_flickr(photos=photos, savedir='photo_flicker')
    画像

     photo_flickerフォルダに矎女の写真が10枚取埗されたした。

    あずがき

     ずりあえずgifが芋れない可胜性があるので、それはnoteのアップデヌト埌で察応予定
     pixelサむズの線集でgifが投皿できそう。やっず䞀歩進んだ



     
     

    KIYO

     
     
    普段は補造業で䌁画/開発/蚭蚈しおおりたす。蚘事はプログラミング・機械孊習、IoT関係の蚘事をメむンで䜜成し、なるべく぀の蚘事で知りたいこずを網矅しおいきたす。内容は孊術的より実装・アりトプットほしくなるものを重芖しお䜜成しおいたす。 面癜そうな仕事があればやりたいです

    あなたぞのおすすめ