# BADMINTON-POSE-RECOGNITION
###### tags: `Project`
## My Updates
- 2020 - 10 Add newrunvideo.py
- 2020 - 10 Output keypoints as csv files in estimator.py
- 2020 - 11 Apply player tracking in estimator.py
- 2020 - 11 Update player tracking in estimator.py
- 2020 - 11 Construct and training models to import by sklearn
- 2020 - 12 - 20 Done background submission , bitwise and in file Background_subtraction
## tf-pose-estimation
openpose is reference by https://github.com/ildoonet/tf-pose-estimation <br>
**If there is any compyright issue, please contact me immediately**
'Openpose', human pose estimation algorithm, have been implemented using Tensorflow. It also provides several variants that have some changes to the network structure for **real-time processing on the CPU or low-power embedded devices.**
**You can even run this on your macbook with a descent FPS!**
Implemented features are listed here : [features](./etcs/feature.md)
### Installation Guide
#### Dependencies
You need dependencies below.
- python3
- tensorflow 1.4.1+ (python 3.6 above does not support)
- opencv3, protobuf, python3-tk
- slidingwindow
- https://github.com/adamrehn/slidingwindow
- I copied from the above git repo to modify few things.
#### Install
Clone the repo and install 3rd-party libraries.
```bash
$ git clone https://www.github.com/ildoonet/tf-pose-estimation
$ cd tf-pose-estimation
$ pip3 install -r requirements.txt
```
Build c++ library for post processing. See : https://github.com/ildoonet/tf-pose-estimation/tree/master/tf_pose/pafprocess
```
$ cd tf_pose/pafprocess
$ swig -python -c++ pafprocess.i && python3 setup.py build_ext --inplace
```
#### Package Install
Alternatively, you can install this repo as a shared package using pip.
```bash
$ git clone https://www.github.com/ildoonet/tf-pose-estimation
$ cd tf-pose-estimation
$ python setup.py install # Or, `pip install -e .`
```
#### Download Tensorflow Graph File(pb file)
Before running demo, you should download graph files. You can deploy this graph on your mobile or other platforms.
- cmu (trained in 656x368)
- mobilenet_thin (trained in 432x368)
- mobilenet_v2_large (trained in 432x368)
- mobilenet_v2_small (trained in 432x368)
```
$ cd models/graph/cmu
$ bash download.sh
```
### Python Usage
#### Realtime Webcam
```
$ python run_webcam.py --model=mobilenet_thin --resize=432x368 --camera=0
```
Apply TensoRT
```
$ python run_webcam.py --model=mobilenet_thin --resize=432x368 --camera=0 --tensorrt=True
```
#### run video
```
python3 newrunvideo.py --model=mobilenet_thin --video=./images/2.mp4 --write_video=./results.mp4
```
## Background Subtraction using opencv
Background subtraction (BS) is a common and widely used technique for generating a foreground mask (namely, a binary image containing the pixels belonging to moving objects in the scene) by using static cameras.<br>
As the name suggests, BS calculates the foreground mask performing a subtraction between the current frame and a background model, containing the static part of the scene or, more in general, everything that can be considered as background given the characteristics of the observed scene.<br>

Basic Example :
```=py
from __future__ import print_function
import cv2 as cv
import argparse
parser = argparse.ArgumentParser(description='This program shows how to use background subtraction methods provided by \
OpenCV. You can process both videos and images.')
parser.add_argument('--input', type=str, help='Path to a video or a sequence of image.', default='vtest.avi')
parser.add_argument('--algo', type=str, help='Background subtraction method (KNN, MOG2).', default='MOG2')
args = parser.parse_args()
if args.algo == 'MOG2':
backSub = cv.createBackgroundSubtractorMOG2()
else:
backSub = cv.createBackgroundSubtractorKNN()
capture = cv.VideoCapture(cv.samples.findFileOrKeep(args.input))
if not capture.isOpened:
print('Unable to open: ' + args.input)
exit(0)
while True:
ret, frame = capture.read()
if frame is None:
break
fgMask = backSub.apply(frame)
cv.rectangle(frame, (10, 2), (100,20), (255,255,255), -1)
cv.putText(frame, str(capture.get(cv.CAP_PROP_POS_FRAMES)), (15, 15),
cv.FONT_HERSHEY_SIMPLEX, 0.5 , (0,0,0))
cv.imshow('Frame', frame)
cv.imshow('FG Mask', fgMask)
keyboard = cv.waitKey(30)
if keyboard == 'q' or keyboard == 27:
break
```
### Results
Raw Data :

Result After Background Subtraction :

Result After Bitwise And :

### Usage
```
python3 main.py --input video.mp4
```