CSVから大量の画像を学習させよう

所要時間:30分

CSVをダウンロード

まずは、学習用のデータが存在するCSVをダウンロードしてください。

https://drive.google.com/file/d/1rMtKPRpnbNr4q-WjFO0w0jxxDwxZcxxx/view

CSVをGoogle Colaboratoryにアップロードする

では、まずGoogle Colaboratory上でCSVを利用するために、以下のコマンドを実行します。

import pandas as pd #pandasのインポート
from google.colab import files #Google Colaboratoryでファイルをアップロードできるライブラリをインポート
uploaded = files.upload() #ファイルをアップロードするメソッド

実行すると、以下のような画面になると思います。 このように、[ファイル選択]をクリックし、ダウンロードしたCSVファイルを選択すると、CSVをColaboratory上にアップロードすることができます。

ファイルがアップロードされたことを確認する

では、ファイルがアップロードされたことを確認します。現在のディレクトリにファイルが存在することを確認するために、lsコマンドを実行します。

!ls #ディレクトリにどのファイルが存在するか分かるコマンド

実行すると、akb.csvが存在するはずです。

akb.csv sample_data

ここにakb.csvが存在すれば、大丈夫です。lsコマンドについては、下記リンクがわかりやすいので確認してみてみてください。

PandasでCSVを読み込む

それでは、さっそくPandasでCSVを読み込んでみましょう。

import pandas as pd 
import io 
df = pd.read_csv(io.StringIO(uploaded['akb.csv'].decode('utf-8')), index_col=0)  #CSVを読み込む
df.head() #先頭行の5列を取得する

実行結果は、以下のようになります。

きちんとCSVが読み込まれていることが分かります。

実行するアルゴリズム

それでは、これから行うアルゴリズムを確認します。

  1. AKBメンバー一人ひとりの名前を抽出したリストを作成する
  2. 1から、AKBメンバーを一人一人取り出し、Personを登録する
  3. 同時に、CSVの行を一つ一つ取り出す
  4. 2で取り出したメンバーの名前と、3の行のtermにてメンバーの名前が一致した場合、Personに画像URLからFaceを追加する

といった処理を行いたいと思います。

AKBのメンバーの名前リストの作成

まずは、CSVの中から、メンバー名を取得します。CSVのtermの中には、名前が重複しているので、重複していない状態にしたいです。

そのため、pandasのvalue_countsメソッドを利用して、データフレームの中に異なる値が何個あるか確認するメソッドを実行します。

では、実行してみます。

df.term.value_counts()

実行結果は以下のようになります。 このデータでは、

  • index: termの中の値(メンバー名)
  • count: 個数

というシリーズ(Series)が作成されるので、このindexのみを一つ一つ取り出して、リストの中に入れます。 試しに、indexだけ確認してみましょう。

df.term.value_counts().index

このindexの中から、一つ一つ取り出して、namelistに追加します。 namelistは、配列として宣言しておいて、for文の中から追加するappendメソッドで代入していくようなイメージです。

# AKBメンバーの画像の数を可視化
name_list = []
for name in df.term.value_counts().index:
    name_list.append(name) #nameをname_listに配列の要素として追加

これで、name_listの中身を確認すると、重複なしのAKBメンバーの名前が取得できるはずです。

name_list

実行結果は以下のようになります。

['馬嘉伶', '高橋朱里', '勝又彩央里', '梅本和泉', '本田仁美', '川本紗矢', '山内瑞葵', '向井地美音', '中野郁海', '長久玲奈', '庄司なぎさ', '高岡薫', '横山結衣', '福岡聖菜', '播磨七海', '市川愛美', '永野恵', '佐藤七海', '安田叶', '奥本陽菜', '千葉恵里', '横山由依', '田屋美咲', '野澤玲奈', '大川莉央', '本間麻衣', '佐藤美波', '坂口渚沙', '齋藤陽菜', .... ]

 

Personの作成とFaceの追加

では、さきほど取得したnamelistから、AKBメンバーを一人ひとり取り出し、makeperson関数で新しいPersonを追加します。

追加したら、データフレームから全行を一つ一つ取り出し、name_listから取り出したnameと一致するメンバー名の場合は、PersonにFaceを追加します。

# 顔の学習 
for name in name_list:  # AKB全メンバーを一人ひとり取得する 
    person_id = make_person(name)["personId"]
    for index, row in df.iterrows(): #CSVから1行ずつ列番号(index)と行(row)を取得する
        if name == row["term"]:# もし、AKBメンバー名と一致したら 
            print ("*" * 40) 
            print(row["term"]) 
            print(row["url"]) 
            add_face_to_person(person_id, row["url"])#personに顔の画像のURLを設定する

Person Groupの学習

さきほどと同じように、Person Groupに顔の学習を行います。

# グループを学習させる 
train_group(GROUP_NAME)

画像を送信して、顔認識を行ってみる

さて、これで学習が終わりました。後は適当な画像URLを載せて、結果を確認してみましょう。 戸田恵梨香に似ているAKBメンバーを検出してみます。戸田恵梨香の画像はこちらを利用します。

