KBSIs' Blog

Technical memo, play diary

<AI開発 part 1>日本人のタレントの顔画像と年齢のデータを集める

日本人のタレントの顔画像と年齢のデータを集めるスクレイピングに挑戦した

IDICHI

<追記>

著作権については、研究開発目的であり、許諾なしで利用可能である。 詳しくはリンクで確認してほしい。(https://storialaw.jp/blog/4936) やっぱ、日本はこういうところが最高やな!

日本人の顔画像は超貴重

まず、日本人の顔画像のデータセット(性別、年齢、顔画像がそろっているもの)はGoogleで検索しても出てこない。
日本人は世界で数少ない人種だけにデータセットが少ないのだ。

経緯

すでにいくつかの記事で話しているが、私はロボカッププロジェクトに参加している。
その際に、画像から年齢、性別を読み取り、人間と対話するタスクがある。
したがって、画像から年齢、性別を推論するAI(ディープラーニング)が必要になった。 AIに学習させるにはデータが大量に必要だが、肝心の日本人のデータがないのでは、困る。
そこで、タレント図鑑 というサイトを発見した。このサイトでは、日本人のタレントを年齢、顔画像とともに公開している。

いざダウンロード。

本来、このサイトからダウンロードするには、一つ一つ右クリックしてダウンロードしていくほかないのだが、スクレイピングという、簡単なプログラムでその保存作業を自動化できるので、それに挑戦した。
コードは短いが、使ったことのないライブラリだったので、苦戦したが、何とか動いた。

import urllib.request
import time,os
get_photo_ages=list(range(5,80))

SAVEPATH=r"photos"
URL="https://www.talent-databank.co.jp"
def init():
    os.makedirs(SAVEPATH,exist_ok=True)
    from selenium import webdriver

    options = webdriver.ChromeOptions()
    # options.add_argument('--headless')
    driver = webdriver.Chrome(options=options)  # 今は chrome_options= ではなく options=

    driver.get(URL)
    print(driver.title)
    driver.find_element_by_xpath("/html/body/div[1]/div/div[3]/div[1]/div[1]/div[1]/form/div/p/input[2]").click()
    print("init end")
    time.sleep(2)
    return driver

def main():
    driver=init()
    for age in get_photo_ages:
        # 検索 入力
        min_age=driver.find_element_by_name("age_min")
        min_age.clear()
        min_age.send_keys(str(age))
        max_age=driver.find_element_by_name("age_max")
        max_age.clear()
        max_age.send_keys(str(age))

        driver.find_element_by_xpath("/html/body/div[1]/div/div[3]/div[1]/div/form/div[3]/div/span/input").click()

        save_count=1
        failcount=0
        now_page=1
        print("now age===>%d"%age,end="")
        while True:
            # <tr> 抜き出し
            element=driver.find_elements_by_tag_name("tr")[1::]
            for ele in element:
                # <a> save
                try:
                    photo=ele.find_element_by_tag_name("img").get_attribute("src")
                    p=os.path.join(SAVEPATH,f"{age}_{save_count}.jpg")
                    # print(p)
                    urllib.request.urlretrieve(photo,p)
                except: 
                    failcount+=1
                    print("fail")
                save_count+=1
            try:
                nextpage=driver.find_elements_by_xpath("//a[contains(text(),'次のページ')]")[0]
                nextpage.click()
                now_page+=1
            except:
                 break
            finally:
                print("page%d saved==>%d"%(now_page,save_count-failcount))
                time.sleep(1.0)
        
if __name__ == "__main__":
    main()

多少強引な書き方をしているが、動けばいい。
なお、このコードを動かす際は

>> pip3 install selenium chromedriver-binary

が必要だ。

結論

得られたデータは約1.7万枚であり、解像度:200x200、サイズ:42.7KBであった。 ただし、年齢によって、枚数に偏りがあるため、枚数を調整する必要がある。
ここから、年齢回帰と性別分類を行う予定である。

Recent posts

See more

Categories

About

大学3年生 伊地知 翔也 詳細はlearn moreから