انتقل إلى المحتوى

مرجع ل ultralytics/hub/utils.py

ملاحظه

هذا الملف متاح في https://github.com/ultralytics/ultralytics/ نقطة / الرئيسية /ultralytics/hub/utils.py. إذا اكتشفت مشكلة ، فيرجى المساعدة في إصلاحها من خلال المساهمة في طلب 🛠️ سحب. شكرا لك 🙏!



ultralytics.hub.utils.Events

فئة لجمع تحليلات الأحداث المجهولة. يتم تمكين تحليلات الأحداث عند المزامنة = True في الإعدادات و معطل عند المزامنة = خطأ. تشغيل 'yolo 'لرؤية وتحديث إعدادات ملف YAML.

سمات:

اسم نوع وصف
url str

عنوان URL لإرسال أحداث مجهولة.

rate_limit float

حد المعدل بالثواني لإرسال الأحداث.

metadata dict

قاموس يحتوي على بيانات وصفية حول البيئة.

enabled bool

علامة لتمكين الأحداث أو تعطيلها بناء على شروط معينة.

شفرة المصدر في ultralytics/hub/utils.py
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197198199 200201202203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228229 230 231 232 233 234 235 236 237 238239 240 241 242 243
class Events:
    """
    A class for collecting anonymous event analytics. Event analytics are enabled when sync=True in settings and
    disabled when sync=False. Run 'yolo settings' to see and update settings YAML file.

    Attributes:
        url (str): The URL to send anonymous events.
        rate_limit (float): The rate limit in seconds for sending events.
        metadata (dict): A dictionary containing metadata about the environment.
        enabled (bool): A flag to enable or disable Events based on certain conditions.
    """

    url = "https://www.google-analytics.com/mp/collect?measurement_id=G-X8NCJYTQXM&api_secret=QLQrATrNSwGRFRLE-cbHJw"

    def __init__(self):
        """Initializes the Events object with default values for events, rate_limit, and metadata."""
        self.events = []  # events list
        self.rate_limit = 60.0  # rate limit (seconds)
        self.t = 0.0  # rate limit timer (seconds)
        self.metadata = {
            "cli": Path(sys.argv[0]).name == "yolo",
            "install": "git" if is_git_dir() else "pip" if is_pip_package() else "other",
            "python": ".".join(platform.python_version_tuple()[:2]),  # i.e. 3.10
            "version": __version__,
            "env": ENVIRONMENT,
            "session_id": round(random.random() * 1e15),
            "engagement_time_msec": 1000,
        }
        self.enabled = (
            SETTINGS["sync"]
            and RANK in (-1, 0)
            and not TESTS_RUNNING
            and ONLINE
            and (is_pip_package() or get_git_origin_url() == "https://github.com/ultralytics/ultralytics.git")
        )

    def __call__(self, cfg):
        """
        Attempts to add a new event to the events list and send events if the rate limit is reached.

        Args:
            cfg (IterableSimpleNamespace): The configuration object containing mode and task information.
        """
        if not self.enabled:
            # Events disabled, do nothing
            return

        # Attempt to add to events
        if len(self.events) < 25:  # Events list limited to 25 events (drop any events past this)
            params = {
                **self.metadata,
                "task": cfg.task,
                "model": cfg.model if cfg.model in GITHUB_ASSETS_NAMES else "custom",
            }
            if cfg.mode == "export":
                params["format"] = cfg.format
            self.events.append({"name": cfg.mode, "params": params})

        # Check rate limit
        t = time.time()
        if (t - self.t) < self.rate_limit:
            # Time is under rate limiter, wait to send
            return

        # Time is over rate limiter, send now
        data = {"client_id": SETTINGS["uuid"], "events": self.events}  # SHA-256 anonymized UUID hash and events list

        # POST equivalent to requests.post(self.url, json=data)
        smart_request("post", self.url, json=data, retry=0, verbose=False)

        # Reset events and rate limit timer
        self.events = []
        self.t = t

__call__(cfg)

يحاول إضافة حدث جديد إلى قائمة الأحداث وإرسال الأحداث إذا تم الوصول إلى حد المعدل.

البارامترات:

اسم نوع وصف افتراضي
cfg IterableSimpleNamespace

كائن التكوين الذي يحتوي على الوضع ومعلومات المهمة.

مطلوب
شفرة المصدر في ultralytics/hub/utils.py
207 208 209 210 211 212 213 214 215 216 217 218219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234235 236 237238239 240 241 242 243
def __call__(self, cfg):
    """
    Attempts to add a new event to the events list and send events if the rate limit is reached.

    Args:
        cfg (IterableSimpleNamespace): The configuration object containing mode and task information.
    """
    if not self.enabled:
        # Events disabled, do nothing
        return

    # Attempt to add to events
    if len(self.events) < 25:  # Events list limited to 25 events (drop any events past this)
        params = {
            **self.metadata,
            "task": cfg.task,
            "model": cfg.model if cfg.model in GITHUB_ASSETS_NAMES else "custom",
        }
        if cfg.mode == "export":
            params["format"] = cfg.format
        self.events.append({"name": cfg.mode, "params": params})

    # Check rate limit
    t = time.time()
    if (t - self.t) < self.rate_limit:
        # Time is under rate limiter, wait to send
        return

    # Time is over rate limiter, send now
    data = {"client_id": SETTINGS["uuid"], "events": self.events}  # SHA-256 anonymized UUID hash and events list

    # POST equivalent to requests.post(self.url, json=data)
    smart_request("post", self.url, json=data, retry=0, verbose=False)

    # Reset events and rate limit timer
    self.events = []
    self.t = t

__init__()

تهيئة كائن الأحداث بالقيم الافتراضية للأحداث rate_limit وبيانات التعريف.

شفرة المصدر في ultralytics/hub/utils.py
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200201202 203 204 205
def __init__(self):
    """Initializes the Events object with default values for events, rate_limit, and metadata."""
    self.events = []  # events list
    self.rate_limit = 60.0  # rate limit (seconds)
    self.t = 0.0  # rate limit timer (seconds)
    self.metadata = {
        "cli": Path(sys.argv[0]).name == "yolo",
        "install": "git" if is_git_dir() else "pip" if is_pip_package() else "other",
        "python": ".".join(platform.python_version_tuple()[:2]),  # i.e. 3.10
        "version": __version__,
        "env": ENVIRONMENT,
        "session_id": round(random.random() * 1e15),
        "engagement_time_msec": 1000,
    }
    self.enabled = (
        SETTINGS["sync"]
        and RANK in (-1, 0)
        and not TESTS_RUNNING
        and ONLINE
        and (is_pip_package() or get_git_origin_url() == "https://github.com/ultralytics/ultralytics.git")
    )



ultralytics.hub.utils.request_with_credentials(url)

قدم طلب AJAX باستخدام ملفات تعريف الارتباط المرفقة في بيئة Google Colab.

البارامترات:

اسم نوع وصف افتراضي
url str

عنوان URL لتقديم الطلب إليه.

مطلوب

ارجاع:

نوع وصف
any

بيانات الاستجابة من طلب AJAX.

يثير:

نوع وصف
OSError

إذا لم يتم تشغيل الوظيفة في بيئة Google Colab.

شفرة المصدر في ultralytics/hub/utils.py
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 5556 57 58 5960 61 62 636465 6667686970717273747576 77
def request_with_credentials(url: str) -> any:
    """
    Make an AJAX request with cookies attached in a Google Colab environment.

    Args:
        url (str): The URL to make the request to.

    Returns:
        (any): The response data from the AJAX request.

    Raises:
        OSError: If the function is not run in a Google Colab environment.
    """
    if not is_colab():
        raise OSError("request_with_credentials() must run in a Colab environment")
    from google.colab import output  # noqa
    from IPython import display  # noqa

    display.display(
        display.Javascript(
            """
            window._hub_tmp = new Promise((resolve, reject) => {
                const timeout = setTimeout(() => reject("Failed authenticating existing browser session"), 5000)
                fetch("%s", {
                    method: 'POST',
                    credentials: 'include'
                })
                    .then((response) => resolve(response.json()))
                    .then((json) => {
                    clearTimeout(timeout);
                    }).catch((err) => {
                    clearTimeout(timeout);
                    reject(err);
                });
            });
            """
            % url
        )
    )
    return output.eval_js("_hub_tmp")



ultralytics.hub.utils.requests_with_progress(method, url, **kwargs)

قم بإجراء طلب HTTP باستخدام الطريقة وعنوان URL المحددين ، مع شريط تقدم اختياري.

البارامترات:

اسم نوع وصف افتراضي
method str

طريقة HTTP التي يجب استخدامها (على سبيل المثال "GET" و "POST").

مطلوب
url str

عنوان URL لإرسال الطلب إليه.

مطلوب
**kwargs dict

وسيطات الكلمات الرئيسية الإضافية لتمريرها إلى الأساس requests.request دالة.

{}

ارجاع:

نوع وصف
Response

كائن الاستجابة من طلب HTTP.

ملاحظه
  • إذا تم تعيين "التقدم" على True ، فسيعرض شريط التقدم تقدم التنزيل للاستجابات ذات طول المحتوى.
  • إذا كان "التقدم" رقما ، عرض شريط التقدم بافتراض طول المحتوى = التقدم.
شفرة المصدر في ultralytics/hub/utils.py
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  
def requests_with_progress(method, url, **kwargs):
    """
    Make an HTTP request using the specified method and URL, with an optional progress bar.

    Args:
        method (str): The HTTP method to use (e.g. 'GET', 'POST').
        url (str): The URL to send the request to.
        **kwargs (dict): Additional keyword arguments to pass to the underlying `requests.request` function.

    Returns:
        (requests.Response): The response object from the HTTP request.

    Note:
        - If 'progress' is set to True, the progress bar will display the download progress for responses with a known
        content length.
        - If 'progress' is a number then progress bar will display assuming content length = progress.
    """
    progress = kwargs.pop("progress", False)
    if not progress:
        return requests.request(method, url, **kwargs)
    response = requests.request(method, url, stream=True, **kwargs)
    total = int(response.headers.get("content-length", 0) if isinstance(progress, bool) else progress)  # total size
    try:
        pbar = TQDM(total=total, unit="B", unit_scale=True, unit_divisor=1024)
        for data in response.iter_content(chunk_size=1024):
            pbar.update(len(data))
        pbar.close()
    except requests.exceptions.ChunkedEncodingError:  # avoid 'Connection broken: IncompleteRead' warnings
        response.close()
    return response



