diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..69ddb80 --- /dev/null +++ b/Makefile @@ -0,0 +1,55 @@ +.ONESHELL: +.PHONY: download build clean + +# Latest battletested AlexeyAB version of Darknet commit +LATEST_COMMIT?=d65909fbea471d06e52a2e4a41132380dc2edaa6 + +# Temporary folder for building Darknet +TMP_DIR?=/tmp/ + +# Download AlexeyAB version of Darknet +download: + rm -rf $(TMP_DIR)install_darknet + mkdir $(TMP_DIR)install_darknet + git clone https://github.com/AlexeyAB/darknet.git $(TMP_DIR)install_darknet + cd $(TMP_DIR)install_darknet + git checkout $(LATEST_COMMIT) + cd - + +# Build AlexeyAB version of Darknet for usage with CPU only. +build: + cd $(TMP_DIR)install_darknet + sed -i -e 's/GPU=1/GPU=0/g' Makefile + sed -i -e 's/CUDNN=1/CUDNN=0/g' Makefile + sed -i -e 's/LIBSO=0/LIBSO=1/g' Makefile + $(MAKE) -j $(shell nproc --all) + $(MAKE) preinstall + cd - + +# Build AlexeyAB version of Darknet for usage with both CPU and GPU (CUDA by NVIDIA). +build_gpu: + cd $(TMP_DIR)install_darknet + sed -i -e 's/GPU=0/GPU=1/g' Makefile + sed -i -e 's/CUDNN=0/CUDNN=1/g' Makefile + sed -i -e 's/LIBSO=0/LIBSO=1/g' Makefile + $(MAKE) -j $(shell nproc --all) + $(MAKE) preinstall + cd - + +# Install system wide. +sudo_install: + cd $(TMP_DIR)install_darknet + sudo cp libdarknet.so /usr/lib/libdarknet.so + sudo cp include/darknet.h /usr/include/darknet.h + sudo ldconfig + cd - + +# Cleanup temporary files for building process +clean: + rm -rf $(TMP_DIR)install_darknet + +# Do every step for CPU-based only build. +install: download build sudo_install clean + +# Do every step for both CPU and GPU-based build. +install_gpu: download build_gpu sudo_install clean \ No newline at end of file diff --git a/README.md b/README.md index f23f191..ac6f231 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@ [![Go Report Card](https://goreportcard.com/badge/github.com/LdDl/go-darknet)](https://goreportcard.com/report/github.com/LdDl/go-darknet) [![GitHub tag](https://img.shields.io/github/tag/LdDl/go-darknet.svg)](https://github.com/LdDl/go-darknet/releases) - # go-darknet: Go bindings for Darknet (Yolo V4, Yolo V3) ### go-darknet is a Go package, which uses Cgo to enable Go applications to use YOLO V4/V3 in [Darknet]. @@ -23,29 +22,20 @@ ## Requirements -For proper codebase please use fork of [darknet](https://github.com/AlexeyAB/darknet). Latest commit I've tested [here](https://github.com/AlexeyAB/darknet/commit/d65909fbea471d06e52a2e4a41132380dc2edaa6) +You need to install fork of [darknet](https://github.com/AlexeyAB/darknet). Latest commit I've tested is [here](https://github.com/AlexeyAB/darknet/commit/d65909fbea471d06e52a2e4a41132380dc2edaa6) -In order to use go-darknet, `libdarknet.so` should be available in one of -the following locations: +Use provided [Makefile](Makefile). -* /usr/lib -* /usr/local/lib +* For CPU-based instalattion: + ```shell + make install + ``` +* For both CPU and GPU-based instalattion: + ```shell + make install_gpu + ``` + Note: If you want to have GPU-acceleration before running command above install [CUDA](https://developer.nvidia.com/cuda-downloads) and [cuDNN](https://developer.nvidia.com/cudnn) (Latest CUDA version I've tested is [10.2](https://developer.nvidia.com/cuda-10.2-download-archive) and cuDNN is [7.6.5](https://developer.nvidia.com/rdp/cudnn-archive#a-collapse765-102)) -Also, [darknet.h] should be available in one of the following locations: - -* /usr/include -* /usr/local/include - -To achieve it, after Darknet compilation (via make) execute following command: -```shell -# 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 -``` -Note: do not forget to set LIBSO=1 in Makefile before executing 'make': -```Makefile -LIBSO=1 -``` ## Installation ```shell @@ -58,87 +48,88 @@ Example Go program is provided in the [example] directory. Please refer to the c Building and running program: -Navigate to [example] folder -```shell -cd $GOPATH/github.com/LdDl/go-darknet/example -``` +* Navigate to [example] folder + ```shell + cd $GOPATH/github.com/LdDl/go-darknet/example + ``` -Download dataset (sample of image, coco.names, yolov4.cfg (or v3), yolov4.weights(or v3)). -```shell -#for yolo v4 -./download_data.sh -#for yolo v3 -./download_data_v3.sh -``` -Note: you don't need *coco.data* file anymore, because sh-script above does insert *coco.names* into 'names' field in *yolov4.cfg* file (so AlexeyAB's fork can deal with it properly) -So last rows in yolov4.cfg file will look like: -```bash -...... -[yolo] -..... -iou_loss=ciou -nms_kind=greedynms -beta_nms=0.6 +* Download dataset (sample of image, coco.names, yolov4.cfg (or v3), yolov4.weights(or v3)). + ```shell + #for yolo v4 + ./download_data.sh + #for yolo v3 + ./download_data_v3.sh + ``` +* Note: you don't need *coco.data* file anymore, because sh-script above does insert *coco.names* into 'names' field in *yolov4.cfg* file (so AlexeyAB's fork can deal with it properly) + So last rows in yolov4.cfg file will look like: + ```bash + ...... + [yolo] + ..... + iou_loss=ciou + nms_kind=greedynms + beta_nms=0.6 -names = coco.names # this is path to coco.names file -``` -Also do not forget change batch and subdivisions sizes from: -```shell -batch=64 -subdivisions=8 -``` -to -```shell -batch=1 -subdivisions=1 -``` -It will reduce amount of VRAM used for detector test. + names = coco.names # this is path to coco.names file + ``` + +* Also do not forget change batch and subdivisions sizes from: + ```shell + batch=64 + subdivisions=8 + ``` + to + ```shell + batch=1 + subdivisions=1 + ``` + It will reduce amount of VRAM used for detector test. -Build and run program -Yolo V4: -```shell -go build main.go && ./main --configFile=yolov4.cfg --weightsFile=yolov4.weights --imageFile=sample.jpg -``` +* Build and run program + Yolo V4: + ```shell + go build main.go && ./main --configFile=yolov4.cfg --weightsFile=yolov4.weights --imageFile=sample.jpg + ``` -Output should be something like this: -```shell -traffic light (9): 73.5039% | start point: (238,73) | end point: (251, 106) -truck (7): 96.6401% | start point: (95,79) | end point: (233, 287) -truck (7): 96.4774% | start point: (662,158) | end point: (800, 321) -truck (7): 96.1841% | start point: (0,77) | end point: (86, 333) -truck (7): 46.8695% | start point: (434,173) | end point: (559, 216) -car (2): 99.7370% | start point: (512,188) | end point: (741, 329) -car (2): 99.2533% | start point: (260,191) | end point: (422, 322) -car (2): 99.0333% | start point: (425,201) | end point: (547, 309) -car (2): 83.3919% | start point: (386,210) | end point: (437, 287) -car (2): 75.8621% | start point: (73,199) | end point: (102, 274) -car (2): 39.1925% | start point: (386,206) | end point: (442, 240) -bicycle (1): 76.3121% | start point: (189,298) | end point: (253, 402) -person (0): 97.7213% | start point: (141,129) | end point: (283, 362) -``` + Output should be something like this: + ```shell + traffic light (9): 73.5039% | start point: (238,73) | end point: (251, 106) + truck (7): 96.6401% | start point: (95,79) | end point: (233, 287) + truck (7): 96.4774% | start point: (662,158) | end point: (800, 321) + truck (7): 96.1841% | start point: (0,77) | end point: (86, 333) + truck (7): 46.8695% | start point: (434,173) | end point: (559, 216) + car (2): 99.7370% | start point: (512,188) | end point: (741, 329) + car (2): 99.2533% | start point: (260,191) | end point: (422, 322) + car (2): 99.0333% | start point: (425,201) | end point: (547, 309) + car (2): 83.3919% | start point: (386,210) | end point: (437, 287) + car (2): 75.8621% | start point: (73,199) | end point: (102, 274) + car (2): 39.1925% | start point: (386,206) | end point: (442, 240) + bicycle (1): 76.3121% | start point: (189,298) | end point: (253, 402) + person (0): 97.7213% | start point: (141,129) | end point: (283, 362) + ``` -Yolo V3: -``` -go build main.go && ./main --configFile=yolov3.cfg --weightsFile=yolov3.weights --imageFile=sample.jpg -``` + Yolo V3: + ``` + go build main.go && ./main --configFile=yolov3.cfg --weightsFile=yolov3.weights --imageFile=sample.jpg + ``` -Output should be something like this: -```shell -truck (7): 49.5197% | start point: (0,136) | end point: (85, 311) -car (2): 36.3747% | start point: (95,152) | end point: (186, 283) -truck (7): 48.4384% | start point: (95,152) | end point: (186, 283) -truck (7): 45.6590% | start point: (694,178) | end point: (798, 310) -car (2): 76.8379% | start point: (1,145) | end point: (84, 324) -truck (7): 25.5731% | start point: (107,89) | end point: (215, 263) -car (2): 99.8783% | start point: (511,185) | end point: (748, 328) -car (2): 99.8194% | start point: (261,189) | end point: (427, 322) -car (2): 99.6408% | start point: (426,197) | end point: (539, 311) -car (2): 74.5610% | start point: (692,186) | end point: (796, 316) -car (2): 72.8053% | start point: (388,206) | end point: (437, 276) -bicycle (1): 72.2932% | start point: (178,270) | end point: (268, 406) -person (0): 97.3026% | start point: (143,135) | end point: (268, 343) -``` + Output should be something like this: + ```shell + truck (7): 49.5197% | start point: (0,136) | end point: (85, 311) + car (2): 36.3747% | start point: (95,152) | end point: (186, 283) + truck (7): 48.4384% | start point: (95,152) | end point: (186, 283) + truck (7): 45.6590% | start point: (694,178) | end point: (798, 310) + car (2): 76.8379% | start point: (1,145) | end point: (84, 324) + truck (7): 25.5731% | start point: (107,89) | end point: (215, 263) + car (2): 99.8783% | start point: (511,185) | end point: (748, 328) + car (2): 99.8194% | start point: (261,189) | end point: (427, 322) + car (2): 99.6408% | start point: (426,197) | end point: (539, 311) + car (2): 74.5610% | start point: (692,186) | end point: (796, 316) + car (2): 72.8053% | start point: (388,206) | end point: (437, 276) + bicycle (1): 72.2932% | start point: (178,270) | end point: (268, 406) + person (0): 97.3026% | start point: (143,135) | end point: (268, 343) + ``` ## Documentation