基于AidLux平台的人流统计应用评测

一、前言

        本文主要以街区人流量统计应用为例,对基于AidLux平台实现的“人体检测+人体追踪+人流统计”业务应用进行评测。如果需要,也可借鉴本文的思路实现不同场景下的人流统计或越界识别业务。

二、环境配置——跨平台应用系统Aidlux

        使用基于Linux的Aidlux平台,可以将装有Aidlux应用的安卓手机、边缘设备和PC端相连接,之后就可以方便的进行代码移植调试,进而实现应用测试。

        对于手机版本的Aidlux软件,可以从安卓手机的应用商店下载相应的APP软件。下载后进行安装、初始化、注册登录,就可进入图形界面。如果想将手机与同一个局域网下的电脑连接, 可以点击图形界面中的Cloud_ip查看其IP地址,然后将电脑的浏览器打开,输入IP地址和密码aidlux,就可以看到手机上该软件的图形界面投影了。

        在图形界面中,可以进入examples中,尝试一系列的 AI 案例;也可以进入文件管理中,进行文件的上传、下载、修改等操作。

        当需要调试代码时,手机界面的操作不太方便,可以通过电脑端的vscode连接手机进行调试。具体流程要如下截图所示:先进行1、2、3步,打开SSH配置文件,然后修改HostName为Cloud_ip的IP地址,端口号可设为9022;再进行4、5、6步,打开手机端的远程资源管理窗口,密码aidlux;之后进行7、8、9步,就可以在电脑端修改代码文件了;最后如果要在电脑端调试代码,还需要经过10、11、12步,先安装python解释器,然后添加路径,最后选择解释器。

基于AidLux平台的人流统计应用评测_第1张图片

基于AidLux平台的人流统计应用评测_第2张图片

 ​​基于AidLux平台的人流统计应用评测_第3张图片

 基于AidLux平台的人流统计应用评测_第4张图片

基于AidLux平台的人流统计应用评测_第5张图片

 基于AidLux平台的人流统计应用评测_第6张图片

三、人流统计算法实现

3.1.行人人体检测

        首先需要准备数据集。本文使用的是旷视的Crowdhuamn数据集,官网http://www.crowdhuman.org/可下载,总共包含三个子数据集:15000张的训练数据集,4370张的验证数据集,5000张的测试数据集。其中训练集和验证集都是有标注信息的,测试集没有标注信息。下载好数据集后,由于标注文件格式为odgt,需要先将标注文件转换为txt格式,才能在yolov5工程中进行训练。

        之后要训练模型文件。训练模型时,要注意修改一些参数,主要包括数据集配置文件中的数据集路径,训练文件中的数据集配置文件路径、模型预训练权重、模型配置文件、epoch、batch-size等。

        再后要转换模型文件。由于aidlux端需要使用的模型格式为tflite,故需要将训练好的pt模型文件进行转换。

3.2行人轨迹追踪

        目标追踪算法包括单目标追踪和多目标追踪,多目标追踪主要针对的是多个目标的运动轨迹,而单目标追踪主要 针对的某⼀个目标的运动轨迹。目前用的较多的是多目标追踪算法,多目标追踪算法包括(1)sort多目标算法(2)deepsort多目标算法(3)Bytetrack多目标追踪算法。该实例中我们使用Bytetrack多目标追踪算法,会尽量的减少人物之间的遮挡而带来的目标的丢失。其中主要代码如下:

    # 目标追踪相关功能
    det = []
    # Process predictions
    for box in pred[0]:  # per image
        box[2] += box[0]
        box[3] += box[1]
        det.append(box)
    if len(det):
        # Rescale boxes from img_size to im0 size
        online_targets = tracker.update(det, [frame.shape[0], frame.shape[1]])
        online_tlwhs = []
        online_ids = []
        online_scores = []
        # 取出每个目标的追踪信息
        for t in online_targets:
            # 目标的检测框信息
            tlwh = t.tlwh
            # 目标的track_id信息
            tid = t.track_id
            online_tlwhs.append(tlwh)
            online_ids.append(tid)
            online_scores.append(t.score)
            # 针对目标绘制追踪相关信息
            res_img = plot_tracking(res_img, online_tlwhs, online_ids, 0,0)
    cvs.imshow(res_img)

