Transformers documentation

كشف الأشياء بدون تدريب مسبق

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

كشف الأشياء بدون تدريب مسبق

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

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

تحتضن Hugging Face العديد من كواشف الكائنات ذاتية الصفرية ذات المفردات المفتوحة من هذا النوع.

في هذا الدليل، ستتعلم كيفية استخدام مثل هذه النماذج:

  • لاكتشاف الكائنات بناءً على أوامر نصية
  • للكشف عن الكائنات على دفعات
  • للكشف عن الأشياء الموجّه بالصور

قبل أن تبدأ، تأكد من تثبيت جميع المكتبات اللازمة:

pip install -q transformers

خط أنابيب كشف الأشياء بدون تدريب مسبق

أبسط طريقة لتجربة الاستدلال باستخدام النماذج هي استخدامه في pipeline(). قم بإنشاء خط أنابيب للكشف عن الأشياء بدون تدريب مسبق من نقطة تحقق على Hugging Face Hub:

>>> from transformers import pipeline

>>> # Use any checkpoint from the hf.co/models?pipeline_tag=zero-shot-object-detection
>>> checkpoint = "iSEE-Laboratory/llmdet_large"
>>> detector = pipeline(model=checkpoint, task="zero-shot-object-detection")

في الخطوة التالية، اختر صورة تريد اكتشاف الأشياء فيها. سنستخدم هنا صورة رائدة الفضاء إيلين كولينز التي تُعد جزءاً من مجموعة بيانات NASA Great Images.

>>> from transformers.image_utils import load_image

>>> url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/zero-sh-obj-detection_1.png"
>>> image = load_image(url)
>>> image
Astronaut Eileen Collins

مرّر الصورة ووسوم الكائنات المرشحة التي تبحث عنها إلى خط الأنابيب. هنا نمرّر الصورة مباشرةً؛ وتشمل الخيارات المناسبة الأخرى مسارًا محليًا إلى صورة أو عنوان URL لصورة. كما نمرّر أوصافًا نصية لجميع العناصر التي نرغب في الاستعلام عنها في الصورة.

>>> predictions = detector(
...     image,
...     candidate_labels=["human face", "rocket", "nasa badge", "star-spangled banner"],
...     threshold=0.45,
... )
>>> predictions
[{'score': 0.8409242033958435,
  'label': 'human face',
  'box': {'xmin': 179, 'ymin': 74, 'xmax': 272, 'ymax': 179}},
 {'score': 0.7380027770996094,
  'label': 'rocket',
  'box': {'xmin': 353, 'ymin': 0, 'xmax': 466, 'ymax': 284}},
 {'score': 0.5850900411605835,
  'label': 'star-spangled banner',
  'box': {'xmin': 0, 'ymin': 0, 'xmax': 96, 'ymax': 511}},
 {'score': 0.5697067975997925,
  'label': 'human face',
  'box': {'xmin': 18, 'ymin': 15, 'xmax': 366, 'ymax': 511}},
 {'score': 0.47813931107521057,
  'label': 'star-spangled banner',
  'box': {'xmin': 353, 'ymin': 0, 'xmax': 459, 'ymax': 274}},
 {'score': 0.46597740054130554,
  'label': 'nasa badge',
  'box': {'xmin': 353, 'ymin': 0, 'xmax': 462, 'ymax': 279}},
 {'score': 0.4585932493209839,
  'label': 'nasa badge',
  'box': {'xmin': 132, 'ymin': 348, 'xmax': 208, 'ymax': 423}}]

لنقم بتصور التنبؤات:

>>> from PIL import ImageDraw

>>> draw = ImageDraw.Draw(image)

>>> for prediction in predictions:
...     box = prediction["box"]
...     label = prediction["label"]
...     score = prediction["score"]

...     xmin, ymin, xmax, ymax = box.values()
...     draw.rectangle((xmin, ymin, xmax, ymax), outline="red", width=1)
...     draw.text((xmin, ymin), f"{label}: {round(score,2)}", fill="white")

>>> image
Visualized predictions on NASA image

كشف الأشياء بدون تدريب مسبق باستخدام النص التوجيهي يدويًا

الآن، بعد أن اطلعتَ على كيفية استخدام خط أنابيب كشف الأشياء بدون تدريب مسبق، دعنا نعيد إنتاج النتيجة ذاتها يدويًا.

ابدأ بتحميل النموذج والمعالج المرتبط به من نقطة تحقق على Hugging Face Hub. سنستخدم هنا نفس نقطة التحقق التي استخدمناها سابقًا:

>>> from transformers import AutoProcessor, AutoModelForZeroShotObjectDetection

>>> model = AutoModelForZeroShotObjectDetection.from_pretrained(checkpoint, device_map="auto")
>>> processor = AutoProcessor.from_pretrained(checkpoint)

لنأخذ صورة مختلفة لتغيير الأمور.

>>> url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/zero-sh-obj-detection_3.png"
>>> image = load_image(url)
>>> image
Beach photo

استخدم المعالج processor لتحضير المدخلات للنموذج.

>>> text_labels = ["hat", "book", "sunglasses", "camera"]
>>> inputs = processor(text=text_labels, images=image, return_tensors="pt").to(model.device)

مرّر المدخلات عبر النموذج، ثم عالجها بعد المعالجة، وبيّن النتائج. نظرًا إلى أن معالج الصور قام بتغيير حجم الصور قبل تمريرها إلى النموذج، عليك استخدام طريقة post_process_object_detection للتأكد من أن صناديق الحدود المتوقعة تحمل الإحداثيات الصحيحة بالنسبة إلى الصورة الأصلية:

