こんな人工知能がほしいよ
LINEのタイムラインで、「女子が彼氏にしてほしい10のこと」というのが流れてきたので、見ていました。そこにはこんな事が書いてありました。
1. おはようと、おやすみのLINEがほしい
2. 背後からのハグ
3. 深く、長い会話
4. 一緒に写真をとること
5. 小さいことでも良いので、サプライズを
6. なぜ、彼女が好きなのかを伝えてほしい
7. 彼女のために時間を作って欲しい
8. 寄り添ってネットフリックスをみたい
9. ランダムキス
10. うそをつかないでほしい
というような10項目がありました、これが女子が彼氏にしてほしい10個のことのようです。もちろんこれは女子次第で個人差があり、まだまだこの他にもあるはずですよね。
そこで、「女子が彼氏にしてほしいこと」のデータを集めまくって、それをビッグデータとします。そしてそれを人工知能のロボットに学習させて、Siriのように
「こんにちは、今日の天気は晴れです、前回のサプライズから28日経過しているので、今日は小さいサプライズをしましょう。」
とサジェストしてくれる、Siri的な人工知能ロボットを開発しましょう。こうすることによって、女子の幸福度が全体的に上がるはずです。
それと反比例して、男子の幸福度は下がりますが。
結構、「彼女に何をすれば喜んでくれるのか?」という問は、男からしたら比較的カロリーを要する思考でございます。なので、なるべく避けたい、そしてその結果、何もしないというところに行き着きます。そうして最終的に彼女が女子会に行ったときに彼氏をディスる繰り返しです。
なので、ではそのカロリーの使う思考活動をロボットに任せましょう。というのが今回のブログ内容でした。
今こうやって図にもしてみましたが、女子がやってほしいことをSiriくんが提案してくれるのですが、提案してくれてもやりたくないものもあります。例えば、ぶっちゃけ、おはようとお休みのLINEはしたくありません。もうSiriくんが勝手にLINEを起動してパターンを決めて送信してくれるのが1番ありがたいですね。そういうBotも開発しましょう。
どうでしょう、いい感じにHappyになれそうじゃないですか。ちょっと寝る前にこのような変なことを思いついて3秒位でなにも考えずにかいているので、まとまってないんですけど、こんな感じで、どうでしょうか。
では、ねます。
おわり。
OF:雪のなかで人影が遊ばせたらエラーが出た話
openFrameworksを勉強する際に、とても参考にしているのがこここじ研(openFrameworks)なんですが、この、「雪のなかで人影が遊ぶ」を実行していこうとした際に、エラーが出たので他のやり方でやってみた結果を書いていきます。
上のリンク先の「シルエットと雪との相互作用を実現」というところの、シルエットをポリゴンに変換する際のこちら↓
// make a polygon shadows[j].get()->clear();
shadows[j].get()->addVertexes(shadowLines[j]);
shadows[j].get()->triangulatePoly(30);
shadows[j].get()->setPhysics(1.0, 0.5, 0.1);
shadows[j].get()->create(world2d.getWorld());
のところで、「signal SIGABRT」というエラーが出てきてビルドはできたのですが、Workしない状態となってました。そのエラーの原因をいろいろとGoogle itしたのですが、なかなかこれと言った解決のためのKeyが手に入らなかったので、計算量が多いためのコマ落ちかな。と自分の中で勝手に結論を出してしまい、別の方法でやることにしました。
それは、単純に分析した輪郭線の位置情報を
for(int i = 0; i < finder.nBlobs; i++){ for(int j = 0; j < finder.blobs[i].pts.size(); j++){ ofPoint pos = finder.blobs[i].pts[j]; ofPtr<ofxBox2dCircle> circle = ofPtr<ofxBox2dCircle>(new ofxBox2dCircle); circle.get() -> setup(world2d.getWorld(), pos.x, pos.y, 3); ContourCircles.push_back(circle); } }
これで取得して、そこに半径3の円をおいているという状態です。これだと実行できました。(おそらくポリゴンをつくるより正確性は下がりますが。)
参考:
Amazon CAPTCHA
#include "ofApp.h" //-------------------------------------------------------------- void ofApp::setup(){ // window ofBackground(80, 80, 120); ofSetWindowShape(640, 480); // box2d world2d.init(); world2d.setFPS(60.0); world2d.setGravity(0, 2); // snow snow.load("snow.png"); snow.setAnchorPoint(0.5, 0.5); // ground world2d.createGround(0, 480, 640, 480); // setup OpneNI kinect.setup(); kinect.setRegister(true); kinect.setMirror(true); kinect.addDepthGenerator(); kinect.start(); minDist = 500; maxDist = 1500; shadowImage.allocate(640, 480); invertImage.allocate(640, 480); // shadow of a person for (int i = 0; i < MAX_BLOBS; i++){ shadows[i] = ofPtr<ofxBox2dPolygon>(new ofxBox2dPolygon); } } void ofApp::makeSnow(float x, float y, float size){ // create a new circle ofPtr<ofxBox2dCircle> circle = ofPtr<ofxBox2dCircle>(new ofxBox2dCircle); // set attributes to this circle circle.get() -> setPhysics(1.0, 0.5, 0.1); circle.get() -> setup(world2d.getWorld(), x, y, size); circle.get() -> setVelocity(ofRandom(-1.0, 1.0), ofRandom(-1.0, 1.0)); // add this circle to "circles" vector circles.push_back(circle); } bool objectkiller(ofPtr<ofxBox2dBaseShape> shape) { float yPos = shape.get() -> getPosition().y; return (yPos >= 500); } //-------------------------------------------------------------- void ofApp::update(){ // shadow kinect.update(); unsigned short *depthData = kinect.getDepthRawPixels().getData(); unsigned char *shadowData = shadowImage.getPixels().getData(); for (int k = 0 ; k < 640 * 480; k++) { shadowData[k] = (minDist < depthData[k] && depthData[k] < maxDist)? 255:0; } shadowImage.flagImageChanged(); invertImage = shadowImage; invertImage.invert(); // find contours shadowImage.threshold(threshold); for(int i = 0; i < ContourCircles.size(); i++){ ContourCircles[i]->destroy(); } ContourCircles.clear(); finder.findContours(shadowImage, 1000, 640*480/4, 4, false); for(int i = 0; i < finder.nBlobs; i++){ for(int j = 0; j < finder.blobs[i].pts.size(); j++){ ofPoint pos = finder.blobs[i].pts[j]; ofPtr<ofxBox2dCircle> circle = ofPtr<ofxBox2dCircle>(new ofxBox2dCircle); circle.get() -> setup(world2d.getWorld(), pos.x, pos.y, 3); ContourCircles.push_back(circle); } } /* numShadows = finder.nBlobs; for (int j = 0; j < MAX_BLOBS; j++) { shadowLines[j].clear(); shadows[j].get()->clear(); if (j < numShadows) { // make a contour for (int k = 0; k < finder.blobs[j].pts.size(); k+=60){ shadowLines[j].addVertex(finder.blobs[j].pts[k]); } shadowLines[j].close(); shadowLines[j].simplify(); // make a polygon shadows[j].get()->clear(); shadows[j].get()->addVertexes(shadowLines[j]); shadows[j].get()->triangulatePoly(5); shadows[j].get()->setPhysics(1.0, 0.5, 0.1); shadows[j].get()->create(world2d.getWorld()); } } */ // make a new snow if (ofRandom(0, 100) < 40) { makeSnow(ofRandom(-40, 680), -40, ofRandom(5, 10)); } // box2d ofRemove(circles, objectkiller); //update the world world2d.update(); } //-------------------------------------------------------------- void ofApp::draw(){ shadowImage.draw(640, 0, 640, 480); // draw shadow ofSetColor(80, 80, 120); //ofSetColor(255, 255, 255); invertImage.draw(0, 0, 640, 480); // draw contours /* ofSetLineWidth(3); ofSetColor(140, 140, 200); for (int j = 0; j < numShadows; j++){ shadowLines[j].draw(); } */ //shadowImage.draw(0, 0, 640, 480); // draw contours finder.draw(0, 0, 640, 480); // draw the ContourCircles ofSetColor(255, 255, 255); for(int i = 0; i < ContourCircles.size(); i++){ ContourCircles[i]->draw(); } // draw each circle ofSetColor(255, 255, 255); for (int i = 0; i < circles.size(); i++) { ofPoint pos = circles[i].get() -> getPosition(); float size = circles[i].get() -> getRadius()*10.0; snow.draw(pos, size, size); } // draw the number of circles and fps ofSetColor(255, 100, 100); char buf[100]; sprintf(buf, "%ld circles", circles.size()); ofDrawBitmapString(buf, 20, 20); sprintf(buf, "%5.2f fps", ofGetFrameRate()); ofDrawBitmapString(buf, 20, 40); sprintf(buf, "%1d fps", threshold); ofDrawBitmapString(buf, 20, 60); } //-------------------------------------------------------------- void ofApp::keyPressed(int key){ switch(key){ case '+': threshold ++; if(threshold > 255) threshold = 255; break; case '-': threshold --; if(threshold < 0) threshold = 0; break; } }
kinect with openFrameworksはまじ簡単だった話
もうすでに大学院を卒業しておりますが、私、非常に残念ではありますが卒業式に行けなかった身分でございます。だけど、よくSNSで見かけるグラデュエーションガウンを着て、ハットを投げるやつの写真
これにはすごく憧れがあって、このためだけにイギリス戻って学長との握手会(卒業式)に参加しようかと考えましたがやめました。
でも、それでもあきらめ切れない部分があったため、どうにかテクノロジーの力を借りて実現しようと思ったのが今回のブログテーマ、
今回はopenFrameworksで人物だけ切り取ってMovie上に貼り付けよう!というブログ内容。まずこれが完成図。
結構本気出して、ガウン着て、友人がFacebookにUpしていたMovieを使ってガチでGraduationしようかと思いましたが、「あ、結構できるんだ〜」っていうところで、そこまでやるものめんどくさくなったので、その(上述した)プロジェクトはこの下のところで終了してます。
でも、もしガウンとか手に入れたらやってみようかなー。
大学の公式YoutubeかVideoを流して、そこでkinectで切り取った自分を、そのVideo上に貼り付けている。若干ズレ的なものがみられる。
さて、openFrameworks(OF)でkinectを操作するのって自分が思っていたのより25倍くらい簡単でびっくりしています。
kinectドライバをインストールとかする必要があるのかな。と思っていたけれども何もいりませんでした。
OpenNIのビルドが若干面倒ですが、ここに書いてある通りにすれば問題なくビルドができました。
先程のリンク先にもあるんですが、ここで書いてある通りに人物を切り抜いて、その前に動画を流しているだけです。
なので、これ、とてつもなく簡単に作ることができました。
まあ、こんな感じの、内容が非常にうすいブログでしたー
なにがいいたかったかというと、kinectでOFまじらくだよ!ってこと!
おわり。
選択することで好きのレベルが上がる理論
好きなことはなんですか?って聞かれても、スパッと出てくることがなかなか無い。
そもそも、「好き」って何?「好き」を言語化するのって難しくない?
ということを思ったので、今日は待ったく科学に基いていない自分の(いま思いついた)妄想理論を紹介します。その名も、「好きだから選択するんじゃなくて、選択するから好き(だと思っているだけ)理論」です。
まあ、ただ単純にそれだけなんだけさ。
先に結論ですが、人間は1日に何回も選択をすることで人生をつくっていると思います。その選択の積み重ねが「好き」を作っているということです。
例えばスタバにいてソイラテにするかティーラテにするかを迷っているとします。そこで、店員さんが「ソイラテおすすめですよー!」とか言うので、ソイラテを選択しました。その時点で、脳は
脳氏「あ、俺、ソイラテ好きなんだな。」
ってまず、思います。でももしそこで美味しくなかったら
脳氏「やっぱり、ティーラテのほうが良かったなー、次回はティーラテにしよう。なのでこのコトを海馬に記憶させておこう」
って思うんです。なので、次回はティーラテを選択するじゃないですが。そしたら
脳氏「あ!やっぱりティーラテはソイラテより良いね!」
ってなるわけです。良し悪しは相対的なので、ここで初めて2つの商品に良し悪しが生まれるんですね。これができた時点で、これ以降、脳はティーラテを選択しやすくなるのです。
そして、これ以降も脳は、海馬という名の内部ストレージにスタバの商品を登録して、その中からそのときの気分や気温などを考慮して、今日はどのドリンクにするかを選択するのですが、相対的基準の高いティーラテが選択されやすくなるのです。その選択のフィードバックとして、「好きレベル+1」が生まれます。その循環でどんどんティーラテを好きになります。
こういうことです。このとき、人間は「自分は好きだから選択をしている」を無意識に思っておりますが、実は、「選択しているから好きだ」ということなんです。
ここをはっきりと意識することで、「実はホントは好きじゃいないもの」だったり、「実は好きなもの」が見えてきたりします。
例えば居酒屋に行って、自分が特に何も考えずに注文したものをメモ(レシートでも可)しておいて、それのデータを取ってみてください。自分は居酒屋に行ったら「チキン南蛮」が好きだと思っていましたが、実は、「カルボナーラ」のほうが注文していたりします。あれ?自分の脳ってそういう順位付けになってるんだ〜という感じで自分の好きを可視化できるはずです。
これは実は、恋愛関係もの言える話で、
「好きだから、付き合っている」
というのは、実はそうではなくて、
「付き合っているから、好き」
ということなんです。
好きか無関心かわからない状態って、付き合っている以上すごくあると思っていて、それは何故かと言うと、「好きだから付き合う」という方程式が日本で一般的になっているからで、
「付き合ってるということは・・・俺は相手のことを好きなんだよあ」
って自分のマインドをコントロールしている状態でもあるんです。
つまり、付き合っているという事実があると、本当の「好き」がぼやけてしまうのです。
でも実は、好きか無関心か分からない状態では、人間は「選択」をしなくなっているはずです。まじで好きと思っていた時代だったら選択していたことも、今は選択しなくなっている。
ということは、好きではなくなっている証拠ではないでしょうか。
なので、付き合ているときに、
「好きだから付き合っている」
という考えを一旦外してみて、「付き合っているから好き(と思っている)」と考えてみると、いいかもしれませんね。そうすることで、本当に好きか否かを脳にアクセスして確認できると思います。
つまり、無意識に選択しているもの(例えば、コンビニでついつい買っちゃうもの)にフォーカスをして、あ、自分はこれを選択するということは、好きなんだ。っていうのを考えながらいきると、このブログの冒頭で言った
「好きなことはなんですか?」
という質問にすんなり答えられるようになるかもしれないですね。
どうでしょう。いみわからない理論ですね。(笑)
おわり。
ドライブデートに誘うときの最強の誘い文句
なんか知らないけど、パンクロックとか聞いたときに気持ちが高鳴って、アルコールを飲んだときの様はHighな気分になる瞬間あるじゃないですか、そのときの高鳴ってるFeelingを共有できるなにか、革命的ツールがほしいです。
いきなりだけど、
「最近、すっごいいい音楽見つけたんだけど、一緒にドライブしながら聞かない?絶対に気に入ると思うよ」
っていうデートの誘い文句を今さっき思いついたんですけど、これ良くないですか?いきたくなりません?(え?男の勘違いシリーズ?)
ここで言っている「いい音楽」っていうのは、メロディーてきにノリノリのなれる曲で、いくつか例を挙げると(最下部に5個上げた)、あんな感じです。
たぶん誘われた女子からしらたら、下で上げた洋楽パンクロックシリーズは初耳となるでしょう。しかし、それがいいんです。
全く未知な領域のものを、
「これよくない?」
ってノリノリな感じで楽しそうにドライブしながら言えば、良いように聞こえ、そのデート誘われた女子も、なんだかしらないけど、洋楽パンクっていいねってなるんです、これは(試してないけど)間違いない。
しかも「絶対に気に入る」ていう無責任なワードを誘い文句に入れることで、さらに興味をもたれること間違いなし。
なので、ぜひ、上のセリフを使ってデートに誘ってみてください。
【おすすめの流すべき音楽5選!!!!】
・これとか
・これとか
・これも
・これも
・さいごはこれ