diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cfce1ad --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.log + diff --git a/data/DJI_0001_0001.jpg b/data/DJI_0001_0001.jpg new file mode 100644 index 0000000..5b54c79 Binary files /dev/null and b/data/DJI_0001_0001.jpg differ diff --git a/data/coco_names.json b/data/coco_names.json new file mode 100644 index 0000000..d59611f --- /dev/null +++ b/data/coco_names.json @@ -0,0 +1,93 @@ +{ + "0":"unlabeled", + "1":"person", + "2":"bicycle", + "3":"car", + "4":"motorcycle", + "5":"airplane", + "6":"bus", + "7":"train", + "8":"truck", + "9":"boat", + "10":"trafficlight", + "11":"firehydrant", + "12":"streetsign", + "13":"stopsign", + "14":"parkingmeter", + "15":"bench", + "16":"bird", + "17":"cat", + "18":"dog", + "19":"horse", + "20":"sheep", + "21":"cow", + "22":"elephant", + "23":"bear", + "24":"zebra", + "25":"giraffe", + "26":"hat", + "27":"backpack", + "28":"umbrella", + "29":"shoe", + "30":"eyeglasses", + "31":"handbag", + "32":"tie", + "33":"suitcase", + "34":"frisbee", + "35":"skis", + "36":"snowboard", + "37":"sportsball", + "38":"kite", + "39":"baseballbat", + "40":"baseballglove", + "41":"skateboard", + "42":"surfboard", + "43":"tennisracket", + "44":"bottle", + "45":"plate", + "46":"wineglass", + "47":"cup", + "48":"fork", + "49":"knife", + "50":"spoon", + "51":"bowl", + "52":"banana", + "53":"apple", + "54":"sandwich", + "55":"orange", + "56":"broccoli", + "57":"carrot", + "58":"hotdog", + "59":"pizza", + "60":"donut", + "61":"cake", + "62":"chair", + "63":"couch", + "64":"pottedplant", + "65":"bed", + "66":"mirror", + "67":"diningtable", + "68":"window", + "69":"desk", + "70":"toilet", + "71":"door", + "72":"tv", + "73":"laptop", + "74":"mouse", + "75":"remote", + "76":"keyboard", + "77":"cellphone", + "78":"microwave", + "79":"oven", + "80":"toaster", + "81":"sink", + "82":"refrigerator", + "83":"blender", + "84":"book", + "85":"clock", + "86":"vase", + "87":"scissors", + "88":"teddybear", + "89":"hairdrier", + "90":"toothbrush" + } \ No newline at end of file diff --git a/data/daria_labels.json b/data/daria_labels.json new file mode 100644 index 0000000..998d57c --- /dev/null +++ b/data/daria_labels.json @@ -0,0 +1,5 @@ +{ + "0":"Label", + "1":"Pallet", + "2":"Product" + } diff --git a/hef/yolov5m.hef b/hef/yolov5m.hef new file mode 100644 index 0000000..8ab9bd1 Binary files /dev/null and b/hef/yolov5m.hef differ diff --git a/hef/yolov5m_daria.hef b/hef/yolov5m_daria.hef new file mode 100644 index 0000000..a458961 Binary files /dev/null and b/hef/yolov5m_daria.hef differ diff --git a/hef/yolov5s.hef b/hef/yolov5s.hef new file mode 100644 index 0000000..502e311 Binary files /dev/null and b/hef/yolov5s.hef differ diff --git a/inference.py b/inference.py index 4532e3f..9bb6463 100644 --- a/inference.py +++ b/inference.py @@ -1,8 +1,11 @@ import json import os import time -t + +import ipdb + from PIL import Image +from threading import Thread from detection_tools.utils.visualization_utils import \ visualize_boxes_and_labels_on_image_array @@ -59,8 +62,8 @@ class DataHandler: return coco_names - def _get_labels(self, label_name): - filename = os.path.join(os.path.dirname(__file__), label_name + '.json') + def get_labels(self, path): + filename = os.path.join(os.path.dirname(__file__), path) names = json.load(open(filename)) names = {int(k): {'id': int(k), 'name': str(v)} for (k, v) in names.items()} return names @@ -279,22 +282,79 @@ class HailoHandler: out = [infer_results[i.name] for i in self.output_vstream_infos] return out + def start_hailo_thread(self): + self.hailo_async = True + self.hailo_block = False + self.input_data = None + self.hailo_thread = Thread(target=self._hailo_async) + self.hailo_thread.start() + + def _hailo_async(self): + with InferVStreams(self.network_group, self.input_vstreams_params, self.output_vstreams_params)\ + as infer_pipeline: + with self.network_group.activate(self.network_group_params): + self._hailo_async_loop(infer_pipeline) -def process_yolo5(): + def _hailo_async_loop(self, infer_pipeline): + while self.hailo_async: + if(not self.hailo_block and type(self.input_data) != type(None)): + self.infer_results = None + self.hailo_block = True + infer_results = infer_pipeline.infer(self.input_data) + self.infer_results = [infer_results[i.name] for i in self.output_vstream_infos] + self.input_data = None + self.hailo_block = False + def hailo_input(self, input_data): + while self.hailo_block: + time.sleep(0.01) + self.hailo_block = True + self.input_data = input_data + self.input_data = {self.input_vstream_info.name: input_data} + self.infer_results = None + self.hailo_block = False + + def hailo_output(self): + while self.hailo_block: + time.sleep(0.01) + return self.infer_results + + + def stop_hailo_thread(self): + self.hailo_async = False + self.hailo_thread.join() + +def test_async_yolo5(): imageMeta = ImageMeta(640, 640, 3) processor = YoloProcessing(imageMeta, classes=3) - data = DataHandler('./minimal_data', imageMeta) + data = DataHandler('./data', imageMeta) data.load_data(processor.preproc) - hailo = HailoHandler('hef/yolov5m_22_2.hef') - out = hailo.run_hailo(data.dataset) + hailo = HailoHandler('hef/yolov5m_daria.hef') + hailo.start_hailo_thread() + + fps = 0 + now = time.time() + for i in range(1000): + fps += 1 + if now + 1 < time.time(): + print(fps) + fps = 0 + now = time.time() + + hailo.hailo_input(data.dataset) + out = None + while(out == None): + time.sleep(0.01) + out = hailo.hailo_output() + + hailo.stop_hailo_thread() logits = processor.postprocessing(out) - labels = data._get_labels("daria_names") + labels = data.get_labels("data/daria_labels.json") image = visualize_boxes_and_labels_on_image_array( data.dataset[0], logits['detection_boxes'].numpy()[0], @@ -308,6 +368,38 @@ def process_yolo5(): line_thickness=4) Image.fromarray(np.uint8(image)).save('/home/maintenance/test.png') + print("Successfully saved image") + + + +def test_process_yolo5(): + + imageMeta = ImageMeta(640, 640, 3) + processor = YoloProcessing(imageMeta, classes=3) + data = DataHandler('./data', imageMeta) + data.load_data(processor.preproc) + + hailo = HailoHandler('hef/yolov5m_daria.hef') + out = hailo.run_hailo(data.dataset) + + logits = processor.postprocessing(out) + + + labels = data.get_labels("data/daria_labels.json") + image = visualize_boxes_and_labels_on_image_array( + data.dataset[0], + logits['detection_boxes'].numpy()[0], + logits['detection_classes'][0], + logits['detection_scores'].numpy()[0], + labels, + use_normalized_coordinates=True, + max_boxes_to_draw=100, + min_score_thresh=.5, + agnostic_mode=False, + line_thickness=4) + + Image.fromarray(np.uint8(image)).save('/home/maintenance/test.png') + print("Successfully saved image") if __name__ == "__main__": - process_yolo5() + test_async_yolo5()