>>> import torch

>>> with torch.inference_mode():
...     outputs = model(**inputs)

>>> results = processor.post_process_grounded_object_detection(
...    outputs, threshold=0.50, target_sizes=[(image.height, image.width)], text_labels=text_labels,
... )[0]

>>> draw = ImageDraw.Draw(image)

>>> scores = results["scores"]
>>> text_labels = results["text_labels"]
>>> boxes = results["boxes"]

>>> for box, score, text_label in zip(boxes, scores, text_labels):
...     xmin, ymin, xmax, ymax = box
...     draw.rectangle((xmin, ymin, xmax, ymax), outline="red", width=1)
...     draw.text((xmin, ymin), f"{text_label}: {round(score.item(),2)}", fill="white")

>>> image
Beach photo with detected objects

المعالجة الدفعية

يمكنك تمرير مجموعات متعددة من الصور واستعلامات نصية للبحث عن كائنات مختلفة (أو متطابقة) في عدة صور. لنستخدم صورة رائد الفضاء وصورة الشاطئ معًا. للمعالجة الدفعية، يجب أن تمرر الاستعلامات النصية كقائمة متداخلة إلى المعالج، والصور كقوائم من صور PIL، أو متجهات PyTorch، أو مصفوفات NumPy.

>>> url1 = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/zero-sh-obj-detection_1.png"
>>> url2 = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/zero-sh-obj-detection_3.png"
>>> images = [load_image(url1), load_image(url2)]
>>> text_queries = [
...     ["human face", "rocket", "nasa badge", "star-spangled banner"],
...     ["hat", "book", "sunglasses", "camera", "can"],
... ]
>>> inputs = processor(text=text_queries, images=images, return_tensors="pt", padding=True)

سابقًا، كنتَ تمرر حجم الصورة الواحدة كمصفوفة (tensor) في مرحلة ما بعد المعالجة، لكن يمكنك أيضًا تمرير مجموعة (tuple)، أو، في حالة وجود عدة صور، قائمة من المجموعات. لننشئ تنبؤات للمثالين، ونعرض الثاني بصريًا (image_idx = 1).

>>> with torch.no_grad():
>>>     outputs = model(**inputs)

>>> target_sizes = [(image.height, image.width) for image in images]
>>> results = processor.post_process_grounded_object_detection(
...     outputs, threshold=0.3, target_sizes=target_sizes, text_labels=text_labels,
... )

لنقم بتصور النتائج:

>>> image_idx = 1
>>> draw = ImageDraw.Draw(images[image_idx])

>>> scores = results[image_idx]["scores"].tolist()
>>> text_labels = results[image_idx]["text_labels"]
>>> boxes = results[image_idx]["boxes"].tolist()

>>> for box, score, text_label in zip(boxes, scores, text_labels):
>>>     xmin, ymin, xmax, ymax = box
>>>     draw.rectangle((xmin, ymin, xmax, ymax), outline="red", width=1)
>>>     draw.text((xmin, ymin), f"{text_label}: {round(score,2)}", fill="white")

>>> images[image_idx]
Beach photo with detected objects

كشف الكائنات الموجّه بالصور

إضافةً إلى كشف الأشياء بدون تدريب باستخدام استعلامات نصية، توفّر نماذج مثل OWL-ViT وOWLv2 كشف الأشياء الموجَّه بالصور. وهذا يعني أنه يمكنك استخدام استعلام بصري للعثور على أشياء مشابهة في الصورة المستهدفة.

>>> from transformers import AutoProcessor, AutoModelForZeroShotObjectDetection

>>> checkpoint = "google/owlv2-base-patch16-ensemble"
>>> model = AutoModelForZeroShotObjectDetection.from_pretrained(checkpoint, device_map="auto")
>>> processor = AutoProcessor.from_pretrained(checkpoint)

على عكس استعلامات النص، يُسمح بصورة مثال واحدة فقط.

لنأخذ صورة قطتين على أريكة كصورة هدف، وصورة قطة واحدة كاستعلام:

>>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
>>> image_target = Image.open(requests.get(url, stream=True).raw)

>>> query_url = "http://images.cocodataset.org/val2017/000000524280.jpg"
>>> query_image = Image.open(requests.get(query_url, stream=True).raw)

لنلقِ نظرة سريعة على الصور:

>>> import matplotlib.pyplot as plt

>>> fig, ax = plt.subplots(1, 2)
>>> ax[0].imshow(image_target)
>>> ax[1].imshow(query_image)
>>> fig.show()
Cats

في خطوة المعالجة المسبقة، عليك الآن استخدام query_images بدلاً من استعلامات النص:

>>> inputs = processor(images=image_target, query_images=query_image, return_tensors="pt")

بالنسبة للتنبؤات، بدلاً من تمرير المدخلات إلى النموذج، قم بتمريرها إلى image_guided_detection(). ارسم التنبؤات كما في السابق، لكن الآن لا توجد تسميات.

>>> with torch.no_grad():
...     outputs = model.image_guided_detection(**inputs)
...     target_sizes = torch.tensor([image_target.size[::-1]])
...     results = processor.post_process_image_guided_detection(outputs=outputs, target_sizes=target_sizes)[0]

>>> draw = ImageDraw.Draw(image_target)

>>> scores = results["scores"].tolist()
>>> boxes = results["boxes"].tolist()

>>> for box, score in zip(boxes, scores):
...     xmin, ymin, xmax, ymax = box
...     draw.rectangle((xmin, ymin, xmax, ymax), outline="white", width=4)

>>> image_target
Cats with bounding boxes
Update on GitHub