使用香橙派AIpro做目标检测

news2024/11/20 9:16:42

使用香橙派AIpro做目标检测

文章目录

    • 使用香橙派AIpro做目标检测
      • 香橙派AIpro开发板介绍
      • 香橙派AIpro应用体验
        • 识别图像
        • 识别视频
        • 摄像头
      • 香橙派AIpro AI应用场景
      • 总结

香橙派AIpro开发板介绍

OrangePi AIpro(8-12T)是一款集成昇腾AI技术的开发板,搭载4核64位CPU和AI处理器,配备图形GPU,提供8-12TOPS的AI计算能力。它支持8GB或16GB LPDDR4X内存,并可扩展至不同容量的eMMC模块。该开发板具备双4K视频输出能力。

​ 接口方面,OrangePi AIpro提供了丰富的选项,包括双HDMI、GPIO、Type-C电源、M.2插槽(兼容SATA/NVMe SSD)、TF卡槽、千兆以太网、USB3.0、USB Type-C、Micro USB(串口功能)、MIPI摄像头和显示屏接口,以及电池接口预留。

该开发板适用于AI计算、深度学习、视频分析、自然语言处理、智能机器人、无人机、云计算、AR/VR、智能安防和家居等多个AIoT领域。支持Ubuntu和openEuler操作系统,适合AI算法原型和应用开发。


我们再来看看开发板的样貌

image-20240702233840611

关于更多香橙派AIpro的信息,阔以到官网一探究竟

香橙派AIpro官网

香橙派AIpro应用体验

OK,我们现在开始体验


准备工作

  • 开发板和数据线(这个购买时会有)
  • HDMI转接口和显示幕(如果要可视化界面的话)
  • 网线(可以通过共享网络的方式)

我们看下我收到的开发板长什么样子吧

d090dee28041f1ae031e339ee04cd583_720

1、插上电源后,我们的屏幕上就会出现登录界面

2、我们输入账户和密码(账户会给你默认写好)

注意📢

默认账户名:HwHiAiUser

默认密码:Mind@123

输入后我们就可以进入桌面

3、我们可以点击右上角连接WiFi

4、然后我们就可以开始体验了


香橙派AIpro支持多种编程语言和软件开发环境,比如Python、 Jupyter、C等,这使得开发者可以根据自己的需求选择适合的操作系统和开发工具~

我这里体验了下香橙派AIpro的AI支持功能


识别图像

我们采用YOLOv5s目标检测算法来实现识别正在的跑操人

我们按照以下几个步骤来处理

  • 加载模型
  • 处理输入图像
  • 执行检测
  • 绘制检测结果和显示或保存结果

这里我给出参考代码,大家可以根据自己的需求做修改

def load_model(weights_path, device_id):
    """加载模型并返回模型对象"""
    device = select_device(device_id)
    model = attempt_load(weights_path, map_location=device)
    return model

def process_image(img, model, names, img_size, stride):
    """处理图像,进行目标检测,并返回标记后的图像"""
    img = torch.from_numpy(img).to(device).float() / 255.0
    img = img.unsqueeze(0)  # 增加批次维度
    pred = model(img)[0]
    pred = non_max_suppression(pred, 0.4, 0.5, classes=None, agnostic=False)
    annotated_img = img.copy()  # 复制原始图像以进行标注
    for *xyxy, conf, cls in reversed(pred):  # 遍历检测结果
        label = f'{names[int(cls)]} {conf:.2f}'
        plot_one_box(xyxy, annotated_img, label=label, color=(255, 0, 0), line_thickness=3)
    return annotated_img

