ODaM is project aimed to do monitoring such as: pedestrian detection and counting, vehicle detection and counting, speed estimation of objects, sending detected objects to gRPC server for detailed analysis.
It's written on Go with a lot of CGO.
| YOLOv4 + Kalman filter for tracking | YOLOv4 + simple centroid tracking |
|---|---|
![]() |
![]() |
| YOLOv4 Tiny + Kalman filter for tracking | YOLOv4 Tiny + simple centroid tracking |
|---|---|
![]() |
![]() |
We are working on this.
Not too fast, but it is what it is.
ODaM is tool for doing monitoring via Darknet's neural network called Yolo V4 (paper: https://arxiv.org/abs/2004.10934).
It's built on top of go-darknet which uses AlexeyAB's fork of Darknet. For doing computer vision stuff and video reading GoCV is used.
Who are you and what do you do?
There is info about me here: https://github.com/LdDl
You can have chat with me in Telegram/Gmail
Is this library / software or even framework?
I think about it as software with library capabilities.
What it capable of?
Not that much currently:
Why Go?
Well, C++ is a killer in computer vision field and Python has a great battery included bindings for C++ code.
But I do no think that I'm ready to build gRPC/REST or any other web components of this software in C++ or Python (C++ is not that easy and Python...I just don't like Python syntax). That's why I prefer to stick with Go.
Why did you pick JSON for configuration purposes instead of TOML/YAML/INI or any other well-suited formats?
Why bindings to Darknet instead of Opencv included stuff?
Sometimes you just do not need full OpenCV installation for object detection. I have such ANPR projet here: https://github.com/LdDl/license_plate_recognition I guess when I'm done with stable core I might switch from Go's Darknet bindings to OpenCV one (since ODaM-project requires OpenCV installation obviously)
What are your plans?
There is ROADMAP.md, but overall I am planning to extend capabilities of software: * Improve perfomance * Implement some cool tracking techniques (e.g. SORT) * Do gRPC accepting microservice for enabling software to catch information from external devices/systems/microservices and etc. E.g: you want to send message 'there is red light on traffic light" to instance of software, then it would look like grpcServer.Send('there is red light on traffic light'). After that any captured object will have state with message above in it. So you can catch traffic offenders. * Introduce convex polygon based calculations (same as virtual lines but for polygons)
How to help you?
If you are here, then you are already helped a lot, since you noticed my existence :harold_face:
If you want to make PR for some undone features (algorithms mainly) I'll glad to take a look.
Need to enable CUDA (GPU) in every installation step where it's possible.
bash
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget http://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.deb
sudo apt-key add /var/cuda-repo-10-2-local-10.2.89-440.33.01/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda
echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrcbash
sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.2_amd64.deb
sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.2_amd64.deb
sudo dpkg -i libcudnn7-doc_7.6.5.32-1+cuda10.2_amd64.deb
Do not forget to check if cuDNN installed properly:
bash
cp -r /usr/src/cudnn_samples_v7/ $HOME
cd $HOME/cudnn_samples_v7/mnistCUDNN
make clean && make
./mnistCUDNN
cd -Install AlexeyAb's fork of Darknet
bash
git clone https://github.com/AlexeyAB/darknet
cd ./darknet
# Checkout to last battle-tested commit
git checkout f056fc3b6a11528fa0522a468eca1e909b7004b7
# Enable GPU acceleration
sed 's/GPU=0/GPU=1/' ./Makefile
# Enable cuDNN
sed 's/CUDNN=0/CUDNN=1/' ./Makefile
# Prepare *.so
sed 's/LIBSO=0/LIBSO=1/' ./Makefile
make
# Copy *.so to /usr/lib + /usr/include (or /usr/local/lib + /usr/local/include)
sudo cp libdarknet.so /usr/lib/libdarknet.so && sudo cp include/darknet.h /usr/include/darknet.h
# sudo cp libdarknet.so /usr/local/lib/libdarknet.so && sudo cp include/darknet.h /usr/local/include/darknet.h
Alternatively you can use Makefile from go-darknet repository: https://github.com/LdDl/go-darknet/blob/master/Makefile
Go bindings for Darknet - instructions link
You need to implement your gRPC server as following proto-file: https://github.com/LdDl/odam/blob/master/yolo_grpc.proto.
If you need to rebuild *.pb.go file, call this is from project root folder:
protoc -I . yolo_grpc.proto --go_out=plugins=grpc:.
In case of my needs I need to detect license plates on vehicles and do OCR on server-side: you can take a look on https://github.com/LdDl/license_plate_recognition for gRPC server example
After steps above done:
go install github.com/LdDl/odam/cmd/odam
Check if executable available
odam -h
and you will see something like this:
Usage of ./odam:
-settings string
Path to application's settings (default "conf.json")
./download_data_v4.sh[yolo]
mask = 0,1,2
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=80
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1
names = coco.names # <<========= here is the link to 'coco.names' file—