#戸田恵梨香の画像URL
toda_image_url = "https://dot.asahi.com/S2000/upload/2017092800048_1.jpg"
​​​​​​​detect_face(toda_image_url)

実行結果は以下のようになります。

[{'faceId': '47ac18c8-056c-405e-9987-683bccaaec29', 'faceRectangle': {'height': 175, 'left': 222, 'top': 136, 'width': 175}}]

このfaceIdを利用して、確認してみましょう。

# 戸田恵梨香のURL 
toda_image_url = "https://dot.asahi.com/S2000/upload/2017092800048_1.jpg" 
face_id = detect_face(toda_image_url)[0]["faceId"] 
person_id = identify(face_id)[0]["candidates"][0]["personId"] 
get_person(person_id)

結果、こちらとなります。

{'name': '大盛真歩', 'persistedFaceIds': ['0578f46d-04c1-4c73-97c3-61d7b0b262cc', '0689bd0b-5421-4647-87e1-9286ab6b7b6d', '12d1f983-b048-4162-b66b-332e72363e92', '20896712-3318-4b59-913c-8ae18d5c18c6', '215ddd1a-5ea8-49d7-baea-4e7ee7cbe6af', '216490ec-84aa-4560-9d78-564a148def56', '265df339-9fe4-4e36-afad-f02abe950629', '2a53ac14-ca16-4181-8f31-429556b4283c', '2f82d9ad-74bc-4634-85d8-0ac73df60170', '4a9ce8d4-b7ff-43ba-b650-c824448e7093', '4c865253-18e3-464e-afbf-12f5510f1b2c', '53f74d16-5f80-4f1a-9adc-e2982262b87b', '6d46efbb-9ef3-4ce4-94f1-5f26adbeb015', '734cecaf-9c38-49f9-aa7e-6854ee2fcfb3', '7a5cdffa-cd34-40de-aee2-28b3c9c98087', '7d406cb9-1c2b-4e5b-a084-7ee3d8997c12', '827b74bd-7139-4778-8b92-dec93a069763', '84da11ec-5a8a-408d-ba01-3d9a7365cfa6', '994d39fe-9a2f-4d4e-aec4-3dfd43f1ba08', 'a0541632-8443-4be8-8fd3-4676b005d1d8', 'a5ff71c1-a689-42ef-9426-9bb46730bf8e', 'a76eb0ea-730d-48b9-bb49-7760104a0bca', 'a875a0e4-d2b1-495b-9f09-2fdd83a02def', 'aae4a2c2-5dcb-4f2a-9bd9-bdc611ccb01f', 'ab704cd2-adcc-4082-9583-f3014360831b', 'b7b88b75-ed44-4e42-9392-c2f9097fe066', 'bae12e87-3a82-42a9-a'}

大盛真歩?誰でしょうか。調べてみました。 ん~似てるか??って感じですが、一応出せます。

結果が微妙なので、逆に本家メンバーを顔認識させてみましょう。 入山杏奈の画像を利用します。

# 入山杏奈のURL 
iriyama_image_url = "https://image.i-voce.jp/files/article/main/zNeUaNnl_1516173652.jpg" 
face_id = detect_face(iriyama_image_url)[0]["faceId"] 
person_id = identify(face_id)[0]["candidates"][0]["personId"] 
get_person(person_id)

実行結果は以下のようになります。

{'name': '入山杏奈', 'persistedFaceIds': ['0724911b-db64-4ea6-b92c-75c1fab1d3a5', '082c60ec-3d3f-4dbd-bec0-5ea46874eb1f', '0e87a4f9-7851-47ba-9a0e-460d73b0af6c', '150a7655-7f7d-4a6c-843c-a2c03944d0a6', '1aa5a29f-d26f-45c6-87f2-ec69809ada1f', '1e568160-c7d7-470b-8685-68e5d337d064', '237a6eeb-a02f-4660-8f1c-6ebce45c99cf', '2af28a41-3298-4bab-8f87-ae7d9a4cb21d', '3093e89a-fde3-499e-8625-1dc69047f089', '32f38227-ed4a-4385-9533-1309dcef4759', '3df71ac7-a763-402b-8234-aae9045e44cd', '3e419aa9-f90d-4857-bda5-f53391acf008', '3e704505-88f7-48c8-a966-e644aaa6e90c', '3f5d6b76-3982-48c2-b213-c7f0253e4ebe', '41b47154-03f1-429e-a17b-784f3d0e80a5', '48276daa-dc14-4064-8bfb-841682fc7773',

ちゃんと学習したものと、同じものが出てきましたね!

最後に

おめでとうございます。

これで、似ているユーザーを取得することができました。

このチュートリアルを通して、似ている人を抽出するアルゴリズムを作成することができました。

今後は、以下のようなアプリを作ってみてもよいかもしれません。

  • Web上で画像を検索すると、AKBメンバーの誰に似ているか教えてくれるアプリ
  • LINEで画像を送ると、AKBメンバーの誰に似ているか教えてくれるアプリ
おめでとうございます!🎉
このチュートリアルはこれで終了です。
次のコースを探す