I am trying to make a motor control system using Object Detection. I have two threads, one for object detection and one for GUI.
Here is the code for object detection
#execute object detection model in real time
def tfod_window():
global coordinates, class_name, named_coordinates
category_index = label_map_util.create_category_index_from_labelmap(files['LABELMAP'])
while cap.isOpened():
ret, frame = cap.read()
image_np = np.array(frame)
input_tensor = tf.convert_to_tensor(np.expand_dims(image_np, 0), dtype=tf.float32)
detections = detect_fn(input_tensor)
num_detections = int(detections.pop('num_detections'))
detections = {key: value[0, :num_detections].numpy()
for key, value in detections.items()}
detections['num_detections'] = num_detections
# detection_classes should be ints.
detections['detection_classes'] = detections['detection_classes'].astype(np.int64)
label_id_offset = 1
image_np_with_detections = image_np.copy()
viz_utils.visualize_boxes_and_labels_on_image_array(
image_np_with_detections,
detections['detection_boxes'],
detections['detection_classes'] label_id_offset,
detections['detection_scores'],
category_index,
use_normalized_coordinates=True,
max_boxes_to_draw=5,
min_score_thresh=.8,
agnostic_mode=False)
cv2.imshow('object detection', cv2.resize(image_np_with_detections, (800, 600)))
#get the coordinates of the detection boxes
boxes = detections['detection_boxes']
max_boxes_to_draw = boxes.shape[0]
scores = detections['detection_scores']
min_score_thresh=.8
coordinates=[]
class_name=[]
named_coordinates=[]
for i in range(min(max_boxes_to_draw, boxes.shape[0])):
if scores[i] > min_score_thresh:
class_id = int(detections['detection_classes'][i] 1)
coordinates.append(boxes[i])
class_name.append(category_index[class_id]["name"])
named_coordinates.append({
"box": boxes[i],
"class_name": category_index[class_id]["name"],
})
if cv2.waitKey(10) & 0xFF == ord('q'):
cap.release()
cv2.destroyAllWindows()
break
However when I want to use coordinates in another thread, it shows '''NameError: name 'class_name' is not defined'''.
The code for another thread is
def GUI():
while cap.isOpened():
if len(class_name) > 0:
print(class_name)
t1 = Thread(target=tfod)
t2 = Thread(target=GUI)
t1.start()
t2.start()
Please Help!! Thank you!!
CodePudding user response:
From the comments: class_name
was not declared/initialized before the t2
thread tried to access it.
You can place a single initial line of code defining class_name
near the top of the program, and this will avoid this error.
For those who may see this page, the error is not super relevant to the title, but here is a post that does discuss how to properly share data between threads.