1、前景介绍
目录
(1)Aidlux简介
Aidlux是基于ARM架构的跨生态的(Android/鸿蒙+Linux)一站式AIoT应用快速开发和部署平台APP,通过共享 Linux 内核实现Android 和 Linux 生态融合,为单一设备同时提供Android和Linux运行环境[1]。使用Aidlux的设备能够同时在安卓和Linux系统中运行,通过单个平台完成多终端协同开发、测试、部署等工作[2],简化了开发步骤。Aidlux广泛应用于各智能行业领域场景中实现不同的业务功能,本次课程项目是以安卓手机作为边缘设备进行开发实战操作。Aidlux具体操作使用流程可参考下文课程链接或网络。
2、训练营课程
(1)本节课主要学习智慧安防实战训练营的课程:https://mp.weixin.qq.com/s/3WrTMItNAGt8l2kjjf042w。
(2)学习目的
在接触人工智能以来至今已有半年之久,之前做过一些AI相关的项目,其中包括有缺陷目标检测识别,车辆行人识别,人脸检测等。但并没有真实的应用于具体的项目实战当中。在了解到江大白老师推出的AI相关项目实战之后,极大的激发了自己的学习兴趣,为了进一步了解AI相关实战项目更好的落地,在边缘设备或移动端等设备更好的落地,便参加了本次课程的相关学习。
3、测试完成的作业内容
(1)题目
在学习了越界识别的功能后,采用人体检测+人体追踪+业务功能的方式实现人流统计。
(2)实现效果展示
人流量统计
Vscode远程连接手机端,运行yolov5_overstep.py代码,在手机端和PC网页端能够显示运行效果,本文视频中的测试视频来源网络侵删。通过手机端的“喵提醒”公众号进行最终人流量统计数信息接受,结果如下图1所示。
图1
(3)实现代码
运行yolov5_overstep.py完整代码如下所示,详细内容请查阅代码注解,完整项目代码可参考课程代码。
# aidlux相关
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 #isInsidePolygon循环引用
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/self.mp4")
frame_id = 0
count_person = 0
while True:
frame = cap.read()
if frame is None:
## 相机采集结束 ##
print("camera is over")
## 统计打印人流数量 ##
# 填写对应的喵码
id = 'tGiP4C0'
# 填写喵提醒中,发送的消息,这里放上前面提到的图片外链
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 += 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 = [[500,10],[300,710]]
cv2.line(res_img,(500,10),(300,710),(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_count:"+str(count_person), (20,20), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,255), 1)
cvs.imshow(res_img)
4、学习心得
该课程进行了详细的操作步骤讲解,操作简单易懂,容易上手。通过本次课程学习不仅接触到了Ailudx这个方便的开发平台,学会了如何使用Aidlux在手机端进行模型部署,真实感受到了AI模型落地的相关流程,为后续的学习提供强有力的支撑。Aidlux平台操作起来方便,AI功能易于实现,运行过程中基本没有出现过任何大的问题,后期会继续使用该平台进行AI项目落地开发。
参考