2024-6-14 10:56:10 [显示全部楼层]
842浏览
查看: 842|回复: 0

[M10项目] 基于行空板的nanodet物体分类项目

[复制链接]
一、实践目标
本项目在行空板上外接USB摄像头,通过摄像头来识别物体,找到画面中的物体将其框出并识别。

二、知识目标
1、学习使用ncnn框架和Nanodet模型实现实时物体检测。

三、实践准备
硬件清单:

基于行空板的nanodet物体分类项目图1


软件使用:
Mind+编程软件x1

四、实践过程
1、硬件搭建
1、将摄像头接入行空板的USB接口。

基于行空板的nanodet物体分类项目图2

2、通过USB连接线将行空板连接到计算机。

基于行空板的nanodet物体分类项目图3

2、软件编写
第一步:打开Mind+,远程连接行空板

基于行空板的nanodet物体分类项目图4

第二步:在“行空板的文件”中新建一个名为AI的文件夹,在其中再新建一个名为“基于行空板的nanodet物体分类项目”的文件夹,导入本节课的依赖文件。

基于行空板的nanodet物体分类项目图5


第三步:编写程序
在上述文件的同级目录下新建一个项目文件,并命名为“main.py”。
示例程序:
  1. import os
  2. # 设置NCNN的环境变量
  3. os.environ["NCNN_HOME"] = os.getcwd()
  4. import sys
  5. import cv2
  6. import time
  7. import numpy as np
  8. import ncnn
  9. # 导入ncnn的模型库
  10. from ncnn.model_zoo import get_model
  11. # 导入工具函数
  12. from utils import draw_detection_objects
  13. # 打开默认的摄像头设备
  14. cap = cv2.VideoCapture(0)
  15. # 设置摄像头的分辨率为320x240
  16. cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
  17. cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
  18. # 设置摄像头的缓冲区大小为1,这样可以减少延迟
  19. cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
  20. # 创建一个名为'image'的全屏窗口
  21. cv2.namedWindow('image',cv2.WND_PROP_FULLSCREEN)    #Set the windows to be full screen.
  22. cv2.setWindowProperty('image', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)    #Set the windows to be full screen.
  23. # 从模型库中获取NanoDet模型,设置了目标大小、阈值、线程数等参数
  24. net = get_model(
  25.     "nanodet",
  26.     target_size=320,
  27.     prob_threshold=0.4,
  28.     nms_threshold=0.5,
  29.     num_threads=4,
  30.     use_gpu=False,
  31. )
  32. # 主循环
  33. while cap.isOpened():
  34.     # 从摄像头中读取一帧
  35.     success, image = cap.read()
  36.     # 如果读取失败,则忽略这一帧
  37.     if not success:
  38.         print("Ignoring empty camera frame.")
  39.         # If loading a video, use 'break' instead of 'continue'.
  40.         continue
  41.     # 使用NanoDet模型对图像进行目标检测,得到检测到的目标列表
  42.     objects = net(image)
  43.     # 在图像上标记出检测到的目标
  44.     image = draw_detection_objects(image, net.class_names, objects)
  45.     # 将图像逆时针旋转90度
  46.     image = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE)
  47.     # 显示图像
  48.     cv2.imshow('image', image)
  49.     # 如果按下了'ESC'键,则退出循环
  50.     if cv2.waitKey(5) & 0xFF == 27:
  51.         break
  52. # 释放摄像头设备
  53. cap.release()
复制代码

3、运行调试
第一步:运行“1-Install_dependency.py”程序文件,等待自动安装依赖包。
第二步:运行主程序
运行“main.py”程序,可以看到初始时屏幕上显示着摄像头拍摄到的实时画面,将摄像头画面对准苹果、鼠标、手机等不同的物体,可以看到其被一一识别出。

基于行空板的nanodet物体分类项目图6

Tips:程序运行过程中,可能需要联网自动更新下载模型。

4、程序解析
在上述的“main.py”文件中,我们主要通过opencv库来调用摄像头,获取实时视频流,然后使用ncnn库的NanoDet模型对图像进行目标检测,并在图像上标记出检测到的目标。整体流程如下,
①初始化:程序启动时,会打开默认的摄像头设备,并设置摄像头的分辨率和缓冲区大小。然后,程序会创建一个名为'image'的全屏窗口,用于显示图像。接着,程序会从模型库中获取NanoDet模型,并设置模型的相关参数。
②主循环:程序进入一个无限循环,在每次循环中,程序会执行以下操作:
- 从摄像头中读取一帧。如果读取失败,则会忽略这一帧,继续下一次循环。
- 使用NanoDet模型对读取到的帧进行目标检测,得到检测到的目标列表。
- 在读取到的帧上标记出检测到的目标。标记方式是在每个目标的外接矩形区域内,画出该目标的类别名称和置信度。
·将标记后的帧逆时针旋转90度,然后在窗口中显示出来。
③用户交互:程序会检查用户的键盘输入,如果按下了'ESC'键,那么程序会退出主循环。
④结束:当主循环结束时,程序会释放摄像头设备,然后退出。

五、知识园地
1. 了解ncnn库的NanoDet模型
ncnn是一个为移动端优化的高效神经网络前向计算框架,由腾讯的开源项目NCNN提供。ncnn可以运行在Android、iOS等移动设备上,支持多种神经网络模型,包括NanoDet。
NanoDet是一个高效的、轻量级的目标检测模型。它的设计目标是在保持较高的准确率的同时,尽量减小模型的大小和计算量,从而能够在资源受限的设备(如移动设备和嵌入式设备)上实现实时的目标检测。
NanoDet的主要特点包括:
1. 轻量级:NanoDet的模型大小非常小,只有约1MB,这使得它可以在资源受限的设备上运行。
2. 高效:NanoDet的计算量非常小,只有约1.5BFLOPs,这使得它可以在移动设备上实时运行。
3. 高精度:尽管NanoDet的模型大小和计算量都非常小,但它的检测精度仍然非常高,可以达到与一些更大、更复杂的模型相媲美的性能。
NanoDet使用了一些先进的神经网络设计技术,如深度可分离卷积、注意力模块等,来实现高效和高精度的目标检测。它的网络结构主要包括一个特征提取网络和一个目标检测头,特征提取网络用于从输入图像中提取特征,目标检测头用于根据提取的特征进行目标检测。


Project.zip

3.91 MB, 下载次数: 684

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail