基于AI+RT-THREAD的人检测入侵检测摄像头(一 AI模型的导入及处理)

RT-AK+RT-THREAD+ART-PI的人检测入侵检测摄像头

  • 简介:该项目基于ART-PI+RT-THREAD平台开发了一套基于人检测AI的网络摄像头,当遥控开启时将自动检测人的特征并判断,若有人则将图片数据自动上传网络并报警。图为ART-PI主图

  • 硬件部分
    ART-PI开发版,OV2640摄像头,红外接收头与遥控器

  • 软件部分
    RT-THREAD操作系统,图像处理,AI模型的C语言应用,红外遥控部分,网络传输部分

    下面以实现顺序教学此项目的实现(预计分三期)

一、AI部分的实现
在计划这个项目之前还没有了解到RT-AK,只知道CubeMx里的Ai模型转换,也试了一下,核心函数是模型的查找初始化等等,RT-AK进一步将这些函数集成,最后产生几个应用函数,在后面会提到。RT-AK的使用在其他文章里可以找到详细用法,这里就放几张关键步骤图带过一下
在RT-AK的ai-tools截面打开命令行
命令行设置参数,包括项目路径,工具路径,模型路径,生成的模型名称等
导入成功后我们进入项目里看一看,APP里会多出
model.c&&model.h
项目文件会多出多出X-CUBE-AI&&rt_ai_lib
下面介绍通用的应用层代码
AI部分代码逻辑为:
1.给模型分配空间

rt_ai_buffer_t *work_buffer = rt_malloc(RT_AI_你设置的模型名称(默认network)_WORK_BUFFER_BYTES+RT_AI_你设置的模型名称_IN_TOTAL_SIZE_BYTES+RT_AI_你设置的模型名称_OUT_TOTAL_SIZE_BYTES);

2.查找模型

model = rt_ai_find(RT_AI_你设置的模型名称_MODEL_NAME);

3.初始化模型

result = rt_ai_init(model, work_buffer);

4.向模型传入参数(一般是数组,我这里是50*50的数组)

rt_memcpy(model->input[0], &array_out_50X50[0][0], RT_AI_IFPERSON_IN_1_SIZE_BYTES);

5.模型运行

result = rt_ai_run(model, ai_run_complete, &ai_run_complete_flag);

6.得到输出

uint8_t *out = (uint8_t *)rt_ai_output(model, 0);

以下是我自己编写的应用层,即在上面基础的详细代码,希望之后的人可以以此为模板找到方法

#include <rt_ai_ifperson_model.h>
#include <rt_ai.h>
#include <rt_ai_log.h>
#include <math.h>
#include <rtthread.h>
#include <rtdevice.h>
#include "drv_common.h"
void ai_run_complete(void *arg){
    *(int*)arg = 1;
}


int ifperson_app(rt_uint8_t array_in_320X240[][320])
{
    rt_uint8_t array_out_50X50[50][50]={0};


    /*数据预处理*/
    Bilinear_interpolation_algorithm(array_in_320X240,array_out_50X50);
    /*end*/


	rt_err_t result = RT_EOK;
	uint8_t answer=0;
    int ai_run_complete_flag = 0;//定义两个状态量
    rt_ai_buffer_t *work_buffer = rt_malloc(RT_AI_IFPERSON_WORK_BUFFER_BYTES+RT_AI_IFPERSON_IN_TOTAL_SIZE_BYTES+RT_AI_IFPERSON_OUT_TOTAL_SIZE_BYTES);//
    if(!work_buffer) {rt_kprintf("malloc err\n");return -1;}
    //else rt_kprintf("malloc done\n");
    model = rt_ai_find(RT_AI_IFPERSON_MODEL_NAME);
    if(model == RT_AI_NULL){
        return -1;
    }							//找到模型
    result = rt_ai_init(model, work_buffer);
    //rt_kprintf("ai_init done\n");
    //init the model handle
    if(result != 0){
        return -1;
    }
    //prepare input data
    rt_memcpy(model->input[0], &array_out_50X50[0][0], RT_AI_IFPERSON_IN_1_SIZE_BYTES);
    //rt_kprintf("memcpy done\n");
    result = rt_ai_run(model, ai_run_complete, &ai_run_complete_flag);
    //rt_kprintf("ai_run done\n");
    //process the inference data
    if(ai_run_complete_flag){
        //get inference data
        uint8_t *out = (uint8_t *)rt_ai_output(model, 0);
        answer=out[0];
        //get argmax  
        rt_kprintf("person prediction: %d\n",answer);
        if(answer>160)  person=1;
        else   person=0;
        if(person )  {
            rt_pin_write(FM_PIN, PIN_LOW);
            web_post_pic(array_in_320X240, 0);
        }
        else  rt_pin_write(FM_PIN, PIN_HIGH);
     }   
    rt_free(work_buffer);
    return 0;
}
//MSH_CMD_EXPORT(ifperson_app, person detection demo);

