rk3399之AI识别_三

4 篇文章 3 订阅
1 篇文章 0 订阅

        本篇继续描述如何在3399上结合前面网络摄像头进行AI识别的情况,目前我们使用最新的yolov5模型进行识别。关于该模型使用的rknn_api,可上3399相关论坛官网下载,1808驱动需更新至1.6以上。

        官网给的实例,都是分析一张图片,讲识别结果再次绘制到图片上。python的接口可能更多,丰富点,支持直接拉流分析。但是怎么通过c++接口拉流进行分析呢,进一步,我们是否可以分析多路码流。在不要求识别帧率的情况下,我们识别多路视频这是可行的。

        首先我们确定AI识别的流程

        加载模型数据-初始化计算棒-通过api接口传入图片RGB数据-分析得出结果-画框标识

        通过流程我们可以看出,加载模型初始化计算棒是固定的,计算棒分析结果也是不需要用户关心的。用户可以自定义的流程,就是传入RGB数据,和分析结果出来后画框(这是可选步骤,不一定非要画框)。结合我们第二篇文章,思路就清晰了,我们已经完成了摄像头的解码操作,得到了yuv数据,我们所作的操作就是转换成RGB数据,然后通过rknn_api接口塞给计算棒就可以了。这是我们的rga接口就派上了用场了,它可以将yuv数据转换成rgb数据(我这里测试的,实际上是转成bgr数据才正确)。

        这里还有一点需要注意,传入的rgb数据并不是原长宽,考虑到分析的速度,一般都是对图片进行了压缩。比如说一个训练支持416*416数据的模型,原摄像头是1080*720(720P),那么得到720P的YUV数据后,需要将其缩放成416*416的rgb数据传入才可以正确分析。所以这步一定要确定你们训练的模型大小,然后针对性的缩放拉伸。rgb一般可以直接缩放成该大小的rgb数据,但是为了更好的识别现实中场景,减少因缩放产生的物体扭曲。我们应按整数比例缩放图片后,再进行冗余填充,这块可使用到opencv的copyMakeBorder函数。参考lettbox函数如下:

cv::Mat CV5Detect::letterbox(ffmpeg::RgaData &rData, int target_w, int target_h, int &wpad, int &hpad, float &scale)
{
    int in_w = rData.width;
    int in_h = rData.height;
    int tar_w = target_w;
    int tar_h = target_h;
    float r = std::min(float(tar_h) / in_h, float(tar_w) / in_w);
    int inside_w = round(in_w*r);
    int inside_h = round(in_h*r);
    int padd_w = tar_w - inside_w;
    int padd_h = tar_h - inside_h;
    wpad = padd_w;
    hpad = padd_h;
    scale = r;
    cv::Mat src(in_h, in_w, CV_8UC3);
    src.data = rData.data;
    cv::Mat resize_img(inside_h, inside_w, CV_8UC3);
    /// 如果宽高非4对齐,使用软缩(性能低)
    if (inside_w % 4 != 0 || inside_h % 4 != 0)
    {
        cv::resize(src, resize_img, cv::Size(inside_w, inside_h));
    }
    else
    {
        ffmpeg::RgaData rgaDataOut;
        rgaDataOut.type = ffmpeg::BGR24;
        rgaDataOut.width = inside_w;
        rgaDataOut.height = inside_h;
        rgaDataOut.data = m_picData.get();
        /// 通过rga进行缩放,性能高,不占cpu
        if (!m_pPeg->transRga(rData, rgaDataOut))
        {
            errorf("enc transRga failed\n");
            return resize_img;
        }
        resize_img.data = rgaDataOut.data;
    }
    // cv::imwrite("resize.jpg", resize_img);
    padd_w = padd_w / 2;
    padd_h = padd_h / 2;
    int top = int(round(padd_h - 0.1));

    int bottom = hpad - top;
    int left = int(round(padd_w - 0.1));

    int right = wpad - left;
    /// 冗余填充,使图片在等比例缩放的条件下,符合传入计算棒的RGB图像大小
    cv::copyMakeBorder(resize_img, resize_img, top, bottom, left, right, cv::BORDER_CONSTANT, cv::Scalar(114, 114, 114));
    return resize_img;
}

         对于一路摄像头AI识别,基本上可以做到全帧率识别的。也就是从解码-AI识别-显示,都是可以串行操作。但是对于同时多路识别,就不能串行了。需要将解码,AI,显示异步解开。同时降低帧率。

        本篇就作为3399视频系列结束了,附件包提供自己封装的解码,AI,显示一套流程。AI识别我们是基于3399加1808的方案做的,如果是3399Pro的话,还需要少许改动。程序仅保证720P及以下分辨率显示及识别效果,码流类型H264,可针对摄像头进行配置。

        程序使用方法:

        程序下载后,将压缩包解压至3399的任意目录,运行run.sh即可。配置视频方法,编辑config/QtUi/video_channel.json文件。按照下图字段解释,配置相应字段即可。配置完后重启程序即可生效  

