.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "how_to/compile_models/from_darknet.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_how_to_compile_models_from_darknet.py: Compile YOLO-V2 and YOLO-V3 in DarkNet Models ============================================= **Author**: `Siju Samuel `_ This article is an introductory tutorial to deploy darknet models with TVM. All the required models and libraries will be downloaded from the internet by the script. This script runs the YOLO-V2 and YOLO-V3 Model with the bounding boxes Darknet parsing have dependancy with CFFI and CV2 library Please install CFFI and CV2 before executing this script .. code-block:: bash pip install cffi pip install opencv-python .. GENERATED FROM PYTHON SOURCE LINES 33-50 .. code-block:: default # numpy and matplotlib import numpy as np import matplotlib.pyplot as plt import sys # tvm, relay import tvm from tvm import te from tvm import relay from ctypes import * from tvm.contrib.download import download_testdata from tvm.relay.testing.darknet import __darknetffi__ import tvm.relay.testing.yolo_detection import tvm.relay.testing.darknet .. GENERATED FROM PYTHON SOURCE LINES 56-59 Choose the model ----------------------- Models are: 'yolov2', 'yolov3' or 'yolov3-tiny' .. GENERATED FROM PYTHON SOURCE LINES 59-63 .. code-block:: default # Model name MODEL_NAME = "yolov3" .. GENERATED FROM PYTHON SOURCE LINES 64-67 Download required files ----------------------- Download cfg and weights file if first time. .. GENERATED FROM PYTHON SOURCE LINES 67-99 .. code-block:: default CFG_NAME = MODEL_NAME + ".cfg" WEIGHTS_NAME = MODEL_NAME + ".weights" REPO_URL = "https://github.com/dmlc/web-data/blob/main/darknet/" CFG_URL = REPO_URL + "cfg/" + CFG_NAME + "?raw=true" WEIGHTS_URL = "https://pjreddie.com/media/files/" + WEIGHTS_NAME cfg_path = download_testdata(CFG_URL, CFG_NAME, module="darknet") weights_path = download_testdata(WEIGHTS_URL, WEIGHTS_NAME, module="darknet") # Download and Load darknet library if sys.platform in ["linux", "linux2"]: DARKNET_LIB = "libdarknet2.0.so" DARKNET_URL = REPO_URL + "lib/" + DARKNET_LIB + "?raw=true" elif sys.platform == "darwin": DARKNET_LIB = "libdarknet_mac2.0.so" DARKNET_URL = REPO_URL + "lib_osx/" + DARKNET_LIB + "?raw=true" else: err = "Darknet lib is not supported on {} platform".format(sys.platform) raise NotImplementedError(err) lib_path = download_testdata(DARKNET_URL, DARKNET_LIB, module="darknet") DARKNET_LIB = __darknetffi__.dlopen(lib_path) net = DARKNET_LIB.load_network(cfg_path.encode("utf-8"), weights_path.encode("utf-8"), 0) dtype = "float32" batch_size = 1 data = np.empty([batch_size, net.c, net.h, net.w], dtype) shape_dict = {"data": data.shape} print("Converting darknet to relay functions...") mod, params = relay.frontend.from_darknet(net, dtype=dtype, shape=data.shape) .. rst-class:: sphx-glr-script-out .. code-block:: none Converting darknet to relay functions... .. GENERATED FROM PYTHON SOURCE LINES 100-103 Import the graph to Relay ------------------------- compile the model .. GENERATED FROM PYTHON SOURCE LINES 103-112 .. code-block:: default target = tvm.target.Target("llvm", host="llvm") dev = tvm.cpu(0) data = np.empty([batch_size, net.c, net.h, net.w], dtype) shape = {"data": data.shape} print("Compiling the model...") with tvm.transform.PassContext(opt_level=3): lib = relay.build(mod, target=target, params=params) [neth, netw] = shape["data"][2:] # Current image shape is 608x608 .. rst-class:: sphx-glr-script-out .. code-block:: none Compiling the model... .. GENERATED FROM PYTHON SOURCE LINES 113-115 Load a test image ----------------- .. GENERATED FROM PYTHON SOURCE LINES 115-121 .. code-block:: default test_image = "dog.jpg" print("Loading the test image...") img_url = REPO_URL + "data/" + test_image + "?raw=true" img_path = download_testdata(img_url, test_image, "data") data = tvm.relay.testing.darknet.load_image(img_path, netw, neth) .. rst-class:: sphx-glr-script-out .. code-block:: none Loading the test image... .. GENERATED FROM PYTHON SOURCE LINES 122-125 Execute on TVM Runtime ---------------------- The process is no different from other examples. .. GENERATED FROM PYTHON SOURCE LINES 125-209 .. code-block:: default from tvm.contrib import graph_executor m = graph_executor.GraphModule(lib["default"](dev)) # set inputs m.set_input("data", tvm.nd.array(data.astype(dtype))) # execute print("Running the test image...") # detection # thresholds thresh = 0.5 nms_thresh = 0.45 m.run() # get outputs tvm_out = [] if MODEL_NAME == "yolov2": layer_out = {} layer_out["type"] = "Region" # Get the region layer attributes (n, out_c, out_h, out_w, classes, coords, background) layer_attr = m.get_output(2).numpy() layer_out["biases"] = m.get_output(1).numpy() out_shape = (layer_attr[0], layer_attr[1] // layer_attr[0], layer_attr[2], layer_attr[3]) layer_out["output"] = m.get_output(0).numpy().reshape(out_shape) layer_out["classes"] = layer_attr[4] layer_out["coords"] = layer_attr[5] layer_out["background"] = layer_attr[6] tvm_out.append(layer_out) elif MODEL_NAME == "yolov3": for i in range(3): layer_out = {} layer_out["type"] = "Yolo" # Get the yolo layer attributes (n, out_c, out_h, out_w, classes, total) layer_attr = m.get_output(i * 4 + 3).numpy() layer_out["biases"] = m.get_output(i * 4 + 2).numpy() layer_out["mask"] = m.get_output(i * 4 + 1).numpy() out_shape = (layer_attr[0], layer_attr[1] // layer_attr[0], layer_attr[2], layer_attr[3]) layer_out["output"] = m.get_output(i * 4).numpy().reshape(out_shape) layer_out["classes"] = layer_attr[4] tvm_out.append(layer_out) elif MODEL_NAME == "yolov3-tiny": for i in range(2): layer_out = {} layer_out["type"] = "Yolo" # Get the yolo layer attributes (n, out_c, out_h, out_w, classes, total) layer_attr = m.get_output(i * 4 + 3).numpy() layer_out["biases"] = m.get_output(i * 4 + 2).numpy() layer_out["mask"] = m.get_output(i * 4 + 1).numpy() out_shape = (layer_attr[0], layer_attr[1] // layer_attr[0], layer_attr[2], layer_attr[3]) layer_out["output"] = m.get_output(i * 4).numpy().reshape(out_shape) layer_out["classes"] = layer_attr[4] tvm_out.append(layer_out) thresh = 0.560 # do the detection and bring up the bounding boxes img = tvm.relay.testing.darknet.load_image_color(img_path) _, im_h, im_w = img.shape dets = tvm.relay.testing.yolo_detection.fill_network_boxes( (netw, neth), (im_w, im_h), thresh, 1, tvm_out ) last_layer = net.layers[net.n - 1] tvm.relay.testing.yolo_detection.do_nms_sort(dets, last_layer.classes, nms_thresh) coco_name = "coco.names" coco_url = REPO_URL + "data/" + coco_name + "?raw=true" font_name = "arial.ttf" font_url = REPO_URL + "data/" + font_name + "?raw=true" coco_path = download_testdata(coco_url, coco_name, module="data") font_path = download_testdata(font_url, font_name, module="data") with open(coco_path) as f: content = f.readlines() names = [x.strip() for x in content] tvm.relay.testing.yolo_detection.show_detections(img, dets, thresh, names, last_layer.classes) tvm.relay.testing.yolo_detection.draw_detections( font_path, img, dets, thresh, names, last_layer.classes ) plt.imshow(img.transpose(1, 2, 0)) plt.show() .. image-sg:: /how_to/compile_models/images/sphx_glr_from_darknet_001.png :alt: from darknet :srcset: /how_to/compile_models/images/sphx_glr_from_darknet_001.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none Running the test image... class:['dog 0.994'] left:127 top:227 right:316 bottom:533 class:['truck 0.9266'] left:471 top:83 right:689 bottom:169 class:['bicycle 0.9984'] left:111 top:113 right:577 bottom:447 .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 1 minutes 1.791 seconds) .. _sphx_glr_download_how_to_compile_models_from_darknet.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: from_darknet.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: from_darknet.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_