
rlm@422: 
rlm@425: \section{Artificial Imagination}
rlm@425: \label{sec-1}
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 \emph{embodiment} and \emph{imagination}.
rlm@422: 
rlm@425: \subsection{What is imagination?}
rlm@425: \label{sec-1-1}
rlm@425: 
rlm@425: One kind of imagination is \emph{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 \href{http://www.youtube.com/watch?v=0jz4HcwTQmU}{single dots} on a screen!
rlm@425: 
rlm@425: 
rlm@425: \begin{figure}[htb]
rlm@425: \centering
rlm@425: \includegraphics[width=5cm]{./images/cat-drinking.jpg}
rlm@425: \caption{A cat drinking some water. Identifying this action is beyond the state of the art for computers.}
rlm@425: \end{figure}
rlm@425: 
rlm@425: 
rlm@429: \begin{listing}
rlm@429: \caption{This is a basic test for the vision system. It only tests the vision-pipeline and does not deal with loading eyes from a blender file. The code creates two videos of the same rotating cube from different angles.}
rlm@425: \begin{clojurecode}
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{clojurecode}
rlm@429: \end{listing}
rlm@426: 
rlm@426: \begin{itemize}
rlm@426: \item This is test1 \cite{Tappert77}.
rlm@426: \end{itemize}
rlm@429: 
rlm@429: \cite{Tappert77}
rlm@429: lol
rlm@429: \citet{Tappert77}