{
        "QtUiConfig" : 
        {
                "channels" : --->数组,接入多路摄像头。最多8路720P
                [
                        {
                                "camType" : 0,
                                "enable" : true, --->使能流,设置true,进行拉流解码操作
                                "enableAI" : true, --->使能,在插入计算棒的情况下,可进行AI识别
                                "ip" : "192.168.31.61", --->摄像头IP,可根据实际情况填写
                                "name" : "chan2", --->摄像头名称,自定义,多路情况下,名称不能重复
                                "nodeId" : "E024E47A524C45F8", --->此字段,会自动生成,建议删除,如果手动填写,确保不一样
                                "password" : "root12345", --->摄像头密码
                                "port" : 80, 
                                "procted_zone" : 
                                {
                                        "points" : [],
                                        "type" : ""
                                },
                                "profile" : "Profile_1",
                                "protocol" : "onvif",
                                "streamUrl" : "rtsp://admin:root12345@192.168.31.61:554/Streaming/Channels/101", --->摄像头rtsp流地址,此为海康示例,其它厂商流地址,自行确定填写
                                "user" : "admin", --->用户名
                                "widgetId" : --->播放窗口序列号
                                [
                                        0
                                ]
                        }
                ],
                "display" : true --->true为显示QT界面,false不显示
        }
}

       建议接上显示屏,可以QT界面展示流界面及AI识别结果。可双击界面左下角,通道列表-全部通道,双击具体的通道。右侧窗口即可播放

        二次开发接口及程序免费运行license请联系微信HardAndBetter获取,或者加入QQ群586166104讨论。

        程序下载路径

        3399视频AI分析demo-图像识别文档类资源-CSDN下载

        没有积分可进行百度网盘下载,路径如下:

        https://pan.baidu.com/s/1zB7Ezpi4ONnVheRn1l84lA  提取码:8jjd

### 回答1: RK3399 是一款基于ARM架构的处理器,可以在上面运行各种类型的模型。要在RK3399上运行模型,您需要: 1. 安装适当的深度学习框架,如TensorFlow、PyTorch或Caffe,以便加载和运行模型。 2. 将模型导入到框架中,并设置输入和输出节点。 3. 编写代码来加载模型、输入数据并运行推理。 在运行模型之前,您需要确保RK3399的硬件资源(如CPU、内存和GPU)足够满足模型的要求。另外,您还需要考虑模型的输入数据格式,以确保它与RK3399上的框架兼容。 总的来说,RK3399是一款功能强大的处理器,可以支持各种类型的模型。但是,为了使模型能够高效地运行,您需要仔细考虑硬件资源和软件设置。 ### 回答2: RK3399是一款高性能、低功耗的芯片,广泛用于AI人工智能领域。它采用了Cortex-A72和Cortex-A53这两个高能效处理器核心,并搭配Mali-T860MP4 GPU,可以提供出色的图像处理能力。 在RK3399上运行模型可以通过使用深度学习框架如TensorFlow或PyTorch来实现。首先,我们需要将训练好的模型转换为RK3399识别的格式,例如TensorFlow Lite或ONNX等。然后,将转换后的模型加载到RK3399芯片上。 运行模型的过程中,RK3399利用其强大的计算能力和GPU加速能力,可以快速高效地进行推理过程。模型的输入数据通过接口传输到芯片上,芯片进行计算后输出相应的结果。RK3399处理速度快,能够实时处理图像、语音等各种数据,可以广泛应用于人脸识别、物体检测、语音识别和自动驾驶等领域。 同时,RK3399还具备低功耗的优点,适用于移动设备或嵌入式系统。它可以通过电池供电,并且对电池的能耗要求较低,能够持续稳定地运行模型。 总之,RK3399作为一款高性能低功耗的芯片,能够快速高效地运行模型,并可广泛应用于各种人工智能领域。 ### 回答3: RK3399是一个强大的处理器芯片,常用于嵌入式设备和物联网应用。它由ARM的big.LITTLE架构组成,包含两个高性能的Cortex-A72核心和四个低功耗的Cortex-A53核心,具有强大的计算能力。 要在RK3399上运行模型,首先需要选择一个适合的深度学习框架,例如TensorFlow或PyTorch,并根据模型的类型和大小进行配置。 一般情况下,需要在RK3399上进行模型推理,而不是训练。模型推理是指使用已经训练好的模型对输入数据进行预测或分类。为了在RK3399上运行模型,需要将训练好的模型转换为推理模型,以减小模型的体积和计算量。 将模型转换为RK3399可运行的模型格式后,可以使用相应的深度学习框架的推理API在RK3399上加载和运行模型。这些API提供了一系列功能,例如加载模型、预处理输入数据、运行模型推理等。 在运行模型之前,还需要确保RK3399上的操作系统和驱动程序的兼容性。在运行模型之后,可以根据需求使用RK3399的输入和输出接口与其他设备进行数据的交互,例如相机、传感器等。 需要注意的是,由于RK3399的资源和功耗限制,较大规模和复杂的模型可能无法在RK3399上高效运行。因此,在选择和设计模型时,需要权衡计算能力和资源的限制,以保证模型在RK3399上的有效运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值