摔倒检测

  • 数据集来源
    • 数据的处理
    • 模型训练

数据集来源

开始使用目标检测检测人体,再通过宽高比值变化来判断是否摔倒,该方法在密集场景不管用,所以想着找一个摔倒数据集来进行检测是否摔倒,附上数据集来源:
中国华录杯——定向算法赛(人体摔倒姿态识别)这个训练集数据集我没有找到,官网下载的也只是未标注的测试集
Le2i Fall detection Dataset
• Annotations

  • 标签格式为txt格式
  • 标签前两行为跌倒帧数的起始与终止点,也存在没有这两行的文件
  • 之后一行就是六个字段,帧编号, XX,人物bbx

Le2i Fall detection Dataset 原文下载速度不敢恭维,附上 百度云下载链接, 提取码:qghr
中国华录杯——定向算法赛(人体摔倒姿态识别)测试集,无标注,自己找的一些算法打的标注,还算过得去,需要自取百度云 百度云下载链接 , 提取码:asdh
以上两个数据集要是侵权了会删除

数据的处理

Le2i Fall detection Dataset数据转换成voc格式的xml文件:

  1. 数据集解压后如下图,不知道有两个场景是没有标注文件的,号称假摔,所以我把他删了

  2. 解压后运行如下代码
# coding=utf-8
"""
@Time: 2021/3/9 10:23
@IDE: PyCharm
@Author: chengzhang
@File: processVideo.py
"""
import os
from tqdm import tqdm
import cv2
from xml.dom.minidom import Documentcount = 0def process(fileDir):dataset = [os.path.join(fileDir, i) for i in os.listdir(fileDir)]for dir in dataset:Annotation = os.path.join(dir, "Annotation_files")Annotations = [os.path.join(Annotation, i) for i in os.listdir(Annotation)]for ann in tqdm(Annotations):txt = open(ann).readlines()if len(txt[0].split(',')) < 2:videoPath = ann.replace('Annotation_files', 'Videos').replace('.txt', '.avi')start, end = int(txt[0].replace('\n', '')), int(txt[1].replace('\n', ''))video(videoPath, txt, start, end)def video(videoPath, txt, start, end):global countvs = cv2.VideoCapture(videoPath)ind = 1while True:success, frame = vs.read()if frame is None:breakif (ind + 8) >= start and ind <= end:Jpg = '{:06d}.jpg'.format(count)outPutJpg = os.path.join(save, Jpg)outPutXML = outPutJpg.replace('jpg', 'xml')cv2.imwrite(outPutJpg, frame)count += 1imgShape = frame.shapeinfo = txt[ind].replace('\n', '').split(',')_, _, xmin, ymin, xmax, ymax = infobboxsInfo = [[int(xmin), int(ymin), int(xmax), int(ymax)]]bbox2xml(bboxsInfo, imgShape, Jpg, outPutXML)ind += 1def bbox2xml(bboxsInfo, imgShape, outPutJpg, outPutXML):# for boxInfo in bboxsInfo:xmlBuilder = Document()annotation = xmlBuilder.createElement("annotation")  # 创建annotation标签xmlBuilder.appendChild(annotation)Pheight, Pwidth, Pdepth = imgShapefolder = xmlBuilder.createElement("folder")  # folder标签folderContent = xmlBuilder.createTextNode("VOC2007")folder.appendChild(folderContent)annotation.appendChild(folder)filename = xmlBuilder.createElement("filename")  # filename标签filenameContent = xmlBuilder.createTextNode(outPutJpg)filename.appendChild(filenameContent)annotation.appendChild(filename)size = xmlBuilder.createElement("size")  # size标签width = xmlBuilder.createElement("width")  # size子标签widthwidthContent = xmlBuilder.createTextNode(str(Pwidth))width.appendChild(widthContent)size.appendChild(width)height = xmlBuilder.createElement("height")  # size子标签heightheightContent = xmlBuilder.createTextNode(str(Pheight))height.appendChild(heightContent)size.appendChild(height)depth = xmlBuilder.createElement("depth")  # size子标签depthdepthContent = xmlBuilder.createTextNode(str(Pdepth))depth.appendChild(depthContent)size.appendChild(depth)annotation.appendChild(size)for bbox in bboxsInfo:label = "fall"box_xmin, box_ymin, box_xmax, box_ymax = bboxobject = xmlBuilder.createElement("object")picname = xmlBuilder.createElement("name")nameContent = xmlBuilder.createTextNode(label)picname.appendChild(nameContent)object.appendChild(picname)pose = xmlBuilder.createElement("pose")poseContent = xmlBuilder.createTextNode("Unspecified")pose.appendChild(poseContent)object.appendChild(pose)truncated = xmlBuilder.createElement("truncated")truncatedContent = xmlBuilder.createTextNode("0")truncated.appendChild(truncatedContent)object.appendChild(truncated)difficult = xmlBuilder.createElement("difficult")difficultContent = xmlBuilder.createTextNode("0")difficult.appendChild(difficultContent)object.appendChild(difficult)bndbox = xmlBuilder.createElement("bndbox")xmin = xmlBuilder.createElement("xmin")xminContent = xmlBuilder.createTextNode(str(box_xmin))xmin.appendChild(xminContent)bndbox.appendChild(xmin)ymin = xmlBuilder.createElement("ymin")yminContent = xmlBuilder.createTextNode(str(box_ymin))ymin.appendChild(yminContent)bndbox.appendChild(ymin)xmax = xmlBuilder.createElement("xmax")xmaxContent = xmlBuilder.createTextNode(str(box_xmax))xmax.appendChild(xmaxContent)bndbox.appendChild(xmax)ymax = xmlBuilder.createElement("ymax")ymaxContent = xmlBuilder.createTextNode(str(box_ymax))ymax.appendChild(ymaxContent)bndbox.appendChild(ymax)object.appendChild(bndbox)annotation.appendChild(object)f = open(outPutXML, 'w')xmlBuilder.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='utf-8')f.close()if __name__ == '__main__':fileDir = r"E:\数据集\FallDataset\dataset"  # 源数据集路径save = r"E:\数据集\FallDataset\FallDataset"  # 保存voc格式路径process(fileDir)

