From 7eaa02731e14c20c382fd1908065ba0b8877cd30 Mon Sep 17 00:00:00 2001 From: Florian Bruggisser Date: Thu, 8 Dec 2022 15:51:07 +0100 Subject: [PATCH] implemented yolov5 #15 --- README.md | 31 +++++++++- .../YOLOWebcamExample/YOLOWebcamExample.pde | 2 +- examples/YOLOv5/YOLOv5.pde | 58 ++++++++++++++++++ .../data/pexels-lina-kivaka-5623971.jpg | Bin 0 -> 91253 bytes .../java/ch/bildspur/vision/DeepVision.java | 37 ++++++++++- .../java/ch/bildspur/vision/YOLONetwork.java | 45 +++++++++++--- .../vision/dependency/Repository.java | 6 ++ .../vision/network/ClassificationNetwork.java | 1 - .../java/ch/bildspur/vision/test/Sketch.java | 2 +- .../vision/test/YOLODetectionTest.java | 10 ++- 10 files changed, 173 insertions(+), 19 deletions(-) create mode 100644 examples/YOLOv5/YOLOv5.pde create mode 100644 examples/YOLOv5/data/pexels-lina-kivaka-5623971.jpg diff --git a/README.md b/README.md index f829e79..cd9dddb 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,7 @@ Here you find a list of implemented networks: - YOLOv3 - YOLOv4 - YOLOv4-tiny + - [YOLOv5](https://github.com/ultralytics/yolov5/) (n, s, m, l, x) - [YOLO Fastest & XL](https://github.com/dog-qiuqiu/Yolo-Fastest) - SSDMobileNetV2 - Handtracking based on SSDMobileNetV2 @@ -174,8 +175,13 @@ YOLO a very fast and accurate single shot network. The pre-trained model is trai - YOLOv3-tiny (very fast, but trading performance for accuracy) - YOLOv3-spp (original model using [spatial pyramid pooling](https://stackoverflow.com/a/55014630/1138326)) - YOLOv3 (608) -- YOLOv4 (608) (most accurate network) +- YOLOv4 (608) - YOLOv4-tiny (416) +- YOLOv5n (640) +- YOLOv5s (640) +- YOLOv5m (640) +- YOLOv5l (640) +- YOLOv5x (640) ```java // setup the network @@ -184,6 +190,11 @@ YOLONetwork net = vision.createYOLOv4Tiny(); YOLONetwork net = vision.createYOLOv3(); YOLONetwork net = vision.createYOLOv3SPP(); YOLONetwork net = vision.createYOLOv3Tiny(); +YOLONetwork net = vision.createYOLOv5n(); +YOLONetwork net = vision.createYOLOv5s(); +YOLONetwork net = vision.createYOLOv5m(); +YOLONetwork net = vision.createYOLOv5l(); +YOLONetwork net = vision.createYOLOv5x(); // set confidence threshold net.setConfidenceThreshold(0.2f); @@ -193,6 +204,24 @@ net.setConfidenceThreshold(0.2f); * [WebCam Example YOLO](examples/YOLOWebcamExample) * [RealSense Example YOLO](examples/RealSenseYoloDetector) +#### YOLOv5 +Since version `0.9.0` YOLOv5 is implemented as well. It uses the pre-trained models converted into the ONNX format. At the moment YOLOv5 does not work well with the implemented NMS. To adjust the settings of the NMS use the following functions. + +``` +// set confidence threshold +net.setConfidenceThreshold(0.2f); + +// set confidence threshold +net.set(0.2f); + +// set the IoU threshold (overlapping of the bounding boxes) +net.setNmsThreshold(0.4f); + +// set how many objects should be taken into account for nms +// 0 means all objects +net.setTopK(100); +``` + #### SSDMobileNetV2 [[Paper](https://arxiv.org/abs/1512.02325)] This network is a single shot detector based on the mobilenetv2 architecture. It is pre-trained on the 90 classes COCO dataset and is really fast. diff --git a/examples/YOLOWebcamExample/YOLOWebcamExample.pde b/examples/YOLOWebcamExample/YOLOWebcamExample.pde index 75ce6f3..785307b 100644 --- a/examples/YOLOWebcamExample/YOLOWebcamExample.pde +++ b/examples/YOLOWebcamExample/YOLOWebcamExample.pde @@ -15,7 +15,7 @@ ResultList detections; int textSize = 12; public void setup() { - size(640, 480, FX2D); + size(640, 480); colorMode(HSB, 360, 100, 100); diff --git a/examples/YOLOv5/YOLOv5.pde b/examples/YOLOv5/YOLOv5.pde new file mode 100644 index 0000000..9b3443c --- /dev/null +++ b/examples/YOLOv5/YOLOv5.pde @@ -0,0 +1,58 @@ +import ch.bildspur.vision.*; +import ch.bildspur.vision.result.*; + +DeepVision deepVision = new DeepVision(this); +YOLONetwork yolo; +ResultList detections; + +PImage image; +int textSize = 12; + +public void setup() { + size(640, 480); + + colorMode(HSB, 360, 100, 100); + + image = loadImage("pexels-lina-kivaka-5623971.jpg"); + + println("creating model..."); + yolo = deepVision.createYOLOv5l(); + + println("loading yolo model..."); + yolo.setup(); + + println("inferencing..."); + yolo.setConfidenceThreshold(0.95f); + yolo.setTopK(0); + + detections = yolo.run(image); +} + +public void draw() { + background(55); + + image(image, 0, 0); + + noFill(); + strokeWeight(2f); + + strokeWeight(3f); + textSize(textSize); + + for (ObjectDetectionResult detection : detections) { + int hue = (int)(360.0 / yolo.getLabels().size() * detection.getClassId()); + + noFill(); + stroke(hue, 80, 100); + rect(detection.getX(), detection.getY(), detection.getWidth(), detection.getHeight()); + + fill(hue, 80, 100); + rect(detection.getX(), detection.getY() - (textSize + 3), textWidth(detection.getClassName()) + 4, textSize + 3); + + fill(0); + textAlign(LEFT, TOP); + text(detection.getClassName(), detection.getX() + 2, detection.getY() - textSize - 3); + } + + surface.setTitle("YOLO Test - FPS: " + Math.round(frameRate)); +} diff --git a/examples/YOLOv5/data/pexels-lina-kivaka-5623971.jpg b/examples/YOLOv5/data/pexels-lina-kivaka-5623971.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee333764d2427263366af58b43a093099c398253 GIT binary patch literal 91253 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Ţ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 N7nx^M9YGNZ|Jj)73qk+@ literal 0 HcmV?d00001 diff --git a/src/main/java/ch/bildspur/vision/DeepVision.java b/src/main/java/ch/bildspur/vision/DeepVision.java index 171b874..6ddffb6 100644 --- a/src/main/java/ch/bildspur/vision/DeepVision.java +++ b/src/main/java/ch/bildspur/vision/DeepVision.java @@ -33,7 +33,7 @@ public DeepVision(PApplet sketch, boolean enableCUDABackend) { public static void enableDesiredBackend(Net net) { if (USE_DEFAULT_BACKEND) return; - if(haveOpenCL()) { + if (haveOpenCL()) { System.out.println("DNN OpenCL backend enabled"); net.setPreferableBackend(opencv_dnn.DNN_BACKEND_OPENCV); net.setPreferableTarget(opencv_dnn.DNN_TARGET_OPENCL); @@ -195,6 +195,41 @@ public YOLONetwork createYOLOv4Tiny(int inputSize) { return createYOLONetwork(Repository.YOLOv4TinyModel, Repository.YOLOv4TinyWeight, Repository.COCONames, inputSize); } + protected YOLONetwork createYOLOv5(Dependency weights, Dependency names, int inputSize) { + prepareDependencies(weights, names); + + YOLONetwork network = new YOLONetwork( + null, + weights.getPath(), + inputSize, inputSize, + true + ); + + network.loadLabels(names.getPath()); + network.setTopK(100); + return network; + } + + public YOLONetwork createYOLOv5n() { + return createYOLOv5(Repository.YOLOv5nOnnx, Repository.COCONames, 640); + } + + public YOLONetwork createYOLOv5s() { + return createYOLOv5(Repository.YOLOv5sOnnx, Repository.COCONames, 640); + } + + public YOLONetwork createYOLOv5m() { + return createYOLOv5(Repository.YOLOv5mOnnx, Repository.COCONames, 640); + } + + public YOLONetwork createYOLOv5l() { + return createYOLOv5(Repository.YOLOv5lOnnx, Repository.COCONames, 640); + } + + public YOLONetwork createYOLOv5x() { + return createYOLOv5(Repository.YOLOv5xOnnx, Repository.COCONames, 640); + } + public YOLONetwork createYOLOFastest() { return createYOLONetwork(Repository.YOLOFastestModel, Repository.YOLOFastestWeight, Repository.COCONames, 320); } diff --git a/src/main/java/ch/bildspur/vision/YOLONetwork.java b/src/main/java/ch/bildspur/vision/YOLONetwork.java index 8a2e0ca..5d93217 100644 --- a/src/main/java/ch/bildspur/vision/YOLONetwork.java +++ b/src/main/java/ch/bildspur/vision/YOLONetwork.java @@ -27,6 +27,10 @@ public class YOLONetwork extends ObjectDetectionNetwork { private float nmsThreshold = 0.4f; private boolean skipNMS = false; + private int topK = 0; + + private boolean isOutputScaled = false; + private Net net; private StringVector outNames; @@ -38,10 +42,19 @@ public YOLONetwork(Path configPath, Path weightsPath, int width, int height) { this.setConfidenceThreshold(0.5f); } + public YOLONetwork(Path configPath, Path weightsPath, int width, int height, boolean isOutputScaled) { + this(configPath, weightsPath, width, height); + this.isOutputScaled = isOutputScaled; + } + public boolean setup() { - net = readNetFromDarknet( - configPath.toAbsolutePath().toString(), - weightsPath.toAbsolutePath().toString()); + if (weightsPath.toString().endsWith(".onnx")) { + net = readNetFromONNX(weightsPath.toAbsolutePath().toString()); + } else { + net = readNetFromDarknet( + configPath.toAbsolutePath().toString(), + weightsPath.toAbsolutePath().toString()); + } // setup output layers outNames = net.getUnconnectedOutLayersNames(); @@ -98,6 +111,11 @@ private ResultList postprocess(Mat frame, MatVector outs) // ones with high confidence scores. Assign the box's class label as the class // with the highest score for the box. Mat result = outs.get(i); + if (result.dims() > 2) { + // squeeze output mat + result = new Mat(result.size(1), result.size(2), CV_32F, result.ptr(0, i)); + } + FloatIndexer data = result.createIndexer(); for (int j = 0; j < result.rows(); j++) { @@ -112,11 +130,14 @@ private ResultList postprocess(Mat frame, MatVector outs) } } + float iw = isOutputScaled ? width : 1; + float ih = isOutputScaled ? height : 1; + if (maxScore > getConfidenceThreshold()) { - int centerX = (int) (data.get(j, 0) * frame.cols()); - int centerY = (int) (data.get(j, 1) * frame.rows()); - int width = (int) (data.get(j, 2) * frame.cols()); - int height = (int) (data.get(j, 3) * frame.rows()); + int centerX = (int) (data.get(j, 0) / iw * frame.cols()); + int centerY = (int) (data.get(j, 1) / ih * frame.rows()); + int width = (int) (data.get(j, 2) / iw * frame.cols()); + int height = (int) (data.get(j, 3) / ih * frame.rows()); int left = centerX - width / 2; int top = centerY - height / 2; @@ -152,7 +173,7 @@ private ResultList postprocess(Mat frame, MatVector outs) FloatPointer confidencesPointer = new FloatPointer(confidences.size()); confidencesPointer.put(confidences.get()); - NMSBoxes(boxes, confidencesPointer, getConfidenceThreshold(), nmsThreshold, indices, 1.f, 0); + NMSBoxes(boxes, confidencesPointer, getConfidenceThreshold(), nmsThreshold, indices, 1.f, topK); ResultList detections = new ResultList<>(); for (int i = 0; i < indices.limit(); ++i) { @@ -211,4 +232,12 @@ public int getHeight() { public Net getNet() { return net; } + + public int getTopK() { + return topK; + } + + public void setTopK(int topK) { + this.topK = topK; + } } diff --git a/src/main/java/ch/bildspur/vision/dependency/Repository.java b/src/main/java/ch/bildspur/vision/dependency/Repository.java index 25d6c10..8c7aa1c 100644 --- a/src/main/java/ch/bildspur/vision/dependency/Repository.java +++ b/src/main/java/ch/bildspur/vision/dependency/Repository.java @@ -18,6 +18,12 @@ public class Repository { // networks // object detection + public static final Dependency YOLOv5nOnnx = new Dependency("yolov5n.onnx"); + public static final Dependency YOLOv5sOnnx = new Dependency("yolov5s.onnx"); + public static final Dependency YOLOv5mOnnx = new Dependency("yolov5m.onnx"); + public static final Dependency YOLOv5lOnnx = new Dependency("yolov5l.onnx"); + public static final Dependency YOLOv5xOnnx = new Dependency("yolov5x.onnx"); + public static final Dependency YOLOv4Model = new Dependency("yolov4.cfg"); public static final Dependency YOLOv4Weight = new Dependency("yolov4.weights"); diff --git a/src/main/java/ch/bildspur/vision/network/ClassificationNetwork.java b/src/main/java/ch/bildspur/vision/network/ClassificationNetwork.java index a396863..a9a803f 100644 --- a/src/main/java/ch/bildspur/vision/network/ClassificationNetwork.java +++ b/src/main/java/ch/bildspur/vision/network/ClassificationNetwork.java @@ -5,7 +5,6 @@ import ch.bildspur.vision.result.ObjectDetectionResult; import ch.bildspur.vision.result.ResultList; import org.bytedeco.javacpp.DoublePointer; -import org.bytedeco.opencv.global.opencv_dnn; import org.bytedeco.opencv.opencv_core.Mat; import org.bytedeco.opencv.opencv_core.Point; import org.bytedeco.opencv.opencv_core.Scalar; diff --git a/src/test/java/ch/bildspur/vision/test/Sketch.java b/src/test/java/ch/bildspur/vision/test/Sketch.java index 309ebfa..8be180a 100644 --- a/src/test/java/ch/bildspur/vision/test/Sketch.java +++ b/src/test/java/ch/bildspur/vision/test/Sketch.java @@ -11,7 +11,7 @@ public static void main(String... args) { } public void settings() { - size(640, 480, FX2D); + size(640, 480); } public void setup() { diff --git a/src/test/java/ch/bildspur/vision/test/YOLODetectionTest.java b/src/test/java/ch/bildspur/vision/test/YOLODetectionTest.java index 62c151c..47b19ac 100644 --- a/src/test/java/ch/bildspur/vision/test/YOLODetectionTest.java +++ b/src/test/java/ch/bildspur/vision/test/YOLODetectionTest.java @@ -5,7 +5,6 @@ import ch.bildspur.vision.YOLONetwork; import ch.bildspur.vision.result.ObjectDetectionResult; import ch.bildspur.vision.test.tools.StopWatch; -import org.opencv.dnn.Dnn; import processing.core.PApplet; import processing.core.PImage; @@ -40,15 +39,14 @@ public void setup() { testImage = officeImage; println("creating network..."); - yolo = vision.createYOLOv4Tiny(); + vision.setUseDefaultBackend(true); + yolo = vision.createYOLOv5s(); println("loading model..."); yolo.setup(); - yolo.getNet().setPreferableBackend(Dnn.DNN_BACKEND_OPENCV); - yolo.getNet().setPreferableTarget(Dnn.DNN_TARGET_OPENCL); - - yolo.setConfidenceThreshold(0.2f); + yolo.setConfidenceThreshold(0.25f); + yolo.setNmsThreshold(0.1f); println("inferencing..."); watch.start();