सामग्री पर जाएं

के लिए संदर्भ ultralytics/solutions/ai_gym.py

नोट

यह फ़ाइल यहाँ उपलब्ध है https://github.com/ultralytics/ultralytics/बूँद/मुख्य/ultralytics/समाधान/ai_gym.py का उपयोग करें। यदि आप कोई समस्या देखते हैं तो कृपया पुल अनुरोध का योगदान करके इसे ठीक करने में मदद करें 🛠️। 🙏 धन्यवाद !



ultralytics.solutions.ai_gym.AIGym

उनके पोज़ के आधार पर रीयल-टाइम वीडियो स्ट्रीम में लोगों के जिम चरणों का प्रबंधन करने के लिए एक वर्ग।

में स्रोत कोड ultralytics/solutions/ai_gym.py
class AIGym:
    """A class to manage the gym steps of people in a real-time video stream based on their poses."""

    def __init__(self):
        """Initializes the AIGym with default values for Visual and Image parameters."""

        # Image and line thickness
        self.im0 = None
        self.tf = None

        # Keypoints and count information
        self.keypoints = None
        self.poseup_angle = None
        self.posedown_angle = None
        self.threshold = 0.001

        # Store stage, count and angle information
        self.angle = None
        self.count = None
        self.stage = None
        self.pose_type = "pushup"
        self.kpts_to_check = None

        # Visual Information
        self.view_img = False
        self.annotator = None

        # Check if environment support imshow
        self.env_check = check_imshow(warn=True)

    def set_args(
        self,
        kpts_to_check,
        line_thickness=2,
        view_img=False,
        pose_up_angle=145.0,
        pose_down_angle=90.0,
        pose_type="pullup",
    ):
        """
        Configures the AIGym line_thickness, save image and view image parameters.

        Args:
            kpts_to_check (list): 3 keypoints for counting
            line_thickness (int): Line thickness for bounding boxes.
            view_img (bool): display the im0
            pose_up_angle (float): Angle to set pose position up
            pose_down_angle (float): Angle to set pose position down
            pose_type (str): "pushup", "pullup" or "abworkout"
        """
        self.kpts_to_check = kpts_to_check
        self.tf = line_thickness
        self.view_img = view_img
        self.poseup_angle = pose_up_angle
        self.posedown_angle = pose_down_angle
        self.pose_type = pose_type

    def start_counting(self, im0, results, frame_count):
        """
        Function used to count the gym steps.

        Args:
            im0 (ndarray): Current frame from the video stream.
            results (list): Pose estimation data
            frame_count (int): store current frame count
        """
        self.im0 = im0
        if frame_count == 1:
            self.count = [0] * len(results[0])
            self.angle = [0] * len(results[0])
            self.stage = ["-" for _ in results[0]]
        self.keypoints = results[0].keypoints.data
        self.annotator = Annotator(im0, line_width=2)

        num_keypoints = len(results[0])

        # Resize self.angle, self.count, and self.stage if the number of keypoints has changed
        if len(self.angle) != num_keypoints:
            self.angle = [0] * num_keypoints
            self.count = [0] * num_keypoints
            self.stage = ["-" for _ in range(num_keypoints)]

        for ind, k in enumerate(reversed(self.keypoints)):
            if self.pose_type in ["pushup", "pullup"]:
                self.angle[ind] = self.annotator.estimate_pose_angle(
                    k[int(self.kpts_to_check[0])].cpu(),
                    k[int(self.kpts_to_check[1])].cpu(),
                    k[int(self.kpts_to_check[2])].cpu(),
                )
                self.im0 = self.annotator.draw_specific_points(k, self.kpts_to_check, shape=(640, 640), radius=10)

            if self.pose_type == "abworkout":
                self.angle[ind] = self.annotator.estimate_pose_angle(
                    k[int(self.kpts_to_check[0])].cpu(),
                    k[int(self.kpts_to_check[1])].cpu(),
                    k[int(self.kpts_to_check[2])].cpu(),
                )
                self.im0 = self.annotator.draw_specific_points(k, self.kpts_to_check, shape=(640, 640), radius=10)
                if self.angle[ind] > self.poseup_angle:
                    self.stage[ind] = "down"
                if self.angle[ind] < self.posedown_angle and self.stage[ind] == "down":
                    self.stage[ind] = "up"
                    self.count[ind] += 1
                self.annotator.plot_angle_and_count_and_stage(
                    angle_text=self.angle[ind],
                    count_text=self.count[ind],
                    stage_text=self.stage[ind],
                    center_kpt=k[int(self.kpts_to_check[1])],
                    line_thickness=self.tf,
                )

            if self.pose_type == "pushup":
                if self.angle[ind] > self.poseup_angle:
                    self.stage[ind] = "up"
                if self.angle[ind] < self.posedown_angle and self.stage[ind] == "up":
                    self.stage[ind] = "down"
                    self.count[ind] += 1
                self.annotator.plot_angle_and_count_and_stage(
                    angle_text=self.angle[ind],
                    count_text=self.count[ind],
                    stage_text=self.stage[ind],
                    center_kpt=k[int(self.kpts_to_check[1])],
                    line_thickness=self.tf,
                )
            if self.pose_type == "pullup":
                if self.angle[ind] > self.poseup_angle:
                    self.stage[ind] = "down"
                if self.angle[ind] < self.posedown_angle and self.stage[ind] == "down":
                    self.stage[ind] = "up"
                    self.count[ind] += 1
                self.annotator.plot_angle_and_count_and_stage(
                    angle_text=self.angle[ind],
                    count_text=self.count[ind],
                    stage_text=self.stage[ind],
                    center_kpt=k[int(self.kpts_to_check[1])],
                    line_thickness=self.tf,
                )

            self.annotator.kpts(k, shape=(640, 640), radius=1, kpt_line=True)

        if self.env_check and self.view_img:
            cv2.imshow("Ultralytics YOLOv8 AI GYM", self.im0)
            if cv2.waitKey(1) & 0xFF == ord("q"):
                return

        return self.im0

