手撕 实现iou,nms等 / 图像面经

1. 手撕

自己写的,大致思路的实现

1.nms

import numpy

def bbox_iou(box1, box2):
    """
    box1: [N,4] [x1,y1, x2,y2]
    box2: [M,4]
    """
    a1 = max(box1[0], box2[0])
    b1 = max(box1[1], box2[1])
    a2 = min(box1[2], box2[2])
    b2 = min(box1[3], box2[3])
    inter_aera = (a2-a1)*(b2-b1)
    out_aera = (box1[2]-box1[0])*(box1[3]-box1[1]) + (box2[2]-box2[0])*(box2[3]-box2[1]) - inter_aera
    return inter_aera / out_aera

def nms(bboxes, threshold=0.5):
    """
    bboxes: [N,4] [x1,x2,y1,y2,  confidence]
    """
    sorted(bboxes, key=lambda x:-x[-1])         #按confidence降序
    # 求iou, >0.5则删除

    for i in range(1, len(bboxes)):
        iou = bbox_iou(bboxes[i][:-1], bboxes[0][:-1])      # 计算iou
        if iou>threshold:
            bboxes = np.delete(bboxes, i, axis=0)           # 删除
    
    return bboxes

2. 移动均值滤波

def moving_average(transforms_raw_data, windowsize):
    transforms_smooth = np.copy(transforms_raw_data)
    window = np.ones(int(windowsize)) / float(windowsize)
    for i in range(3):
        transforms_smooth[:, i] = np.convolve(transforms_raw_data[:, i], window, 'same')
    return transforms_smooth[int(windowsize/2)-1]

3. 快速排序

"""
快速排序_2023.11.06

"""



def fastsort2(arr):
    def order(arr, left, right):
        temp = arr[left]
        cur_left = left
        cur_right = right

        while cur_left < cur_right:
            while cur_left < cur_right and arr[cur_right]>=temp:
                cur_right -= 1
            arr[cur_left] = arr[cur_right]
            while cur_left < cur_right and arr[cur_left]<=temp:
                cur_left += 1
            arr[cur_right] = arr[cur_left]
        
        # 找到位置
        arr[cur_left] = temp
        if left<cur_left-1:
            order(arr, left, cur_left-1)
        if cur_left+1 < right:
            order(arr, cur_left+1, right)


    order(arr, left=0, right=len(arr)-1)



def fastsort(input_arr):
    def order(arr, left, right):        # 递归
        temp = arr[left]
        cur_left = left
        cur_right = right


        while cur_left<cur_right:
            while cur_left<cur_right and arr[cur_right]>=temp:
                cur_right -= 1
            if cur_left<cur_right:
                arr[cur_left] = arr[cur_right]
                cur_left += 1

            while cur_left<cur_right and arr[cur_left]<=temp:
                cur_left += 1
            if cur_left<cur_right:
                arr[cur_right] = arr[cur_left]
                cur_right -= 1
            
        # 相遇  
        arr[cur_left] = temp
        # print(arr)

        if cur_left-1 > left:
            order(arr, left, cur_left-1)
        if cur_left+1 < right:
            order(arr, cur_left+1, right)


    order(input_arr, left=0, right=len(input_arr)-1)


if __name__ =="__main__":
    a = [49, 38, 65, 97, 76, 13, 27, 49]
    # a = [49, 38, 65, 97]
    fastsort(a)
    print("最终结果:", a)

2. 面经

1. 角点检测,LK光流跟踪

2. 图像去噪(均值,高斯,双边,BM3D)

3. 图像边缘增强(sobel以及canny算子相比有啥优点)

4. 灰度直方图

5. 相机模型(内外参),双目相机标定(基础矩阵)

6. 颜色空间(HSV, YUV)

7. 损失函数(L2, IOU, 交叉熵,focal loss,稳像EPE)

8. 优化函数(SGD,Adam)

9.卡尔曼滤波

10. SIFT算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值