3.3人流统计

        本文以一个街道上的双向流量进行统计,参考代码如下:

    # 目标追踪相关功能
    det = []
    # Process predictions
    for box in pred[0]:  # per image
        box[2] += box[0]
        box[3] += box[1]
        det.append(box)
    if len(det):
        # Rescale boxes from img_size to im0 size
        online_targets = tracker.update(det, [frame.shape[0], frame.shape[1]])
        online_tlwhs = []
        online_ids = []
        online_scores = []
        # 取出每个目标的追踪信息
        for t in online_targets:
            # 目标的检测框信息
            tlwh = t.tlwh
            # 目标的track_id信息
            tid = t.track_id
            online_tlwhs.append(tlwh)
            online_ids.append(tid)
            online_scores.append(t.score)
            # 针对目标绘制追踪相关信息
            res_img = plot_tracking(res_img, online_tlwhs, online_ids, 0,0)
 
            #1.绘制统计人流线
            # lines =[[167,541],[1191,539]]
            # lines =[[593,176],[904,243]]
            lines =[[186,249],[1235,366]]
            # cv2.line(res_img,(167,541),(1191,539),(255,255,0),3)
            # cv2.line(res_img,(593,176),(904,243),(255,255,0),3)
            cv2.line(res_img,(186,249),(1235,366),(255,255,0),3)

            # 2.计算得到人体下方中心点的位置(人体检测监测点调整)
            pt = [tlwh[0]+1/2*tlwh[2],tlwh[1]+tlwh[3]]#以人头为识别点
            
            #3人体和违规线的判断(状态追踪)
            track_info = is_passing_line(pt, lines)
 
            if tid not in track_id_status.keys():
                track_id_status.update( {tid:[track_info]})
            else:
                if track_info != track_id_status[tid][-1]:
                    track_id_status[tid].append(track_info)
 
            # 4.判断是否有track_id越界,有的话保存成图片
            # 当某个track_id的状态,上一帧是-1,但是这一帧是1时,说明越界了
            if track_id_status[tid][-1] == 1 and len(track_id_status[tid]) >1:
                # 判断上一个状态是否是-1,是否的话说明越界,为了防止继续判别,随机的赋了一个3的值
                if  track_id_status[tid][-2] == -1:
                    track_id_status[tid].append(3)
                    #cv2.imwrite("overstep.jpg",res_img)
                    count_person_up += 1   #之前已经定义count_person=0,不然会报未定义的错
                    
               #5.再判断当前一个状态为1,后一个状态为-1时的情况
            if track_id_status[tid][-1] == -1 and len(track_id_status[tid]) >1:
                # 判断上一个状态是否是1,是否的话说明越界,为了防止继续判别,随机的赋了一个3的值
                if  track_id_status[tid][-2] == 1:
                    track_id_status[tid].append(3)
                    #cv2.imwrite("overstep.jpg",res_img)
                    count_person_down += 1 
    cv2.putText(res_img,"Person_up_count:"+ str(count_person_up)+"\nPerson_down_count:"+ str(count_person_down), (50,50), cv2.FONT_HERSHEY_SIMPLEX, 1 ,(255, 0, 255), 3)
    cvs.imshow(res_img)

四、人流统计应用

        为了较为完整的实现整个人流统计应用,还需要对算法的结果进行展示。例如,本文通过以微信“喵提醒”的⽅式对人流量进行统计和反馈。其主要代码和结果展示如下:

# aidlux相关
#下面的utils函数包和track函数包要到公众号“AidLUx”上回复lesson5
from cvs import *
import aidlite_gpu
from utils import detect_postprocess, preprocess_img, draw_detect_res, scale_coords,process_points,is_in_poly,is_passing_line
import cv2
# bytetrack
from track.tracker.byte_tracker import BYTETracker
from track.utils.visualize import plot_tracking
import requests #库的引用
import time
 
# 加载模型
model_path = '/home/lesson4_codes/aidlux/yolov5n_best-fp16.tflite'
in_shape = [1 * 640 * 640 * 3 * 4]
out_shape = [1 * 25200 * 6 * 4]
 