__init__()

दृश्य और छवि मापदंडों के लिए डिफ़ॉल्ट मानों के साथ AIGym को प्रारंभ करता है।

में स्रोत कोड ultralytics/solutions/ai_gym.py
12 बांग्लादेश 12 बांग्लादेश14 15 16 17 18 19 20 21 22 23 24 25 26272829 3031 32 33 34 3536 37
def __init__(self):
    """Initializes the AIGym with default values for Visual and Image parameters."""

    # Image and line thickness
    self.im0 = None
    self.tf = None

    # Keypoints and count information
    self.keypoints = None
    self.poseup_angle = None
    self.posedown_angle = None
    self.threshold = 0.001

    # Store stage, count and angle information
    self.angle = None
    self.count = None
    self.stage = None
    self.pose_type = "pushup"
    self.kpts_to_check = None

    # Visual Information
    self.view_img = False
    self.annotator = None

    # Check if environment support imshow
    self.env_check = check_imshow(warn=True)

set_args(kpts_to_check, line_thickness=2, view_img=False, pose_up_angle=145.0, pose_down_angle=90.0, pose_type='pullup')

AIGym line_thickness को कॉन्फ़िगर करता है, छवि को बचाने के लिए और छवि मापदंडों को देखें.

पैरामीटर:

नाम प्रकार विवरण: __________ चूक
kpts_to_check list

गिनती के लिए 3 कीपॉइंट

आवश्यक
line_thickness int

बाउंडिंग बॉक्स के लिए लाइन मोटाई।

2
view_img bool

IM0 प्रदर्शित करें

False
pose_up_angle float

मुद्रा स्थिति सेट करने के लिए कोण

145.0
pose_down_angle float

मुद्रा स्थिति को नीचे सेट करने के लिए कोण

90.0
pose_type str

"पुशअप", "पुलअप" या "एब्वर्कआउट"

'pullup'
में स्रोत कोड ultralytics/solutions/ai_gym.py
39 बांग्लादेश 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 555657585960 61 626364
def set_args(
    self,
    kpts_to_check,
    line_thickness=2,
    view_img=False,
    pose_up_angle=145.0,
    pose_down_angle=90.0,
    pose_type="pullup",
):
    """
    Configures the AIGym line_thickness, save image and view image parameters.

    Args:
        kpts_to_check (list): 3 keypoints for counting
        line_thickness (int): Line thickness for bounding boxes.
        view_img (bool): display the im0
        pose_up_angle (float): Angle to set pose position up
        pose_down_angle (float): Angle to set pose position down
        pose_type (str): "pushup", "pullup" or "abworkout"
    """
    self.kpts_to_check = kpts_to_check
    self.tf = line_thickness
    self.view_img = view_img
    self.poseup_angle = pose_up_angle
    self.posedown_angle = pose_down_angle
    self.pose_type = pose_type

start_counting(im0, results, frame_count)

