Skip to content

Commit 2a34234

Browse files
committed
initial commit
0 parents  commit 2a34234

16 files changed

+4682
-0
lines changed

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2023 EMIT Lab, UW ECE
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

README.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Viola Jones Cascade Classifier Training
2+
This repository provides a Python implementation for training a cascade classifier using Viola-Jones algorithm. The code has been optimized to run almost as fast as the C++ implementation provided by OpenCV.
3+
4+
## Data preparation
5+
Positive data samples should be placed in a directory
6+
Background images from which negative data will be generated should be placed in another directory.
7+
8+
## Usage
9+
### Training
10+
Training without GA
11+
```
12+
python src/traincascade.py -model /path/to/save/cascade_classifier/ \
13+
-data_pos /path/to/positive/samples/folder/ \
14+
-data_neg /path/to/background/samples/folder/ \
15+
-numPos [NUM POS] -numNeg [NUM POS] -numStages [NUM STAGES] -maxWeakCount [MAX WEAK CLF COUNT] -minHitRate [MIN DETR EACH ROUND] -maxFalseAlarmRate [MAX FPR EACH ROUND] -log_file /path/to/logfile.log
16+
```
17+
18+
Training with GA
19+
```
20+
python src/traincascade_ga.py -model /path/to/save/cascade_classifier/ \
21+
-data_pos /path/to/positive/samples/folder/ \
22+
-data_neg /path/to/background/samples/folder/ \
23+
-results_dir /path/to/results/folder/
24+
-numPos [NUM POS] -numNeg [NUM POS] -numStages [NUM STAGES] -maxWeakCount [MAX WEAK CLF COUNT] -minHitRate [MIN DETR EACH ROUND] -maxFalseAlarmRate [MAX FPR EACH ROUND] -log_file /path/to/logfile.log
25+
```
26+
27+
### Detection
28+
```
29+
python src/inference.py -model /path/to/cascade_classifier/ -image /path/to/image.jpg -stage [STAGE] -min_obj_size [MIN OBJ SIZE] -max_obj_size [MAX OBJ SIZE]
30+
```