ultralytics.hub.utils.smart_request(method, url, retry=3, timeout=30, thread=True, code=-1, verbose=True, progress=False, **kwargs)

يجعل طلب HTTP باستخدام مكتبة "الطلبات" ، مع إعادة محاولة التراجع الأسي حتى مهلة محددة.

البارامترات:

اسم نوع وصف افتراضي
method str

طريقة HTTP لاستخدامها للطلب. الخيارات هي "نشر" و "الحصول على".

مطلوب
url str

عنوان URL لتقديم الطلب إليه.

مطلوب
retry int

عدد مرات إعادة المحاولة قبل الاستسلام. الافتراضي هو 3.

3
timeout int

مهلة في ثوان وبعد ذلك ستتخلى الوظيفة عن إعادة المحاولة. الافتراضي هو 30.

30
thread bool

ما إذا كنت تريد تنفيذ الطلب في مؤشر ترابط خفي منفصل. الافتراضي هو صواب.

True
code int

معرف للطلب ، يستخدم لأغراض التسجيل. الافتراضي هو -1.

-1
verbose bool

علامة لتحديد ما إذا كان سيتم طباعتها إلى وحدة التحكم أم لا. الافتراضي هو صواب.

True
progress bool

ما إذا كنت تريد إظهار شريط تقدم أثناء الطلب. الافتراضي هو خطأ.

False
**kwargs dict

وسيطات الكلمات الأساسية التي سيتم تمريرها إلى وظيفة الطلبات المحددة في الطريقة.

{}

ارجاع:

نوع وصف
Response

كائن استجابة HTTP. إذا تم تنفيذ الطلب في سلسلة رسائل منفصلة، فترجع "بلا".

شفرة المصدر في ultralytics/hub/utils.py
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138139 140141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158159 160 161 162 163 164 165 166167 168
def smart_request(method, url, retry=3, timeout=30, thread=True, code=-1, verbose=True, progress=False, **kwargs):
    """
    Makes an HTTP request using the 'requests' library, with exponential backoff retries up to a specified timeout.

    Args:
        method (str): The HTTP method to use for the request. Choices are 'post' and 'get'.
        url (str): The URL to make the request to.
        retry (int, optional): Number of retries to attempt before giving up. Default is 3.
        timeout (int, optional): Timeout in seconds after which the function will give up retrying. Default is 30.
        thread (bool, optional): Whether to execute the request in a separate daemon thread. Default is True.
        code (int, optional): An identifier for the request, used for logging purposes. Default is -1.
        verbose (bool, optional): A flag to determine whether to print out to console or not. Default is True.
        progress (bool, optional): Whether to show a progress bar during the request. Default is False.
        **kwargs (dict): Keyword arguments to be passed to the requests function specified in method.

    Returns:
        (requests.Response): The HTTP response object. If the request is executed in a separate thread, returns None.
    """
    retry_codes = (408, 500)  # retry only these codes

    @TryExcept(verbose=verbose)
    def func(func_method, func_url, **func_kwargs):
        """Make HTTP requests with retries and timeouts, with optional progress tracking."""
        r = None  # response
        t0 = time.time()  # initial time for timer
        for i in range(retry + 1):
            if (time.time() - t0) > timeout:
                break
            r = requests_with_progress(func_method, func_url, **func_kwargs)  # i.e. get(url, data, json, files)
            if r.status_code < 300:  # return codes in the 2xx range are generally considered "good" or "successful"
                break
            try:
                m = r.json().get("message", "No JSON message.")
            except AttributeError:
                m = "Unable to read JSON."
            if i == 0:
                if r.status_code in retry_codes:
                    m += f" Retrying {retry}x for {timeout}s." if retry else ""
                elif r.status_code == 429:  # rate limit
                    h = r.headers  # response headers
                    m = (
                        f"Rate limit reached ({h['X-RateLimit-Remaining']}/{h['X-RateLimit-Limit']}). "
                        f"Please retry after {h['Retry-After']}s."
                    )
                if verbose:
                    LOGGER.warning(f"{PREFIX}{m} {HELP_MSG} ({r.status_code} #{code})")
                if r.status_code not in retry_codes:
                    return r
            time.sleep(2**i)  # exponential standoff
        return r

    args = method, url
    kwargs["progress"] = progress
    if thread:
        threading.Thread(target=func, args=args, kwargs=kwargs, daemon=True).start()
    else:
        return func(*args, **kwargs)





تم إنشاء 2023-11-12, اخر تحديث 2023-11-25
المؤلفون: جلين جوشر (3)