佟年为韩商言做的网站,平面设计概述,桂林人论坛爆料,大连模板建站哪家好【CanMV K230 AI视觉】 跌倒检测 跌倒检测 动态测试效果可以去下面网站自己看。
B站视频链接#xff1a;已做成合集 抖音链接#xff1a;已做成合集 跌倒检测
跌倒检测主要根据人体姿态来判断#xff0c;可以用于老人、小孩跌倒监护。 实验名称#xff1a;跌倒检测
实验… 【CanMV K230 AI视觉】 跌倒检测 跌倒检测 动态测试效果可以去下面网站自己看。
B站视频链接已做成合集 抖音链接已做成合集 跌倒检测
跌倒检测主要根据人体姿态来判断可以用于老人、小孩跌倒监护。 实验名称跌倒检测
实验平台01Studio CanMV K230
教程wiki.01studio.cc
from libs.PipeLine import PipeLine, ScopedTiming
from libs.AIBase import AIBase
from libs.AI2D import Ai2d
import os
import ujson
from media.media import *
from time import *
import nncase_runtime as nn
import ulab.numpy as np
import time
import utime
import image
import random
import gc
import sys
import aicube# 自定义跌倒检测类继承自AIBase基类
class FallDetectionApp(AIBase):def __init__(self, kmodel_path, model_input_size, labels, anchors, confidence_threshold0.2, nms_threshold0.5, nms_optionFalse, strides[8,16,32], rgb888p_size[224,224], display_size[1920,1080], debug_mode0):super().__init__(kmodel_path, model_input_size, rgb888p_size, debug_mode) # 调用基类的构造函数self.kmodel_path kmodel_path # 模型文件路径self.model_input_size model_input_size # 模型输入分辨率self.labels labels # 分类标签self.anchors anchors # 锚点数据用于跌倒检测self.strides strides # 步长设置self.confidence_threshold confidence_threshold # 置信度阈值self.nms_threshold nms_threshold # NMS非极大值抑制阈值self.nms_option nms_option # NMS选项self.rgb888p_size [ALIGN_UP(rgb888p_size[0], 16), rgb888p_size[1]] # sensor给到AI的图像分辨率并对宽度进行16的对齐self.display_size [ALIGN_UP(display_size[0], 16), display_size[1]] # 显示分辨率并对宽度进行16的对齐self.debug_mode debug_mode # 是否开启调试模式self.color [(255,0, 0, 255), (255,0, 255, 0), (255,255,0, 0), (255,255,0, 255)] # 用于绘制不同类别的颜色# Ai2d实例用于实现模型预处理self.ai2d Ai2d(debug_mode)# 设置Ai2d的输入输出格式和类型self.ai2d.set_ai2d_dtype(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8)# 配置预处理操作这里使用了pad和resizeAi2d支持crop/shift/pad/resize/affine具体代码请打开/sdcard/app/libs/AI2D.py查看def config_preprocess(self, input_image_sizeNone):with ScopedTiming(set preprocess config, self.debug_mode 0): # 计时器如果debug_mode大于0则开启ai2d_input_size input_image_size if input_image_size else self.rgb888p_size # 初始化ai2d预处理配置默认为sensor给到AI的尺寸可以通过设置input_image_size自行修改输入尺寸top, bottom, left, right self.get_padding_param() # 获取padding参数self.ai2d.pad([0, 0, 0, 0, top, bottom, left, right], 0, [0,0,0]) # 填充边缘self.ai2d.resize(nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) # 缩放图像self.ai2d.build([1,3,ai2d_input_size[1],ai2d_input_size[0]],[1,3,self.model_input_size[1],self.model_input_size[0]]) # 构建预处理流程# 自定义当前任务的后处理results是模型输出array的列表这里使用了aicube库的anchorbasedet_post_process接口def postprocess(self, results):with ScopedTiming(postprocess, self.debug_mode 0):dets aicube.anchorbasedet_post_process(results[0], results[1], results[2], self.model_input_size, self.rgb888p_size, self.strides, len(self.labels), self.confidence_threshold, self.nms_threshold, self.anchors, self.nms_option)return dets# 绘制检测结果到画面上def draw_result(self, pl, dets):with ScopedTiming(display_draw, self.debug_mode 0):if dets:pl.osd_img.clear() # 清除OSD图像for det_box in dets:# 计算显示分辨率下的坐标x1, y1, x2, y2 det_box[2], det_box[3], det_box[4], det_box[5]w (x2 - x1) * self.display_size[0] // self.rgb888p_size[0]h (y2 - y1) * self.display_size[1] // self.rgb888p_size[1]x1 int(x1 * self.display_size[0] // self.rgb888p_size[0])y1 int(y1 * self.display_size[1] // self.rgb888p_size[1])x2 int(x2 * self.display_size[0] // self.rgb888p_size[0])y2 int(y2 * self.display_size[1] // self.rgb888p_size[1])# 绘制矩形框和类别标签pl.osd_img.draw_rectangle(x1, y1, int(w), int(h), colorself.color[det_box[0]], thickness2)pl.osd_img.draw_string_advanced(x1, y1-50, 32, self.labels[det_box[0]] str(round(det_box[1],2)), colorself.color[det_box[0]])else:pl.osd_img.clear()# 获取padding参数def get_padding_param(self):dst_w self.model_input_size[0]dst_h self.model_input_size[1]input_width self.rgb888p_size[0]input_high self.rgb888p_size[1]ratio_w dst_w / input_widthratio_h dst_h / input_highif ratio_w ratio_h:ratio ratio_welse:ratio ratio_hnew_w int(ratio * input_width)new_h int(ratio * input_high)dw (dst_w - new_w) / 2dh (dst_h - new_h) / 2top int(round(dh - 0.1))bottom int(round(dh 0.1))left int(round(dw - 0.1))right int(round(dw - 0.1))return top, bottom, left, rightif __name__ __main__:# 显示模式默认hdmi,可以选择hdmi和lcddisplay_modelcdif display_modehdmi:display_size[1920,1080]else:display_size[800,480]# 设置模型路径和其他参数kmodel_path /sdcard/app/tests/kmodel/yolov5n-falldown.kmodelconfidence_threshold 0.3nms_threshold 0.45rgb888p_size [1920, 1080]labels [Fall,NoFall] # 模型输出类别名称anchors [10, 13, 16, 30, 33, 23, 30, 61, 62, 45, 59, 119, 116, 90, 156, 198, 373, 326] # anchor设置# 初始化PipeLine用于图像处理流程pl PipeLine(rgb888p_sizergb888p_size, display_sizedisplay_size, display_modedisplay_mode)pl.create()# 初始化自定义跌倒检测实例fall_det FallDetectionApp(kmodel_path, model_input_size[640, 640], labelslabels, anchorsanchors, confidence_thresholdconfidence_threshold, nms_thresholdnms_threshold, nms_optionFalse, strides[8,16,32], rgb888p_sizergb888p_size, display_sizedisplay_size, debug_mode0)fall_det.config_preprocess()clock time.clock()try:while True:os.exitpoint() # 检查是否有退出信号clock.tick()img pl.get_frame() # 获取当前帧数据res fall_det.run(img) # 推理当前帧fall_det.draw_result(pl, res) # 绘制结果到PipeLine的osd图像print(res) # 打印结果pl.show_image() # 显示当前的绘制结果gc.collect() # 垃圾回收print(clock.fps()) #打印帧率except Exception as e:sys.print_exception(e) # 打印异常信息finally:fall_det.deinit() # 反初始化pl.destroy() # 销毁PipeLine实例使用类说明FallDetectionApp跌倒检测类