2661|2

407

帖子

10

TA的资源

一粒金砂(高级)

楼主
 

嵌入式工程师AI挑战营RV1106人脸识别+流水记录(2) [复制链接]

上一篇记录SDK的编译,主题人脸识别关系不大

继续按照WIKI实验,先要先看下板卡的人脸检测的效果,于是按照RKMPI 实例使用指南 | LUCKFOX WIKI中“基于 opencv-mobile 绘制 RKNN 推理结果”复现了一下

按照Wiki8.1在虚拟机中

  1. 获取 git 仓库源码

    • git clone

    • it

  2. 设置环境变量

    注意:使用绝对地址。

  3. 执行 

    • ./build.sh
     后选择编译的例程

使用 luckfox_pico_rtsp_retinaface实例

在.\luckfox_pico_rkmpi_example.7z\luckfox_pico_rkmpi_example\example\luckfox_pico_rtsp_retinaface\src\main.cc文件中增加FPS与人脸框

  • int main(int argc, char *argv[]) {
  • system("RkLunch-stop.sh");
  • RK_S32 s32Ret = 0;
  • int width = DISP_WIDTH;
  • int height = DISP_HEIGHT;
  • int model_width = 640;
  • int model_height = 640;
  • float scale_x = (float)width / (float)model_width;
  • float scale_y = (float)height / (float)model_height;
  • int sX,sY,eX,eY;
  • char fps_text[16];
  • float fps = 0;
  • memset(fps_text,0,16);
  • char text[16];
  • memset(text,0,16);
  • // Rknn model
  • rknn_app_context_t rknn_app_ctx;
  • object_detect_result_list od_results;
  • //init model
  • const char *model_path = "./model/retinaface.rknn";
  • memset(&rknn_app_ctx, 0, sizeof(rknn_app_context_t));
  • if(init_retinaface_model(model_path, &rknn_app_ctx) != RK_SUCCESS)
  • {
  • RK_LOGE("rknn model init fail!");
  • return -1;
  • }
  • //h264_frame
  • VENC_STREAM_S stFrame;
  • stFrame.pstPack = (VENC_PACK_S *)malloc(sizeof(VENC_PACK_S));
  • RK_U64 H264_PTS = 0;
  • RK_U32 H264_TimeRef = 0;
  • VIDEO_FRAME_INFO_S stViFrame;
  • // Create Pool
  • MB_POOL_CONFIG_S PoolCfg;
  • memset(&PoolCfg, 0, sizeof(MB_POOL_CONFIG_S));
  • PoolCfg.u64MBSize = width * height * 3 ;
  • PoolCfg.u32MBCnt = 1;
  • PoolCfg.enAllocType = MB_ALLOC_TYPE_DMA;
  • //PoolCfg.bPreAlloc = RK_FALSE;
  • MB_POOL src_Pool = RK_MPI_MB_CreatePool(&PoolCfg);
  • printf("Create Pool success !\n");
  • // Get MB from Pool
  • MB_BLK src_Blk = RK_MPI_MB_GetMB(src_Pool, width * height * 3, RK_TRUE);
  • // Build h264_frame
  • VIDEO_FRAME_INFO_S h264_frame;
  • h264_frame.stVFrame.u32Width = width;
  • h264_frame.stVFrame.u32Height = height;
  • h264_frame.stVFrame.u32VirWidth = width;
  • h264_frame.stVFrame.u32VirHeight = height;
  • h264_frame.stVFrame.enPixelFormat = RK_FMT_RGB888;
  • h264_frame.stVFrame.u32FrameFlag = 160;
  • h264_frame.stVFrame.pMbBlk = src_Blk;
  • unsigned char *data = (unsigned char *)RK_MPI_MB_Handle2VirAddr(src_Blk);
  • cv::Mat frame(cv::Size(width,height),CV_8UC3,data);
  • // rkaiq init
  • RK_BOOL multi_sensor = RK_FALSE;
  • const char *iq_dir = "/etc/iqfiles";
  • rk_aiq_working_mode_t hdr_mode = RK_AIQ_WORKING_MODE_NORMAL;
  • //hdr_mode = RK_AIQ_WORKING_MODE_ISP_HDR2;
  • SAMPLE_COMM_ISP_Init(0, hdr_mode, multi_sensor, iq_dir);
  • SAMPLE_COMM_ISP_Run(0);
  • // rkmpi init
  • if (RK_MPI_SYS_Init() != RK_SUCCESS) {
  • RK_LOGE("rk mpi sys init fail!");
  • return -1;
  • }
  • // rtsp init
  • rtsp_demo_handle g_rtsplive = NULL;
  • rtsp_session_handle g_rtsp_session;
  • g_rtsplive = create_rtsp_demo(554);
  • g_rtsp_session = rtsp_new_session(g_rtsplive, "/live/0");
  • rtsp_set_video(g_rtsp_session, RTSP_CODEC_ID_VIDEO_H264, NULL, 0);
  • rtsp_sync_video_ts(g_rtsp_session, rtsp_get_reltime(), rtsp_get_ntptime());
  • // vi init
  • vi_dev_init();
  • vi_chn_init(0, width, height);
  • // venc init
  • RK_CODEC_ID_E enCodecType = RK_VIDEO_ID_AVC;
  • venc_init(0, width, height, enCodecType);
  • printf("init success\n");
  • while(1)
  • {
  • // get vi frame
  • h264_frame.stVFrame.u32TimeRef = H264_TimeRef++;
  • h264_frame.stVFrame.u64PTS = TEST_COMM_GetNowUs();
  • s32Ret = RK_MPI_VI_GetChnFrame(0, 0, &stViFrame, -1);
  • if(s32Ret == RK_SUCCESS)
  • {
  • void *vi_data = RK_MPI_MB_Handle2VirAddr(stViFrame.stVFrame.pMbBlk);
  • cv::Mat yuv420sp(height + height / 2, width, CV_8UC1, vi_data);
  • cv::Mat bgr(height, width, CV_8UC3, data);
  • cv::Mat model_bgr(model_height, model_width, CV_8UC3);
  • cv::cvtColor(yuv420sp, bgr, cv::COLOR_YUV420sp2BGR);
  • cv::resize(bgr, frame, cv::Size(width ,height), 0, 0, cv::INTER_LINEAR);
  • cv::resize(bgr, model_bgr, cv::Size(model_width ,model_height), 0, 0, cv::INTER_LINEAR);
  • //model
  • memcpy(rknn_app_ctx.input_mems[0]->virt_addr, model_bgr.data, model_width * model_height * 3);
  • inference_retinaface_model(&rknn_app_ctx, &od_results);
  • //model
  • sprintf(fps_text,"fps = %.2f",fps);
  • cv::putText(frame,fps_text,
  • cv::Point(40, 40),
  • cv::FONT_HERSHEY_SIMPLEX,1,
  • cv::Scalar(0,255,0),2);
  • for(int i = 0; i < od_results.count; i++)
  • {
  • if(od_results.count >= 1)
  • {
  • object_detect_result *det_result = &(od_results.results[i]);
  • sX = (int)((float)det_result->box.left *scale_x);
  • sY = (int)((float)det_result->box.top *scale_y);
  • eX = (int)((float)det_result->box.right *scale_x);
  • eY = (int)((float)det_result->box.bottom *scale_y);
  • printf("%d %d %d %d\n",sX,sY,eX,eY);
  • cv::rectangle(frame,cv::Point(sX,sY),
  • cv::Point(eX,eY),cv::Scalar(0,255,0),3);
  • sprintf(text, " %.1f%%", det_result->prop * 100);
  • cv::putText(frame,text,cv::Point(sX, sY - 8),
  • cv::FONT_HERSHEY_SIMPLEX,1,
  • cv::Scalar(0,255,0),2);
  • }
  • }
  • }
  • memcpy(data, frame.data, width * height * 3);
  • // encode H264
  • RK_MPI_VENC_SendFrame(0, &h264_frame ,-1);
  • // rtsp
  • s32Ret = RK_MPI_VENC_GetStream(0, &stFrame, -1);
  • if(s32Ret == RK_SUCCESS)
  • {
  • if(g_rtsplive && g_rtsp_session)
  • {
  • //printf("len = %d PTS = %d \n",stFrame.pstPack->u32Len, stFrame.pstPack->u64PTS);
  • void *pData = RK_MPI_MB_Handle2VirAddr(stFrame.pstPack->pMbBlk);
  • rtsp_tx_video(g_rtsp_session, (uint8_t *)pData, stFrame.pstPack->u32Len,
  • stFrame.pstPack->u64PTS);
  • rtsp_do_event(g_rtsplive);
  • }
  • RK_U64 nowUs = TEST_COMM_GetNowUs();
  • fps = (float) 1000000 / (float)(nowUs - h264_frame.stVFrame.u64PTS);
  • }
  • // release frame
  • s32Ret = RK_MPI_VI_ReleaseChnFrame(0, 0, &stViFrame);
  • if (s32Ret != RK_SUCCESS) {
  • RK_LOGE("RK_MPI_VI_ReleaseChnFrame fail %x", s32Ret);
  • }
  • s32Ret = RK_MPI_VENC_ReleaseStream(0, &stFrame);
  • if (s32Ret != RK_SUCCESS) {
  • RK_LOGE("RK_MPI_VENC_ReleaseStream fail %x", s32Ret);
  • }
  • }
  • // Destory MB
  • RK_MPI_MB_ReleaseMB(src_Blk);
  • // Destory Pool
  • RK_MPI_MB_DestroyPool(src_Pool);
  • RK_MPI_VI_DisableChn(0, 0);
  • RK_MPI_VI_DisableDev(0);
  • SAMPLE_COMM_ISP_Stop(0);
  • RK_MPI_VENC_StopRecvFrame(0);
  • RK_MPI_VENC_DestroyChn(0);
  • free(stFrame.pstPack);
  • if (g_rtsplive)
  • rtsp_del_demo(g_rtsplive);
  • RK_MPI_SYS_Exit();
  • // Release rknn model
  • release_retinaface_model(&rknn_app_ctx);
  • return 0;
  • }

 

