窝牛号

基于Mediapipe的对象分类任务,CPU平台毫秒级别延迟

计算机视觉任务一直是GPU的天下,由于GPU超强的算力,也把计算机视觉任务提高了很多水平。但是在移动终端平台,如何来运行大型的模型,一直是大家关注的话题。Mediapipe是google开源的可以直接运行在移动终端设备上的多任务模型,不仅在计算机视觉任务上,还是NLP自然语言处理任务上,都取得的较好的成绩。本期我们来看看使用Mediapipe如何进行对象分类任务。

Mediapipe对象分类任务,输入可以是以下数据类型之一:

静止图像解码后的视频帧现场视频直播

图像分类器输出一个类别列表,其中包含:

类别索引:模型输出中类别的索引Score:该类别的置信度得分,通常是[0,1]中的概率类别名称(可选):TFLite 模型元数据中指定的类别名称类别显示名称(可选):TFLite 模型元数据中指定的类别的显示名称

图像分类器需要下载图像分类模型,Mediapipe提供了2种尺寸的模型供用户下载。

EfficientNet-Lite0模型

EfficientNet-Lite0 模型使用 EfficientNet 架构,并使用ImageNet进行训练以识别 1,000个类别,例如树木、动物、食物、车辆、人等。EfficientNet-Lite0 可用作 int8 和 float 32 模型。

EfficientNet-Lite2模型

EfficientNet-Lite2 模型使用 EfficientNet 架构,并使用ImageNet进行训练以识别 1,000 个类别,例如树木、动物、食物、车辆、人等。EfficientNet-Lite2 可用作 int8 和 float 32 模型。该模型通常比 EfficientNet-Lite0 更准确,但速度也更慢且占用更多内存。该模型适用于精度比速度更重要的任务。

在移动终端设备上面,其EfficientNet-Lite0模型最快才只有10ms的延时,这对一个计算机视觉任务来说已经是很快的结果,这么低的延时,完全可以直接使用在实时视频与直播任务上。

若要运行Mediapipe的对象分类任务,首先需要安装Mediapipe库,并下载相关的模型。

!pip install -q mediapipe==0.10.0 !wget -O classifier.tflite -q https://storage.googleapis.com/mediapipe-models/image_classifier/efficientnet_lite0/float32/1/efficientnet_lite0.tflite !wget -O classifier.tflite -q https://storage.googleapis.com/mediapipe-models/image_classifier/efficientnet_lite2/float32/1/efficientnet_lite2.tflite !wget -O classifier.tflite -q https://storage.googleapis.com/mediapipe-models/image_classifier/efficientnet_lite0/int8/1/efficientnet_lite0.tflite !wget -O classifier.tflite -q https://storage.googleapis.com/mediapipe-models/image_classifier/efficientnet_lite2/int/1/efficientnet_lite2.tflite

当安装完成Mediapipe库与预训练模型后,就可以进行图片的分类任务了,当然这里你可以下载不同的预训练模型。

import mediapipe as mp from mediapipe.tasks import python from mediapipe.tasks.python.components import processors from mediapipe.tasks.python import vision base_options = python.BaseOptions(model_asset_path=&39;) options = vision.ImageClassifierOptions(base_options=base_options, max_results=4) classifier = vision.ImageClassifier.create_from_options(options) IMAGE_FILENAMES = [&39;] images = [] predictions = []

首先我们导入相关的第三方库,这里主要是mediapipe,以及相关的mediapipe函数。并使用python.BaseOptions来加载已经训练好的模型。并使用ImageClassifierOptions来建立一个图形分类器,其ImageClassifierOptions参数如下:

running_mode : 1.MAGE:单图像输入模式。 2.VIDEO:视频解码帧的模式。 3.LIVE_STREAM:输入数据实时流的模式,例如来自摄像机的输入数据。在这种模式下,必须调用resultListener来设置监听器以异步接收结果。 display_names_locale:设置用于任务模型元数据中提供的显示名称的标签语言。默认en为英语。 max_results:分类数量 score_threshold:预测分数的阈值 category_allowlist:设置允许的类别名称的可选列表。如果非空,则类别名称不在该集合中的分类结果将被过滤掉。 category_denylist:设置不允许的类别名称的可选列表。如果不为空,则过滤掉类别名称在此集合中的分类结果。 result_callback:设置结果监听器在图像分类器处于直播模式时异步接收分类结果。仅当运行模式设置为LIVE_STREAM

设置完成后,就可以根据自己的图片来进行图片分类了,这里建立一个IMAGE_FILENAMES列表,可以把图片的绝对位置都放在此列表中,一起进行检测分类,或者也可以打开摄像头进行实时视频的对象分类任务。

for image_name in IMAGE_FILENAMES: image = mp.Image.create_from_file(image_name) classification_result = classifier.classify(image) images.append(image) top_category = classification_result.classifications[0].categories[0] predictions.append(f&34;) display_batch_of_images(images, predictions)

使用for循环,遍历IMAGE_FILENAMES列表,并把图片传递给classifier对象分类任务器,经过分类任务器检测后,其结果保存在classification_result中。最后,我们使用可视化函数把检测结果进行可视化。

from matplotlib import pyplot as plt def display_one_image(image, title, subplot, titlesize=16): plt.subplot(*subplot) plt.imshow(image) if len(title) > 0: plt.title(title, fontsize=int(titlesize), color=&39;, fontdict={&39;:&39;}, pad=int(titlesize/1.5)) return (subplot[0], subplot[1], subplot[2]+1) def display_batch_of_images(images, predictions): images = [image.numpy_view() for image in images] rows = int(math.sqrt(len(images))) cols = len(images) FIGSIZE = 13.0 SPACING = 0.1 subplot=(rows,cols, 1) if rows < cols: plt.figure(figsize=(FIGSIZE,FIGSIZE/cols*rows)) else: plt.figure(figsize=(FIGSIZE/rows*cols,FIGSIZE)) for i, (image, prediction) in enumerate(zip(images[:rows*cols], predictions[:rows*cols])): dynamic_titlesize = FIGSIZE*SPACING/max(rows,cols) * 40 + 3 subplot = display_one_image(image, prediction, subplot, titlesize=dynamic_titlesize) plt.tight_layout() plt.subplots_adjust(wspace=SPACING, hspace=SPACING) plt.show()

可视化函数与上期介绍的手势识别一致,可以直接参考,当然基于mediapipe还有更多计算机视觉任务,比如前期介绍的人脸468点检测与人体姿态检测等。

本站所发布的文字与图片素材为非商业目的改编或整理,版权归原作者所有,如侵权或涉及违法,请联系我们删除

窝牛号 wwww.93ysy.com   沪ICP备2021036305号-1