rlm@425: #+title: =CORTEX= rlm@425: #+author: Robert McIntyre rlm@425: #+email: rlm@mit.edu rlm@425: #+description: Using embodied AI to facilitate Artificial Imagination. rlm@425: #+keywords: AI, clojure, embodiment rlm@422: rlm@425: * Artificial Imagination rlm@422: rlm@425: Imagine watching a video of someone skateboarding. When you watch rlm@425: the video, you can imagine yourself skateboarding, and your rlm@425: knowledge of the human body and its dynamics guides your rlm@425: interpretation of the scene. For example, even if the skateboarder rlm@425: is partially occluded, you can infer the positions of his arms and rlm@425: body from your own knowledge of how your body would be positioned if rlm@425: you were skateboarding. If the skateboarder suffers an accident, you rlm@425: wince in sympathy, imagining the pain your own body would experience rlm@425: if it were in the same situation. This empathy with other people rlm@425: guides our understanding of whatever they are doing because it is a rlm@425: powerful constraint on what is probable and possible. In order to rlm@425: make use of this powerful empathy constraint, I need a system that rlm@425: can generate and make sense of sensory data from the many different rlm@425: senses that humans possess. The two key proprieties of such a system rlm@425: are /embodiment/ and /imagination/. rlm@422: rlm@425: ** What is imagination? rlm@422: rlm@425: One kind of imagination is /sympathetic/ imagination: you imagine rlm@425: yourself in the position of something/someone you are rlm@425: observing. This type of imagination comes into play when you follow rlm@425: along visually when watching someone perform actions, or when you rlm@425: sympathetically grimace when someone hurts themselves. This type of rlm@425: imagination uses the constraints you have learned about your own rlm@425: body to highly constrain the possibilities in whatever you are rlm@425: seeing. It uses all your senses to including your senses of touch, rlm@425: proprioception, etc. Humans are flexible when it comes to "putting rlm@425: themselves in another's shoes," and can sympathetically understand rlm@425: not only other humans, but entities ranging from animals to cartoon rlm@425: characters to [[http://www.youtube.com/watch?v=0jz4HcwTQmU][single dots]] on a screen! rlm@425: rlm@425: rlm@425: #+caption: A cat drinking some water. Identifying this action is beyond the state of the art for computers. rlm@425: #+ATTR_LaTeX: :width 5cm rlm@425: [[./images/cat-drinking.jpg]] rlm@425: rlm@425: rlm@425: This is a basic test for the vision system. It only tests the rlm@425: vision-pipeline and does not deal with loading eyes from a blender rlm@425: file. The code creates two videos of the same rotating cube from rlm@425: different angles. rlm@425: rlm@425: rlm@425: #+name: test-1 rlm@425: #+begin_src clojure rlm@425: (in-ns 'cortex.test.vision) rlm@425: rlm@425: (defn test-pipeline rlm@425: "Testing vision: rlm@425: Tests the vision system by creating two views of the same rotating rlm@425: object from different angles and displaying both of those views in rlm@425: JFrames. rlm@425: rlm@425: You should see a rotating cube, and two windows, rlm@425: each displaying a different view of the cube." rlm@425: ([] (test-pipeline false)) rlm@425: ([record?] rlm@425: (let [candy rlm@425: (box 1 1 1 :physical? false :color ColorRGBA/Blue)] rlm@425: (world rlm@425: (doto (Node.) rlm@425: (.attachChild candy)) rlm@425: {} rlm@425: (fn [world] rlm@425: (let [cam (.clone (.getCamera world)) rlm@425: width (.getWidth cam) rlm@425: height (.getHeight cam)] rlm@425: (add-camera! world cam rlm@425: (comp rlm@425: (view-image rlm@425: (if record? rlm@425: (File. "/home/r/proj/cortex/render/vision/1"))) rlm@425: BufferedImage!)) rlm@425: (add-camera! world rlm@425: (doto (.clone cam) rlm@425: (.setLocation (Vector3f. -10 0 0)) rlm@425: (.lookAt Vector3f/ZERO Vector3f/UNIT_Y)) rlm@425: (comp rlm@425: (view-image rlm@425: (if record? rlm@425: (File. "/home/r/proj/cortex/render/vision/2"))) rlm@425: BufferedImage!)) rlm@425: (let [timer (IsoTimer. 60)] rlm@425: (.setTimer world timer) rlm@425: (display-dilated-time world timer)) rlm@425: ;; This is here to restore the main view rlm@425: ;; after the other views have completed processing rlm@425: (add-camera! world (.getCamera world) no-op))) rlm@425: (fn [world tpf] rlm@425: (.rotate candy (* tpf 0.2) 0 0)))))) rlm@425: #+end_src rlm@426: rlm@426: rlm@426: - This is test1 \cite{Tappert77}.