في هذا البرنامج التعليمي، نعمل من البداية إلى النهاية سير العمل ل نماذج Qualcomm AI Hub. نبدأ بإعداد الحزمة المطلوبة، واكتشاف مجموعة النماذج المتاحة، وتحميل MobileNet-V2 لاستدلال PyTorch المحلي. نحن أيضًا نتعامل مع مشكلة مهمة في شكل الإدخال عن طريق تحويل موترات صورة NHWC إلى تنسيق NCHW المتوقع بواسطة النموذج. من هناك، نقوم بإجراء الاستدلال على كل من إدخال العينة المضمنة للنموذج والصورة الحقيقية، وفحص أفضل التوقعات، وتنفيذ العرض التوضيحي الرسمي لـ Qualcomm AI Hub CLI، وتوسيع سير العمل باستخدام مثال اكتشاف الكائنات YOLOv7. نقوم أيضًا بتضمين قسم اختياري للأجهزة السحابية حيث نقوم بتجميع النموذج وملف تعريفه وتشغيله على جهاز Qualcomm حقيقي عند توفر رمز API المميز.
import subprocess, sys, os, glob, textwrap, traceback
import numpy as np, torch
from PIL import Image
import matplotlib.pyplot as plt
def pip_install(*pkgs):
subprocess.run([sys.executable, "-m", "pip", "install", "-q", *pkgs], check=True)
pip_install("qai_hub_models")
OUT_DIR = "/content/qaihm_out"; os.makedirs(OUT_DIR, exist_ok=True)
torch.set_grad_enabled(False)
def to_nchw(value):
arr = value[0] if isinstance(value, (list, tuple)) else value
t = torch.from_numpy(np.asarray(arr, dtype=np.float32))
if t.ndim == 3:
t = t.unsqueeze(0)
if t.ndim == 4 and t.shape[1] != 3 and t.shape[-1] == 3:
t = t.permute(0, 3, 1, 2).contiguous()
return t
نبدأ باستيراد المكتبات وإعداد وظيفة مساعدة لتثبيت الحزم مباشرة داخل Colab. نقوم بتثبيت qai_hub_models، وإنشاء دليل الإخراج، وتعطيل تتبع التدرج لأننا نحتاج فقط إلى الاستدلال. نحدد أيضًا وظيفة to_nchw() لتحويل أي موتر صورة إدخال إلى تنسيق القناة الأولى المتوقع بواسطة النموذج.
import pkgutil, qai_hub_models.models as _m
model_ids = sorted(n for _, n, p in pkgutil.iter_modules(_m.__path__)
if p and not n.startswith("_"))
print(f">>> {len(model_ids)} models available. First 40:\n")
print(textwrap.fill(", ".join(model_ids[:40]), 100), "\n")
from qai_hub_models.models.mobilenet_v2 import Model as MobileNetV2
model = MobileNetV2.from_pretrained().eval()
spec = model.get_input_spec()
input_name = list(spec.keys())[0]
print(">>> Input:", input_name, spec[input_name].shape, spec[input_name].dtype)
from torchvision.models import MobileNet_V2_Weights
IMAGENET_CLASSES = MobileNet_V2_Weights.IMAGENET1K_V1.meta["categories"]
def top5(logits):
if logits.ndim == 1: logits = logits.unsqueeze(0)
probs = torch.softmax(logits, dim=1)[0]
conf, idx = probs.topk(5)
return [(IMAGENET_CLASSES[i], float(c)) for c, i in zip(conf, idx)]
نكتشف حزم نماذج Qualcomm AI Hub المتاحة ونطبع المجموعة الأولى من معرفات النماذج لفهم ما يمكن الوصول إليه. نقوم بعد ذلك بتحميل نموذج MobileNet-V2 المُدرب مسبقًا، وقراءة مواصفات الإدخال الخاصة به، وتحديد اسم الإدخال الصحيح. نقوم أيضًا بإعداد تسميات فئة ImageNet وتحديد وظيفة top5() لتحويل سجلات النموذج إلى تنبؤات من أفضل 5 تنبؤات يمكن قراءتها.
sample = model.sample_inputs()
x = to_nchw(sample[input_name])
print(">>> fed tensor shape:", tuple(x.shape))
print("\n>>> Top-5 for the built-in sample input:")
for label, conf in top5(model(x)):
print(f" {conf:6.2%} {label}")
from torchvision import transforms
preprocess = transforms.Compose([
transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(),
])
img = None
try:
import urllib.request
p = os.path.join(OUT_DIR, "input.jpg")
urllib.request.urlretrieve(
"https://raw.githubusercontent.com/pytorch/hub/master/images/dog.jpg", p)
img = Image.open(p).convert("RGB")
except Exception as e:
print(">>> photo download skipped:", e)
if img is not None:
preds = top5(model(preprocess(img).unsqueeze(0)))
print("\n>>> Top-5 for the downloaded photo:")
for label, conf in preds: print(f" {conf:6.2%} {label}")
plt.figure(figsize=(5,5)); plt.imshow(img); plt.axis("off")
plt.title(f"{preds[0][0]} ({preds[0][1]:.1%})"); plt.show()
نقوم أولاً بإجراء الاستدلال باستخدام نموذج الإدخال المدمج في النموذج واستخدام to_nchw() لإصلاح شكل الموتر قبل تمريره إلى MobileNet-V2. نقوم بعد ذلك بتنزيل صورة حقيقية، ومعالجتها مسبقًا باستخدام خطوات تغيير الحجم القياسية، والاقتصاص، وتحويل الموتر، وتشغيل تنبؤ آخر. نعرض أخيرًا الصورة مع الملصق العلوي المتوقع لتوصيل مخرجات النموذج بشكل مرئي إلى الصورة المدخلة.
def run_demo(module, extra=None, timeout=900):
cmd = [sys.executable, "-m", module, "--eval-mode", "fp",
"--output-dir", OUT_DIR] + (extra or [])
print(f"\n>>> {' '.join(cmd)}")
try:
r = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)
print("\n".join((r.stdout + r.stderr).strip().splitlines()[-25:]))
except Exception as e:
print(">>> demo skipped:", e)
run_demo("qai_hub_models.models.mobilenet_v2.demo")
try:
pip_install("qai_hub_models[yolov7]")
run_demo("qai_hub_models.models.yolov7.demo")
imgs = sorted(glob.glob(OUT_DIR + "/*.png") + glob.glob(OUT_DIR + "/*.jpg"),
key=os.path.getmtime)
if imgs:
plt.figure(figsize=(9,9)); plt.imshow(Image.open(imgs[-1]).convert("RGB"))
plt.axis("off"); plt.title("YOLOv7 detections"); plt.show()
else:
print(">>> no output image found (results may have printed instead).")
except Exception:
print(">>> YOLOv7 section skipped:\n", traceback.format_exc())
نحدد وظيفة run_demo() القابلة لإعادة الاستخدام والتي تنفذ العروض التوضيحية الرسمية لنموذج Qualcomm AI Hub من سطر الأوامر. نحن نستخدمه لتشغيل العرض التوضيحي لـ MobileNet-V2 ثم تثبيت إضافات YOLOv7 لاكتشاف الكائنات. نقوم بتشغيل العرض التوضيحي YOLOv7، والبحث عن صورة الإخراج التي تم إنشاؤها، وتصور الاكتشافات في حالة إنشاء صورة.
try:
import qai_hub as hub
devices = hub.get_devices()
print(f"\n>>> Authenticated. {len(devices)} cloud devices available.")
device = hub.Device("Samsung Galaxy S24 (Family)")
sample = model.sample_inputs()
nchw = to_nchw(sample[input_name])
traced = torch.jit.trace(model, [nchw])
cloud_inputs = {input_name: [nchw.numpy()]}
cj = hub.submit_compile_job(model=traced, device=device,
input_specs=model.get_input_spec(),
options="--target_runtime tflite")
target = cj.get_target_model(); print(">>> compiled:", cj.url)
pj = hub.submit_profile_job(model=target, device=device); print(">>> profiling:", pj.url)
ij = hub.submit_inference_job(model=target, device=device, inputs=cloud_inputs)
out = ij.download_output_data()
dev_logits = torch.from_numpy(np.asarray(list(out.values())[0][0]))
print(">>> Top-5 from the REAL device:")
for label, conf in top5(dev_logits): print(f" {conf:6.2%} {label}")
target.download(os.path.join(OUT_DIR, "mobilenet_v2.tflite"))
print(">>> saved compiled .tflite to", OUT_DIR)
except Exception as e:
print("\n>>> Cloud (on-device) section skipped — no API token configured.")
print(" Get one at workbench.aihub.qualcomm.com, then:")
print(" !qai-hub configure --api_token YOUR_TOKEN")
print(" detail:", (str(e).splitlines() or [type(e).__name__])[0])
print("\n>>> Tutorial complete. Outputs in:", OUT_DIR)
نحن نقوم بتضمين سير عمل سحابي اختياري لـ Qualcomm AI Hub والذي يتم تشغيله فقط عند تكوين رمز API المميز. نقوم باسترداد الأجهزة السحابية المتاحة، وتتبع نموذج PyTorch، وتجميعه لـ TFLite، وتصنيفه على جهاز Qualcomm، وإرسال مهمة الاستدلال. نقوم بعد ذلك بتنزيل مخرجات الجهاز، وطباعة أهم التوقعات، وحفظ نموذج TFLite المترجم، والانتهاء بإظهار مكان تخزين جميع مخرجات البرنامج التعليمي.
في الختام، لدينا سير عمل عملي كامل لاستخدام نماذج Qualcomm AI Hub داخل Colab. لقد تعلمنا كيفية تحميل النماذج المدربة مسبقًا، وإعداد المدخلات بشكل صحيح، وتشغيل الاستدلال المحلي، وتصور نتائج التصنيف والكشف، واستخدام العروض التوضيحية الرسمية كنقاط مرجعية قابلة للتكرار. لقد رأينا أيضًا كيف يمكن للنموذج نفسه أن يتجاوز تنفيذ PyTorch المحلي إلى خط أنابيب الأجهزة السحابية من Qualcomm للتجميع والتوصيف والاستدلال على الجهاز الحقيقي. فهو يوفر مسارًا من التجارب البسيطة إلى النشر المدرك للأجهزة باستخدام Qualcomm AI Hub.
تحقق من رموز كاملة مع دفتر الملاحظات هنا. أيضا، لا تتردد في متابعتنا على تغريد ولا تنسى الانضمام إلينا 150 ألف+ مل من SubReddit والاشتراك في النشرة الإخبارية لدينا. انتظر! هل أنت على برقية؟ الآن يمكنك الانضمام إلينا على التليجرام أيضًا.
هل تحتاج إلى الشراكة معنا للترويج لصفحة GitHub Repo أو صفحة الوجه المعانقة أو إصدار المنتج أو الندوة عبر الويب وما إلى ذلك؟تواصل معنا
ظهر المنشور التدريب العملي على الترميز على نماذج Qualcomm AI Hub للتصنيف واكتشاف الكائنات ونشر الأجهزة أولاً على MarkTechPost.
اكتشاف المزيد من كحيل | أخبار التقنية
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.
