rk3399之AI识别_三
时间:2022-10-10 21:00:00
本文继续描述如何将3399与之前的网络摄像头AI目前,我们使用最新的识别信息yolov识别5模型。使用该模型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的方案,识别我们Pro还需要一点变化。程序仅保证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