Canmv K210开发板案例——物体检测

学习目标:

  • 在Canmv IDE环境下使用K210学习物体检测功能,将摄像头采集的画面进行分析出来,若画面符合模型中的物体类型则框出并显示物体类型名称

  • 使用人脸检测模型以及yolo2网络算法,通过通用神经网络处理器KPU来进行目标检测


学习内容:

1、导入相关库,并初始化摄像头和LCD显示屏

import sensor, image, time, lcd
from maix import KPU


lcd.init()  # 初始化LCD显示屏
sensor.reset()  # 复位并初始化摄像头
sensor.set_pixformat(sensor.RGB565)  # 设置摄像头输出格式为 RGB565
sensor.set_framesize(sensor.QVGA) # 设置摄像头输出大小为 QVGA (320x240)
sensor.skip_frames(time = 1000) # 等待摄像头稳定
clock = time.clock() # 创建一个clock对象,用来计算帧率

2、新建物体类型名称变量obj_name,初始化KPU相关的参数,加载物体检测模型以及使用yolo2网络算法,kpu需要加载kmodel文件

#物体名称“飞机”、“自行车”、“鸟”、“船”等
obj_name = ("aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor")

od_img = image.Image(size=(320,256)) #检测模型需要320*256图输入,这里初始化一个image
# 物体检测锚点;锚点参数与模型参数一致,同一个模型这个参数是固定的(即训练模型时确定了)
anchor = (1.3221, 1.73145, 3.19275, 4.00944, 5.05587, 8.09892, 9.47112, 4.84053, 11.2364, 10.0071)
kpu = KPU()#创建一个KPU类,用于物体检测

print("ready load model")
# 从文件系统中加载物体检测模型(也可以flash地址加载方式),如 "/sd/xxx.kmodel"{(flash_offset, size)(偏移大小,模型大小)}
kpu.load_kmodel("/sd/KPU/voc20_object_detect/voc20_detect.kmodel")
# 为yolo2网络模型传入初始化参数, 只有使用yolo2时使用;锚点参数,anchor的锚点数,输入图像的宽,输入图像的高,模型需要的图的宽,模型需要的图的高,模型层宽,模型层高,概率阈值,box_iou门限,要分辨的目标类数量
kpu.init_yolo2(anchor, anchor_num=5, img_w=320, img_h=240, net_w=320 , net_h=256 ,layer_w=10 ,layer_h=8, threshold=0.7, nms_value=0.2, classes=20)

3、使用while循环将图像传入KPU循环进行计算,使用yolo2神经网络算法解算,终得到相似度最高的类型名称,框出物体并显示物体名称

while True:
    clock.tick() # 更新计算帧率的clock
    img = sensor.snapshot() # 拍照,获取一张图像
    od_img.draw_image(img, 0,0) # 将img图像写到od_img图像的坐标(0,0)位置处
    od_img.pix_to_ai() # 对rgb565的image生成ai运算需要的r8g8b8格式存储
    kpu.run_with_output(od_img)         # 对输入图像进行kpu运算
    dect = kpu.regionlayer_yolo2() # yolo2后处理
    fps = clock.fps() # 获取帧率
    if len(dect) > 0:
        print("dect:",dect)
        for l in dect :
            img.draw_rectangle(l[0],l[1],l[2],l[3], color=(0, 255, 0))  # 在图像上绘制一个矩形
            img.draw_string(l[0],l[1], obj_name[l[4]], color=(0, 255, 0), scale=1.5) #  绘制标签类别

    img.draw_string(0, 0, "%2.1ffps" %(fps), color=(0, 60, 128), scale=2.0) # 显示屏显示FPS
    lcd.display(img)

# 创建的kpu对象去初始化,释放模型内存
kpu.deinit()

实验分析:

Performing Object Detection:

在这里插入图片描述


Serial Terminal Printing:

在这里插入图片描述

等待摄像头稳定,在画面中检测到物体时,就会画矩形框住识别到的物体,并在串行终端打印出检测到的数据包括:物体目标框的左上角x,y坐标目标框的宽w高h类别序号概率值([0, 1])


实验过程与总结:

实验过程:

  • 在Canmv IDE中,通过导入必要的库,初始化了摄像头和LCD显示屏,为实时图像采集和展示结果做准备。定义了包含多个物体名称的元组obj_name,加载了预训练的物体检测模型至KPU,并设置了参数。利用while循环,实时获取图像并使用yolo2算法检测物体,解析输出确定物体类型,并在LCD上绘制边界框和显示名称。实验结果证明了系统在实时物体检测和识别方面的有效性。

总结:

  • 本次实验在Canmv IDE环境下利用K210芯片成功实现了物体检测。通过环境搭建、设备初始化、模型加载、图像采集、检测处理到结果展示,我们采用yolo2算法并用KPU加速神经网络运算,实现了多物体的实时检测与识别。
  • 结果验证了系统的有效性,但也突显了提升复杂场景鲁棒性的需求。未来将致力于模型优化、算法泛化及数据处理效率提升。此处检测人脸的阈值:threshold=0.7,如果需要检测人脸更加准确,可以适当调整阈值

完整代码展示:

# Yolo_face_detect - By: Jack - 周日 4月 21 2024

import sensor, image, time, lcd
from maix import KPU #导入Maix类的KPU模块