जिम स्टेप्स को गिनने के लिए इस्तेमाल किया जाने वाला फंक्शन।

पैरामीटर:

नाम प्रकार विवरण: __________ चूक
im0 ndarray

वीडियो स्ट्रीम से वर्तमान फ्रेम।

आवश्यक
results list

अनुमान डेटा प्रस्तुत करें

आवश्यक
frame_count int

वर्तमान फ्रेम गणना स्टोर करें

आवश्यक
में स्रोत कोड ultralytics/solutions/ai_gym.py
66 67 68 69 70 71 72 73 74 75 76 77 78  79 80 81 82 83 84 85 86 87  88 89 90  91   92 93 94    95  96    97 98          99 100   101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128129 130131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148149 150151 152 153 154
def start_counting(self, im0, results, frame_count):
    """
    Function used to count the gym steps.

    Args:
        im0 (ndarray): Current frame from the video stream.
        results (list): Pose estimation data
        frame_count (int): store current frame count
    """
    self.im0 = im0
    if frame_count == 1:
        self.count = [0] * len(results[0])
        self.angle = [0] * len(results[0])
        self.stage = ["-" for _ in results[0]]
    self.keypoints = results[0].keypoints.data
    self.annotator = Annotator(im0, line_width=2)

    num_keypoints = len(results[0])

    # Resize self.angle, self.count, and self.stage if the number of keypoints has changed
    if len(self.angle) != num_keypoints:
        self.angle = [0] * num_keypoints
        self.count = [0] * num_keypoints
        self.stage = ["-" for _ in range(num_keypoints)]

    for ind, k in enumerate(reversed(self.keypoints)):
        if self.pose_type in ["pushup", "pullup"]:
            self.angle[ind] = self.annotator.estimate_pose_angle(
                k[int(self.kpts_to_check[0])].cpu(),
                k[int(self.kpts_to_check[1])].cpu(),
                k[int(self.kpts_to_check[2])].cpu(),
            )
            self.im0 = self.annotator.draw_specific_points(k, self.kpts_to_check, shape=(640, 640), radius=10)

        if self.pose_type == "abworkout":
            self.angle[ind] = self.annotator.estimate_pose_angle(
                k[int(self.kpts_to_check[0])].cpu(),
                k[int(self.kpts_to_check[1])].cpu(),
                k[int(self.kpts_to_check[2])].cpu(),
            )
            self.im0 = self.annotator.draw_specific_points(k, self.kpts_to_check, shape=(640, 640), radius=10)
            if self.angle[ind] > self.poseup_angle:
                self.stage[ind] = "down"
            if self.angle[ind] < self.posedown_angle and self.stage[ind] == "down":
                self.stage[ind] = "up"
                self.count[ind] += 1
            self.annotator.plot_angle_and_count_and_stage(
                angle_text=self.angle[ind],
                count_text=self.count[ind],
                stage_text=self.stage[ind],
                center_kpt=k[int(self.kpts_to_check[1])],
                line_thickness=self.tf,
            )

        if self.pose_type == "pushup":
            if self.angle[ind] > self.poseup_angle:
                self.stage[ind] = "up"
            if self.angle[ind] < self.posedown_angle and self.stage[ind] == "up":
                self.stage[ind] = "down"
                self.count[ind] += 1
            self.annotator.plot_angle_and_count_and_stage(
                angle_text=self.angle[ind],
                count_text=self.count[ind],
                stage_text=self.stage[ind],
                center_kpt=k[int(self.kpts_to_check[1])],
                line_thickness=self.tf,
            )
        if self.pose_type == "pullup":
            if self.angle[ind] > self.poseup_angle:
                self.stage[ind] = "down"
            if self.angle[ind] < self.posedown_angle and self.stage[ind] == "down":
                self.stage[ind] = "up"
                self.count[ind] += 1
            self.annotator.plot_angle_and_count_and_stage(
                angle_text=self.angle[ind],
                count_text=self.count[ind],
                stage_text=self.stage[ind],
                center_kpt=k[int(self.kpts_to_check[1])],
                line_thickness=self.tf,
            )

        self.annotator.kpts(k, shape=(640, 640), radius=1, kpt_line=True)

    if self.env_check and self.view_img:
        cv2.imshow("Ultralytics YOLOv8 AI GYM", self.im0)
        if cv2.waitKey(1) & 0xFF == ord("q"):
            return

    return self.im0





2023-12-02 बनाया गया, अपडेट किया गया 2023-12-02
लेखक: रिज़वानमुनव्वर (1)