added readme and instruction html
This commit is contained in:
parent
43d36335a6
commit
2fc410504e
2 changed files with 1017 additions and 0 deletions
263
README.md
Normal file
263
README.md
Normal file
|
@ -0,0 +1,263 @@
|
||||||
|
|
||||||
|
# Step 0: Clone the repository
|
||||||
|
Before you can run this project, you will need to clone the git repository with the following command:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone https://git.nickiel.net/Nickiel/WGU-Capstone
|
||||||
|
```
|
||||||
|
|
||||||
|
See [Project Structure](#project-structure) for more information on the repository you just cloned.
|
||||||
|
|
||||||
|
See [Step 1 - Prerequisites](#step-1---prerequisites) on what is required before you can run this project.
|
||||||
|
|
||||||
|
# Project Structure
|
||||||
|
Below you can find the default project folder structure after cloning it:
|
||||||
|
|
||||||
|
```
|
||||||
|
WGU-Capstone
|
||||||
|
├.gitignore
|
||||||
|
├Main.py
|
||||||
|
├README.md
|
||||||
|
├WGU-Capstone-User-Guide.html
|
||||||
|
├requirements.txt
|
||||||
|
├shell.nix
|
||||||
|
├cascades
|
||||||
|
│ ├ cascade_1.xml
|
||||||
|
│ ├ cascade_2.xml
|
||||||
|
│ ├ cascade_5.xml
|
||||||
|
│ └ cascade_10.xml
|
||||||
|
├training_data
|
||||||
|
│ ├ positives
|
||||||
|
│ └ training_data_setup.py
|
||||||
|
└validation
|
||||||
|
├ TestVideo.mp4
|
||||||
|
├ compare_to_gt.py
|
||||||
|
├ create_ground_truth.py
|
||||||
|
└ ground_truth.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
[Click here to skip the detailed file structure explaination](#step-1---prerequisites)
|
||||||
|
|
||||||
|
## Top Level
|
||||||
|
In the top-level of the cloned repository, you will find most of the files required for the core-fuctionality.
|
||||||
|
|
||||||
|
#### .gitignore
|
||||||
|
This file excludes files we don't want to check into git - such as the training data.
|
||||||
|
These files continue to exist on machine, but they are not uploaded to the remote git repository. This is very helpful to keep the clone sizes down, and upload/download speeds up.
|
||||||
|
|
||||||
|
#### Main.py
|
||||||
|
The main file of interest for this project. This file contains all of the code for the finished product.
|
||||||
|
As long as this file is in the same folder as the `./cascades` folder, it can be copied and run anywhere with the prerequisites installed.
|
||||||
|
|
||||||
|
#### README.md
|
||||||
|
The file you are reading in a format that most git hosting servers automatically render as the home-page.
|
||||||
|
|
||||||
|
#### WGU-Capstone-User-Guide.html
|
||||||
|
The html version of the README.md file that was bundled with CSS and hyper-links.
|
||||||
|
|
||||||
|
#### requirements.txt
|
||||||
|
The file that contains all of the python pip requiremnts to run. This packages in this file can either be installed by hand (e.g. `pip install opencv-python`), or can all be installed at once with `pip install -r requirements.txt` which will install all of the modules needed to run this project that are not included in the standard library.
|
||||||
|
|
||||||
|
#### shell.nix
|
||||||
|
A file that can be used on [Nix and NixOS](https://nixos.org/) systems to create a reproducable environement with all of the requirements to run the `Main.py` file.
|
||||||
|
|
||||||
|
## ./Cascades
|
||||||
|
This folder contains the final trained models created by this project in the model training step.
|
||||||
|
For more information on how they were created, see [Training your own Haar file](#training-your-own-haar-file) below.
|
||||||
|
|
||||||
|
This folder needs to be in the same directory as the `Main.py` file for the `Main.py` file to be able to run.
|
||||||
|
|
||||||
|
## ./Traning_data
|
||||||
|
This folder contains all of the requirements for creating a new model from a few un-catagorized positive images, and a large dataset of negatives.
|
||||||
|
|
||||||
|
NOTE: Before anything in this folder can be run, please see [the section on training the haar files](#training-your-own-haar-file) for several prerequisites.
|
||||||
|
|
||||||
|
#### ./Training_data_setup.py
|
||||||
|
This python file takes a large data-set of negative images from the `./training_data/negatives` folder and creates .vec files that can be passed as an arguement to the utility that trains the final Haar file.
|
||||||
|
|
||||||
|
#### ./Positives
|
||||||
|
This folder contains the 10 images that were used to create the cascade files included in this project. These files were included because the 10 images are a very small dataset in comparison to the required negatives.
|
||||||
|
|
||||||
|
## ./Validation
|
||||||
|
The folder contains all of the scripts and files used to measure the performance and accuracy of the generated models.
|
||||||
|
|
||||||
|
#### TestVideo.mp4
|
||||||
|
This minute-long video was used to test the trained models.
|
||||||
|
|
||||||
|
#### Compare_to_gt.py
|
||||||
|
This file compares the output of a `--validate` output file generated by `Main.py` of a run with the provided `ground_truth.txt` file.
|
||||||
|
The output of this file is a .csv file that describes the average deviation from the boxes described by the `ground_truth.txt` file. See [Validation and Testing](#validation-and-testing) for more information on this process.
|
||||||
|
|
||||||
|
#### Create_ground_truth.py
|
||||||
|
This is the file used to create the `ground_truth.txt` file from the provided `TestVideo.mp4`.
|
||||||
|
|
||||||
|
# Step 1 - Prerequisites
|
||||||
|
Before you can run this project, you need a python environment with the required packages installed.
|
||||||
|
|
||||||
|
If you are using Nix or NixOS, simply run `nix shell` in the `WGU-Capstone` folder, and all of the packages required to run `Main.py` will be installed for that shell session.
|
||||||
|
|
||||||
|
However, if you are not on a Nix system, continue reading.
|
||||||
|
|
||||||
|
The steps below detail how to set up a virtual environment that can be used to run this project, but a system-wide install of python with the packages detailed in `requirements.txt` installed will also suffice.
|
||||||
|
|
||||||
|
### Set up virtual environment
|
||||||
|
This project was created with python 3.11, and other versions are not garunteed to work. So to ensure the project works as designed, install python 3.11 from the official python download page.
|
||||||
|
|
||||||
|
Once you have python 3.11 installed on your system, navigate to the cloned repository's root directory, and run the following command to create a new virtual environement:
|
||||||
|
|
||||||
|
```python
|
||||||
|
python -m venv ./venv
|
||||||
|
```
|
||||||
|
|
||||||
|
You can now run the following commands to enter the virtual environment, and any python commands will be run inside the virtual environment instead of your system-wide installation.
|
||||||
|
|
||||||
|
On windows run the following if you are using a cmd prompt:
|
||||||
|
```shell
|
||||||
|
.\venv\Scripts\activate.bat
|
||||||
|
```
|
||||||
|
On windows in powershell:
|
||||||
|
```shell
|
||||||
|
.\venv\Scripts\Activate.ps1
|
||||||
|
```
|
||||||
|
|
||||||
|
If you are on a linux based operating system, enter the virtual environment with:
|
||||||
|
```shell
|
||||||
|
.\venv\Scripts\activate
|
||||||
|
```
|
||||||
|
|
||||||
|
### Install requirements
|
||||||
|
Now that you have activated the virtual environment, install the non-standard library requirements with the below command:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
pip install -r ./requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
# Step 2 - Running the project
|
||||||
|
Now that the pre-requisites have been installed, you can run the project. For a full list of command-line arguements, run `python Main.py --help`.
|
||||||
|
|
||||||
|
Run the project with the dashboard enabled with the following command from the root of the project directory:
|
||||||
|
```shell
|
||||||
|
python Main.py -d
|
||||||
|
```
|
||||||
|
|
||||||
|
You should see the web-cam of your computer turn on, and a window appear showing the view of the webcam, with boxes around any detected faces.
|
||||||
|
|
||||||
|
To display the calculated adjustment amounts generated by this project, enable the print-to-stoud feature with the `-o` flag:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
python Main.py -d -o
|
||||||
|
```
|
||||||
|
|
||||||
|
This command will output the calculated output commands for every detected face, and also show the summary statistics.
|
||||||
|
|
||||||
|
# Additional flags
|
||||||
|
This section will describe, in greater depth, the available feature flags shown by the `--help` screen.
|
||||||
|
|
||||||
|
## Help
|
||||||
|
`-h` or `--help`
|
||||||
|
|
||||||
|
Displays all of the available parameters and a quick description
|
||||||
|
|
||||||
|
## Version
|
||||||
|
`-v` or `--version`
|
||||||
|
|
||||||
|
Prints the version of the program and exits
|
||||||
|
|
||||||
|
## Show Dashboard
|
||||||
|
`-d` or `--dasbboard`
|
||||||
|
|
||||||
|
Display the run-summary statistics, these are off by default.
|
||||||
|
|
||||||
|
## Output Adjustment Instructions
|
||||||
|
`-o` or `--output`
|
||||||
|
|
||||||
|
Print the calculated adjustment instructions generated by the program. This output demonstrates the generated values that will be sent to the motorized camera platform.
|
||||||
|
|
||||||
|
## Use Video File
|
||||||
|
`-f <file_path>` or `--file <file_path>`
|
||||||
|
|
||||||
|
Use a video file (such as ./validation/TestVideo.mp4) instead of the computer's webcam. Useful for generating validation files and on machines without a working webcam.
|
||||||
|
|
||||||
|
## Headless Mode
|
||||||
|
`-s` or `--no-screen`
|
||||||
|
|
||||||
|
Run the program without the window displaying processed video frames.
|
||||||
|
|
||||||
|
## Save Frames for Training Data
|
||||||
|
`-t` or `--training-data`
|
||||||
|
|
||||||
|
Save frames where faces were found to `./output` as .jpg files, and save the located face's location to a .csv file.
|
||||||
|
This feature will be used to generate positive images automatically for training future models.
|
||||||
|
|
||||||
|
## Generate Validation File
|
||||||
|
`--validate`
|
||||||
|
|
||||||
|
Outputs all discovered boxes, the frame they were found on, and the box coordinates so the model can be validated against the ground truth. See [validation and testing](#validation-and-testing) for more information on this process.
|
||||||
|
|
||||||
|
# Training Your Own Haar File
|
||||||
|
This project contains the scripts required to train your own Haar cascade files, but it does not contain several of the dependencies.
|
||||||
|
|
||||||
|
NOTE: These steps only apply to Windows devices.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
The first requirement needed before you can train your own Haar file, is a large number of negative images. For this project, I used [this Kaggle dataset of landscape images](https://www.kaggle.com/datasets/arnaud58/landscape-pictures/) as my negatives datasource. After downloading this file, unzip it and deposit all of the raw images into the `./training_data/negatives` folder - create it if needed.
|
||||||
|
|
||||||
|
Next we need to download the windows OpenCV binary distributable and put it in our training_data folder.
|
||||||
|
|
||||||
|
You can download the 3.4.15 binary executable [here](https://sourceforge.net/projects/opencvlibrary/files/3.4.15/opencv-3.4.15-vc14_vc15.exe/download). (You can also go [here](https://opencv.org/releases/) and find the 3.4.15 release and choose "windows" to get to the same page).
|
||||||
|
|
||||||
|
After the .exe file has downloaded, open it and go through the steps to unzip it. After it has been unzipped, copy the folder to `./training_data/opencv`. So you should be able to run this from the training_data directory:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
.\opencv\build\x64\vc15\bin\opencv_createsamples.exe
|
||||||
|
```
|
||||||
|
|
||||||
|
If you do not get an error running the above command, then it was installed correctly.
|
||||||
|
|
||||||
|
## Generating positive images
|
||||||
|
Now that we have the create_samples utility provided by OpenCV (they stopped distributing executables of it after 3.4.15) and the negatives folder full of negative images, we can use the `training_data_setup.py` file to create several different sized datasets ready for training Haar cascade files on.
|
||||||
|
|
||||||
|
The python file will run the create_samples tool for every positive image in `./positives`, creating many positive images.
|
||||||
|
The script will do all of the steps up through creating the .vec files that the train_cascade exectuable requires.
|
||||||
|
|
||||||
|
Before exiting, training_data_setup outputs the commands that need to be run to train the models. Run these commands from the training_data folder, and after they have finished training, you can use the generated Haar cascades instead of the ones provided.
|
||||||
|
|
||||||
|
|
||||||
|
# Validation and Testing
|
||||||
|
The following describes the process I used to test the precision and accuracy of the generated cascade files.
|
||||||
|
|
||||||
|
## Generate the Ground Truth file
|
||||||
|
I have included a generated `ground_truth.txt` file, so you don't need to do this step. But if you would like to generate the ground truth file from the provided test video, navigate to root of the project, and run the create ground truth script:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
python create_ground_truth.py
|
||||||
|
```
|
||||||
|
|
||||||
|
A window will open and display the process as it creates the file. This script does not utilize Haar files, but the MIL tracking algorithm, which results in much more accurate results, but a slower processing speed for the video.
|
||||||
|
|
||||||
|
All of these settings have been hard-coded so it will always output the same ground truth file.
|
||||||
|
|
||||||
|
## Getting the model validation file
|
||||||
|
Now that we have the ground truth for our Test Video, we need to generate the same file with our trained model.
|
||||||
|
|
||||||
|
To do this, edit the `Main.py` file so that it uses the new cascade, then run the python file with the `--validate` option set, and the test video passed to the `-f` flag. The command used to generate the statistics with the test video provided is this:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
python ./Main.py -d -f ./validation/TestVideo.mp4 --validate
|
||||||
|
```
|
||||||
|
(Notice that we can still display the dashboard while it outputs validation info)
|
||||||
|
|
||||||
|
This will create a new file in the `./validation` folder describing the faces and locations found in each frame.
|
||||||
|
|
||||||
|
## Comparing it to the ground truth
|
||||||
|
I have created a script to automatically compare a validation file with a ground truth file, and output the average absolute deviation in adjustment instructions.
|
||||||
|
It requires two arguements, and has one optional output. You can see the options with the `--help` flag, but I will demonstrate all of the options below.
|
||||||
|
|
||||||
|
You can use `./validation/compare_to_gt.py` like this:
|
||||||
|
```shell
|
||||||
|
cd ./validation
|
||||||
|
python compare_to_gt ./ground_truth.txt ./20231012-081235.txt ./output.csv --faces_count_file ./faces_count_output.csv
|
||||||
|
```
|
||||||
|
|
||||||
|
This script will then take the generated test validation file, and get what the generated adjustment output would be, and gets the absolute difference between it and the ground truth, then it adds together all results for each frame - this last part penalizes false positives. We can then take the generated output file, and open it in Excel. We can take the average of it to see what the average deviation from the ground truth would be. The generated faces_count_output file contains the number of faces found in each frame, and can be used to measure the number of false positives.
|
||||||
|
|
754
WGU-Capstone-User-Guide.html
Normal file
754
WGU-Capstone-User-Guide.html
Normal file
|
@ -0,0 +1,754 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang xml:lang>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="generator" content="pandoc" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
||||||
|
<title>WGU Capstone User Guide</title>
|
||||||
|
<style>
|
||||||
|
code{white-space: pre-wrap;}
|
||||||
|
span.smallcaps{font-variant: small-caps;}
|
||||||
|
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
||||||
|
div.column{flex: auto; overflow-x: auto;}
|
||||||
|
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
||||||
|
|
||||||
|
ul.task-list[class]{list-style: none;}
|
||||||
|
ul.task-list li input[type="checkbox"] {
|
||||||
|
font-size: inherit;
|
||||||
|
width: 0.8em;
|
||||||
|
margin: 0 0.8em 0.2em -1.6em;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
||||||
|
|
||||||
|
pre > code.sourceCode { white-space: pre; position: relative; }
|
||||||
|
pre > code.sourceCode > span { line-height: 1.25; }
|
||||||
|
pre > code.sourceCode > span:empty { height: 1.2em; }
|
||||||
|
.sourceCode { overflow: visible; }
|
||||||
|
code.sourceCode > span { color: inherit; text-decoration: inherit; }
|
||||||
|
div.sourceCode { margin: 1em 0; }
|
||||||
|
pre.sourceCode { margin: 0; }
|
||||||
|
@media screen {
|
||||||
|
div.sourceCode { overflow: auto; }
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
pre > code.sourceCode { white-space: pre-wrap; }
|
||||||
|
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
|
||||||
|
}
|
||||||
|
pre.numberSource code
|
||||||
|
{ counter-reset: source-line 0; }
|
||||||
|
pre.numberSource code > span
|
||||||
|
{ position: relative; left: -4em; counter-increment: source-line; }
|
||||||
|
pre.numberSource code > span > a:first-child::before
|
||||||
|
{ content: counter(source-line);
|
||||||
|
position: relative; left: -1em; text-align: right; vertical-align: baseline;
|
||||||
|
border: none; display: inline-block;
|
||||||
|
-webkit-touch-callout: none; -webkit-user-select: none;
|
||||||
|
-khtml-user-select: none; -moz-user-select: none;
|
||||||
|
-ms-user-select: none; user-select: none;
|
||||||
|
padding: 0 4px; width: 4em;
|
||||||
|
color: #aaaaaa;
|
||||||
|
}
|
||||||
|
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
|
||||||
|
div.sourceCode
|
||||||
|
{ }
|
||||||
|
@media screen {
|
||||||
|
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
|
||||||
|
}
|
||||||
|
code span.al { color: #ff0000; font-weight: bold; }
|
||||||
|
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; }
|
||||||
|
code span.at { color: #7d9029; }
|
||||||
|
code span.bn { color: #40a070; }
|
||||||
|
code span.bu { color: #008000; }
|
||||||
|
code span.cf { color: #007020; font-weight: bold; }
|
||||||
|
code span.ch { color: #4070a0; }
|
||||||
|
code span.cn { color: #880000; }
|
||||||
|
code span.co { color: #60a0b0; font-style: italic; }
|
||||||
|
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; }
|
||||||
|
code span.do { color: #ba2121; font-style: italic; }
|
||||||
|
code span.dt { color: #902000; }
|
||||||
|
code span.dv { color: #40a070; }
|
||||||
|
code span.er { color: #ff0000; font-weight: bold; }
|
||||||
|
code span.ex { }
|
||||||
|
code span.fl { color: #40a070; }
|
||||||
|
code span.fu { color: #06287e; }
|
||||||
|
code span.im { color: #008000; font-weight: bold; }
|
||||||
|
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; }
|
||||||
|
code span.kw { color: #007020; font-weight: bold; }
|
||||||
|
code span.op { color: #666666; }
|
||||||
|
code span.ot { color: #007020; }
|
||||||
|
code span.pp { color: #bc7a00; }
|
||||||
|
code span.sc { color: #4070a0; }
|
||||||
|
code span.ss { color: #bb6688; }
|
||||||
|
code span.st { color: #4070a0; }
|
||||||
|
code span.va { color: #19177c; }
|
||||||
|
code span.vs { color: #4070a0; }
|
||||||
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; }
|
||||||
|
</style>
|
||||||
|
<style type="text/css">html{
|
||||||
|
font-family:sans-serif;
|
||||||
|
-ms-text-size-adjust:100%;
|
||||||
|
-webkit-text-size-adjust:100%
|
||||||
|
}
|
||||||
|
body{
|
||||||
|
background-color: #11111b;
|
||||||
|
color: #cdd6f4;
|
||||||
|
margin:0;
|
||||||
|
}
|
||||||
|
a{
|
||||||
|
color: #a6d189;
|
||||||
|
background:transparent
|
||||||
|
}
|
||||||
|
a:active,a:hover{
|
||||||
|
outline:0
|
||||||
|
}
|
||||||
|
b,strong{
|
||||||
|
font-weight:bold
|
||||||
|
}
|
||||||
|
h1{
|
||||||
|
color: #eba0ac;
|
||||||
|
font-size:2em;
|
||||||
|
margin:0.67em 0
|
||||||
|
}
|
||||||
|
small{
|
||||||
|
font-size:80%
|
||||||
|
}
|
||||||
|
sub,sup{
|
||||||
|
color: #b5bfe2
|
||||||
|
font-size:75%;
|
||||||
|
line-height:0;
|
||||||
|
position:relative;
|
||||||
|
vertical-align:baseline
|
||||||
|
}
|
||||||
|
sup{
|
||||||
|
top:-0.5em
|
||||||
|
}
|
||||||
|
sub{
|
||||||
|
bottom:-0.25em
|
||||||
|
}
|
||||||
|
img{
|
||||||
|
border:0
|
||||||
|
}
|
||||||
|
hr{
|
||||||
|
-moz-box-sizing:content-box;
|
||||||
|
box-sizing:content-box;
|
||||||
|
height:0;
|
||||||
|
}
|
||||||
|
pre{
|
||||||
|
overflow:auto
|
||||||
|
}
|
||||||
|
code,kbd,pre,samp{
|
||||||
|
font-family:monospace, monospace;
|
||||||
|
font-size:1em;
|
||||||
|
color: #414559;
|
||||||
|
}
|
||||||
|
textarea{
|
||||||
|
overflow:auto
|
||||||
|
}
|
||||||
|
table{
|
||||||
|
border-collapse:collapse;
|
||||||
|
border-spacing:0
|
||||||
|
}
|
||||||
|
td,th{
|
||||||
|
padding:0
|
||||||
|
}
|
||||||
|
body,code,tr.odd,tr.even,body{
|
||||||
|
line-height:1.3;
|
||||||
|
text-align:justify;
|
||||||
|
-moz-hyphens:auto;
|
||||||
|
-ms-hyphens:auto;
|
||||||
|
-webkit-hyphens:auto;
|
||||||
|
hyphens:auto
|
||||||
|
}
|
||||||
|
@media (max-width: 400px){
|
||||||
|
body{
|
||||||
|
font-size:12px;
|
||||||
|
margin-left:10px;
|
||||||
|
margin-right:10px;
|
||||||
|
margin-top:10px;
|
||||||
|
margin-bottom:15px
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (min-width: 401px) and (max-width: 600px){
|
||||||
|
body{
|
||||||
|
font-size:14px;
|
||||||
|
margin-left:10px;
|
||||||
|
margin-right:10px;
|
||||||
|
margin-top:10px;
|
||||||
|
margin-bottom:15px
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (min-width: 601px) and (max-width: 900px){
|
||||||
|
body{
|
||||||
|
font-size:15px;
|
||||||
|
margin-left:100px;
|
||||||
|
margin-right:100px;
|
||||||
|
margin-top:20px;
|
||||||
|
margin-bottom:25px
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (min-width: 901px) and (max-width: 1800px){
|
||||||
|
body{
|
||||||
|
font-size:17px;
|
||||||
|
margin-left:200px;
|
||||||
|
margin-right:200px;
|
||||||
|
margin-top:30px;
|
||||||
|
margin-bottom:25px;
|
||||||
|
max-width:800px
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (min-width: 1801px){
|
||||||
|
body{
|
||||||
|
font-size:18px;
|
||||||
|
margin-left:20%;
|
||||||
|
margin-right:20%;
|
||||||
|
margin-top:30px;
|
||||||
|
margin-bottom:25px;
|
||||||
|
max-width:1000px
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p{
|
||||||
|
margin-top:10px;
|
||||||
|
margin-bottom:18px
|
||||||
|
}
|
||||||
|
em{
|
||||||
|
font-style:italic
|
||||||
|
}
|
||||||
|
strong{
|
||||||
|
font-weight:bold
|
||||||
|
}
|
||||||
|
h1,h2,h3,h4,h5,h6{
|
||||||
|
font-weight:bold;
|
||||||
|
padding-top:0.25em;
|
||||||
|
margin-bottom:0.15em
|
||||||
|
}
|
||||||
|
header{
|
||||||
|
line-height:2.475em;
|
||||||
|
padding-bottom:0.7em;
|
||||||
|
border-bottom:1px solid #bbb;
|
||||||
|
margin-bottom:1.2em
|
||||||
|
}
|
||||||
|
header>h1{
|
||||||
|
border:none;
|
||||||
|
padding:0;
|
||||||
|
margin:0;
|
||||||
|
font-size:225%
|
||||||
|
}
|
||||||
|
header>h2{
|
||||||
|
border:none;
|
||||||
|
padding:0;
|
||||||
|
margin:0;
|
||||||
|
font-style:normal;
|
||||||
|
font-size:175%
|
||||||
|
}
|
||||||
|
header>h3{
|
||||||
|
padding:0;
|
||||||
|
margin:0;
|
||||||
|
font-size:125%;
|
||||||
|
font-style:italic
|
||||||
|
}
|
||||||
|
header+h1{
|
||||||
|
border-top:none;
|
||||||
|
padding-top:0px
|
||||||
|
}
|
||||||
|
h1{
|
||||||
|
border-top:1px solid #bbb;
|
||||||
|
padding-top:15px;
|
||||||
|
font-size:150%;
|
||||||
|
margin-bottom:10px
|
||||||
|
}
|
||||||
|
h1:first-of-type{
|
||||||
|
border:none
|
||||||
|
}
|
||||||
|
h2{
|
||||||
|
font-size:125%;
|
||||||
|
font-style:italic
|
||||||
|
}
|
||||||
|
h3{
|
||||||
|
font-size:105%;
|
||||||
|
font-style:italic
|
||||||
|
}
|
||||||
|
hr{
|
||||||
|
border:0px;
|
||||||
|
border-top:1px solid #bbb;
|
||||||
|
width:100%;
|
||||||
|
height:0px
|
||||||
|
}
|
||||||
|
hr+h1{
|
||||||
|
border-top:none;
|
||||||
|
padding-top:0px
|
||||||
|
}
|
||||||
|
ul,ol{
|
||||||
|
font-size:90%;
|
||||||
|
margin-top:10px;
|
||||||
|
margin-bottom:15px;
|
||||||
|
padding-left:30px
|
||||||
|
}
|
||||||
|
ul{
|
||||||
|
list-style:circle
|
||||||
|
}
|
||||||
|
ol{
|
||||||
|
list-style:decimal
|
||||||
|
}
|
||||||
|
ul ul,ol ol,ul ol,ol ul{
|
||||||
|
font-size:inherit
|
||||||
|
}
|
||||||
|
li{
|
||||||
|
margin-top:5px;
|
||||||
|
margin-bottom:7px
|
||||||
|
}
|
||||||
|
q,blockquote,dd{
|
||||||
|
font-style:italic;
|
||||||
|
font-size:90%
|
||||||
|
}
|
||||||
|
blockquote,dd{
|
||||||
|
quotes:none;
|
||||||
|
border-left:0.35em #bbb solid;
|
||||||
|
padding-left:1.15em;
|
||||||
|
margin:0 1.5em 0 0
|
||||||
|
}
|
||||||
|
blockquote blockquote,dd blockquote,blockquote dd,dd dd,ol blockquote,ol dd,ul blockquote,ul dd,blockquote ol,dd ol,blockquote ul,dd ul{
|
||||||
|
font-size:inherit
|
||||||
|
}
|
||||||
|
a,a:link,a:visited,a:hover{
|
||||||
|
text-decoration:none;
|
||||||
|
border-bottom:1px dashed #111
|
||||||
|
}
|
||||||
|
a:hover,a:link:hover,a:visited:hover,a:hover:hover{
|
||||||
|
border-bottom-style:solid
|
||||||
|
}
|
||||||
|
a.footnoteRef,a:link.footnoteRef,a:visited.footnoteRef,a:hover.footnoteRef{
|
||||||
|
border-bottom:none;
|
||||||
|
color:#666
|
||||||
|
}
|
||||||
|
code{
|
||||||
|
font-family:"Source Code Pro","Consolas","Monaco",monospace;
|
||||||
|
font-size:85%;
|
||||||
|
background-color:#ddd;
|
||||||
|
border:1px solid #bbb;
|
||||||
|
padding:0px 0.15em 0px 0.15em;
|
||||||
|
-webkit-border-radius:3px;
|
||||||
|
-moz-border-radius:3px;
|
||||||
|
border-radius:3px
|
||||||
|
}
|
||||||
|
pre{
|
||||||
|
margin-right:1.5em;
|
||||||
|
display:block
|
||||||
|
}
|
||||||
|
pre>code{
|
||||||
|
display:block;
|
||||||
|
font-size:70%;
|
||||||
|
padding:10px;
|
||||||
|
-webkit-border-radius:5px;
|
||||||
|
-moz-border-radius:5px;
|
||||||
|
border-radius:5px;
|
||||||
|
overflow-x:auto
|
||||||
|
}
|
||||||
|
blockquote pre,dd pre,ul pre,ol pre{
|
||||||
|
margin-left:0;
|
||||||
|
margin-right:0
|
||||||
|
}
|
||||||
|
blockquote pre>code,dd pre>code,ul pre>code,ol pre>code{
|
||||||
|
font-size:77.77778%
|
||||||
|
}
|
||||||
|
caption,figcaption{
|
||||||
|
font-size:80%;
|
||||||
|
font-style:italic;
|
||||||
|
text-align:right;
|
||||||
|
margin-bottom:5px
|
||||||
|
}
|
||||||
|
caption:empty,figcaption:empty{
|
||||||
|
display:none
|
||||||
|
}
|
||||||
|
table{
|
||||||
|
width:100%;
|
||||||
|
margin-top:1em;
|
||||||
|
margin-bottom:1em
|
||||||
|
}
|
||||||
|
table+h1{
|
||||||
|
border-top:none
|
||||||
|
}
|
||||||
|
tr td,tr th{
|
||||||
|
padding:0.2em 0.7em
|
||||||
|
}
|
||||||
|
tr.header{
|
||||||
|
border-top:1px solid #222;
|
||||||
|
border-bottom:1px solid #222;
|
||||||
|
font-weight:700
|
||||||
|
}
|
||||||
|
tr.odd{
|
||||||
|
background-color:#eee
|
||||||
|
}
|
||||||
|
tr.even{
|
||||||
|
background-color:#ccc
|
||||||
|
}
|
||||||
|
tbody:last-child{
|
||||||
|
border-bottom:1px solid #222
|
||||||
|
}
|
||||||
|
dt{
|
||||||
|
font-weight:700
|
||||||
|
}
|
||||||
|
dt:after{
|
||||||
|
font-weight:normal;
|
||||||
|
content:":"
|
||||||
|
}
|
||||||
|
dd{
|
||||||
|
margin-bottom:10px
|
||||||
|
}
|
||||||
|
img{
|
||||||
|
display:block;
|
||||||
|
margin:0px auto;
|
||||||
|
padding:0px;
|
||||||
|
max-width:100%
|
||||||
|
}
|
||||||
|
figcaption{
|
||||||
|
margin:5px 10px 5px 30px
|
||||||
|
}
|
||||||
|
.footnotes{
|
||||||
|
color:#666;
|
||||||
|
font-size:70%;
|
||||||
|
font-style:italic
|
||||||
|
}
|
||||||
|
.footnotes li p:last-child a:last-child{
|
||||||
|
border-bottom:none
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<!--[if lt IE 9]>
|
||||||
|
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
|
||||||
|
<![endif]-->
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<nav id="TOC" role="doc-toc">
|
||||||
|
<ul>
|
||||||
|
<li><a href="#step-0-clone-the-repository" id="toc-step-0-clone-the-repository">Step 0: Clone the
|
||||||
|
repository</a></li>
|
||||||
|
<li><a href="#project-structure" id="toc-project-structure">Project
|
||||||
|
Structure</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#top-level" id="toc-top-level">Top Level</a></li>
|
||||||
|
<li><a href="#cascades" id="toc-cascades">./Cascades</a></li>
|
||||||
|
<li><a href="#traning_data" id="toc-traning_data">./Traning_data</a></li>
|
||||||
|
<li><a href="#validation" id="toc-validation">./Validation</a></li>
|
||||||
|
</ul></li>
|
||||||
|
<li><a href="#step-1---prerequisites" id="toc-step-1---prerequisites">Step 1 - Prerequisites</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#set-up-virtual-environment" id="toc-set-up-virtual-environment">Set up virtual environment</a></li>
|
||||||
|
<li><a href="#install-requirements" id="toc-install-requirements">Install requirements</a></li>
|
||||||
|
</ul></li>
|
||||||
|
<li><a href="#step-2---running-the-project" id="toc-step-2---running-the-project">Step 2 - Running the
|
||||||
|
project</a></li>
|
||||||
|
<li><a href="#additional-flags" id="toc-additional-flags">Additional
|
||||||
|
flags</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#help" id="toc-help">Help</a></li>
|
||||||
|
<li><a href="#version" id="toc-version">Version</a></li>
|
||||||
|
<li><a href="#show-dashboard" id="toc-show-dashboard">Show
|
||||||
|
Dashboard</a></li>
|
||||||
|
<li><a href="#output-adjustment-instructions" id="toc-output-adjustment-instructions">Output Adjustment
|
||||||
|
Instructions</a></li>
|
||||||
|
<li><a href="#use-video-file" id="toc-use-video-file">Use Video
|
||||||
|
File</a></li>
|
||||||
|
<li><a href="#headless-mode" id="toc-headless-mode">Headless
|
||||||
|
Mode</a></li>
|
||||||
|
<li><a href="#save-frames-for-training-data" id="toc-save-frames-for-training-data">Save Frames for Training
|
||||||
|
Data</a></li>
|
||||||
|
<li><a href="#generate-validation-file" id="toc-generate-validation-file">Generate Validation File</a></li>
|
||||||
|
</ul></li>
|
||||||
|
<li><a href="#training-your-own-haar-file" id="toc-training-your-own-haar-file">Training Your Own Haar File</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#prerequisites" id="toc-prerequisites">Prerequisites</a></li>
|
||||||
|
<li><a href="#generating-positive-images" id="toc-generating-positive-images">Generating positive images</a></li>
|
||||||
|
</ul></li>
|
||||||
|
<li><a href="#validation-and-testing" id="toc-validation-and-testing">Validation and Testing</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#generate-the-ground-truth-file" id="toc-generate-the-ground-truth-file">Generate the Ground Truth
|
||||||
|
file</a></li>
|
||||||
|
<li><a href="#getting-the-model-validation-file" id="toc-getting-the-model-validation-file">Getting the model validation
|
||||||
|
file</a></li>
|
||||||
|
<li><a href="#comparing-it-to-the-ground-truth" id="toc-comparing-it-to-the-ground-truth">Comparing it to the ground
|
||||||
|
truth</a></li>
|
||||||
|
</ul></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
<h1 id="step-0-clone-the-repository">Step 0: Clone the repository</h1>
|
||||||
|
<p>Before you can run this project, you will need to clone the git
|
||||||
|
repository with the following command:</p>
|
||||||
|
<div class="sourceCode" id="cb1"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="fu">git</span> clone https://git.nickiel.net/Nickiel/WGU-Capstone</span></code></pre></div>
|
||||||
|
<p>See <a href="#project-structure">Project Structure</a> for more
|
||||||
|
information on the repository you just cloned.</p>
|
||||||
|
<p>See <a href="#step-1---prerequisites">Step 1 - Prerequisites</a> on
|
||||||
|
what is required before you can run this project.</p>
|
||||||
|
<h1 id="project-structure">Project Structure</h1>
|
||||||
|
<p>Below you can find the default project folder structure after cloning
|
||||||
|
it:</p>
|
||||||
|
<pre><code>WGU-Capstone
|
||||||
|
├.gitignore
|
||||||
|
├Main.py
|
||||||
|
├README.md
|
||||||
|
├WGU-Capstone-User-Guide.html
|
||||||
|
├requirements.txt
|
||||||
|
├shell.nix
|
||||||
|
├cascades
|
||||||
|
│ ├ cascade_1.xml
|
||||||
|
│ ├ cascade_2.xml
|
||||||
|
│ ├ cascade_5.xml
|
||||||
|
│ └ cascade_10.xml
|
||||||
|
├training_data
|
||||||
|
│ ├ positives
|
||||||
|
│ └ training_data_setup.py
|
||||||
|
└validation
|
||||||
|
├ TestVideo.mp4
|
||||||
|
├ compare_to_gt.py
|
||||||
|
├ create_ground_truth.py
|
||||||
|
└ ground_truth.txt</code></pre>
|
||||||
|
<p><a href="#step-1---prerequisites">Click here to skip the detailed
|
||||||
|
file structure explaination</a></p>
|
||||||
|
<h2 id="top-level">Top Level</h2>
|
||||||
|
<p>In the top-level of the cloned repository, you will find most of the
|
||||||
|
files required for the core-fuctionality.</p>
|
||||||
|
<h4 id="gitignore">.gitignore</h4>
|
||||||
|
<p>This file excludes files we don’t want to check into git - such as
|
||||||
|
the training data. These files continue to exist on machine, but they
|
||||||
|
are not uploaded to the remote git repository. This is very helpful to
|
||||||
|
keep the clone sizes down, and upload/download speeds up.</p>
|
||||||
|
<h4 id="main.py">Main.py</h4>
|
||||||
|
<p>The main file of interest for this project. This file contains all of
|
||||||
|
the code for the finished product. As long as this file is in the same
|
||||||
|
folder as the <code>./cascades</code> folder, it can be copied and run
|
||||||
|
anywhere with the prerequisites installed.</p>
|
||||||
|
<h4 id="readme.md">README.md</h4>
|
||||||
|
<p>The file you are reading in a format that most git hosting servers
|
||||||
|
automatically render as the home-page.</p>
|
||||||
|
<h4 id="wgu-capstone-user-guide.html">WGU-Capstone-User-Guide.html</h4>
|
||||||
|
<p>The html version of the README.md file that was bundled with CSS and
|
||||||
|
hyper-links.</p>
|
||||||
|
<h4 id="requirements.txt">requirements.txt</h4>
|
||||||
|
<p>The file that contains all of the python pip requiremnts to run. This
|
||||||
|
packages in this file can either be installed by hand
|
||||||
|
(e.g. <code>pip install opencv-python</code>), or can all be installed
|
||||||
|
at once with <code>pip install -r requirements.txt</code> which will
|
||||||
|
install all of the modules needed to run this project that are not
|
||||||
|
included in the standard library.</p>
|
||||||
|
<h4 id="shell.nix">shell.nix</h4>
|
||||||
|
<p>A file that can be used on <a href="https://nixos.org/">Nix and
|
||||||
|
NixOS</a> systems to create a reproducable environement with all of the
|
||||||
|
requirements to run the <code>Main.py</code> file.</p>
|
||||||
|
<h2 id="cascades">./Cascades</h2>
|
||||||
|
<p>This folder contains the final trained models created by this project
|
||||||
|
in the model training step. For more information on how they were
|
||||||
|
created, see <a href="#training-your-own-haar-file">Training your own
|
||||||
|
Haar file</a> below.</p>
|
||||||
|
<p>This folder needs to be in the same directory as the
|
||||||
|
<code>Main.py</code> file for the <code>Main.py</code> file to be able
|
||||||
|
to run.</p>
|
||||||
|
<h2 id="traning_data">./Traning_data</h2>
|
||||||
|
<p>This folder contains all of the requirements for creating a new model
|
||||||
|
from a few un-catagorized positive images, and a large dataset of
|
||||||
|
negatives.</p>
|
||||||
|
<p>NOTE: Before anything in this folder can be run, please see <a href="#training-your-own-haar-file">the section on training the haar
|
||||||
|
files</a> for several prerequisites.</p>
|
||||||
|
<h4 id="training_data_setup.py">./Training_data_setup.py</h4>
|
||||||
|
<p>This python file takes a large data-set of negative images from the
|
||||||
|
<code>./training_data/negatives</code> folder and creates .vec files
|
||||||
|
that can be passed as an arguement to the utility that trains the final
|
||||||
|
Haar file.</p>
|
||||||
|
<h4 id="positives">./Positives</h4>
|
||||||
|
<p>This folder contains the 10 images that were used to create the
|
||||||
|
cascade files included in this project. These files were included
|
||||||
|
because the 10 images are a very small dataset in comparison to the
|
||||||
|
required negatives.</p>
|
||||||
|
<h2 id="validation">./Validation</h2>
|
||||||
|
<p>The folder contains all of the scripts and files used to measure the
|
||||||
|
performance and accuracy of the generated models.</p>
|
||||||
|
<h4 id="testvideo.mp4">TestVideo.mp4</h4>
|
||||||
|
<p>This minute-long video was used to test the trained models.</p>
|
||||||
|
<h4 id="compare_to_gt.py">Compare_to_gt.py</h4>
|
||||||
|
<p>This file compares the output of a <code>--validate</code> output
|
||||||
|
file generated by <code>Main.py</code> of a run with the provided
|
||||||
|
<code>ground_truth.txt</code> file. The output of this file is a .csv
|
||||||
|
file that describes the average deviation from the boxes described by
|
||||||
|
the <code>ground_truth.txt</code> file. See <a href="#validation-and-testing">Validation and Testing</a> for more
|
||||||
|
information on this process.</p>
|
||||||
|
<h4 id="create_ground_truth.py">Create_ground_truth.py</h4>
|
||||||
|
<p>This is the file used to create the <code>ground_truth.txt</code>
|
||||||
|
file from the provided <code>TestVideo.mp4</code>.</p>
|
||||||
|
<h1 id="step-1---prerequisites">Step 1 - Prerequisites</h1>
|
||||||
|
<p>Before you can run this project, you need a python environment with
|
||||||
|
the required packages installed.</p>
|
||||||
|
<p>If you are using Nix or NixOS, simply run <code>nix shell</code> in
|
||||||
|
the <code>WGU-Capstone</code> folder, and all of the packages required
|
||||||
|
to run <code>Main.py</code> will be installed for that shell
|
||||||
|
session.</p>
|
||||||
|
<p>However, if you are not on a Nix system, continue reading.</p>
|
||||||
|
<p>The steps below detail how to set up a virtual environment that can
|
||||||
|
be used to run this project, but a system-wide install of python with
|
||||||
|
the packages detailed in <code>requirements.txt</code> installed will
|
||||||
|
also suffice.</p>
|
||||||
|
<h3 id="set-up-virtual-environment">Set up virtual environment</h3>
|
||||||
|
<p>This project was created with python 3.11, and other versions are not
|
||||||
|
garunteed to work. So to ensure the project works as designed, install
|
||||||
|
python 3.11 from the official python download page.</p>
|
||||||
|
<p>Once you have python 3.11 installed on your system, navigate to the
|
||||||
|
cloned repository’s root directory, and run the following command to
|
||||||
|
create a new virtual environement:</p>
|
||||||
|
<div class="sourceCode" id="cb3"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a>python <span class="op">-</span>m venv .<span class="op">/</span>venv</span></code></pre></div>
|
||||||
|
<p>You can now run the following commands to enter the virtual
|
||||||
|
environment, and any python commands will be run inside the virtual
|
||||||
|
environment instead of your system-wide installation.</p>
|
||||||
|
<p>On windows run the following if you are using a cmd prompt:</p>
|
||||||
|
<pre class="shell"><code>.\venv\Scripts\activate.bat</code></pre>
|
||||||
|
<p>On windows in powershell:</p>
|
||||||
|
<pre class="shell"><code>.\venv\Scripts\Activate.ps1</code></pre>
|
||||||
|
<p>If you are on a linux based operating system, enter the virtual
|
||||||
|
environment with:</p>
|
||||||
|
<pre class="shell"><code>.\venv\Scripts\activate</code></pre>
|
||||||
|
<h3 id="install-requirements">Install requirements</h3>
|
||||||
|
<p>Now that you have activated the virtual environment, install the
|
||||||
|
non-standard library requirements with the below command:</p>
|
||||||
|
<pre class="shell"><code>pip install -r ./requirements.txt</code></pre>
|
||||||
|
<h1 id="step-2---running-the-project">Step 2 - Running the project</h1>
|
||||||
|
<p>Now that the pre-requisites have been installed, you can run the
|
||||||
|
project. For a full list of command-line arguements, run
|
||||||
|
<code>python Main.py --help</code>.</p>
|
||||||
|
<p>Run the project with the dashboard enabled with the following command
|
||||||
|
from the root of the project directory:</p>
|
||||||
|
<pre class="shell"><code>python Main.py -d</code></pre>
|
||||||
|
<p>You should see the web-cam of your computer turn on, and a window
|
||||||
|
appear showing the view of the webcam, with boxes around any detected
|
||||||
|
faces.</p>
|
||||||
|
<p>To display the calculated adjustment amounts generated by this
|
||||||
|
project, enable the print-to-stoud feature with the <code>-o</code>
|
||||||
|
flag:</p>
|
||||||
|
<pre class="shell"><code>python Main.py -d -o</code></pre>
|
||||||
|
<p>This command will output the calculated output commands for every
|
||||||
|
detected face, and also show the summary statistics.</p>
|
||||||
|
<h1 id="additional-flags">Additional flags</h1>
|
||||||
|
<p>This section will describe, in greater depth, the available feature
|
||||||
|
flags shown by the <code>--help</code> screen.</p>
|
||||||
|
<h2 id="help">Help</h2>
|
||||||
|
<p><code>-h</code> or <code>--help</code></p>
|
||||||
|
<p>Displays all of the available parameters and a quick description</p>
|
||||||
|
<h2 id="version">Version</h2>
|
||||||
|
<p><code>-v</code> or <code>--version</code></p>
|
||||||
|
<p>Prints the version of the program and exits</p>
|
||||||
|
<h2 id="show-dashboard">Show Dashboard</h2>
|
||||||
|
<p><code>-d</code> or <code>--dasbboard</code></p>
|
||||||
|
<p>Display the run-summary statistics, these are off by default.</p>
|
||||||
|
<h2 id="output-adjustment-instructions">Output Adjustment
|
||||||
|
Instructions</h2>
|
||||||
|
<p><code>-o</code> or <code>--output</code></p>
|
||||||
|
<p>Print the calculated adjustment instructions generated by the
|
||||||
|
program. This output demonstrates the generated values that will be sent
|
||||||
|
to the motorized camera platform.</p>
|
||||||
|
<h2 id="use-video-file">Use Video File</h2>
|
||||||
|
<p><code>-f <file_path></code> or
|
||||||
|
<code>--file <file_path></code></p>
|
||||||
|
<p>Use a video file (such as ./validation/TestVideo.mp4) instead of the
|
||||||
|
computer’s webcam. Useful for generating validation files and on
|
||||||
|
machines without a working webcam.</p>
|
||||||
|
<h2 id="headless-mode">Headless Mode</h2>
|
||||||
|
<p><code>-s</code> or <code>--no-screen</code></p>
|
||||||
|
<p>Run the program without the window displaying processed video
|
||||||
|
frames.</p>
|
||||||
|
<h2 id="save-frames-for-training-data">Save Frames for Training
|
||||||
|
Data</h2>
|
||||||
|
<p><code>-t</code> or <code>--training-data</code></p>
|
||||||
|
<p>Save frames where faces were found to <code>./output</code> as .jpg
|
||||||
|
files, and save the located face’s location to a .csv file. This feature
|
||||||
|
will be used to generate positive images automatically for training
|
||||||
|
future models.</p>
|
||||||
|
<h2 id="generate-validation-file">Generate Validation File</h2>
|
||||||
|
<p><code>--validate</code></p>
|
||||||
|
<p>Outputs all discovered boxes, the frame they were found on, and the
|
||||||
|
box coordinates so the model can be validated against the ground truth.
|
||||||
|
See <a href="#validation-and-testing">validation and testing</a> for
|
||||||
|
more information on this process.</p>
|
||||||
|
<h1 id="training-your-own-haar-file">Training Your Own Haar File</h1>
|
||||||
|
<p>This project contains the scripts required to train your own Haar
|
||||||
|
cascade files, but it does not contain several of the dependencies.</p>
|
||||||
|
<p>NOTE: These steps only apply to Windows devices.</p>
|
||||||
|
<h2 id="prerequisites">Prerequisites</h2>
|
||||||
|
<p>The first requirement needed before you can train your own Haar file,
|
||||||
|
is a large number of negative images. For this project, I used <a href="https://www.kaggle.com/datasets/arnaud58/landscape-pictures/">this
|
||||||
|
Kaggle dataset of landscape images</a> as my negatives datasource. After
|
||||||
|
downloading this file, unzip it and deposit all of the raw images into
|
||||||
|
the <code>./training_data/negatives</code> folder - create it if
|
||||||
|
needed.</p>
|
||||||
|
<p>Next we need to download the windows OpenCV binary distributable and
|
||||||
|
put it in our training_data folder.</p>
|
||||||
|
<p>You can download the 3.4.15 binary executable <a href="https://sourceforge.net/projects/opencvlibrary/files/3.4.15/opencv-3.4.15-vc14_vc15.exe/download">here</a>.
|
||||||
|
(You can also go <a href="https://opencv.org/releases/">here</a> and
|
||||||
|
find the 3.4.15 release and choose “windows” to get to the same
|
||||||
|
page).</p>
|
||||||
|
<p>After the .exe file has downloaded, open it and go through the steps
|
||||||
|
to unzip it. After it has been unzipped, copy the folder to
|
||||||
|
<code>./training_data/opencv</code>. So you should be able to run this
|
||||||
|
from the training_data directory:</p>
|
||||||
|
<pre class="shell"><code>.\opencv\build\x64\vc15\bin\opencv_createsamples.exe</code></pre>
|
||||||
|
<p>If you do not get an error running the above command, then it was
|
||||||
|
installed correctly.</p>
|
||||||
|
<h2 id="generating-positive-images">Generating positive images</h2>
|
||||||
|
<p>Now that we have the create_samples utility provided by OpenCV (they
|
||||||
|
stopped distributing executables of it after 3.4.15) and the negatives
|
||||||
|
folder full of negative images, we can use the
|
||||||
|
<code>training_data_setup.py</code> file to create several different
|
||||||
|
sized datasets ready for training Haar cascade files on.</p>
|
||||||
|
<p>The python file will run the create_samples tool for every positive
|
||||||
|
image in <code>./positives</code>, creating many positive images. The
|
||||||
|
script will do all of the steps up through creating the .vec files that
|
||||||
|
the train_cascade exectuable requires.</p>
|
||||||
|
<p>Before exiting, training_data_setup outputs the commands that need to
|
||||||
|
be run to train the models. Run these commands from the training_data
|
||||||
|
folder, and after they have finished training, you can use the generated
|
||||||
|
Haar cascades instead of the ones provided.</p>
|
||||||
|
<h1 id="validation-and-testing">Validation and Testing</h1>
|
||||||
|
<p>The following describes the process I used to test the precision and
|
||||||
|
accuracy of the generated cascade files.</p>
|
||||||
|
<h2 id="generate-the-ground-truth-file">Generate the Ground Truth
|
||||||
|
file</h2>
|
||||||
|
<p>I have included a generated <code>ground_truth.txt</code> file, so
|
||||||
|
you don’t need to do this step. But if you would like to generate the
|
||||||
|
ground truth file from the provided test video, navigate to root of the
|
||||||
|
project, and run the create ground truth script:</p>
|
||||||
|
<pre class="shell"><code>python create_ground_truth.py</code></pre>
|
||||||
|
<p>A window will open and display the process as it creates the file.
|
||||||
|
This script does not utilize Haar files, but the MIL tracking algorithm,
|
||||||
|
which results in much more accurate results, but a slower processing
|
||||||
|
speed for the video.</p>
|
||||||
|
<p>All of these settings have been hard-coded so it will always output
|
||||||
|
the same ground truth file.</p>
|
||||||
|
<h2 id="getting-the-model-validation-file">Getting the model validation
|
||||||
|
file</h2>
|
||||||
|
<p>Now that we have the ground truth for our Test Video, we need to
|
||||||
|
generate the same file with our trained model.</p>
|
||||||
|
<p>To do this, edit the <code>Main.py</code> file so that it uses the
|
||||||
|
new cascade, then run the python file with the <code>--validate</code>
|
||||||
|
option set, and the test video passed to the <code>-f</code> flag. The
|
||||||
|
command used to generate the statistics with the test video provided is
|
||||||
|
this:</p>
|
||||||
|
<pre class="shell"><code>python ./Main.py -d -f ./validation/TestVideo.mp4 --validate</code></pre>
|
||||||
|
<p>(Notice that we can still display the dashboard while it outputs
|
||||||
|
validation info)</p>
|
||||||
|
<p>This will create a new file in the <code>./validation</code> folder
|
||||||
|
describing the faces and locations found in each frame.</p>
|
||||||
|
<h2 id="comparing-it-to-the-ground-truth">Comparing it to the ground
|
||||||
|
truth</h2>
|
||||||
|
<p>I have created a script to automatically compare a validation file
|
||||||
|
with a ground truth file, and output the average absolute deviation in
|
||||||
|
adjustment instructions. It requires two arguements, and has one
|
||||||
|
optional output. You can see the options with the <code>--help</code>
|
||||||
|
flag, but I will demonstrate all of the options below.</p>
|
||||||
|
<p>You can use <code>./validation/compare_to_gt.py</code> like this:</p>
|
||||||
|
<pre class="shell"><code>cd ./validation
|
||||||
|
python compare_to_gt ./ground_truth.txt ./20231012-081235.txt ./output.csv --faces_count_file ./faces_count_output.csv</code></pre>
|
||||||
|
<p>This script will then take the generated test validation file, and
|
||||||
|
get what the generated adjustment output would be, and gets the absolute
|
||||||
|
difference between it and the ground truth, then it adds together all
|
||||||
|
results for each frame - this last part penalizes false positives. We
|
||||||
|
can then take the generated output file, and open it in Excel. We can
|
||||||
|
take the average of it to see what the average deviation from the ground
|
||||||
|
truth would be. The generated faces_count_output file contains the
|
||||||
|
number of faces found in each frame, and can be used to measure the
|
||||||
|
number of false positives.</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in a new issue