AI实战训练营&Aidlux学习心得

1.学习内容

        学习过程中,我了解了AI⾏业智慧城市⾏业的⽬前状况,并学习了边缘设备、越界识别应⽤等案例,认识了边缘设备Aidlux。我通过使用云服务器对⽬标检测算法进行训练,并在Aidlux上移植、测试。实践中将⽬标检测、⽬标追踪以及越界识别结合,尝试了完整的⼈体检测追踪,当有⼈越界的时候,会通过喵提醒的⽅式,通知开发者及时查看⼿机⾥⾯的越界图⽚。

2.学习目的

        研究生期间,本人对深度学习以及图像识别领域特别感兴趣,想从这两个方向选题,刚好大白老师举办Aidlux智慧安防训练营活动,在大白老师的指导下,通过Aidlux平台将手机作为一台边缘设备,完成了人流统计的业务流程。

3.作业题目

(1)题目:

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

(2)实现效果:

728724006

 以上是我运行的边缘端即手机画面的录屏,最后的效果有Vscode界面 + 边缘端设备(手机)+ Aidlux端的PC端显示,由于我手机有限,所以没有拍整体图,大家可以在头脑中想象一下那个画面,边缘端设备(手机)+ Aidlux端的PC端都可以显示运行状态。

4.代码实现:

人流统计越界线段绘制,我们采用cv2.line的方式

 # 1.绘制统计人流线
            lines = [[186,249],[1235,366]]
            cv2.line(res_img,(186,249),(1235,366),(255, 255, 0),3)

人体检测统计点调整,这里主要分析人体正下方的点。人体检测用的yolov5算法,会得到检测框的四个点信息,[左上角点x,左上角点y,宽w,高h]。所以我们需要通过代码,转换成人体下方的点,即[左上角点x+1/2*宽w,左上角点y+高h]

# 2.计算得到人体下方中心点的位置(人体检测监测点调整)
pt = [tlwh[0]+1/2*tlwh[2],tlwh[1]+tlwh[3]]

人体状态追踪,有了人体正下方的点,还需要根据人体是否在监控区域将人体状态进行划分,我们将人体在监测区域内设置为1,不在监测区域内设置为-1。接下来判断每个人的运动状态,将每个人运动轨迹中,每一帧在图片上的状态统计下来,是1还是-1,并将所有的状态,保存到track_id_status里面

# 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)

越界行为判断,比如某个人前一帧的状态是-1,现在的状态是1,就可以认为该人已经越界了

# 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

喵提醒发送,当整个视频跑完后,就可以得到人流统计整体的数据了。为了及时知道人流的信息状态,我们也可以将最后的结果,以喵提醒的方式进行发送。这部分的代码,可以放在最前面的图片采集中:

### 统计打印人流数量 ###
        # 填写对应的喵码
        id = 'tyfnbnT'
        # 填写喵提醒中,发送的消息,这里放上前面提到的图片外链
        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'}
        result = requests.post(request_url + "id=" + id +"&text=" + text + "&ts=" + ts + "&type=" + type,headers=headers)
        break

整个代码如下:

# aidlux相关
from unittest import result
from wsgiref.util import request_uri
from cvs import *
import aidlite_gpu
from utils import detect_postprocess, is_passing_line, preprocess_img, draw_detect_res
import cv2
# bytetrack
from track.tracker.byte_tracker import BYTETracker
from track.utils.visualize import plot_tracking
import requests
import time


# 加载模型
model_path = '/home/lesson5_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/lesson5_codes/aidlux/video.mp4")
frame_id = 0
count_person = 0
while True:
    frame = cap.read()
    if frame is None:

        ### 相机采集结束 ###
        print("camera is over!")
        ### 统计打印人流数量 ###
        # 填写对应的喵码
        id = 'tyfnbnT'
        # 填写喵提醒中,发送的消息,这里放上前面提到的图片外链
        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'}
        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.绘制越界监测区域
            # points = [[593,176],[904,243],[835,323],[507,259]]
            # color_light_green=(144, 238, 144)  ##浅绿色
            # res_img = process_points(res_img,points,color_light_green)
            
            ### 人流计数识别功能实现 ###
            # 1.绘制统计人流线
            lines = [[186,249],[1235,366]]
            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)
                    count_person +=1

                # # 5.越界识别+喵提醒
                # # 填写对应的喵码
                # id = 'tP48aPC'
                # # 填写喵提醒中,发送的消息,这里放上前面提到的图片外链
                # 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)

    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)

在视频运行完后,手机上还会收到一个喵提醒的提示

公众号喵提醒

3.学习心得

 在学习的过程中,我跟着大白老师,体验了项目部署的各个流程,从开始下载Vscode和Aidlux,再到连接Vscode和Aidlux,在电脑端完成手机端代码的编辑,通过云服务器训练⼈体检测模型,并将训练好的yolov5部署在手机端,接着引入目标追踪算法实现对行人的追踪,最后通过划定区域统计越过该区域的人数,将人体检测、人体追踪和业务功能结合起来完成人流统计。在训练营的每个阶段,都收益颇丰,特别感谢大白老师以及本次训练营工作人员所做的一切努力!

4.AidLux使用心得

由于边缘设备大都是硬件,而大部分人身边并没有边缘设备硬件,在对边缘设备一无所知的情况下购买硬件设备,着实不是明智之举,而Aidlux边缘设备软件则有效的解决了这一问题。AidLux边缘设备软件,为我们提供了一个可以在安卓手机上开发和部署的环境,并且内置了各种AI案例参考,这个环境和现实的边缘计算设备AidBox基本一样,而且Aidlux的部署十分友好,运行较为稳定。走完Aidluxd的部署流程,对以后在边缘设备的真实部署有事半功倍的效果。如果还有进一步的项目运行或者实验需要,在Aidlux边缘设备软件使用的基础上可以购买硬件设备,将是一种很好的体验。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值