requirements.txt

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
# This file may be used to create an environment using:
2+
# $ conda create --name <env> --file <this file>
3+
# platform: linux-64
4+
_libgcc_mutex=0.1=main
5+
_openmp_mutex=5.1=1_gnu
6+
_py-xgboost-mutex=2.0=cpu_0
7+
asttokens=2.2.1=pyhd8ed1ab_0
8+
backcall=0.2.0=pyh9f0ad1d_0
9+
backports=1.0=pyhd8ed1ab_3
10+
backports.functools_lru_cache=1.6.4=pyhd8ed1ab_0
11+
blas=1.1=openblas
12+
bottleneck=1.3.5=py38h7deecbd_0
13+
brotli=1.0.9=h5eee18b_7
14+
brotli-bin=1.0.9=h5eee18b_7
15+
bzip2=1.0.8=h7f98852_4
16+
c-ares=1.19.1=h5eee18b_0
17+
ca-certificates=2023.7.22=hbcca054_0
18+
cairo=1.16.0=h18b612c_1001
19+
certifi=2023.7.22=pyhd8ed1ab_0
20+
charset-normalizer=3.0.1=pypi_0
21+
cloudpickle=2.2.1=pypi_0
22+
colorama=0.4.6=pyhd8ed1ab_0
23+
coloredlogs=15.0.1=pyhd8ed1ab_3
24+
contourpy=1.0.7=pypi_0
25+
cycler=0.11.0=pyhd3eb1b0_0
26+
dbus=1.13.18=hb2f20db_0
27+
debugpy=1.5.1=py38h295c915_0
28+
decorator=5.1.1=pyhd8ed1ab_0
29+
eigen=3.4.0=h4bd325d_0
30+
entrypoints=0.4=pyhd8ed1ab_0
31+
executing=1.2.0=pyhd8ed1ab_0
32+
expat=2.2.10=h9c3ff4c_0
33+
ffmpeg=4.2.2=h20bf706_0
34+
fftw=3.3.9=h27cfd23_1
35+
fontconfig=2.14.1=hef1e5e3_0
36+
fonttools=4.38.0=pypi_0
37+
freetype=2.10.4=h0708190_1
38+
giflib=5.2.1=h36c2ea0_2
39+
glib=2.69.1=he621ea3_2
40+
gmp=6.2.1=h58526e2_0
41+
gnutls=3.6.13=h85f3911_1
42+
graphite2=1.3.14=h295c915_1
43+
gst-plugins-base=1.14.0=h8213a91_2
44+
gstreamer=1.14.0=h28cd5cc_2
45+
harfbuzz=4.3.0=hd55b92a_0
46+
hdf5=1.10.6=h3ffc7dd_1
47+
humanfriendly=10.0=py38h578d9bd_4
48+
icu=58.2=hf484d3e_1000
49+
idna=3.4=pypi_0
50+
imageio=2.26.0=pyh24c5eb1_0
51+
importlib-metadata=4.11.3=py38h06a4308_0
52+
importlib_metadata=4.11.3=hd3eb1b0_0
53+
imutils=0.5.4=py38h578d9bd_3
54+
intel-openmp=2021.4.0=h06a4308_3561
55+
ipykernel=6.15.0=pyh210e3f2_0
56+
ipython=8.4.0=py38h578d9bd_0
57+
jedi=0.18.2=pyhd8ed1ab_0
58+
joblib=1.1.0=pyhd3eb1b0_0
59+
jpeg=9e=h166bdaf_1
60+
jupyter_client=7.0.6=pyhd8ed1ab_0
61+
jupyter_core=5.3.0=py38h578d9bd_0
62+
keyutils=1.6.1=h166bdaf_0
63+
kiwisolver=1.4.4=pypi_0
64+
krb5=1.20.1=h568e23c_1
65+
lame=3.100=h7f98852_1001
66+
lcms2=2.12=h3be6417_0
67+
ld_impl_linux-64=2.38=h1181459_1
68+
lerc=3.0=h295c915_0
69+
libblas=3.9.0=15_linux64_openblas
70+
libbrotlicommon=1.0.9=h5eee18b_7
71+
libbrotlidec=1.0.9=h5eee18b_7
72+
libbrotlienc=1.0.9=h5eee18b_7
73+
libcblas=3.9.0=15_linux64_openblas
74+
libclang=10.0.1=default_hb85057a_2
75+
libcurl=8.2.1=h91b91d3_0
76+
libdeflate=1.8=h7f8727e_5
77+
libedit=3.1.20221030=h5eee18b_0
78+
libev=4.33=h516909a_1
79+
libevent=2.1.12=h8f2d780_0
80+
libffi=3.4.2=h6a678d5_6
81+
libgcc-ng=11.2.0=h1234567_1
82+
libgfortran-ng=12.2.0=h69a702a_19
83+
libgfortran5=12.2.0=h337968e_19
84+
libgomp=11.2.0=h1234567_1
85+
liblapack=3.9.0=15_linux64_openblas
86+
libllvm10=10.0.1=he513fc3_3
87+
libllvm11=11.1.0=h9e868ea_6
88+
libnghttp2=1.52.0=ha637b67_1
89+
libopenblas=0.3.20=pthreads_h78a6416_0
90+
libopus=1.3.1=h7f98852_1
91+
libpng=1.6.37=hbc83047_0
92+
libpq=12.15=h37d81fd_1
93+
libprotobuf=3.20.3=he621ea3_0
94+
libsodium=1.0.18=h36c2ea0_1
95+
libssh2=1.10.0=h37d81fd_2
96+
libstdcxx-ng=11.2.0=h1234567_1
97+
libtiff=4.4.0=hecacb30_2
98+
libuuid=2.32.1=h7f98852_1000
99+
libvpx=1.7.0=h439df22_0
100+
libwebp=1.2.4=h11a3e52_0
101+
libwebp-base=1.2.4=h5eee18b_0
102+
libxcb=1.15=h7f8727e_0
103+
libxgboost=1.7.3=h6a678d5_0
104+
libxkbcommon=1.0.3=he3ba5ed_0
105+
libxml2=2.9.14=h74e7548_0
106+
libxslt=1.1.35=h4e12654_0
107+
lightgbm=3.1.1=py38h709712a_0
108+
llvmlite=0.39.1=py38he621ea3_0
109+
lz4-c=1.9.3=h9c3ff4c_1
110+
matplotlib=3.6.3=pypi_0
111+
matplotlib-base=3.6.2=py38h945d387_0
112+
matplotlib-inline=0.1.6=pyhd8ed1ab_0
113+
mkl=2021.4.0=h06a4308_640
114+
mkl-service=2.4.0=py38h7f8727e_0
115+
mkl_random=1.2.2=py38h51133e4_0
116+
mpmath=1.3.0=pyhd8ed1ab_0
117+
munkres=1.1.4=py_0
118+
ncurses=6.4=h6a678d5_0
119+
nest-asyncio=1.5.6=pyhd8ed1ab_0
120+
nettle=3.6=he412f7d_0
121+
nspr=4.33=h295c915_0
122+
nss=3.74=h0370c37_0
123+
numba=0.56.4=py38h417a72b_0
124+
numexpr=2.8.4=py38hd2a5715_0
125+
numpy=1.22.3=py38h99721a1_2
126+
nvidia-cublas-cu11=11.10.3.66=pypi_0
127+
nvidia-cuda-nvrtc-cu11=11.7.99=pypi_0
128+
nvidia-cuda-runtime-cu11=11.7.99=pypi_0
129+
nvidia-cudnn-cu11=8.5.0.96=pypi_0
130+
onnxruntime=1.15.1=py38hf70ce4d_0
131+
openblas=0.3.20=pthreads_h320a7e8_0
132+
opencv=4.6.0=py38hd653453_2
133+
openh264=2.1.1=h4ff587b_0
134+
openjpeg=2.3.1=hf7af979_3
135+
openssl=1.1.1w=h7f8727e_0
136+
packaging=21.3=pyhd3eb1b0_0
137+
pandas=1.4.3=py38h6a678d5_0
138+
parso=0.8.3=pyhd8ed1ab_0
139+
pcre=8.45=h9c3ff4c_0
140+
pexpect=4.8.0=pyh1a96a4e_2
141+
pickleshare=0.7.5=py_1003
142+
pillow=9.4.0=pypi_0
143+
pip=22.3.1=py38h06a4308_0
144+
pixman=0.38.0=h516909a_1003
145+
platformdirs=3.5.1=pyhd8ed1ab_0
146+
ply=3.11=py38_0
147+
prompt-toolkit=3.0.38=pyha770c72_0
148+
protobuf=3.20.3=py38h6a678d5_0
149+
psutil=5.9.0=py38h5eee18b_0
150+
ptyprocess=0.7.0=pyhd3deb0d_0
151+
pure_eval=0.2.2=pyhd8ed1ab_0
152+
py-xgboost=1.7.3=py38h06a4308_0
153+
pycocotools=2.0.6=pypi_0
154+
pygad=3.0.1=pypi_0
155+
pygments=2.15.1=pyhd8ed1ab_0
156+
pyparsing=3.0.4=pyhd3eb1b0_0
157+
pyqt=5.15.7=py38h6a678d5_1
158+
pyqt5-sip=12.11.0=py38h6a678d5_1
159+
python=3.8.16=h7a1cb2a_2
160+
python-dateutil=2.8.2=pyhd3eb1b0_0
161+
python-flatbuffers=23.5.26=pyhd8ed1ab_0
162+
python_abi=3.8=2_cp38
163+
pytz=2022.1=py38h06a4308_0
164+
pyvww=0.1.1=pypi_0
165+
pyzmq=19.0.2=py38ha71036d_2
166+
qt-main=5.15.2=h327a75a_7
167+
qt-webengine=5.15.9=hd2b0992_4
168+
qtwebkit=5.212=h4eab89a_4
169+
readline=8.2=h5eee18b_0
170+
requests=2.28.2=pypi_0
171+
scikit-learn=1.1.1=py38h6a678d5_0
172+
scipy=1.7.3=py38hf838250_2
173+
seaborn=0.11.2=pyhd3eb1b0_0
174+
setuptools=65.6.3=py38h06a4308_0
175+
sip=6.6.2=py38h6a678d5_0
176+
six=1.16.0=pyhd3eb1b0_1
177+
sqlite=3.40.1=h5082296_0
178+
stack_data=0.6.2=pyhd8ed1ab_0
179+
sympy=1.12=pyh04b8f61_3
180+
tbb=2021.6.0=hdb19cb5_1
181+
threadpoolctl=2.2.0=pyh0d69192_0
182+
tk=8.6.12=h1ccaba5_0
183+
toml=0.10.2=pyhd3eb1b0_0
184+
torch=1.13.1=pypi_0
185+
torchvision=0.14.1=pypi_0
186+
tornado=6.1=py38h27cfd23_0
187+
tqdm=4.64.1=pyhd8ed1ab_0
188+
traitlets=5.9.0=pyhd8ed1ab_0
189+
typing-extensions=4.4.0=pypi_0
190+
typing_extensions=4.5.0=pyha770c72_0
191+
urllib3=1.26.14=pypi_0
192+
wcwidth=0.2.6=pyhd8ed1ab_0
193+
wheel=0.37.1=pyhd3eb1b0_0
194+
x264=1!157.20191217=h7b6447c_0
195+
xorg-kbproto=1.0.7=h7f98852_1002
196+
xorg-libice=1.0.10=h7f98852_0
197+
xorg-libsm=1.2.3=hd9c2040_1000
198+
xorg-libx11=1.7.2=h7f98852_0
199+
xorg-libxext=1.3.4=h7f98852_1
200+
xorg-libxrender=0.9.10=h7f98852_1003
201+
xorg-renderproto=0.11.1=h7f98852_1002
202+
xorg-xextproto=7.3.0=h7f98852_1002
203+
xorg-xproto=7.0.31=h7f98852_1007
204+
xz=5.2.10=h5eee18b_1
205+
yapf=0.32.0=pyhd8ed1ab_0
206+
zeromq=4.3.4=h9c3ff4c_1
207+
zipp=3.11.0=py38h06a4308_0
208+
zlib=1.2.13=h5eee18b_0
209+
zstd=1.5.2=ha4553b6_0

0 commit comments

Comments
 (0)