88
エロ目ジェネレータのすべて umitanuki a.k.a. Hitoshi Harada

Eroeye Presents

Embed Size (px)

Citation preview

エロ目ジェネレータのすべて

umitanukia.k.a.

Hitoshi Harada

自己紹介

about me…

• 1982生まれ(0x19歳)

about me…

• 1982生まれ(0x19歳)

• Windows95で初めてPCに触れる

about me…

• 1982生まれ(0x19歳)

• Windows95で初めてPCに触れる

• 大学でCGを学ぶ(初アセンブラ)

about me…

• 1982生まれ(0x19歳)

• Windows95で初めてPCに触れる

• 大学でCGを学ぶ(初アセンブラ)

• Finland/Assembly03に行く(シベリア鉄道で帰る)

about me…

• 1982生まれ(0x19歳)

• Windows95で初めてPCに触れる

• 大学でCGを学ぶ(初アセンブラ)

• Finland/Assembly03に行く(シベリア鉄道で帰る)

• 現在:FORCIA, Inc.にて検索エンジンの開発

about me…

• 1982生まれ(0x19歳)

• Windows95で初めてPCに触れる

• 大学でCGを学ぶ(初アセンブラ)

• Finland/Assembly03に行く(シベリア鉄道で帰る)

• 現在:FORCIA, Inc.にて検索エンジンの開発

• PostgreS QLにパッチを送ったりする

about me…

• 1982生まれ(0x19歳)

• Windows95で初めてPCに触れる

• 大学でCGを学ぶ(初アセンブラ)

• Finland/Assembly03に行く(シベリア鉄道で帰る)

• 現在:FORCIA, Inc.にて検索エンジンの開発

• PostgreS QLにパッチを送ったりする

• http://d.hatena.ne.jp/umitanuki/

about me…

• 1982生まれ(0x19歳)

• Windows95で初めてPCに触れる

• 大学でCGを学ぶ(初アセンブラ)

• Finland/Assembly03に行く(シベリア鉄道で帰る)

• 現在:FORCIA, Inc.にて検索エンジンの開発

• PostgreS QLにパッチを送ったりする

• http://d.hatena.ne.jp/umitanuki/• The nine finger programmer

PostgreS QLもよろしく!

• window function – S ELECT sum(salary) OVER (PARTITION BY

dep)FROM empsalary;みたいなことが書けるように改良してみた。

オープンソースRDBMS 初の実装(たぶん)

http://umitanuki.net/pgsql/wfv04/design.html

閑話休題

エロ目ジェネレータとは

エロ目ジェネレータとは

• 顔写真をエロ目にするWebサービス

エロ目ジェネレータとは

• 顔写真をエロ目にするWebサービス

• つまり・・・

みんな知っている遊びにすぎません。

SAMPLE

エロ目ジェネレータとは

• 顔写真をエロ目にするWebサービス

エロ目ジェネレータとは

• 顔写真をエロ目にするWebサービス

• URLを入力するだけでエロ目画像を作成

エロ目ジェネレータとは

• 顔写真をエロ目にするWebサービス

• URLを入力するだけでエロ目画像を作成

• シンプル(すぎる)UI–携帯OK

エロ目ジェネレータとは

• 顔写真をエロ目にするWebサービス

• URLを入力するだけでエロ目画像を作成

• シンプル(すぎる)UI–携帯OK

• 完全ランダムな10枚のエロ目ギャラリー– DopeなUI

エロ目ジェネレータとは

• 顔写真をエロ目にするWebサービス

• URLを入力するだけでエロ目画像を作成

• シンプル(すぎる)UI–携帯OK

• 完全ランダムな10枚のエロ目ギャラリー– DopeなUI

• http://umitanuki.net/eroeye/

エロ目のゆくえ

流れ

• 【開発】2007年12月27日~31日

流れ

• 【開発】2007年12月27日~31日

• 【公開】2008年01月02日

http://d.hatena.ne.jp/umitanuki/20080102

流れ

• 【開発】2007年12月27日~31日

• 【公開】2008年01月02日

• http://yusukebe.com/archives/07/12/31/015942.htmlにTB(エロつながりかと思って)

流れ

• 【開発】2007年12月27日~31日

• 【公開】2008年01月02日

• http://yusukebe.com/archives/07/12/31/015942.htmlにTB(エロつながりかと思って)

流れ

• 【開発】2007年12月27日~31日

• 【公開】2008年01月02日

• http://yusukebe.com/archives/07/12/31/015942.htmlにTB(エロつながりかと思って)

