JeVoisBase  1.20
JeVois Smart Embedded Machine Vision Toolkit Base Modules
Share this page:
PyPreBlob.py
Go to the documentation of this file.
1 import pyjevois
2 if pyjevois.pro: import libjevoispro as jevois
3 else: import libjevois as jevois
4 
5 import numpy as np
6 import cv2
7 
8 ## Simple DNN pre-processor written in python
9 #
10 # This version is mainly for tutorial purposes and does not support as many features as the C++ PreProcessorBlob
11 #
12 # Compare this code to the C++ PreProcessorBlob (which has more functionality than here):
13 # - Abstract base: https://github.com/jevois/jevois/blob/master/include/jevois/DNN/PreProcessor.H
14 # - Header: https://github.com/jevois/jevois/blob/master/include/jevois/DNN/PreProcessorBlob.H
15 # - Implementation: https://github.com/jevois/jevois/blob/master/src/jevois/DNN/PreProcessorBlob.C
16 #
17 # @author Laurent Itti
18 #
19 # @email itti\@usc.edu
20 # @address University of Southern California, HNB-07A, 3641 Watt Way, Los Angeles, CA 90089-2520, USA
21 # @copyright Copyright (C) 2022 by Laurent Itti, iLab and the University of Southern California
22 # @mainurl http://jevois.org
23 # @supporturl http://jevois.org/doc
24 # @otherurl http://iLab.usc.edu
25 # @license GPL v3
26 # @distribution Unrestricted
27 # @restrictions None
28 # @ingroup pydnn
29 class PyPreBlob:
30  # ###################################################################################################
31  ## [Optional] Constructor
32  def __init__(self):
33  self.results = [] # list of strings containing our latest results to report
34 
35  # ###################################################################################################
36  ## [Optional] JeVois parameters initialization
37  def init(self):
38  pc = jevois.ParameterCategory("DNN Pre-Processing Options", "")
39 
40  self.scale = jevois.Parameter(self, 'scale', 'float',
41  "Value scaling factor applied to input pixels, or 0.0 to extract a " +
42  "UINT8 blob, typically for use with quantized networks",
43  2.0/255.0, pc)
44 
45  self.mean = jevois.Parameter(self, 'mean', 'fscalar',
46  "Mean value subtracted from input image",
47  (127.5, 127.5, 127.5), pc)
48 
49  # ###################################################################################################
50  ## [Required] Main processing function: extract one or more 4D blobs from an image
51  ## img is the input image from the camera sensor
52  ## swaprb is true if we should swap red/blue channels (based on camera grab order vs. network desired order)
53  ## attrs is a list of string blob specifiers, one per desired blob (see below for format and parsing)
54  ## We return a tuple with 2 lists: list of blobs, and list of crop rectangles that were used to extract the blobs.
55  ## The Network will use the blobs, and a PostProcessor may use the crops to, e.g., rescale object detection boxes
56  ## back to the original image.
57  def process(self, img, swaprb, attrs):
58  # Clear any old results:
59  self.results.clear()
60 
61  # We want to return a tuple containing two lists: list of 4D blobs (numpy arrays), and list of crop rectangles
62  blobs = []
63  crops = []
64 
65  # Create one blob per received size attribute:
66  for a in attrs:
67  # attr format is: [NCHW:|NHWC:|NA:|AUTO:]Type:[NxCxHxW|NxHxWxC|...][:QNT[:fl|:scale:zero]]
68  alist = a.split(':')
69 
70  # In this simple example, we will use cv2.blobFromImage() which returns NCHW blobs. Hence require that:
71  if alist[0] != 'NCHW': raise ValueError("Only NCHW blobs supported. Try the C++ preprocessor for more.")
72  typ = alist[1]
73  dims = alist[2]
74 
75  # We only support uint8 or float32 in this example:
76  if typ == '8U': typ = cv2.CV_8U
77  elif typ == '32F': typ = cv2.CV_32F
78  else: raise ValueError("Only 8U or 32F blob types supported. Try the C++ preprocessor for more.")
79 
80  # Split the dims from NxCxHxW string:
81  dlist = dims.split('x')
82  if len(dlist) != 4: raise ValueError("Only 4D blobs supported. Try the C++ preprocessor for more.")
83 
84  # We just want the width and height:
85  siz = (int(dlist[3]), int(dlist[2]))
86 
87  # Ok, hand it over to blobFromImage(). To keep it simple here, we do not do cropping, so that we can easily
88  # recover the crop rectangles from the original image:
89  b = cv2.dnn.blobFromImage(img, self.scale.get(), siz, self.mean.get(), swaprb, crop = False, ddepth = typ)
90  blobs.append(b)
91 
92  # We did not crop, so the recangles are just the original image. We send rectangles as tuples of format:
93  # ( (x,y), (w, h) )
94  crops.append( ( (0, 0), (img.shape[1], img.shape[0] ) ) )
95 
96  return (blobs, crops)
97 
98  # ###################################################################################################
99  ## [Optional] Report the latest results obtained by process() by drawing them
100  ## outimg is None or a RawImage to draw into when in Legacy mode (drawing to an image send to USB)
101  ## helper is None or a GUIhelper to do OpenGL drawings when in JeVois-Pro mode
102  ## overlay is True if users wishes to see overlay text
103  ## idle is true if keyboard/mouse have been idle for a while, which typically would reduce what is displayed.
104  ##
105  ## Note that report() is called on every frame even though the network may run slower or take some time to load and
106  ## initialize, thus you should be prepared for report() being called even before process() has ever been called
107  ## (i.e., create some class member variables to hold the reported results, initialize them to some defaults in your
108  ## constructor, report their current values here, and update their values in process()).
109  def report(self, outimg, helper, overlay, idle):
110  # Nothing to report here. Note that the base C++ PreProcessor class will do some reporting for us.
111  # You could delete that whole method, kept here for tutorial purposes.
112  pass
113 
PyPreBlob.PyPreBlob.results
results
Definition: PyPreBlob.py:33
demo.int
int
Definition: demo.py:37
PyPreBlob.PyPreBlob.report
def report(self, outimg, helper, overlay, idle)
[Optional] Report the latest results obtained by process() by drawing them outimg is None or a RawIma...
Definition: PyPreBlob.py:109
PyPreBlob.PyPreBlob
Simple DNN pre-processor written in python.
Definition: PyPreBlob.py:29
PyPreBlob.PyPreBlob.init
def init(self)
[Optional] JeVois parameters initialization
Definition: PyPreBlob.py:37
jevois::ParameterCategory
PyPreBlob.PyPreBlob.__init__
def __init__(self)
[Optional] Constructor
Definition: PyPreBlob.py:32
PyPreBlob.PyPreBlob.mean
mean
Definition: PyPreBlob.py:45
PyPreBlob.PyPreBlob.process
def process(self, img, swaprb, attrs)
[Required] Main processing function: extract one or more 4D blobs from an image img is the input imag...
Definition: PyPreBlob.py:57
PyPreBlob.PyPreBlob.scale
scale
Definition: PyPreBlob.py:40