最廣為人知的目標檢測模型是Yolo系列,現已更新為V8系列,但現有的Yolo模型面臨量化支援不足、精度延遲權衡不足等侷限性。
Yolo-NAS 模型在 Coco、Objects365 和 RoboFlow 100 等知名資料集上進行了預訓練,非常適合生產環境中的下游物件檢測任務。 YOLO-NAS的發布代表了目標檢測模型推理效能和效率的重大飛躍,解決了傳統模型的侷限性,並為各種任務和硬體提供了前所未有的適應性。 全新 YOLO-NAS 提供最先進的 (SOTA) 效能和無與倫比的精度速度效能,效能優於 YOLO5、YOLOX6、YOLOXV7 和 YOLO8 等其他型號。
然而,其主流的目標檢測模型,為了快速執行,需要使用強大的GPU作為後端算力。 隨著移動終端的普及,移動終端對大型機型的需求越來越大。 谷歌發布的MediaPipe系列已經成功在移動終端上執行目標檢測模型,執行速度在ms級。
mediapipe 物件檢測模型可以對 ** 或實時實時流執行物件檢測任務。 mediapipe 目標檢測模型包含三種不同大小的模型,您可以根據自己的任務選擇相關模型。
型號 1:efficientdet-lite0
EfficientDet-Lite0 模型使用具有 320x320 輸入大小和 bifpn 特徵網路的 EfficientNet-Lite0 骨幹網路模型。 該模型使用 COCO 資料集進行訓練,COCO 資料集是乙個包含 150 萬個物件例項和 80 個物件標籤的大規模物件檢測資料集。 EfficientDet-Lite0 模型使用三種不同的大小:int8、float16 或 float32。 該模型在延遲和準確性之間取得了平衡。 對於許多任務來說,它既準確又輕巧。 是大多數物件檢測任務的首選模型。
模型 2:efficientdet-lite2
EfficientDet-Lite2 模型使用輸入大小為 448x448 的 EfficientNet-Lite2 骨幹網路模型和 BIFPN 特徵網路。 該模型還使用 COCO 資料集進行訓練,EfficientDet-Lite2 還提供三種尺寸:INT8、FLOAT16 和 FLOAT32。 該模型通常比 EfficientDet-Lite0 更準確,但它也更慢且更占用記憶體。
型號 3:SSD MobileNetv2
SSD MobileNetv2 模型使用具有 256x256 輸入大小和 SSD 簽名網路的 MobileNetv2 骨幹網路模型。 該模型使用 COCO 資料集進行訓練,SSD MobileNetv2 提供了 2 種大小的模型,INT8 和 FLOAT 32。 該模型比 EfficientDet-Lite0 更快、更輕,但通常也不太準確。
無論是輸入,還是**,其模型最終都會轉換為**進行目標檢測,對於**,在目標檢測完成後,將每一幀的**連線在一起,再次轉換為**,最終實現**或**流的目標檢測。 其模型輸出 4 個引數:
檢測框:用於目標檢測的框的位置檢測類:目標檢測的分類檢測分數:目標檢測的置信度數框數:框數
對於沒有GPU的移動終端,其EfficientDet-Lite 0 INT8型號只有29延遲為 31 毫秒,其最大型號僅為 198延遲77ms,速度也相當快。
實現 MediaPipe 物件檢測模型
若要實現 MediaPipe 物件檢測模型,首先需要設定相關環境。 安裝 mediapipe 010個版本,以及**相關的目標檢測模型,這裡可以**3種任意尺寸模型的模型。
pip install -q mediapipe==0.10.0!wget -q -o efficientdet.tflite -q -q -o efficientdet.tflite -q -q -o efficientdet.tflite -q
然後,建立乙個視覺化函式,該函式的主要目的是在物件檢測完成後視覺化目標檢測的結果。
import cv2import numpy as npmargin = 10 row_size = 10 font_size = 1font_thickness = 1text_color = (255, 0, 0) # reddef visualize(image, detection_result) -np.ndarray: for detection in detection_result.detections: bbox = detection.bounding_box start_point = bbox.origin_x, bbox.origin_y end_point = bbox.origin_x + bbox.width, bbox.origin_y + bbox.height cv2.rectangle(image, start_point, end_point, text_color, 3) category = detection.categories[0] category_name = category.category_name probability = round(category.score, 2) result_text = category_name + ' (' + str(probability) +')' text_location = (margin + bbox.origin_x, margin + row_size + bbox.origin_y) cv2.puttext(image, result_text, text_location, cv2.font_hershey_plain,font_size, text_color, font_thickness) return image
現在我們可以載入乙個需要物件檢測的**,並執行物件檢測任務。
import numpy as npimport mediapipe as mpfrom mediapipe.tasks import pythonfrom mediapipe.tasks.python import visionimage_file = '12.jpg'base_options = python.baseoptions(model_asset_path='efficientdet.tflite')options = vision.objectdetectoroptions(base_options=base_options,score_threshold=0.5)detector = vision.objectdetector.create_from_options(options)image = mp.image.create_from_file(image_file)detection_result = detector.detect(image)image_copy = np.copy(image.numpy_view())annotated_image = visualize(image_copy, detection_result)rgb_annotated_image = cv2.cvtcolor(annotated_image, cv2.color_bgr2rgb)cv2_imshow(rgb_annotated_image)
當然,在目標檢測的類別和目標檢測的準確性方面,MediaPipe 與其他基於 GPU 系列的目標檢測模型還是有差距的,但 MediaPipe 並不使用 GPU 進行加速,如果在移動端使用其他目標檢測模型,效果不如 Mediapipe, 而且它的物件檢測模型也非常相關。
YOLO模型系列。