模型训练

  1. 使用U神的yolov5,链接
  2. 将voc格式的数据集转换成yolov5所需要的格式,数据格式如下:其中txt标注为下面代码生成的归一化数据
# coding=utf-8
"""
@Time: 2020/9/17 9:07
@IDE: PyCharm
@Author: chengzhang
@File: voc2v5.py
"""
import os
import glob
from tqdm import tqdm
import xml.etree.ElementTree as ET
import shutil
import argparse
from random import shuffle
import cv2def check_x_y_w_h(norm_x, norm_y, norm_w, norm_h):norm_x = 0.00001 if norm_x <= 0 else norm_xnorm_x = 0.99999 if norm_x >= 1 else norm_xnorm_y = 0.00001 if norm_y <= 0 else norm_ynorm_y = 0.99999 if norm_y >= 1 else norm_ynorm_w = 0.00001 if norm_w <= 0 else norm_wnorm_w = 0.99999 if norm_w >= 1 else norm_wnorm_h = 0.00001 if norm_h <= 0 else norm_hnorm_h = 0.99999 if norm_h >= 1 else norm_hreturn norm_x, norm_y, norm_w, norm_hdef convert(size, box):dw = 1. / (size[0])dh = 1. / (size[1])x = (box[0] + box[1]) / 2.0 - 1y = (box[2] + box[3]) / 2.0 - 1w = box[1] - box[0]h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhx, y, w, h = check_x_y_w_h(x, y, w, h)return (x, y, w, h)def write_txt(train_xml, dataset):with open(dataset, "w", encoding="utf-8") as f:for xml in tqdm(train_xml):f.write(xml.replace('.xml', '.jpg') + '\n')target_label_txt = xml.replace('.xml', '.txt')img = cv2.imread(xml.replace('.xml', '.jpg'))h, w, c = img.shape# 输入文件xmlin_file = open(xml)# 输出label txtout_file = open(target_label_txt, 'w')tree = ET.parse(in_file)root = tree.getroot()for obj in root.iter('object'):try:cls = obj.find('name').textexcept:continueif cls not in classes:continuexmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))bb = convert((w, h), b)out_file.write(str(0) + " " + " ".join([str(a) for a in bb]) + '\n')def check_dir(dir):try:shutil.rmtree(dir)except:os.makedirs(dir)if not os.path.exists(dir):os.makedirs(dir)def parse_annotation(img_dir):all_imgs = []all_xmls = []for tmpdir in img_dir:for home, dirs, files in os.walk(tmpdir):for filename in files:# 文件名列表,包含完整路径if filename.endswith((".jpg", ".jpeg", ".png")):filePath = os.path.join(home, filename)all_imgs.append(filePath)elif filename.endswith(".xml"):filePath = os.path.join(home, filename)all_xmls.append(filePath)return all_xmlsif __name__ == '__main__':classes = ['fall']parser = argparse.ArgumentParser()parser.add_argument("--train_txt", default="/data/share/imageAlgorithm/zhangcheng/code/yolov5/data/train_fall.txt")parser.add_argument("--test_txt", default="/data/share/imageAlgorithm/zhangcheng/code/yolov5/data/val_fall.txt")flags = parser.parse_args()imgPathList = ["/data/share/imageAlgorithm/zhangcheng/dataset/falldataset/FallDataset/","/data/share/imageAlgorithm/zhangcheng/dataset/falldataset/FallDataset_A/"]dataset = parse_annotation(imgPathList)shuffle(dataset)num = len(dataset)trainNum = int(0.9 * num)trainList = dataset[: trainNum]testList = dataset[trainNum:]write_txt(trainList, flags.train_txt)write_txt(testList, flags.test_txt)
  1. 根据上面处理的数据进行训练
