object_detector MAP:

本文详细解析了目标检测中平均精度(mAP)的概念及其计算方法,对比了VOC2010前后两种不同的mAP计算策略,帮助读者深入理解mAP在评估检测算法性能中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:目标检测中的mAP是什么含义? - Wentao MA的回答 - 知乎 https://www.zhihu.com/question/53405779/answer/419532990

对于上述PR值,如果我们采用:

  1. VOC2010之前的方法,我们选取Recall >= 0, 0.1, ..., 1的11处Percision的最大值:1, 1, 1, 0.5, 0.5, 0.5, 0.5, 0.5, 0, 0, 0。此时Aeroplane类别的 AP = 5.5 / 11 = 0.5
  2. VOC2010及以后的方法,对于Recall >= 0, 0.14, 0.29, 0.43, 0.57, 0.71, 1,我们选取此时Percision的最大值:1, 1, 1, 0.5, 0.5, 0.5, 0。此时Aeroplane类别的 AP = (0.14-0)*1 + (0.29-0.14)*1 + (0.43-0.29)*0.5 + (0.57-0.43)*0.5 + (0.71-0.57)*0.5 + (1-0.71)*0 = 0.5

mAP就是对每一个类别都计算出AP然后再计算AP平均值就好了~

from maix import camera, display, image, nn, app, comm, uart, pinmap, time import struct, os #定义全局变量 devices = [] # 设置UART1引脚映射 pinmap.set_pin_function("A18", "UART1_RX") # 设置UART1接收引脚 pinmap.set_pin_function("A19", "UART1_TX") # 设置UART1发送引脚 # 初始化串口通信 device = "/dev/ttyS1" # UART1设备路径 uart1 = uart.UART(device, 115200) # 配置UART1,波特率115200 report_on = True APP_CMD_DETECT_RES = 0x02 def encode_objs(objs): ''' encode objs info to bytes body for protocol 2B x(LE) + 2B y(LE) + 2B w(LE) + 2B h(LE) + 2B idx + 4B score(float) ... ''' body = b'' for obj in objs: body += struct.pack("<hhHHHf", obj.x, obj.y, obj.w, obj.h, obj.class_id, obj.score) return body def build_packet(packet_id): packet = bytearray(28) packet[0] = 0x40 packet[1] = packet_id packet[27] = 0x5D return packet model_path = "model_231544.mud" if not os.path.exists(model_path): model_path = "/root/视觉_01/model_231544.mud" detector = nn.YOLOv5(model=model_path) cam = camera.Camera(detector.input_width(), detector.input_height(), detector.input_format()) dis = display.Display() p = comm.CommProtocol(buff_size = 1024) # ... 前面的代码保持不变 ... # ... 前面的导入和初始化代码保持不变 ... while not app.need_exit(): img = cam.read() objs = detector.detect(img, conf_th=0.5, iou_th=0.45) # 添加标志位避免重复发送 signal_sent = False if len(objs) > 0 and report_on: body = encode_objs(objs) p.report(APP_CMD_DETECT_RES, body) for obj in objs: img.draw_rect(obj.x, obj.y, obj.w, obj.h, color=image.COLOR_RED) msg = f'{detector.labels[obj.class_id]}: {obj.score:.2f}' img.draw_string(obj.x, obj.y, msg, color=image.COLOR_RED) object_name = detector.labels[obj.class_id] object_score = obj.score print(object_name, object_score) # 仅当分数足够高且未发送信号时才处理 if object_score > 0.85 and not signal_sent: signal_value = None # 修正条件判断:使用in运算符检查列表 if object_name in ["tudou"]: signal_value = 49 elif object_name in ["bailuobo"]: signal_value = 50 elif object_name in ["huluobo"]: signal_value = 51 elif object_name in ["zhibei"]: signal_value = 52 elif object_name in ["shitou"]: signal_value = 53 elif object_name in ["cipian"]: signal_value = 54 elif object_name in ["wuhaodianchi"]: signal_value = 55 elif object_name in ["1haodianchi"]: signal_value = 56 elif object_name in ["erhaodianchi"]: signal_value = 57 elif object_name in ["qihaodianchi"]: signal_value = 62 elif object_name in ["xiaotudou"]: signal_value = 63 elif object_name in ["suliaoping"]: signal_value = 64 elif object_name in ["yaobaozhuang"]: signal_value = 65 elif object_name in ["yaowan"]: signal_value = 66 elif object_name in ["zhituan"]: signal_value = 67 elif object_name in ["zhuankuai"]: signal_value = 68 if signal_value is not None: # 构建结构化数据包 packet = bytearray(28) packet[0] = 0x40 # 包头 packet[1] = signal_value # 信号值(0-3) #packet[2] = obj.class_id # 类别ID packet[27] = 0x5D # 包尾 #bytes(packet) uart1.write(bytes(packet)) print(f"检测到 {object_name}, 发送信号: {signal_value}, 数据包: {packet.hex()}") signal_sent = True # 标记已发送 time.sleep(0.1) # 减少延时 dis.show(img) 这个程序中土豆块输出为@1],将62-68改为输出14-20
最新发布
08-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值