Package: gestop
Gestop : Customizable Gesture Control of Computer SystemsThis is the implementation of the approach described in the paper:Sriram Krishna and Nishant Sinha.Gestop: Customizable Gesture Control of Computer Systems8th ACM IKDD CODS and 26th COMAD. 2021. 405-409.Built on top ofmediapipe, this project aims to be a tool to interact with a computer through hand gestures. Out of the box, using this tool, it is possible to:Use your hand to act as a replacement for the mouse.Perform hand gestures to control system parameters like screen brightness, volume etc.In addition, it is possible to extend and customize the functionality of the application in numerous ways:Remap existing hand gestures to different functions in order to better suit your needs.Create custom functionality through the use of either python functions or shell scripts.Collect data and create your own custom gestures to use with existing gestures.Demo (Click on the image to see the full video)Static and Dynamic Gestures Dataset linkInstallationInstallation usingpipinside a virtual environment is highly recommended. To do so:python-mvenvenvsourceenv/bin/activatepipinstallgestopIn addition to the Python dependencies,OpenCVandxdotoolare also required by Gestop.UsageServerTo start theGestopserver:python-mgestop.receiverClientThe client, or thekeypoint generator, can be setup either through MediaPipe's C++ API, or through its Python API. The Python API is simpler to setup and is recommended.MediaPipe Python APIpython-mgestop.keypoint_gen.hand_trackingMediaPipe C++ APIDownload mediapipe and set it up. MediaPipe >=0.8.0 isNOTsupported and should no be used. Make sure the provided hand tracking example is working to verify if all dependencies are installed.Clone this repo in the top level directory of mediapipe. Install all of Gestop's dependencies.Run the instructions below to build and then execute the code.Note:Run build instructions in themediapipe/directory, not inside this directory.GPU (Linux only)bazelbuild-copt--verbose_failures--copt-DMESA_EGL_NO_X11_HEADERS--copt-DEGL_NO_X11gestop:hand_tracking_gpuGLOG_logtostderr=1bazel-bin/gestop/hand_tracking_gpu--calculator_graph_config_file=gestop/gestop/keypoint_gen/hand_tracking_desktop_live.pbtxtCPUbazelbuild-copt--defineMEDIAPIPE_DISABLE_GPU=1gestop:hand_tracking_cpuGLOG_logtostderr=1bazel-bin/gestop/hand_tracking_cpu--calculator_graph_config_file=gestop/keypoint_gen/hand_tracking_desktop_live.pbtxtOverviewThe hand keypoints are detected using google's MediaPipe. These keypoints are then fed intoreceiver.py. The tool recognizes two kinds of gestures:Static Gestures : Gestures whose meaning can be inferred from a single image itself.Dynamic Gestures : Gestures which can only be understood through a sequence of images i.e. a video.Static gestures, by default, are mapped to all functionality relevant to the mouse, such as left mouse click, scroll etc. Combined with mouse tracking, this allows one to replace the mouse entirely. The mouse is tracked simply by moving the hand, where the tip of the index finger reflects the position of the cursor. The gestures related to the mouse actions are detailed below. To train the neural network to recognize static gestures, a dataset was created manually for the available gestures.For more complicated gestures involving the movement of the hand, dynamic gestures can be used. By default, it consists of various other actions to interface with the system, such as modifying screen brightness, switching workspaces, taking screenshots etc. The data for these dynamic gestures comes fromSHREC2017 dataset. Dynamic gestures are detected by holding down theCtrlkey, which freezes the cursor, performing the gesture, and then releasing the key.The project consists of a few distinct pieces which are:MediaPipe - Accessed through either the Python API or the C++ API, MediaPipe tracks the hand, generates the keypoints and transmits them.Gesture Receiver - Seereceiver.py, responsible for handling the stream and utilizing the following modules.Mouse Tracker - Seemouse_tracker.py, responsible for moving the cursor using the position of the index finger.Gesture Recognizer - Seerecognizer.py, takes in the keypoints from the mediapipe executable, and converts them into a high level description of the state of the hand, i.e. a gesture name.Gesture Executor - Seeexecutor.py, uses the gesture name from the previous module, and executes an action.NotesFor best performance, perform dynamic gestures with right hand only, as all data from SHREC is right hand only.For dynamic gestures to work properly, you may need to change the keycodes being used inexecutor.py. Use the givenfind_keycode.pyscript to find the keycodes of the keys used to change screen brightness and volumee. Finally, system shortcuts may need to be remapped so that the shortcuts work even with the Ctrl key held down. For example, in addition to the usual default behaviour of<Prnt_Screen>taking a screenshot, you may need to add<Ctrl+Prnt_Screen>as a shortcut as well.Customizing GestopAvailable GesturesAPI ReferenceUseful InformationJoints of the handHandCommanderVideo recorded with VokoScreenNG