CUDA_VISIBLE_DEVICES=4,5,6,7 nohup python train.py --img 640 --batch 16 --epochs 600 --data ./data/fallDown.yaml --weights ./weights/yolov5l.pt > train_fall.log 2>&1 &
  1. 训练曲线如下:
    30个epoch结果

摔倒检测+yolov5相关推荐

  1. Python+Yolov5跌倒检测 摔倒检测 人物目标行为 人体特征识别

    Python+Yolov5跌倒检测 摔倒检测 人物目标行为 人体特征识别 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对<<Python+ ...

  2. 用AidLux跑老人摔倒检测项目,看AI助老轻松落地

    据国家卫健委预计,到2035年,我国60岁及以上老年人口数量将突破4亿,在总人口中的占比将超过30%. 届时我国将进入重度老龄化阶段.面对日益严峻的老龄化趋势,AI助老.智慧养老被加速提上日程. 对于 ...

  3. 摔跤视频软件测试,Apple Watch 4摔倒检测立功:成功救人一命,网友:马上入手!...

    原标题:Apple Watch 4摔倒检测立功:成功救人一命,网友:马上入手! 在2018年的苹果秋季发布会上,iPhone XS系列无疑是整场发布会的主角,不过同时推出的Apple Watch Se ...

  4. 摔倒、摔倒检测数据集

    近期学习摔倒检测,接触摔倒数据集,自学笔记,仅用作个人复习. the UR fall detection dataset (URFD) the fall detection dataset (FDD) ...

  5. 目标检测 YOLOv5 - 模型的样子

    目标检测 YOLOv5 - 模型的样子 flyfish 文章目录 目标检测 YOLOv5 - 模型的样子 开始加载模型文件 模型的层 模型的属性 模块的名称以及模块本身 模型的权重 模型权重的名字和权 ...

  6. 目标检测 YOLOv5 - ncnn模型的加密 C++实现封装库和Android调用库示例

    目标检测 YOLOv5 - ncnn模型的加密 C++实现封装库和Android调用库示例 flyfish 文章目录 目标检测 YOLOv5 - ncnn模型的加密 C++实现封装库和Android调 ...

  7. 《深度学习与目标检测 YOLOv5》

    <深度学习与目标检测 YOLOv5> flyfish 基础 深度学习基础 - 向量 深度学习基础 - 累加符号和连乘符号 深度学习基础 - 最大似然估计 深度学习基础 - 朴素贝叶斯 深度 ...

  8. 计算机视觉摔倒检测,有关摔倒检测数据集(fall detection databases)

    近期学习摔倒检测,接触摔倒数据集,自学笔记,仅用作个人复习. the UR fall detection dataset (URFD) the fall detection dataset (FDD) ...

  9. 姿态检测 树莓派_基于深度学习的树莓派老人摔倒检测系统的制作方法

    本发明属于电子器件技术领域,涉及基于深度学习的树莓派老人摔倒检测系统. 背景技术: 日益庞大的老年群体已成为人们关注的焦点.由于老年人身体活动不便等特点,摔倒已成为我国人员伤亡的第四位原因,而意外摔倒 ...

最新文章

  1. 吴恩达新动作:建立全新机器学习资源Hub,「以数据为中心的AI」大本营
  2. 测温枪的工作原理全面解析,如何测出你的温度
  3. show line numbers
  4. 3.2.1 造成误差的原因分析
  5. ATL服务器:用 Visual C++创建的高性能的Web应用程序和XML Web 服务
  6. 计算机的主要危害是什么意思,cpu使用率是什么意思 cpu使用率低但是电脑卡原因...
  7. 笔记-高项案例题-2015年上-进度管理-质量管理
  8. Jmeter进行分布式性能测试
  9. 极度 YM....自己用trie写了个伪 map....( HDU 1075 )
  10. django 学习 (四) 模板标签
  11. CVPR 2022数据集汇总|包含目标检测、多模态等方向
  12. 网上很多NV21数据直接使用BitmapFactory的代码是错误的
  13. sas编程技术教程 人大经济论坛sas培训
  14. 纯英文拼音交流1声应该表示成0,要不就不知道怎么发音
  15. 在Markdown编辑器中输入上标下标
  16. HTML基础,大三老学姐在线总结
  17. 什么是软文推广?如何才能把软文推广的更好呢?
  18. 对华锐风电的一些看法
  19. html实训报告致谢,学术论文致谢词范文
  20. 对linux系统4T硬盘分区

热门文章

  1. 《痞子衡嵌入式半月刊》 第 28 期
  2. C语言学习11:strlen()函数详解
  3. 简约大气昼夜wordpress免费导航主题
  4. 面试-Java【之】(revers)递归实现字符串倒序排列(详解)
  5. 关于我一不小心拆了个USB2.0拓展坞这件事——浅谈HS8836A芯片
  6. 大小超过2T的磁盘分区规划,parted命令
  7. 音乐电台“淘漉音乐”
  8. 大学十年(一个程序员的路程
  9. 阿朱:从50到5000,从技术到人
  10. 杰奇采集分页 php,杰奇自定义分页代码,教程及案例