编写完代码框架之后,你的AI模型不一定能跑起来,这是因为AI模型在这里的量级必须足够小,做到这一点,需要减少激活层,减少输入量,尽可能减少层数,然后转为U8格式输入(量化),U8输出。要想知道这些参数,就需要看转C的report文件查看generate_report以查看你的模型参数
,最后贴一张我的模型参数作为参考(这中间为了减小模型真的可能不断试错)模型参数
主要看RAM(total) ,它反映的是运行时会占用的内存,最好不要超过100kb级别。
下一章我们继续讲图像的处理,如何让图像传输和AI模型对接起来,所有代码会在最后一章附上github地址

基于AI+RT-THREAD的人检测入侵检测摄像头(二 图像数据处理)

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
RT-Thread 作品秀】基于RT-Thread的网络照相机作者:吴顶顶 概述随着科技的进步和互联网的发展,基于物联网的可拍照设备也越来越多的融入到人们的生活中来,例如在超市中,管理者利用拍照设备定时抓取货架照片,分析货物状态,并补充、优化货物摆放;在酒吧里,管理者会利用拍照设备定时抓拍酒架照片,传送到网络平台供大众浏览,以招揽更多顾客。本网络照相机基于STM32H7+RTThread平台,采集摄像头数据,并通过无线网络传送到服务器,提供SD卡配网、手动拍摄、定时拍摄、照片推送等功能,并提供windows上位机提供控制和照片显示功能。 主要功能有: 格式化sd卡:格式化sd卡,但是会保留网络配置文件,其他文件全部删除 设备重启:重启设备 实时拍照:发送指令给照相机,照相机拍照,并把照片回传 定时拍照:照相机依据下发的拍照时间,在时间到达时拍摄一张照片,并传给服务器 按键拍照:点击板上用户按钮,拍摄一张照片,并传给服务器 定时任务:可以新建/删除/查询定时拍照任务,任务存储在sd卡中,重启有效 开发环境硬件:ART-PI(STM32H750主控)+ OV2640模组 RT-Thread版本:4.0.3 SDK 版本:1.0.1 开发工具及版本:RT-Thread Studio 1.1.5, Qt5.14.0 RT-Thread使用情况概述内核部分:调度器,信号量,互斥锁,内存管理 调度器:多任务调度 信号量:用于唤醒对应任务 互斥锁:用于互斥资源独占访问 内存管理:动态内存申请与释放 组件部分:虚拟文件系统,IPC,I2C,RTC,NTP 虚拟文件系统:文件操作,sd卡、照片文件 IPC:mqtt发送数据需要 I2C:配置摄像头模块需要 RTC和NTP:同步时间 软件包部分:paho mqtt,cJSON,netutils pahomqtt:用于和服务器通信 cJSON:解析、封装mqtt消息 netutils:NTP网络对时 其他:base64 用于将图片文件转换成字符串,便于mqtt传输 硬件框架总体的硬件框架如下图所示: 本网络摄像机硬件结果较为简单,即art-pi连接一个摄像头模组,art-pi板上用到了AP6212无线模块,外部内存,led指示灯,和sd卡。其中,摄像头模块用于采集图像信号;AP6212用于和服务器进行通信;因一张图像数据量较大,片内内存不够,故而使用外部内存;led灯用于指示设备工作状态;sd卡用于保存网络、服务器、和定时任务配置。 软件框架说明整体的软件框架如下图所示,网络照相机内部有一个proxy线程,负责和云端进行通信,在接收到云端消息后会解析,并分发到其他的线程执行,然后将执行结果返回到云端;照相机发生了其他的事件,例如用户按键拍照,也会将数据传给proxy线程,proxy线程再将数据发送到云端。用户通过上位机终端软件连接上云服务器,实现与照相机的通信及控制。 整个系统支持接入多个照相机,如下图所示,不同的照相机通过sd卡配置文件中sn进行区分,上位机软件可以显示所有在线的照相机,但同一时间只支持操作一个。 软件模块说明1. 用户线程创建流程如下图所示为用户线程创建流程 用户线程作用描述如下: main:用于创建sd_card 线程,检测按键事件,闪灯; sd_card:用于管理与sd卡相关的工作,包括拍照,网络配置,定时任务; network:负责联网,根据sd卡的配置文件连接到指定的wifi网络; proxy:负责启动mqtt,并管理与云端的通信,其他线程都需要通过proxy线程与云端交互数据; event:定时任务和按键任务,在定时时间到达时,或者用户按键时拍摄照片并通过proxy上传云端。 2. 通信接口及流程2.1 MQTT订阅主题设备向服务器订阅主题: /ter/query/discovery,用于接收设备发现消息 /ter/sn/request,用于接收针对该设备的指令,其中sn为设备的SN号,下同 客户端向服务器订阅主题: /dev/response/discovery,用于接收设备发现回复 /dev/response/will,用于接收设备遗嘱消息 /dev/sn/response,用于接收设备操作指令回复 /dev/sn/event,用于接收设备的通知 2.2 设备发现所有的设备均订阅/ter/query/discovery主题,客户端向该主题发布发现消息,所有收到消息的设备向/dev/response/discovery回复一条消息,而客户端又订阅了/dev/response/discovery主题,故而便可以知道哪些设备在线了。 设备连上服务器的时候,会定义一个遗嘱消息,主题为/dev/sn/will,客户端订阅了该主题,当设备因为某些原因掉线,则超过一定时间之后,
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kejane

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值