《Aidlux智慧安防AI实战训练营》学习分享

1、课程目标

讲解AI⾏业智慧城市⾏业的⽬前状况,并从边缘设备应用、越界识别应⽤等为案例进⾏讲解,通过实战化培训全面提升算法实战应用。

2、课程大纲

为了带着⼤家整体实现各个功能,本次训练营的课程主要分成6节课。

第⼀节课,即本节课,主要讲解AI⾏业智慧城市⾏业的⽬前状况,并从边缘设备、越界识别应⽤等为案例,进⾏讲解。

第⼆节课,主要从边缘设备的⽅式,Aidlux进⾏讲解,了解在边缘端的各⽅⾯内容。

第三节课,主要从⽬标检测算法的训练,Aidlux上的移植、测试等⽅⾯进⾏讲解。

第四节课,学习了⽬标检测后,会将⽬标检测和⽬标追踪结合,尝试完整的⼈体检测追踪,为后⾯的各类业务功能做准备。

第五节课,会将越界识别的业务功能也添加进来,当有⼈越界的时候,会通过喵提醒的⽅式,通知开发者及时查看⼿机⾥⾯的越界图⽚。

第六节课,会举办⼀次结营活动,对于完成训练营作业的同学颁发获奖证书,以及⼀系列的礼物奖励。

3、课程作业

1)作业要求:实现⼈流统计代码,使⽤⼈体检测+⼈体追踪+业务逻辑,完成⼈流统计的业务功能,完成整体⼈流统计项⽬的开发和实现。

2)效果实现:

《Aidlux智慧安防AI实战训练营》学习分享_第1张图片

演示效果视频如下:

3)具体代码

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/lesson3_codes/yolov5_code/aidlux/1.mp4")

frame_id = 0

count_person = 0

while True:

    frame = cap.read()

    if frame is None:

        #相机采集结束

        print("Camera is over!")

        # 填写对应的喵码

        id = 'ti5efHO'

        # 填写喵提醒中,发送的消息,这里放上前面提到的图片外链

        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

    frame_id += 2

    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 = [[195,890], [1028,890]]

            cv2.line(res_img,(195,890), (1028,890), (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)

                    count_person += 1

                   

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

    cvs.imshow(res_img)

4、收获总结及学习心得

   1)熟悉AI项目开发流程: 通过前面5次课学习,熟悉Aidlux相关操作,对AI项目开发流程全面进行实现及实战,包括数据采集和数据标注、数据分析和可视化、网络模型设计、AI模型部署及AI边缘设备代码实现。

2)熟悉掌握常用开发工具:熟悉VScode安装、编程、调试,对python和OpenCV常见图像处理及视频处理进行实操编码及测试;熟悉AidLux远程调试,实现边缘终端部署测试。

3)掌握目标检测跟踪算法:熟悉人体检测YOLO V5版本相关算法,并对其原理及算法应用进行资料查阅和熟悉;熟悉多目标跟踪算法,并对deepsort、bytetrack等基本原理及算法实现。

4)掌握算法综合场景应用:熟悉掌握了越界识别、人流统计综合应用,对常见警戒区域设置、行为判断、状态检测等业务逻辑进行全面熟悉与设计,并实现目标跟踪类综合应用。

发布平台:

1)知乎:https://zhuanlan.zhihu.com/p/578554617?

 

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