config.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. # -*- coding: utf-8 -*-
  2. # @Time : 2022/6/24 15:18
  3. # @Author : MaochengHu
  4. # @Email : wojiaohumaocheng@gmail.com
  5. # @File : config.py
  6. # @Project : person_monitor
  7. import os
  8. import argparse
  9. # -------------------------- 常规配置参数 ------------------------------- #
  10. # 项目根路径
  11. pro_root = "/data2/humaocheng/person_monitor"
  12. # 依赖根路径
  13. dependence_root = os.path.join(pro_root, "dependence")
  14. # 模型根路径
  15. model_root = os.path.join(pro_root, "dev/src/algorithms/save_models")
  16. # 测试文件(可以是本地视频文件也可以是在线视频流地址)
  17. # input_source = "rtsp://admin:sunwin2019@192.168.20.240:554/h265/ch1/main/av_stream"
  18. input_source = "/data2/humaocheng/person_monitor/dev/test/demo.mp4"
  19. # 使用GPU索引
  20. cuda_index = 0
  21. item_max_size = 60 # 保留多少帧进行动作识别
  22. # 保存结果
  23. save_result = True # 是否将识别出来的结果进行保存
  24. use_keypoint = True # 是否通过关键点进行行为识别,如果不用关键点则直接基于视频裁剪进行行为识别
  25. # ---------------------- 人物目标检测配置参数 --------------------------------#
  26. # 模型加载参数
  27. object_detection_model_config = dict(
  28. pt_weights=os.path.join(model_root, "object_detection_model", "person_detection.engine"), # 目标检测的权重地址
  29. data=os.path.join(model_root, "object_detection_model", "person.yaml"), # 目标检测对应的类别文件
  30. imgsz=(640, 640), # 表示图片大小,不通的yolo模型需要对应不同的输入大小(不宜修改)
  31. device=cuda_index, # GPU索引
  32. confthre=0.001, # 做跟踪所以置信度需要很小, 保证丢失目标能补上
  33. nmsthre=0.7, # nms阈值大小
  34. max_det=20 # 设置最大检测人数
  35. )
  36. person_attr = ["play_phone", "", "sleep", "work"]
  37. # ----------------------- 人物属性检测模型配置参数 ---------------------------- #
  38. # 模型加载参数
  39. person_attribute_model_config = dict(
  40. pt_weights=os.path.join(model_root, "object_detection_model", "attribute.pt"), # 目标检测的权重地址
  41. data=os.path.join(model_root, "object_detection_model", "person.yaml"), # 目标检测对应的类别文件
  42. imgsz=(640, 640), # 表示图片大小,不通的yolo模型需要对应不同的输入大小(不宜修改)
  43. device=cuda_index, # GPU索引
  44. confthre=0.6, # 目标置信度
  45. nmsthre=0.7, # nms阈值大小
  46. )
  47. # 人物状态类别
  48. person_class_list = ["play_phone", "call_phone", "sleep", "work"]
  49. # 安全帽佩戴状态类别
  50. helmet_class_list = ["no_helmet", "helmet"]
  51. # ----------------------- 人体跟踪模型配置参数 ---------------------------- #
  52. tracker_max_id = 100 # 建议大于等于max_det的5倍及以上
  53. tracker_model_config = dict(
  54. track_thresh=0.5, # 跟踪人体置信度
  55. track_buffer=30, # 如果人体框丢失多少帧则不进行追回
  56. match_thresh=0.8, # 相似度匹配阈值多少算匹配上
  57. mot20=False, # 是否使用mot20 计算
  58. tracker_max_id=tracker_max_id, # 最多跟踪多少人, 如果超过该人数, 则重新计数
  59. )
  60. # 生成跟踪参数解析器
  61. tracker_parser = argparse.ArgumentParser()
  62. for k, v in tracker_model_config.items():
  63. tracker_parser.add_argument("--{}".format(k), default=v)
  64. tracker_args = tracker_parser.parse_args()
  65. #
  66. tracker_frame_rate = 30 # 跟踪视频的fps的值
  67. min_box_area = 10 # 小于多少的边不进行识别
  68. output_side_size = 640 # 如果不进行关键点识别,直接基于视频识别,则需要进行padding裁剪对应的输出图片大小
  69. tracker_line_size = 90 # 设置人体行为轨迹跟踪线长度
  70. # ----------------------- 关键点模型配置参数 ---------------------------- #
  71. pose_name = "tiny_pose"
  72. pose_model_platform = "paddle" # 目前仅仅支持paddle(飞浆) 以及 mmpose 平台
  73. pose_trt = True # 是否使用tensorrt加速
  74. if pose_model_platform == "paddle":
  75. if pose_trt:
  76. run_mode = "trt_fp32"
  77. else:
  78. run_mode = "paddle"
  79. keypoint_model_config = dict(model_dir=os.path.join(model_root, "pose_model/tinypose_256x192"),
  80. device="gpu:{}".format(cuda_index),
  81. trt_calib_mode=True,
  82. run_mode=run_mode,
  83. enable_mkldnn=True,
  84. batch_size=8,
  85. threshold=0.5
  86. )
  87. elif pose_model_platform == "mmpose":
  88. if pose_trt:
  89. keypoint_model_config = dict(model_config_path=os.path.join(model_root,
  90. "mspn50_coco_256x192_topdown_heatmap/mspn50_coco_256x192.py "),
  91. deploy_config_path=os.path.join(model_root,
  92. "mspn50_coco_256x192_topdown_heatmap/pose-detection_tensorrt_static-256x192.py"),
  93. device="cuda:{}".format(cuda_index),
  94. checkpoint=[os.path.join(model_root,
  95. "mspn50_coco_256x192_topdown_heatmap/end2end.engine")]
  96. )
  97. else:
  98. keypoint_model_config = dict(model_config_path=os.path.join(model_root,
  99. "mspn50_coco_256x192_topdown_heatmap/mspn50_coco_256x192.py"),
  100. device="cuda:{}".format(cuda_index),
  101. checkpoint=os.path.join(model_root,
  102. "mspn50_coco_256x192_topdown_heatmap/mspn50_coco_256x192-8fbfb5d0_20201123.pth")
  103. )
  104. # ------------------------- 行为识别模型配置参数 ------------------------ #
  105. if use_keypoint:
  106. action_config_root = os.path.join(model_root, "action_model/stgcn_80e_ntu60_xsub_keypoint")
  107. save_kp_npy = False # 是否需要保留关键点姿态采集, 采集骨骼关键点, 并画出对应的骨骼关键点视频
  108. dataset_format = 'TopDownCocoDataset'
  109. class_name = "fall" # run, jump .etc # 需要采集的骨骼关键点对应的动作类别
  110. npy_output_dir = os.path.join(pro_root, "test_npy/{}".format(class_name))
  111. if save_kp_npy:
  112. if not os.path.exists(npy_output_dir):
  113. os.makedirs(npy_output_dir)
  114. action_model_config = dict(
  115. model_config_path=os.path.join(action_config_root, "stgcn_80e_ntu60_xsub_keypoint_customer.py"),
  116. checkpoint=os.path.join(action_config_root, "best_top1_acc_epoch_26.pth"),
  117. action_label=os.path.join(pro_root, "dev/configs/customer_action.txt"),
  118. device="cuda:{}".format(cuda_index),
  119. item_max_size=item_max_size, # 保留多少帧进行动作识别
  120. save_kp_npy=save_kp_npy,
  121. dataset_format=dataset_format,
  122. npy_output_dir=npy_output_dir
  123. )
  124. # ----------------------- 人群聚集检测配置参数 ---------------------------- #
  125. eps = 100 # 人员聚类距离
  126. min_samples = 2 # 簇最少人数
  127. # ----------------------- 人员入侵配置参数 ------------------------------- #
  128. limited_area = (800, 200, 1000, 600) # 对应限制区域的画面坐标
  129. # -------------------------- 显示结果配置参数 ---------------------------- #
  130. show_result = True # 是否需要展示效果
  131. show_config = dict(kps_threshold=0.3, draw_point_num=30) # 关键点的展示阈值以及需要画跟踪点的长度