• yusukebe++

エロ目は国境を越える

• 【掲載】ネトラン&教えて君

エロ目は国境を越える

• 【掲載】ネトラン&教えて君

• 【掲載】韓国のサイト(オルゴだからR iot )• http://overdread.egloos.com/4202256

Excite翻訳してみた

「ギャグ顔作り」

• あんな式で千ウォン札紙幤を折って退渓李滉先生をムフッフッした顔(...)で作って見た方々多いかけますが, やけど住所を付けて入れるだけで簡単にあんな式のギャグ顔で完成させてくれるザングナンジルサイトがあってススック.

Excite翻訳してみた

「ギャグ顔作り」

• あんな式で千ウォン札紙幤を折って退渓李滉先生をムフッフッした顔(...)で作って見た方々多いかけますが, やけど住所を付けて入れるだけで簡単にあんな式のギャグ顔で完成させてくれるザングナンジルサイトがあってススック.

• korean++

再び平穏な日々

災害はGWにやってくる

• 【掲載】ザイーガ

災害はGWにやってくる

• 【掲載】ザイーガ

• 【掲載】Yahoo! ニュース コンピュータカテゴリ

災害はGWにやってくる

• 【掲載】ザイーガ

• 【掲載】Yahoo! ニュース コンピュータカテゴリ

災害はGWにやってくる

• 【掲載】ザイーガ

• 【掲載】Yahoo! ニュース コンピュータカテゴリ

• さくらのサーバ死亡フラグ

災害はGWにやってくる

• 【掲載】ザイーガ

• 【掲載】Yahoo! ニュース コンピュータカテゴリ

• さくらのサーバ死亡フラグ

• 503 エロ目ジェネレータ temporarily unavailable

GW丸つぶれ

• 即日Amazon EC2にS ign up

GW丸つぶれ

• 即日Amazon EC2にS ign up• ドメイン切り替えにより回復

GW丸つぶれ

• 即日Amazon EC2にS ign up• ドメイン切り替えにより回復

• Yahoo!検索キーワード「今週の7位」にランキング(されたらしい)

GW丸つぶれ

• 即日Amazon EC2にS ign up• ドメイン切り替えにより回復

• Yahoo!検索キーワード「今週の7位」にランキング(されたらしい)

• 関西某局からお問い合わせ

GW丸つぶれ

• 即日Amazon EC2にS ign up• ドメイン切り替えにより回復

• Yahoo!検索キーワード「今週の7位」にランキング(されたらしい)

• 関西某局からお問い合わせ

• 「テレビ出してもいいっすか?」

GW丸つぶれ

• 即日Amazon EC2にS ign up• ドメイン切り替えにより回復

• Yahoo!検索キーワード「今週の7位」にランキング(されたらしい)

• 関西某局からお問い合わせ

• 「テレビ出してもいいっすか?」

• 「まあ、お好きにどぞ」

しくみ

• OpenCV+PythonのCGI• そこにPythonがあったから

• ほぼ初見のPythonistaが書いた(ひどい)コードを見るがよいッ!

山折りのアルゴリズム

山折りのアルゴリズム

山折りのアルゴリズム

山折りのアルゴリズム

山折りのアルゴリズム

下のピクセルから上へ順次コピーしていくコピーするオフセット量は横軸に依存する

CGIからコピペ

for r in eyes: rad = r.width / 2 basex = r.x + rad for y in range(face.y, min(int(face.y+face.height*1.3), image.height-r.width)): for relx in range(-rad, rad):# offy = int(math.sqrt(rad*rad - relx*relx) / 2.0) offy = int((rad - abs(relx)) / 2.0) image_copy[y, basex + relx] = image[y + offy, basex + relx] cvS aveImage(result_name, image_copy)

中心に行くに従ってずらす量を増やす

見事なエロ目

見事なエロ目

ちなみに

for r in eyes: rad = r.width / 2 basex = r.x + rad for y in range(face.y, min(int(face.y+face.height*1.3), image.height-r.width)): for relx in range(-rad, rad):# offy = int(math.sqrt(rad*rad - relx*relx) / 2.0)

offy = -int((rad - abs(relx)) / 2.0) image_copy[y, basex + relx] = image[y + offy, basex + relx] cvS aveImage(result_name, image_copy)

負にする

泣き目