luckfox_pico_rtsp_retinaface_demo 测试人脸检测,rtsp视频流添加FPS后交叉编译
export LUCKFOX_SDK_PATH=/home/ubuntu/luckfox-pico
sudo chmod -R 777 ../luckfox_pico_rkmpi_example
ubuntu@ubuntu:~/luckfox_pico_rkmpi_example$ ./build.sh

将文件传输到板卡上,按照WIKI8.2在板端运行

  1. 编译完成后会在

    • luckfox_pico_rkmpi_example/install
    文件夹下生成对应的部署文件夹

  2. 将生成的部署文件夹完整上传到 Luckfox Pico 上 (可使用adb ssh等方式) ,板端进入文件夹运行

  3. 使用 VLC 打开网络串流 

    • rtsp://172.32.0.93/live/0
    (按实际情况修改 IP 地址拉取图像)

 

PC端文件

luckfox_pico_rtsp_retinaface.7z (442.92 KB, 下载次数: 4)

板端文件

luckfox_pico_rtsp_retinaface_demo板端.7z (1.25 MB, 下载次数: 5)

 

 

 

最新回复

Wiki8.1必须要在虚拟机中运行么   详情 回复 发表于 2024-12-15 09:41
点赞 关注

回复
举报

6931

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

Wiki8.1必须要在虚拟机中运行么

点评

按照WIKI,应该也可以在DOCK中运行,因为要用到SDK,应该是用SDK中的编译链吧  详情 回复 发表于 2024-12-15 10:19
 
 

回复

407

帖子

10

TA的资源

一粒金砂(高级)

板凳
 
Jacktang 发表于 2024-12-15 09:41 Wiki8.1必须要在虚拟机中运行么

按照WIKI,应该也可以在DOCK中运行,因为要用到SDK,应该是用SDK中的编译链吧

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【回帖赢京东卡】说说无线技术那些事儿
即日起—2月28日,参与回帖讨论都有机会赢取【30元京东卡】

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表