使用数组操作解码YOLO Core ML对象检测(三)

目录

介绍

解码YOLO输出的正确方式

下一步


总目录 

将ONNX对象检测模型转换为iOS Core ML(一)

在这里,我们将使用数组操作(向量化)来摆脱循环,从而对YOLO Core ML模型进行解码。了解它是如何工作的,将使我们在下一篇文章中将此逻辑添加到Core ML模型中。

介绍

本系列假定您熟悉PythonCondaONNX,并且具有使用Xcode开发iOS应用程序的经验。我们将使用macOS 10.15 +Xcode 11.7+iOS 13+运行代码。

解码YOLO输出的正确方式

如果您以前使用过神经网络或数组,那么您很可能会在上一篇文章中看到我们在细胞和盒子(cycxcx)上的循环。根据经验,如果在处理数组时需要循环,那么这样做是错误的。在这种特殊情况下,这是有意的,因为这些循环使得更容易掌握底层逻辑。向量化的实现通常很简短,但乍一看并不容易理解。

请注意,本文代码下载中的笔记本包含了以前的(基于循环)解决方案和新的解决方案。

首先从矢量化解码开始,我们需要一个在2D数组上工作的新softmax函数:

def softmax_2d(x, axis=1):
    x_max = np.max(x, axis=axis)[:, np.newaxis]
    e_x = np.exp(x - x_max)
    x_sum = np.sum(e_x, axis=axis)[:, np.newaxis]    
    return e_x / x_sum

接下来,为了摆脱cycx以及b循环,我们需要一些常量数组:

ANCHORS_W = np.array([0.57273, 1.87446, 3.33843, 7.88282, 9.77052]).reshape(1, 1, 5)
ANCHORS_H = np.array([0.677385, 2.06253, 5.47434, 3.52778, 9.16828]).reshape(1, 1, 5)

CX = np.tile(np.arange(GRID_SIZE), GRID_SIZE).reshape(1, GRID_SIZE**2, 1)
CY = np.tile(np.arange(GRID_SIZE), GRID_SIZE).reshape(1, GRID_SIZE, GRID_SIZE).transpose()
CY = CY.reshape(1, GRID_SIZE**2, 1)

现在,该ANCHORS数组分为两个:ANCHORS_WANCHORS_H

CXCY数组包含所有的cxcy值组合,嵌套循环执行期间先前生成的。设置这些阵列的形状是为了简化后续操作。

现在我们准备实现矢量化解码函数:

def decode_preds_vec(raw_preds: []):
    num_classes = len(COCO_CLASSES)

    raw_preds = np.transpose(raw_preds, (0, 2, 3, 1))

    raw_preds = raw_preds.reshape((1, GRID_SIZE**2, BOXES_PER_CELL, num_classes + 5))
    decoded_preds = []
    
    tx = raw_preds[:,:,:,0]
    ty = raw_preds[:,:,:,1]
    tw = raw_preds[:,:,:,2]
    th = raw_preds[:,:,:,3]
    tc = raw_preds[:,:,:,4]
    
    x = ((CX + sigmoid(tx)) * CELL_SIZE).reshape(-1)
    y = ((CY + sigmoid(ty)) * CELL_SIZE).reshape(-1)
    
    w = (np.exp(tw) * ANCHORS_W * CELL_SIZE).reshape(-1)
    h = (np.exp(th) * ANCHORS_H * CELL_SIZE).reshape(-1)
    
    box_confidence = sigmoid(tc).reshape(-1)
    
    classes_raw = raw_preds[:,:,:,5:5 + num_classes].reshape(GRID_SIZE**2 * BOXES_PER_CELL, -1)
    classes_confidence = softmax_2d(classes_raw, axis=1)
    
    box_class_idx = np.argmax(classes_confidence, axis=1)   
    box_class_confidence = classes_confidence.max(axis=1)
    combined_box_confidence = box_confidence * box_class_confidence
    
    decoded_boxes = np.stack([
        box_class_idx, 
        combined_box_confidence, 
        x, 
        y, 
        w, 
        h]).transpose()
    
    return sorted(list(decoded_boxes), key=lambda p: p[1], reverse=True)

首先,为了使计算更简单,我们通过将425个值与编码的框坐标和类置信度移动到最后一个维度来转置raw_preds数组。然后,将其形状从(1, 13, 13, 425)重塑为(1, 13*13, 5, 85)。这样,忽略第一个位置的批处理(始终等于0),尺寸顺序与cy13),cx13)和box5)上的先前循环匹配。

请注意,我们必须使用形状(1, 13*13, 5, 85),而不是更明确的形状(1, 13, 13, 5, 85),这是因为Core ML具有某些数组等级限制。这意味着某些操作会导致尺寸过大的数组出现异常。此外,考虑到隐藏的内部序列维,在Core ML中使用数组不是很直观。

NumPy数组上工作时,我们可以使用较长的形状(1, 13, 13, 5, 85),但是,为了使操作可以轻松转换为Core ML,我们必须将维数减少1,因此形状(1, 13*13, 5, 85)

现在,与前一个版本相比的主要变化是如何获取txtytwthtc值,以及classes_raw。与其在单个单元格中读取对应于单个框的单独值,不如在一个步骤中获得具有所有对应值的数组。它支持以下单步数组操作,这些操作使所有计算都非常高效,尤其是在针对数组计算优化的芯片(例如GPU或神经引擎)上执行时。

decoded_preds_vec = decode_preds_vec(preds)
annotate_image(image, decoded_preds_vec)

 

这是另一个例子。

下一步

现在,我们获得了与以前的基于循环的解决方案相同的结果。它使我们准备好将检测解码直接包括在Core ML模型中。最终,这将使我们能够使用Vision框架的对象检测功能,从而大大简化了iOS应用程序的Swift代码。

https://www.codeproject.com/Articles/5286801/Decoding-a-YOLO-Core-ML-Object-Detector-Using-Arra

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于YOLO的三维检测是一种在计算机视觉领域中广泛应用的技术,它结合了YOLO(You Only Look Once)物体检测算法和其他三维数据处理方法。 YOLO是一种基于深度学习的物体检测算法,它具有实时性和高性能的特点。然而,YOLO只能在二维图像上进行物体检测,无法直接应用于三维场景中。为了解决这个问题,基于YOLO的三维检测方法被提出。 在基于YOLO的三维检测中,首先需要获取三维场景数据。可以使用激光雷达(LiDAR)或深度摄像机等设备来获取包含三维信息的点云数据。接下来,将点云数据转换为适合YOLO算法的输入格式,例如将其转化为二维图像或多通道图像。 然后,使用已经训练好的YOLO模型对转换后的数据进行物体检测YOLO模型通过卷积神经网络(CNN)学习了大量的二维物体特征,可以在图像上识别物体并给出其位置、类别和置信度得分。 最后,通过对检测结果进行后处理和分析,可以将二维检测结果映射到三维场景中。常见的方法是通过点云数据的几何信息,例如点的xyz坐标,来进一步估计物体的三维位置、姿态和尺寸等信息。 基于YOLO的三维检测可以应用于自动驾驶、机器人导航、智能安防等领域。它能够实时准确地检测出场景中的物体,并提供更全面的三维信息,帮助系统做出更精确的决策。但同时也面临一些挑战,如如何处理大规模的点云数据、如何实现高性能和实时处理等问题,这些需要进一步的研究和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值