timm documentation

البدء السريع

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

البدء السريع

يُعدّ هذا الدليل السريع موجّهًا للمطوّرين الذين هم على أتمّ الاستعداد للغوص في الكود ورؤية مثال على كيفية دمج timm في سير عمل تدريب نماذجهم.

أولاً، ستحتاج إلى تثبيت timm. لمزيد من المعلومات حول التثبيت، راجع التثبيت.

pip install timm

تحميل نموذج مُدرَّب مسبقًا

يمكن تحميل النماذج المُدرَّبة مسبقًا باستخدام create_model().

هنا، نقوم بتحميل النموذج المُدرَّب مسبقًا mobilenetv3_large_100.

>>> import timm

>>> m = timm.create_model('mobilenetv3_large_100', pretrained=True)
>>> m.eval()
Note: The returned PyTorch model is set to train mode by default, so you must call .eval() on it if you plan to use it for inference.

قائمة النماذج ذات الأوزان المُسبقة التدريب

لإدراج النماذج المعبأة مع timm، يمكنك استخدام list_models(). إذا حددت pretrained=True، فستعيد هذه الدالة أسماء النماذج التي تتوفر لها أوزان مسبقة التدريب فقط.

>>> import timm
>>> from pprint import pprint
>>> model_names = timm.list_models(pretrained=True)
>>> pprint(model_names)
[
    'adv_inception_v3',
    'cspdarknet53',
    'cspresnext50',
    'densenet121',
    'densenet161',
    'densenet169',
    'densenet201',
    'densenetblur121d',
    'dla34',
    'dla46_c',
]

يمكنك أيضًا سرد النماذج التي تحتوي على نمط محدد في اسمها.

>>> import timm
>>> from pprint import pprint
>>> model_names = timm.list_models('*resne*t*')
>>> pprint(model_names)
[
    'cspresnet50',
    'cspresnet50d',
    'cspresnet50w',
    'cspresnext50',
    ...
]

ضبط نموذج مُدرَّب مسبقًا

يمكنك ضبط أي من النماذج المُدرَّبة مسبقًا عن طريق تغيير المُصنِّف (الطبقة الأخيرة) فقط.

>>> model = timm.create_model('mobilenetv3_large_100', pretrained=True, num_classes=NUM_FINETUNE_CLASSES)

لإجراء الضبط الدقيق على مجموعة بياناتك الخاصة، يجب عليك كتابة حلقة تدريب PyTorch أو تكييف سكربت التدريب الخاص بـtimm لاستخدام مجموعة بياناتك.

لأقنية إدخال مختلفة، اضبط in_chans على عدد القنوات المستهدف في النموذج؛ يجب أن يصف التكوين المُسبق أوزان المصدر. راجع تكييف وتصدير النماذج لتحويل القنوات وحفظ النماذج المُكيّفة مع تكوينها الحالي.

استخدام نموذج مُدرَّب مسبقًا لاستخراج الميزات

بدون تعديل الشبكة، يمكن استدعاء model.forward_features(input) على أي نموذج بدلاً من model(input) المعتاد. سيتجاوز هذا مصنف الرأس والتجميع الشامل للشبكات.

لإرشادات أكثر تفصيلاً حول استخدام timm لاستخراج الميزات، راجع استخراج الميزات.

>>> import timm
>>> import torch
>>> x = torch.randn(1, 3, 224, 224)
>>> model = timm.create_model('mobilenetv3_large_100', pretrained=True)
>>> features = model.forward_features(x)
>>> print(features.shape)
torch.Size([1, 960, 7, 7])

تعزيز الصور

لتحويل الصور إلى مدخلات صالحة لنموذج، يمكنك استخدام timm.data.create_transform() مع تحديد input_size المطلوب الذي يتوقعه النموذج.

سيُعيد هذا تحويلًا عامًا يستخدم قيم افتراضية معقولة.

>>> timm.data.create_transform((3, 224, 224))
Compose(
    Resize(size=256, interpolation=bilinear, max_size=None, antialias=True)
    CenterCrop(size=(224, 224))
    MaybeToTensor()
    Normalize(mean=tensor([0.4850, 0.4560, 0.4060]), std=tensor([0.2290, 0.2240, 0.2250]))
)

تتميز النماذج المُدرَّبة مسبقًا بتحويلات محددة كانت تُطبَّق على الصور المُدخَلة إليها أثناء التدريب. إذا استخدمتَ التحويل الخاطئ لصورتك، فلن يستطيع النموذج فهم ما يراه!

للتعرف على التحويلات المستخدمة لنموذج مُدرَّب مسبقًا معين، يمكننا البدء بالنظر إلى pretrained_cfg الخاص به

