mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
This has been a long-time coming, but, it's finally here. TensorFlow lite runs on the OpenMV Cam now. Better yet, a person detection model is now built-into all OpenMV Cams too! Our default code does image classification and supports multi-scale object detection using a sliding window. In a coming PR I will add mobilenet examples for the H7 with SDRAM and image segmentation support.
44 lines
2.3 KiB
Python
44 lines
2.3 KiB
Python
# TensorFlow Lite Person Dection Example
|
|
#
|
|
# Google's Person Detection Model detects if a person is in view.
|
|
#
|
|
# In this example we slide the detector window over the image and get a list
|
|
# of activations. Note that use a CNN with a sliding window is extremely compute
|
|
# expensive so for an exhaustive search do not expect the CNN to be real-time.
|
|
|
|
import sensor, image, time, os, tf
|
|
|
|
sensor.reset() # Reset and initialize the sensor.
|
|
sensor.set_pixformat(sensor.GRAYSCALE) # Set pixel format to RGB565 (or GRAYSCALE)
|
|
sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240)
|
|
sensor.set_windowing((240, 240)) # Set 240x240 window.
|
|
sensor.skip_frames(time=2000) # Let the camera adjust.
|
|
|
|
# Load the built-in person detection network (the network is in your OpenMV Cam's firmware).
|
|
net = tf.load('person_detection')
|
|
labels = ['unsure', 'person', 'no_person']
|
|
|
|
clock = time.clock()
|
|
while(True):
|
|
clock.tick()
|
|
|
|
img = sensor.snapshot()
|
|
|
|
# net.classify() will run the network on an roi in the image (or on the whole image if the roi is not
|
|
# specified). A classification score output vector will be generated for each location. At each scale the
|
|
# detection window is moved around in the ROI using x_overlap (0-1) and y_overlap (0-1) as a guide.
|
|
# If you set the overlap to 0.5 then each detection window will overlap the previous one by 50%. Note
|
|
# the computational work load goes WAY up the more overlap. Finally, for multi-scale matching after
|
|
# sliding the network around in the x/y dimensions the detection window will shrink by scale_mul (0-1)
|
|
# down to min_scale (0-1). For example, if scale_mul is 0.5 the detection window will shrink by 50%.
|
|
# Note that at a lower scale there's even more area to search if x_overlap and y_overlap are small...
|
|
|
|
# default settings just do one detection... change them to search the image...
|
|
for obj in net.classify(img, min_scale=1.0, scale_mul=0.5, x_overlap=0.0, y_overlap=0.0):
|
|
print("**********\nDetections at [x=%d,y=%d,w=%d,h=%d]" % obj.rect())
|
|
for i in range(len(obj.output())):
|
|
print("%s = %f" % (labels[i], obj.output()[i]))
|
|
img.draw_rectangle(obj.rect())
|
|
img.draw_string(obj.x()+3, obj.y()-1, labels[obj.output().index(max(obj.output()))], mono_space = False)
|
|
print(clock.fps(), "fps")
|