画像解析Tweetこんにちは、江口です。前回に引き続き、pythonネタです。皆さんは、同僚との会話で「この女優、どう?」と聞かれて困ったことはありませんか?私はあります。良いとも悪いとも思えず、なんと言いますか、興味が湧かない時が一番返答に困ります。今回はズバリ「機械学習で好みの女性なのかどうか仕分ける!」です。ネタではありますが、真剣です。これによりデータに基づいた返答ができるようになります。自分好みの女優の画像とそうでない画像を収集する。収集した画像から顔だけを抽出し、100x100にリサイズして保存する。女優画像が自分の好みかどうか判定するこんな流れになってます。詳しい流れ、実装は後述するソース解説で紹介します。収集はsave_beautiful.pyで行います。画像の収集にはGoogleCustomSearchを利用しています。qパラメータに自動で「,正面」という文字列を組み立て、searchインデックス(startパラメータ)に1~91までを10区切りで指定しています。&start=91このような具合で順繰りにリクエストを発行していきます。一回にリクエストで10枚、一人の女優につき1~91でつまり100枚近くの画像を収集しています。今回は無料枠で利用しているため、以下のような制約があります。・100req/day(17:00にリセットされる)・一回に取得できるデータ量は10count取得した画像は残さずimages/下にtarget_YES-[女優名]__81_1.pngの形で保存しています。YESがタイプで、NOがタイプでないことを表すようにしています。正面を向いている画像を取得しようと試みています。最後に100x100にリサイズして改めて保存しています。画像抽出にはOpenCVを利用しています。NO画像を全てOpenCVの顔抽出分類器にかけて、うまいこと輪郭画像が抽出できたら、faces下に顔画像を保存しています。参考になるように、失敗した場合は、faces/misses下に保存しています。missesを見ると大体が横顔画像だったり、複数人写っていたり、遠すぎたり、影りが多かったりとする画像が殆どでした。faces下の画像はこんな感じです。NO)と一緒にパターンを学習させるということを行います。俗にいう「教師あり学習」を行なっています。学習にはSVMというアルゴリズムを使用し、YESつまり「私のタイプである女性の画像はこのような3次元ベクトルを有しています。」また、「私のタイプでない女性の画像はこのような3次元ベクトルを有しています。」と識別基準を教え込ませています。SVMにより、YESとNOの境界値最大マージンを取り、識別を行います。labels)このようにdataと正解のlabelをセットすることで学習させることができますが、永続化されません。そのため、Objectを直列化し、学習データをpickleと呼ばれる形式で漬物保存します。"pkls/beauty.pkl")こうすることで、予測実行時に毎回学習し直すことなく、pklファイルをロードすることで機械学習過程を引き継いで予測・判定を行うことが可能になります。clf.predict(t_image_vector3)このような記載になるかと思われます。学習は結構な計算負担があるため、毎回学習計算を走らせず、pklで学習記録を読み出すことができます。その場合は以下のような記載になります。女優画像が自分の好みかどうか判定するいよいよ判定です。今のところ、imagesに1980の画像と、facesにその半分の1100画像が格納されています。(顔輪郭抽出時に多くが失敗し、データが半減しました。main(['http://blog-imgs-42.fc2.com/m/e/m/memoriup/03267.jpg'])解説・・・Google画像検索をスクレイピングしています。画像検索で「ガッキー」で検索させ、imgタグのsrc属性を抽出して、その画像URLの取得画像結果を分類器にかけています!URLから画像を取得し、取得した画像をそのままresizeにかける記載は以下の通りです。100))ソースでは、このresizeした画像をcv2モジュールで顔画像抽出した画像をtargets下に保存し、いよいよ判定コードにかけています。print(ret)上記で表示された結果を共有しますと。NOYESYESYESNOYESNONOYESYESYESNOとなりました。判定を行なった画像URLもログに出しているのですが、確かに微妙にガッキーではない画像も混じっていたため、7,80%くらいの確度といった具合のように感じられます。いえ、データが全然数が足りていないので、これから地道に学習データを増やしていこうと思います!!学習データ量が圧倒的に足りないので、足していきつつも、次回はいよいよTensorflowで多重パーセプトロン、ディープラーニングによる分類・判定を行おうと思います!!今回も拙い文章、ソースでしたが、お付き合いいただきありがとうございました。ソースコードはGithubで管理(?)してますので、こちらをちょこちょこ修正していく形になるかと思いますが、ご了承ください。https://github.com/yueguchi/asial-blog/tree/master/beauty-judge<>学習素材がやはり少ないのが悩みだったので、少し工夫しました。faces下の画像を全てy軸に反転させることで素材を二倍に増やしました。main("faces")実行後、pklを作り直してください。(save_vector3.pyを実行)これで素材が二倍になります。実際に反転させた画像はこんな感じです。麻生久美子がy軸に反転した形で表示されています。学習素材を増やしたあとに、今度は「ハーマイオニー」でGoogle画像検索の結果を判定器にかけたところ、100%でした。"ハーマイオニー").textYESYESYESYESYESYESYESYES以上です。byスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。