>>> model.pretrained_cfg
{'url': 'https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv3_large_100_ra-f55367f5.pth',
 'hf_hub_id': 'timm/mobilenetv3_large_100.ra_in1k',
 'architecture': 'mobilenetv3_large_100',
 'tag': 'ra_in1k',
 'custom_load': False,
 'input_size': (3, 224, 224),
 'fixed_input_size': False,
 'interpolation': 'bicubic',
 'crop_pct': 0.875,
 'crop_mode': 'center',
 'mean': (0.485, 0.456, 0.406),
 'std': (0.229, 0.224, 0.225),
 'num_classes': 1000,
 'pool_size': (7, 7),
 'first_conv': 'conv_stem',
 'classifier': 'classifier',
 'license': 'apache-2.0'}

يمكننا بعد ذلك حلّ إعدادات البيانات المرتبطة فقط باستخدام timm.data.resolve_model_data_config().

>>> timm.data.resolve_model_data_config(model)
{'input_size': (3, 224, 224),
 'interpolation': 'bicubic',
 'mean': (0.485, 0.456, 0.406),
 'std': (0.229, 0.224, 0.225),
 'crop_pct': 0.875,
 'crop_mode': 'center'}

يمكننا تمرير هذا الإعداد إلى timm.data.create_transform() لتحويل النموذج المرتبط به.

>>> data_cfg = timm.data.resolve_model_data_config(model)
>>> transform = timm.data.create_transform(**data_cfg)
>>> transform
Compose(
    Resize(size=256, interpolation=bicubic, max_size=None, antialias=True)
    CenterCrop(size=(224, 224))
    MaybeToTensor()
    Normalize(mean=tensor([0.4850, 0.4560, 0.4060]), std=tensor([0.2290, 0.2240, 0.2250]))
)
Note: Here, the pretrained model's config happens to be the same as the generic config we made earlier. This is not always the case. So, it's safer to use the data config to create the transform as we did here instead of using the generic transform.

استخدام النماذج المُسبقة التدريب للاستدلال

هنا، سنجمع الأقسام المذكورة أعلاه ونستخدم نموذجًا مُدرَّبًا مسبقًا للاستدلال.

أولاً، سنحتاج إلى صورة لإجراء الاستدلال عليها. هنا، نقوم بتحميل صورة لورقة من الويب:

>>> import requests
>>> from PIL import Image
>>> from io import BytesIO
>>> url = 'https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/timm/cat.jpg'
>>> image = Image.open(requests.get(url, stream=True).raw)
>>> image

إليك الصورة التي قمنا بتحميلها:

An Image from a link

الآن، سننشئ نموذجنا وتحويلاتنا مرة أخرى. هذه المرة، نتأكد من ضبط نموذجنا في وضع التقييم.

>>> model = timm.create_model('mobilenetv3_large_100', pretrained=True).eval()
>>> transform = timm.data.create_transform(
    **timm.data.resolve_model_data_config(model)
)

يمكننا تحضير هذه الصورة للنموذج عن طريق تمريرها إلى transform.

>>> image_tensor = transform(image)
>>> image_tensor.shape
torch.Size([3, 224, 224])

الآن يمكننا تمرير تلك الصورة إلى النموذج للحصول على التنبؤات. نستخدم unsqueeze(0) في هذه الحالة، لأن النموذج يتوقع بُعد دفعة (batch dimension).

>>> output = model(image_tensor.unsqueeze(0))
>>> output.shape
torch.Size([1, 1000])

للحصول على الاحتمالات المتوقعة، نطبق softmax على المخرجات. وهذا يتركنا بمصفوفة (tensor) ذات الشكل (num_classes,).

>>> probabilities = torch.nn.functional.softmax(output[0], dim=0)
>>> probabilities.shape
torch.Size([1000])

الآن سنجد فهارس وقيم أعلى 5 فئات متوقعة باستخدام torch.topk.

>>> values, indices = torch.topk(probabilities, 5)
>>> indices
tensor([281, 282, 285, 673, 670])

إذا فحصنا تسميات imagenet للمؤشر الأعلى، يمكننا رؤية ما توقعه النموذج…

>>> IMAGENET_1k_URL = 'https://storage.googleapis.com/bit_models/ilsvrc2012_wordnet_lemmas.txt'
>>> IMAGENET_1k_LABELS = requests.get(IMAGENET_1k_URL).text.strip().split('\n')
>>> [{'label': IMAGENET_1k_LABELS[idx], 'value': val.item()} for val, idx in zip(values, indices)]
[{'label': 'tabby, tabby_cat', 'value': 0.5101025700569153},
 {'label': 'tiger_cat', 'value': 0.22490699589252472},
 {'label': 'Egyptian_cat', 'value': 0.1835290789604187},
 {'label': 'mouse, computer_mouse', 'value': 0.006752475164830685},
 {'label': 'motor_scooter, scooter', 'value': 0.004942195490002632}]
Update on GitHub