基于Aidlux的人体识别、人体追踪与人数统计获取

文章目录

  • 训练营课程
  • 一、学习目的
  • 二、作业题目
    • 1.题目
    • 2.实现效果
    • 3.代码实现
    • 4.学习心得
    • 5.Aidlux使用心得


训练营课程

本节课主要学习智慧安防实战训练营课程:
训练课程主要包括:

1.主要讲解AI⾏业智慧城市场景的⽬前状况,讲解边缘设备、越界识别应⽤等案例,充分认识该场景应用。
2.讲解AI项目开发及Aidlux的特点,主要为环境部署及远程调用的实操。
3.从⽬标检测算法的从0到1的数据处理,环境部署,训练,针对Aidlux上的移植、 测试等⽅⾯进⾏讲解。
4.学习了⽬标检测后,会将⽬标检测和⽬标追踪结合,尝试完整的⼈体检测追踪,为后⾯的各类业务功能做准备。
5.会将越界识别的业务功能也添加进来,当有⼈越界的时候,会通过喵提醒的⽅式,通知开发者及时查看⼿机⾥⾯的越界图⽚。


一、学习目的

本次课程全程由江大白老师进行教学讲解,初次了解到大白老师是有同事推荐大白老师的Yolo讲解,深入浅出让人豁然开悟,工作以来一直想在深度学习的领域中学习更多的知识,大白老师分享完训练营后,我毫不犹豫的参加了,也希望在这过程中可以学到dalao的代码或者部署经验。
本次训练营主要也是基于Aidlux进行的部署与调试,也是基于边缘设备的一种新尝试,经过训练营的学习,也了解到基于PC端的开发到安卓端的部署与执行,以下为训练营的一次大作业,用以检验成果。

二、作业题目

1.题目

在学习了越界识别的功能后,采用人体检测+人体追踪+业务功能的方式实现 人流统计。

2.实现效果

基于Aidlux的人体识别、人体追踪与人数统计获取_第1张图片

越界识别


基于Aidlux的人体识别、人体追踪与人数统计获取_第2张图片

3.代码实现

相关代码可以通过关注Aidlux获取
基于Aidlux的人体识别、人体追踪与人数统计获取_第3张图片
代码文件主要包括推理代码yolov5_overstep.py,工具函数utils.py,跟踪算法track文件夹,以及模型文件yolov5n_best-fp16.tflite和测试视频video.mp4.
主要关注yolov5_overstep.py,代码如下:
(1)必要包加载

# aidlux相关
from cvs import *
import aidlite_gpu
from utils import is_passing_line
from utils import *

# from utils import detect_postprocess, preprocess_img, draw_detect_res, scale_coords,process_points,isInsidePolygon,is_in_poly
import cv2
# bytetrack
from track.tracker.byte_tracker import BYTETracker
from track.utils.visualize import plot_tracking
import requests
import time

(2)加载模型

# 加载模型
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)

(3)初始化

tracker = BYTETracker(frame_rate=30)
track_id_status = {}
cap = cvs.VideoCapture("/home/lesson4_codes/aidlux/video.mp4")
frame_id = 0
count_person =0 

(4)读取视频帧,预处理并进行检测

 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)

(5)对检测到的人体框利用track中的跟踪模型算出每个人体框的id

  # 目标追踪相关功能
    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)

(6)绘制固定人流线,计算人体监测点,对两者位置的判断,track_info 人体的检测点在直线下方为-1,在直线上方为1,记录在track_id_status中

  # 人流计数识别功能实现####
            #  1.绘制统计人流线

            lines = [[186,249],[1235,366]]
            cv2.line(res_img,(186,249),(1234,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)
def is_passing_line(point, polyline):
    # 在直线下方,status =-1
    # 在直线上方,status =1
    status = 1
    # 点映射在直线的高度
    poly_y = ((polyline[1][1] - polyline[0][1]) * (point[0] - polyline[0][0])) / (polyline[1][0] - polyline[0][0]) + \
              polyline[0][1]
    if point[1] > poly_y:
        status = -1
    return status

(7)此处判断每个id走向,此处只检测了一个方向

 # # 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)
                    count_person +=1

(8)状态显示人流统计

  cv2.putText(res_img,"-1 to 1 person_count:"+str(count_person),(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,255),2)
    cvs.imshow(res_img)

(9)喵提醒

while True:
    frame = cap.read()
    if frame is None:
        print("camera is over")
        # 填写对应的喵码
        id = 't9uzzbL'
        # 填写喵提醒中,发送的消息,这里放上前面提到的图片外链
        text = "人流统计数:"+str(count_person)
        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

4.学习心得

如上为部分大作业代码,整个训练营还有其他很有趣的服务器训练,部署,代码调试等内容,大白老师手把手从0到1,还是非常值得学习的,顶,硬顶。


5.Aidlux使用心得

此次的课程我都是部署在闲置的小米8上(某个小杂物堆里掏出来的),因此占用,发热续航都未关注过,只是经常会软件重启,感觉还是有需要优化的地方,但是因为有Aidlux软件,部署感觉挺容易的,榨干我小米8最后的劳动力,它好像还没寿终正寝,哈哈,感觉不单单是个玩具,除此以外,可以暂时部署在手机上进行,方便携带、测试,挺值得进行尝试一下的。

你可能感兴趣的:(人工智能,机器学习,深度学习)