# 载入模型
aidlite = aidlite_gpu.aidlite()
# 载入yolov5检测模型
aidlite.ANNModel(model_path, in_shape, out_shape, 4, 0)
#初始化文件
tracker = BYTETracker(frame_rate=30)
track_id_status = {}
cap = cvs.VideoCapture("/home/lesson4_codes/aidlux/video.mp4")
frame_id = 0
count_person_up = 0
count_person_down = 0
while True:
    frame = cap.read()
    if frame is None:
        print("Camera is over!")
        # 填写对应的喵码
        id = '???' #填写自己的喵码
        # 填写喵提醒中,发送的消息,这里放上前面提到的图片外链
        t=time.localtime()
        t_text = str(time.strftime("%Y-%m-%d %H:%M:%S",t))
        text = "向上\向下 人流量:"+str(count_person_up)+'\\'+str(count_person_down)+'\n'+'时间:'+t_text
        ts = str(time.time())  # 时间戳
        type = 'json'  # 返回内容格式
        request_url = "http://miaotixing.com/trigger?"
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47'}
        result = requests.post(request_url + "id=" + id + "&text=" + text + "&ts=" + ts + "&type=" + type,headers=headers)
        break
    frame_id += 1
    if frame_id % 3 != 0:
        continue
     # 预处理
    img = preprocess_img(frame, target_shape=(640, 640), div_num=255, means=None, stds=None)
    # 数据转换:因为setTensor_Fp32()需要的是float32类型的数据,所以送入的input的数据需为float32,大多数的开发者都会忘记将图像的数据类型转换为float32
    aidlite.setInput_Float32(img, 640, 640)
    # 模型推理API
    aidlite.invoke()
    # 读取返回的结果
    pred = aidlite.getOutput_Float32(0)
    # 数据维度转换
    pred = pred.reshape(1, 25200, 6)[0]
    # 模型推理后处理
    pred = detect_postprocess(pred, frame.shape, [640, 640, 3], conf_thres=0.4, iou_thres=0.45)
    # 绘制推理结果
    res_img = draw_detect_res(frame, pred)
 
    # 目标追踪相关功能
    det = []
    # Process predictions
    for box in pred[0]:  # per image
        box[2] += box[0]
        box[3] += box[1]
        det.append(box)
    if len(det):
        # Rescale boxes from img_size to im0 size
        online_targets = tracker.update(det, [frame.shape[0], frame.shape[1]])
        online_tlwhs = []
        online_ids = []
        online_scores = []
        # 取出每个目标的追踪信息
        for t in online_targets:
            # 目标的检测框信息
            tlwh = t.tlwh
            # 目标的track_id信息
            tid = t.track_id
            online_tlwhs.append(tlwh)
            online_ids.append(tid)
            online_scores.append(t.score)
            # 针对目标绘制追踪相关信息
            res_img = plot_tracking(res_img, online_tlwhs, online_ids, 0,0)
 
            #1.绘制统计人流线
            # lines =[[167,541],[1191,539]]
            # lines =[[593,176],[904,243]]
            lines =[[186,249],[1235,366]]
            # cv2.line(res_img,(167,541),(1191,539),(255,255,0),3)
            # cv2.line(res_img,(593,176),(904,243),(255,255,0),3)
            cv2.line(res_img,(186,249),(1235,366),(255,255,0),3)

            # 2.计算得到人体下方中心点的位置(人体检测监测点调整)
            pt = [tlwh[0]+1/2*tlwh[2],tlwh[1]+tlwh[3]]#以人头为识别点
            
            #3人体和违规线的判断(状态追踪)
            track_info = is_passing_line(pt, lines)
 
            if tid not in track_id_status.keys():
                track_id_status.update( {tid:[track_info]})
            else:
                if track_info != track_id_status[tid][-1]:
                    track_id_status[tid].append(track_info)
 
            # 4.判断是否有track_id越界,有的话保存成图片
            # 当某个track_id的状态,上一帧是-1,但是这一帧是1时,说明越界了
            if track_id_status[tid][-1] == 1 and len(track_id_status[tid]) >1:
                # 判断上一个状态是否是-1,是否的话说明越界,为了防止继续判别,随机的赋了一个3的值
                if  track_id_status[tid][-2] == -1:
                    track_id_status[tid].append(3)
                    #cv2.imwrite("overstep.jpg",res_img)
                    count_person_up += 1   #之前已经定义count_person=0,不然会报未定义的错
                    
               #5.再判断当前一个状态为1,后一个状态为-1时的情况
            if track_id_status[tid][-1] == -1 and len(track_id_status[tid]) >1:
                # 判断上一个状态是否是1,是否的话说明越界,为了防止继续判别,随机的赋了一个3的值
                if  track_id_status[tid][-2] == 1:
                    track_id_status[tid].append(3)
                    #cv2.imwrite("overstep.jpg",res_img)
                    count_person_down += 1 
    cv2.putText(res_img,"Person_up_count:"+ str(count_person_up)+"\nPerson_down_count:"+ str(count_person_down), (50,50), cv2.FONT_HERSHEY_SIMPLEX, 1 ,(255, 0, 255), 3)
    cvs.imshow(res_img)

基于AidLux平台的人流统计应用评测_第7张图片

五、本文小结

        本文是在江大白以及Aidlux团队的训练营中学习而来,详细代码可关注Aidlux公众号并回复关键词获得,其它同学的分享文章和心得也可参考附录中的链接,最后附上本文实现的人流统计视频。

基于AidLux平台的人流统计应用评测_第8张图片

街道双向人流统计

附录

参考链接

基于Aidlux平台的街道人流量统计开发与测试_qq_42950407的博客-CSDN博客

基于yolov5框架实现人流统计(目标检测算法、目标追踪算法以及越界识别功能)+手机获取统计人数_get-yuan的博客-CSDN博客

基于AidLux平台的医院进出口人流量统计案例开发与测试 - 知乎 (zhihu.com)

人体检测+人体追踪的人流统计AI项目在android端部署落地的实战心得 - 知乎 (zhihu.com)

利用Aidlux落地双向AI人流统计项目的实战心得 - 知乎 (zhihu.com)

《Aidlux智慧安防AI实战训练营》作业心得 - 知乎 (zhihu.com)

你可能感兴趣的:(人工智能)