basket_cleaning_detect.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import cv2
  2. import torch
  3. from shapely.geometry import box, Polygon
  4. import threading
  5. import numpy as np
  6. from datetime import datetime
  7. from ultralytics import YOLO
  8. from utils.tool import IoU
  9. from globals import stop_event,redis_client
  10. from config import SAVE_IMG_PATH,POST_IMG_PATH4,BASKET_CLEANING_VIDEO_SOURCES,BASKET_CLEANING_MODEL_SOURCES
  11. from globals import basket_suspension_flag,basket_warning_zone_flag,basket_steel_wire_flag
  12. def init_basket_cleaning_detection():
  13. # global platform_setup_steps_detect_num,platform_setup_final_result,platform_setup_steps_img
  14. # platform_setup_final_result=[0]*14
  15. # platform_setup_steps_detect_num=[0]*14
  16. # platform_setup_steps_img=[False]*14
  17. # redis_client.delete("platform_setup_order")
  18. # for i in range(1, 14):
  19. # redis_client.delete(f"platform_setup_{i}")
  20. # redis_client.delete(f"platform_setup_{i}_img")
  21. pass
  22. def start_basket_cleaning_detection(start_events):
  23. threads = []
  24. for model_path, video_source in zip(BASKET_CLEANING_VIDEO_SOURCES, BASKET_CLEANING_MODEL_SOURCES):
  25. event = threading.Event()
  26. start_events.append(event)
  27. thread = threading.Thread(target=process_video, args=(model_path, video_source,event))
  28. threads.append(thread)
  29. thread.daemon=True
  30. thread.start()
  31. # Wait for all threads to complete
  32. for thread in threads:
  33. thread.join()
  34. print("吊篮清洗子线程运行结束")
  35. def point_in_region(point, region):#判断点是否在多边形内
  36. is_inside = cv2.pointPolygonTest(region.reshape((-1, 1, 2)), point, False)
  37. return is_inside >= 0
  38. def process_video(model_path, video_source,start_event):
  39. model = YOLO(model_path)
  40. cap = cv2.VideoCapture(video_source)
  41. while cap.isOpened():
  42. if stop_event.is_set():#控制停止推理
  43. break
  44. success, frame = cap.read()
  45. if success:
  46. # Run YOLOv8 inference on the frame
  47. if cap.get(cv2.CAP_PROP_POS_FRAMES) % 25 != 0:
  48. continue
  49. results = model.predict(frame,conf=0.6,verbose=False)
  50. #悬挂机构区域,分为四个区域
  51. SUSPENSION_REGION = np.array([[[668, 310], [800, 310], [800, 1070], [668, 1070]],
  52. [[1690, 310], [1750, 310], [1750, 710], [1690, 710]],
  53. [[1350, 340], [1405, 340], [1405, 720], [1350, 720]],
  54. [[550, 385], [635, 385], [635, 880], [550, 880]]], np.int32)
  55. STEEL_WIRE_REGION = np.array([[[0, 0], [0, 0], [0, 0], [0, 0]],[[668, 310], [800, 310], [800, 1070], [668, 1070]],[[0, 0], [0, 0], [0, 0], [0, 0]],[[668, 310], [800, 310], [800, 1070], [668, 1070]]], np.int32)#钢丝绳区域,暂时没有钢丝绳的区域
  56. global basket_suspension_flag,basket_warning_zone_flag,basket_steel_wire_flag
  57. for r in results:
  58. if model_path==BASKET_CLEANING_MODEL_SOURCES[0] and not basket_suspension_flag:#D4悬挂机构
  59. boxes=r.boxes.xyxy#人体的检测框
  60. keypoints = r.keypoints.xy
  61. confidences = r.keypoints.conf
  62. for i in range(len(boxes)):
  63. left_elbow, right_elbow, left_wrist, right_wrist = keypoints[i][7:11].tolist()#获取左右手腕和左右肘的坐标
  64. points = [left_elbow, right_elbow, left_wrist, right_wrist]
  65. is_inside1 = all(point_in_region(point, SUSPENSION_REGION[0]) for point in points)
  66. is_inside2 = all(point_in_region(point, SUSPENSION_REGION[1]) for point in points)
  67. is_inside3 = all(point_in_region(point, SUSPENSION_REGION[2]) for point in points)
  68. is_inside4 = all(point_in_region(point, SUSPENSION_REGION[3]) for point in points)
  69. if is_inside1 or is_inside2 or is_inside3 or is_inside4:
  70. basket_suspension_flag=True#悬挂机构
  71. elif model_path==BASKET_CLEANING_MODEL_SOURCES[1]:#D5吊篮悬挂
  72. boxes = r.boxes.xyxy
  73. confidences = r.boxes.conf
  74. classes = r.boxes.cls
  75. basket_warning_zone_flag=False#当检测不到则为False
  76. for i in range(len(boxes)):
  77. x1, y1, x2, y2 = boxes[i].tolist()
  78. confidence = confidences[i].item()
  79. cls = int(classes[i].item())
  80. label = model.names[cls]
  81. if label=='warning_zone':
  82. basket_warning_zone_flag=True
  83. elif model_path==BASKET_CLEANING_MODEL_SOURCES[2]:#D6,pose
  84. boxes=r.boxes.xyxy#人体的检测框
  85. keypoints = r.keypoints.xy
  86. confidences = r.keypoints.conf
  87. for i in range(len(boxes)):
  88. left_elbow, right_elbow, left_wrist, right_wrist = keypoints[i][7:11].tolist()#获取左右手腕和左右肘的坐标
  89. points = [left_elbow, right_elbow, left_wrist, right_wrist]
  90. is_inside1 = all(point_in_region(point, STEEL_WIRE_REGION[0]) for point in points)
  91. is_inside2 = all(point_in_region(point, STEEL_WIRE_REGION[1]) for point in points)
  92. is_inside3 = all(point_in_region(point, STEEL_WIRE_REGION[2]) for point in points)
  93. is_inside4 = all(point_in_region(point, STEEL_WIRE_REGION[3]) for point in points)
  94. if is_inside1 or is_inside2 or is_inside3 or is_inside4:
  95. basket_steel_wire_flag=True#悬挂机构
  96. start_event.set()
  97. else:
  98. # Break the loop if the end of the video is reached
  99. break
  100. # Release the video capture object and close the display window
  101. cap.release()
  102. if torch.cuda.is_available():
  103. torch.cuda.empty_cache()
  104. del model