タモ(ry

じゃああとは目を検出するだけだね?

• 顔(haarcascade_frontalface_default.xml)はOpenCVに添付されている–空前の笑い男ブーム(笑)

• 目は?–現在はhttp://umitanuki.net/eroeye/eye_8.xml

においてあります。

– これを使ったらすぐできるの?

ところがこれもなかなか・・・

Your perception into the code.

• クソまじめなパターン認識も大事だが・・・

Your perception into the code.

• クソまじめなパターン認識も大事だが・・・

• 顔全体に対して人間が他人の「目」を認知する方法を自分なりにルール化

Your perception into the code.

• クソまじめなパターン認識も大事だが・・・

• 顔全体に対して人間が他人の「目」を認知する方法を自分なりにルール化–顔の半分より上にあるのが「目」

Your perception into the code.

• クソまじめなパターン認識も大事だが・・・

• 顔全体に対して人間が他人の「目」を認知する方法を自分なりにルール化–顔の半分より上にあるのが「目」

– 「目」は横に二つ並んでいる

Your perception into the code.

• クソまじめなパターン認識も大事だが・・・

• 顔全体に対して人間が他人の「目」を認知する方法を自分なりにルール化–顔の半分より上にあるのが「目」

– 「目」は横に二つ並んでいる

– 「目」は二つしかない

Your perception into the code.

• クソまじめなパターン認識も大事だが・・・

• 顔全体に対して人間が他人の「目」を認知する方法を自分なりにルール化–顔の半分より上にあるのが「目」

– 「目」は横に二つ並んでいる

– 「目」は二つしかない

– 「目」はかぶったりしない

Your perception into the code.

• クソまじめなパターン認識も大事だが・・・

• 顔全体に対して人間が他人の「目」を認知する方法を自分なりにルール化–顔の半分より上にあるのが「目」

– 「目」は横に二つ並んでいる

– 「目」は二つしかない

– 「目」はかぶったりしない

– 「目」の互いの大きさはそんなに変わらない

Your perception into the code.

• クソまじめなパターン認識も大事だが・・・

• 顔全体に対して人間が他人の「目」を認知する方法を自分なりにルール化–顔の半分より上にあるのが「目」

– 「目」は横に二つ並んでいる

– 「目」は二つしかない

– 「目」はかぶったりしない

– 「目」の互いの大きさはそんなに変わらない

• Happy Engineering!

def get_eyes(self, img, face=None): if not face: face = self.get_face(img) # eyes must be in upper bound on the face. subimage = cvCreateImage(cvS ize(face.width, face.height), img.depth, img.nChannels) for y in range(face.height): for x in range(face.width): subimage[y, x] = img[face.y+y, face.x+x]

顔の外には目はないので。

e_cascade_name = "eye_8.xml" self.e_storage = e_storage = cvCreateMemS torage(0) e_min_size = cvS ize(10, 6) e_image_scale = (subimage.width/120.0) e_haar_scale = 1.005 e_min_neighbors = 2 e_haar_flags = 0 rects = self.detect(subimage, e_cascade_name, e_storage, e_min_size, e_image_scale, e_haar_scale, e_min_neighbors, e_haar_flags) for r in rects: r.x += face.x r.y += face.y # eyes are only two along horizontally return self.extract2(rects)

顔だけのサブ画像から目の検出を行う

検出結果からさらに横並びな2つを取り出す

まとめ

• OpenCV万歳!(○○ぱい検出も楽しみ!)

まとめ

• OpenCV万歳!(○○ぱい検出も楽しみ!)

• 「ツールつかてみた」的なノリも大事だけど!

まとめ

• OpenCV万歳!(○○ぱい検出も楽しみ!)

• 「ツールつかてみた」的なノリも大事だけど!

• 人間の感覚をコードに落とすのも大事!

まとめ

• OpenCV万歳!(○○ぱい検出も楽しみ!)

• 「ツールつかてみた」的なノリも大事だけど!

• 人間の感覚をコードに落とすのも大事!

• 試行錯誤するって楽しい!

まとめ

• OpenCV万歳!(○○ぱい検出も楽しみ!)

• 「ツールつかてみた」的なノリも大事だけど!

• 人間の感覚をコードに落とすのも大事!

• 試行錯誤するって楽しい!

• こんな駄作が評価されるWebってすげー!

まとめ

• OpenCV万歳!(○○ぱい検出も楽しみ!)

• 「ツールつかてみた」的なノリも大事だけど!

• 人間の感覚をコードに落とすのも大事!

• 試行錯誤するって楽しい!

• こんな駄作が評価されるWebってすげー!

• 肖像権侵害してるよたぶん!

ご静聴ありがとうございました