def plot_one_box(xyxy, img, label, color, line_thickness):
    """在图像上绘制检测框和标签"""
    x1, y1, x2, y2 = xyxy
    cv2.rectangle(img, (x1, y1), (x2, y2), color, line_thickness)
    cv2.putText(img, label, (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, line_thickness)

def main(weights_path, source_path, device_id='cpu'):
    """主函数,用于加载模型、处理视频或图像流,并显示结果"""
    model = load_model(weights_path, device_id)
    stride = int(model.stride.max())
    imgsz = check_img_size(640, s=stride)
    names = model.module.names if hasattr(model, 'module') else model.names
    dataset = LoadStreams(source_path, img_size=imgsz, stride=stride)

    for path, img, im0s, vid_cap in dataset:
        try:
            annotated_img = process_image(img, model, names, imgsz, stride)
            cv2.imshow('Object Detection', annotated_img)
            cv2.waitKey(1)  # 1ms延迟
        except Exception as e:
            print(f"Error processing frame {path}: {e}")

    cv2.destroyAllWindows()

if __name__ == '__main__':
    # 替换为你的模型权重文件路径和视频或图像文件路径
    weights_path = 'path_to_your_yolov5s_weights.pt'
    source_path = 'path_to_your_video_or_image'
    main(weights_path, source_path)

我这里先放一张原图

image-20240703232707917

稍等片刻,运行结果就出来了

image-20240703233127011

我们会发现其实框选住的人并不多

导致的原因可能是

  • 置信度阈值设置得太高
  • 模型训练数据不足
  • 非极大值抑制
  • 等等

有这个问题的可以参考下面的代码片段尝试解决

# 原始的non_max_suppression调用
pred = non_max_suppression(pred, conf_thres=0.5, iou_thres=0.4, classes=None, agnostic=False)

# 调整置信度阈值和NMS阈值
conf_thres = 0.3  # 降低置信度阈值
iou_thres = 0.3   # 降低NMS阈值
pred = non_max_suppression(pred, conf_thres=conf_thres, iou_thres=iou_thres, classes=None, agnostic=False)

经过微调后,效果就明显了很多

image-20240703233741945

识别视频

使用YOLOv5s算法识别视频中正在打篮球的人

我们按照下面的步骤来处理

  • 加载YOLOv5s模型
  • 读取视频流
  • 处理视频帧
  • 绘制检测框
  • 显示或保存结果

这里我给出参考代码,大家可以根据自己的需求做修改


# 函数定义
def detect(frame, model, names, img_size, device):
    # 模型输入处理
    img = torch.from_numpy(cv2.resize(frame, (img_size, img_size))).to(device).float()  # 调整大小并转换为模型需要的格式
    img /= 255.0  # 归一化
    img = img.unsqueeze(0)  # 增加批次维度

    # 模型推理
    pred = model(img)[0]
    pred = non_max_suppression(pred, 0.4, 0.5)  # 应用NMS

    # 绘制检测框
    for det in pred:
        det[:, :4] = scale_coords(img.shape[2:], det[:, :4], frame.shape).round()  # 将坐标映射回原图
        for *xyxy, conf, cls in reversed(det):
            label = f"{names[int(cls)]} {conf:.2f}"
            cv2.rectangle(frame, (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])), (255, 0, 0), 2)
            cv2.putText(frame, label, (int(xyxy[0]), int(xyxy[1])), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

# 主函数
def main(weights, source, img_size=640, conf_thres=0.4, iou_thres=0.5):
    # 加载模型
    device = select_device('')
    model = attempt_load(weights, map_location=device)  # 加载模型
    names = model.module.names if hasattr(model, 'module') else model.names  # 获取类别名称

    # 检查图像大小
    img_size = check_img_size(img_size, s=model.stride.max())  # 确保图像大小符合模型要求

    # 读取视频
    cap = LoadStreams(source, img_size=img_size)

    # 处理视频帧
    while cap.isOpened():
        frame = cap.read()
        if frame is None:
            break

        detect(frame, model, names, img_size, device)

        # 显示结果
        cv2.imshow('YOLOv5s Detection', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):  # 按'q'退出
            break

    cap.release()
    cv2.destroyAllWindows()

# 入口点
if __name__ == '__main__':
    # 替换为你的模型权重文件路径和视频源
    weights = 'yolov5s.pt'
    source = 0 
    main(weights, source)

程序会处理单帧图像,进行目标检测然后绘制检测框,返回标注后的图像

image-20240704001401592

image-20240704001408593

摄像头

还可以通过摄像头录入的画面进行实时处理,由于我这里暂时没有摄像头,就没有进行演示了,我这里可以给出代码参考参考

def detect_frame(frame, model, img_size, device, names):
    # 调整图像大小并转换为模型需要的格式
    frame = cv2.resize(frame, (img_size, img_size))
    img = torch.from_numpy(frame).to(device).float()  # 转换为模型需要的格式
    img /= 255.0  # 归一化
    img = img.unsqueeze(0)  # 增加批次维度
    # 模型推理
    with torch.no_grad():
        pred = model(img)[0]
        pred = non_max_suppression(pred, 0.4, 0.5)  # 应用NMS
    # 绘制检测框
    for det in pred:
        x1, y1, x2, y2, conf, cls = det.cpu()
        label = f"{names[int(cls)]} {conf:.2f}"
        plot_one_box(frame, x1, y1, x2, y2, label, color=(255, 0, 0), line_thickness=2)
def plot_one_box(frame, x1, y1, x2, y2, label, color, line_thickness):
    """在图像上绘制检测框和标签"""
    cv2.rectangle(frame, (x1, y1), (x2, y2), color, line_thickness)
    cv2.putText(frame, label, (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, line_thickness)
def main(weights, img_size=640, source=0):
    # 加载模型
    device = select_device('')
    model = attempt_load(weights, map_location=device).eval()
    names = model.module.names if hasattr(model, 'module') else model.names
    # 检查图像大小
    img_size = check_img_size(img_size)

    # 读取视频流
    cap = cv2.VideoCapture(source)

    while True:
        ret, frame = cap.read()
        if not ret:
            break
        detect_frame(frame, model, img_size, device, names)
        # 显示结果
        cv2.imshow('YOLOv5s Detection', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):  # 按'q'退出
            break
    cap.release()
    cv2.destroyAllWindows()
if __name__ == '__main__':
    weights = 'yolov5s.pt'
    main(weights)

香橙派AIpro AI应用场景

香橙派AIpro开发板因其集成的华为Ascend系列AI处理器和强大的计算能力,适用于多种AI应用场景

目标检测:使用如YOLOv5s这样的轻量级网络模型,可以在边缘设备上进行实时目标检测,适用于智能监控、工业自动化等领域

图像分类:AIpro可以部署图像分类模型,用于场景识别、物体识别等任务,这在内容审核、社交媒体分析等方面有广泛应用

视频图像分析:在视频流分析中,AIpro可以进行实时视频处理,用于人流统计、行为识别等,适用于零售分析、公共安全等场景

深度学习模型推理:AIpro支持深度学习模型的快速推理,适用于需要快速响应的AI应用,如自动驾驶辅助系统、机器人视觉等

总结

​ 能够较快运行处结果得益于香橙派AIpro集成的软件环境,其中包括Python编程语言、Jupyter Notebook等交互式开发工具,以及功能强大的OpenCV图像处理库,这些工具的集成为深度学习模型的构建和实施提供了坚实的基础。同时,香橙派AIpro配备了高性能的处理器,这确保了其在处理复杂算法和处理大量数据时的优越计算能力,进而显著提高了目标检测任务的执行效率

​ 特别值得一提的是,香橙派AIpro拥有详尽的国产中文文档支持,大大降低了学习和使用的门槛,使得国内开发者能够更加顺畅地进行项目开发。而且,系统的图形化界面设计美观,提升了用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1896110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows安装Visual Studio Code(VS Code) (配图超详细!)

一、下载 官方网站:https://code.visualstudio.com/download 二、安装 1、安装之前先在目的安装路径中新建文件夹存放待会要安装的程序(因为在安装过程中选择安装路径时无法现场新建文件夹)。 2、在下载目录中找到安装包并双击运行&#xf…

Java经典面试题将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成

Java经典面试题将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成 题目: 将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成 举个例子:输入[“eat”,“tea”,“tan”,“ate”,“nat”,“bat”] 输出…

实现各平台确定性的物理碰撞

1.使用FixedUpdate而不是Update 1.物理运算,比如刚体运动系统的运算是通过固定的时间来驱动的。 2.再moba帧同步游戏中,15帧的固定调用差不多是网络那边的极限了,采用其他手段如平滑显示来提高画面的平滑度。 FixedUpdate是以一个固定的帧率…

2009-2024年第一季度上市公司华证ESG评级季度数据

2009-2024年第一季度上市公司华证ESG评级季度数据 1、时间:2009-2024年第一季度 2、指标:证券代码、证券简称、评级日期、综合评级、综合得分、E评级、E得分、S评级、S得分、G评级、G得分、证监会行业(新)、同花顺行业&#xff…

步进电机(STM32+28BYJ-48)

一、简介 步进电动机(stepping motor)把电脉冲信号变换成角位移以控制转子转动的执行机构。在自动控制装置中作为执行器。每输入一个脉冲信号,步进电动机前进一步,故又称脉冲电动机。步进电动机多用于数字式计算机的外部设备&…

二分法查找有序表的通用算法(可查链表,数组,字符串...等等)

find_binary函数 注意事项: (1)你设计的迭代器模板中必须有using value_type T,且有加减运算功能,其本上能与C标准库std中一样。 (2)集合必须是有序的。 下面是函数代码: /// &…

flask的进阶使用方法

【 一 】一对多关系 # 1 一对一 [本质就是一对多--》多的那个唯一] # 2 一对多 # 3 多对多1.1 关系 #### 一对多关系 class Hobby(Base):__tablename__ hobbyid Column(Integer, primary_keyTrue)caption Column(String(50), default篮球)def __str__(self):return sel…

C++ | Leetcode C++题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; class Solution { public:int robRange(vector<int>& nums, int start, int end) {int first nums[start], second max(nums[start], nums[start 1]);for (int i start 2; i < end; i) {int temp second;second max(fi…

django学习入门系列之第四点《案例 博客案例》

文章目录 container面板案例 博客案例往期回顾 container 堆叠到两边 <div class"container-fluid clearfix"><div class"col-sm-9">1</div><div class"col-sm-3">2</div> </div>放在中间 <div clas…

嵌入式Linux系统编程 — 6.7 实时信号

目录 1 什么是实时信号 2 sigqueue函数 3 sigpending()函数 1 什么是实时信号 等待信号集只是一个掩码&#xff0c;它并不追踪信号的发生次数。这意味着&#xff0c;如果相同的信号在被阻塞的状态下多次产生&#xff0c;它只会在信号集中被记录一次&#xff0c;并且在信号集…

【Python实战因果推断】20_线性回归的不合理效果10

目录 Neutral Controls Noise Inducing Control Feature Selection: A Bias-Variance Trade-Off Neutral Controls 现在&#xff0c;您可能已经对回归如何调整混杂变量有了一定的了解。如果您想知道干预 T 对 Y 的影响&#xff0c;同时调整混杂变量 X&#xff0c;您所要做的…

项目基础知识

1.JDBC编程和MySQL数据库 数据库的连接&#xff08;以前写qq项目时的代码&#xff09; package com.wu.Util; import java.sql.*; public class JDBCUtil {private static JDBCUtil jdbcUtil null;private JDBCUtil() {}public static JDBCUtil getJdbcUtil() {if (jdbcUtil…

RUP开发模型-系统架构师(二十三)

1、RUP是一个二维软件开发模型&#xff0c;其核心特点之一是&#xff08;&#xff09;。RUP将软件开发周期划分多个循环&#xff0c;每个循环由4个连续阶段组成&#xff0c;每个阶段完成确定的任务。设计及确定系统的体系结构&#xff0c;制定工作计划及资源要求在&#xff08;…

Edge浏览器油猴插件的安装与使用

油猴 (又称篡改猴或Tampermonkey) 是最流行的浏览器扩展之一。它允许用户自定义并增强网页的功能。用户脚本是小型 JavaScript 程序&#xff0c;可用于向网页添加新功能或修改现有功能。使用油猴&#xff0c;您可以轻松在任何网站上创建、管理和运行这些用户脚本。 1.插件的安…

标量场与向量场

标量场与向量场 flyfish 场 是一个函数&#xff0c;它把空间中的每一点关联到一个数值或一个数学对象&#xff08;如向量、张量等&#xff09;。在物理学中&#xff0c;场可以描述许多物理现象&#xff0c;例如温度分布、电场、磁场、压力场等。 标量场 标量场 是一个函数&…

2024 年最佳 Figma 字体

字体不仅仅是文本字符&#xff0c;它们还塑造了用户体验。从引导用户浏览界面到传达品牌个性&#xff0c;字体对于设计​​至关重要。然而&#xff0c;找到适合您的网站或应用风格的完美字体可能具有挑战性。 但不要害怕&#xff0c;我们会帮助您&#xff01;请继续关注&#x…

c语言----队列

很久没有写文章了。因为放假了嘛&#xff0c;给自己稍微放松了一下&#xff0c;所以最近的更新很慢。呜呜下一次一定改。然后咧。今天我想与大家分享的是队列。虽然这个知识点我们应该在讲了堆的实现就应该写的&#xff0c;但是后面忘了&#xff0c;以为自己是写了的。但是昨天…

SQL二次注入原理分析

二次注入在测试的时候比较少见&#xff0c;或者说很难被测出来&#xff0c;因为测的时候首先要去找注入的位置&#xff0c;其次是去判断第一次执行的SQL语句&#xff0c;然后还要去判断第二次进行调用的 SQL 语句。而关键问题就出在第二次的调用上面。 下面以一个常用过滤方法…

STM32学习历程(day2)

GPIO解释 GPIO(General-purpose input/output) 可以配置为八种输入输出模式 引脚电平 0V-3.3V 部分引脚可容忍5v 输出模式可控制端口输出高低电平 用以驱动LED、控制蜂鸣器、模拟通信协议输出时序 输入模式可读取端口的高低电平或电压&#xff0c;用于读取按键输入、外界…

网络IO模型之多路复用器.md

多路复用是什么&#xff1f;怎么理解&#xff1f; 本文主要涉及为 程序中处理网络IO时的模型&#xff0c;对于系统内核而言网络IO模型。这里只做普及使用 前置知识&#xff0c;什么是IO&#xff1f;怎么理解IO IO其实就是In和Out。中文翻译是输入和输出&#xff0c;只要涉及到输…