lcd.init()  # 初始化LCD显示屏
sensor.reset()  # 复位并初始化摄像头
sensor.set_pixformat(sensor.RGB565)  # 设置摄像头输出格式为 RGB565
sensor.set_framesize(sensor.QVGA) # 设置摄像头输出大小为 QVGA (320x240)
sensor.skip_frames(time = 1000) # 等待摄像头稳定
clock = time.clock() # 创建一个clock对象,用来计算帧率

od_img = image.Image(size=(320,256)) # 设置图像尺寸 人脸检测模型需要320*256图输入

# 人脸检测锚点;锚点参数与模型参数一致,同一个模型这个参数是固定的(即训练模型时确定了)
anchor = (0.893, 1.463, 0.245, 0.389, 1.55, 2.58, 0.375, 0.594, 3.099, 5.038, 0.057, 0.090, 0.567, 0.904, 0.101, 0.160, 0.159, 0.255)
kpu = KPU() #创建一个KPU类,用于人脸检测

# 从文件系统中加载人脸检测模型(也可以flash地址加载方式),如 "/sd/xxx.kmodel"{(flash_offset, size)(偏移大小,模型大小)}
kpu.load_kmodel("/sd/KPU/yolo_face_detect/yolo_face_detect.kmodel")
# 为yolo2网络模型传入初始化参数, 只有使用yolo2时使用;锚点参数,anchor的锚点数,输入图像的宽,输入图像的高,模型需要的图的宽,模型需要的图的高,模型层宽,模型层高,概率阈值,box_iou门限,要分辨的目标类数量
kpu.init_yolo2(anchor, anchor_num=9, img_w=320, img_h=240, net_w=320, net_h=256, layer_w=10, layer_h=8, threshold=0.7, nms_value=0.3, classes=1)

while True:
    clock.tick() # 更新计算帧率的clock
    img = sensor.snapshot() # 拍照,获取一张图像
    a = od_img.draw_image(img, 0,0) # 将img图像写到od_img图像的坐标(0,0)位置处
    od_img.pix_to_ai()  # 对rgb565的image生成ai运算需要的r8g8b8格式存储
    kpu.run_with_output(od_img) # 对输入图像进行kpu运算
    dect = kpu.regionlayer_yolo2() # yolo2后处理
    fps = clock.fps()  # 获取帧率
    if len(dect) > 0:
        print("dect:",dect)
        for l in dect :
            # 在图像上绘制一个矩形。 传递l[0],l[1],l[2],l[3]
            a = img.draw_rectangle(l[0],l[1],l[2],l[3], color=(0, 255, 0))
    a = img.draw_string(0, 0, "%2.1ffps" %(fps), color=(0, 60, 128), scale=2.0) # 显示屏显示FP
    lcd.display(img)

# 创建的kpu对象去初始化,释放模型内存
kpu.deinit()

### LlamaIndex 多模态 RAG 实现 LlamaIndex 支持多种数据类型的接入与处理,这使得它成为构建多模态检索增强生成(RAG)系统的理想选择[^1]。为了实现这一目标,LlamaIndex 结合了不同种类的数据连接器、索引机制以及强大的查询引擎。 #### 数据连接器支持多样化输入源 对于多模态数据的支持始于数据收集阶段。LlamaIndex 的数据连接器可以从多个异构资源中提取信息,包括但不限于APIs、PDF文档、SQL数据库等。这意味着无论是文本还是多媒体文件中的内容都可以被纳入到后续的分析流程之中。 #### 统一化的中间表示形式 一旦获取到了原始资料之后,下一步就是创建统一而高效的内部表达方式——即所谓的“中间表示”。这种转换不仅简化了下游任务的操作难度,同时也提高了整个系统的性能表现。尤其当面对复杂场景下的混合型数据集时,良好的设计尤为关键。 #### 查询引擎助力跨媒体理解能力 借助于内置的强大搜索引擎组件,用户可以通过自然语言提问的形式轻松获得所需答案;而对于更复杂的交互需求,则提供了专门定制版聊天机器人服务作为补充选项之一。更重要的是,在这里实现了真正的语义级关联匹配逻辑,从而让计算机具备了一定程度上的‘认知’功能去理解和回应人类意图背后所蕴含的意义所在。 #### 应用实例展示 考虑到实际应用场景的需求多样性,下面给出一段Python代码示例来说明如何利用LlamaIndex搭建一个多模态RAG系统: ```python from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader, LLMPredictor, PromptHelper, ServiceContext from langchain.llms.base import BaseLLM import os def create_multi_modal_rag_system(): documents = SimpleDirectoryReader(input_dir='./data').load_data() llm_predictor = LLMPredictor(llm=BaseLLM()) # 假设已经定义好了具体的大型预训练模型 service_context = ServiceContext.from_defaults( chunk_size_limit=None, prompt_helper=PromptHelper(max_input_size=-1), llm_predictor=llm_predictor ) index = GPTSimpleVectorIndex(documents, service_context=service_context) query_engine = index.as_query_engine(similarity_top_k=2) response = query_engine.query("请描述一下图片里的人物表情特征") print(response) ``` 此段脚本展示了从加载本地目录下各类格式文件开始直到最终完成一次基于相似度排序后的top-k条目返回全过程。值得注意的是,“query”方法接收字符串参数代表使用者想要询问的内容,而在后台则会自动调用相应的解析模块并结合先前准备好的知识库来进行推理计算得出结论。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值