تصور کنید سیستمی داشته باشید که در آن هزینه استنتاج (Inference) برای ارائهدهنده صفر باشد و آپلود دادهها به سرور بهطور کامل حذف شود. با لایهبندی مدلهای مختلف بینایی ماشین برای غلبه بر ناپایداری محیطهای مرورگر، اکنون میتوان تطبیق دقیق عکسهای شناسایی را بهصورت مستقیم در مرورگر کاربر خودکار کرد. همانطور که در یک راهنمای فنی در ۲۸ ژوئیه ۲۰۲۶ در وبسایت dev.to با جزئیات شرح داده شده است، این رویکرد به کاربران اجازه میدهد پرترههایی کاملاً منطبق با استانداردهای قانونی تولید کنند و پیشنمایش آنها را بهصورت آنی ببینند.
بسیاری از کاربران هنگام تلاش برای اجرای هوش مصنوعی در سمت کلاینت، با عدم پشتیبانی پیشبینینشده از WebGL یا نبود APIهای لازم روبرو میشوند. تا پیش از این، ابزارهای سنگینی مانند HivisionIDPhotos برای تجزیه چهره به زمانهای اجرای (Runtimes) ONNX در سمت سرور و شبکههای اختصاصی برای تجزیه چهره (Face Parsing) متکی بودند. این الگوی جدید، منطق پردازش را به رایانش لبه (Edge Computing) — یعنی پردازش دادهها در نزدیکترین نقطه به کاربر، درست مثل اینکه بهجای فرستادن لباس به خشکشویی، خودتان آن را در خانه بشویید — منتقل میکند تا تضمین شود که فارغ از نوع مرورگر، یک نتیجه تشخیص کاربردی بازگردانده شود.
همانطور که در تحلیلهای قبلی ما دربارهی بهینهسازی استنتاج در مرورگر اشاره کردیم، حذف وابستگی به سرور تنها با پذیرش تفاوتهای سختافزاری کاربران ممکن است.
منطق تشخیص چندلایه
برای حفظ پایداری و قابلیت اطمینان، سیستم یک زنجیره جایگزین (Fallback) منعطف را پیاده کرده است. مدل ابتدا تلاش میکند با کیفیتترین مدل موجود را اجرا کند و تنها در صورتی که لایه قبلی شکست بخورد یا توسط مرورگر پشتیبانی نشود، به گزینه پایینتر در لیست حرکت میکند. تابع detectFace در گام نخست، بستر امن (Secure Context) را بررسی میکند، زیرا APIهای تشخیص چهره معمولاً برای اجرا به پروتکل HTTPS نیاز دارند.
سلسلهمراتب تشخیص به این صورت ساختار یافته است:
- MediaPipe Face Landmarker: انتخاب اول و اصلی است که ۴۷۸ نقطه شاخص (Landmark) با دقت بسیار بالا ارائه میدهد تا حداکثری از دقت حاصل شود. این مدل «استاندارد طلایی» برای تحلیلهای هندسهی دقیق است. در این راستا، تحلیلهای پیشرفتهتر بر روی نقاط شاخص چهره، مانند بهرهگیری از کینماتیک چهره برای شناسایی جعلهای عمیق، نشان دادهاند که دقت تحلیل هندسی میتواند تا ۹۵٪ در شناسایی ناهنجاریها اثرگذار باشد.
- Browser FaceDetector API: یک API بومی کروم است که بهعنوان لایهی جایگزین دوم، در صورتی که MediaPipe شکست بخورد یا در دسترس نباشد، فعال میشود.
- BlazeFace: مدلی از TensorFlow است که بهعنوان آخرین لایهی حفاظتی (Safety Net) برای محیطهایی عمل میکند که فاقد APIهای بومی هستند.
اگر هیچیک از این لایهها نتوانند چهرهای را شناسایی کنند یا دلیل خاصی برای «عدم یافتن چهره» (no-face-found) برگردانند، سیستم وضعیت api-missing را بازمیگرداند. این وضعیت سیگنالی است مبنی بر اینکه محیط مرورگر کاربر بهطور کامل از این قابلیتها پشتیبانی نمیکند.
تخمین هندسهی دقیق سر و گردن
تشخیص چهره تنها گام اول است؛ چالش واقعی، محاسبه ارتفاع صحیح سر برای رعایت الزامات قانونی است. عکسهای شناسایی دستورات سختگیرانهای در مورد نسبت ارتفاع سر، موقعیت خط چشم و قوانین حاشیه دارند. برای جلوگیری از خطاهای برش (Cropping)، سیستم از سه فرمول متمایز بهره میبرد که مفاهیم آن از CrownChinEstimator در کتابخانه dpar39/ppp استخراج شده است. این سطح از دقت در پردازش بیومتریک، یادآور متدهایی است که در سیستم CaraComp برای شناسایی جعلهای عمیق از طریق ریاضیات اقلیدسی به کار میروند تا کوچکترین انحرافات ساختاری چهره را ردیابی کنند.
فرمولهای تخمین
- مسیر MediaPipe (بهترین): در این روش، سیستم فاصله از بالای پیشانی تا پایین چانه را محاسبه میکند. از آنجا که نقاط شاخص (Landmarks) موها را تشخیص نمیدهند، یک ضریب ۱.۳۵ برای در نظر گرفتن حجم مو اعمال میشود تا از برش خوردن بالای سر (Crown) جلوگیری شود. این مکانیزم دقیقاً مشابه هدف تشخیص کانتور کانال آلفا است که HivisionIDPhotos در سمت سرور به کار میبرد.
- فرمول PPP (خوب): در صورتی که تنها موقعیت چشمها در دسترس باشد، سیستم از فرمولی استفاده میکند که در آن
chinCrownCoeffبرابر با ۱.۷۶۹۹ است. در این حالت، فاصله بینمردمی (IPD) و فاصله از نقطه میانی چشم تا چانه محاسبه شده و نتیجه از رابطه1.77 * (ipd + frownToChin)به دست میآید. - جایگزین آنتروپومتریک: بر اساس پژوهشهای Farkas LG در کتاب «آنتروپومتری سر و صورت» (Anthropometry of the Head and Face)، در این مسیر صرفاً یک ضریب ۱.۳۵ به کل ارتفاع کادر (Bounding Box) اعمال میشود تا تخمینی از ارتفاع سر به دست آید.
اصلاح نقاط شاخص با قطعهبندی
برای دقت بیشتر در شناسایی بالای سر، سیستم قابلیت قطعهبندی تصویر (Image Segmentation) را ادغام میکند. در حالی که نقاط شاخص میتوانند پیشانی را تخمین بزنند، قطعهبندی مرز واقعی موها را شناسایی میکند. این رویکرد با خدماتی مانند passport-photo-online که صرفاً به تشخیص چهره متکیاند، تفاوت اساسی دارد.
در تابع refineWithSegmentation سیستم مقدار topY را از مرزهای قطعهبندی (مرز موها) میگیرد و آن را با bottomY (چانه) که از نقاط شاخص چهره به دست آمده، جفت میکند. در اینجا یک تمایز حیاتی وجود دارد: مقدار bottomY در قطعهبندی معمولاً سیلوئت کلی بدن (شانهها و تنه) را تشخیص میدهد؛ لذا اگر از آن برای محاسبه ارتفاع سر استفاده شود، اندازهگیری بیش از حد گسترده خواهد شد (Over-extend). با ترکیب «بالای قطعهبندی» و «پایین نقاط شاخص»، توسعهدهنده تضمین میکند که موهای حجیم بهاشتباه برش نخورند.
فرآیند خودتطبیقی و پسزمینه
پس از تثبیت هندسه، الگوریتم Auto-fit یک فرآیند سهمرحلهای شامل «مقیاسبندی، جایگذاری و حفاظت» را اجرا میکند.
فرآیند سهمرحلهای برش
۱. مقیاسبندی (SCALE): سیستم این امر را تضمین میکند که ارتفاع سر با نسبت هدف مطابقت داشته باشد. این کار از طریق مقایسه ارتفاع هدفِ محدودشده (Clamped) در برابر ارتفاع واقعی اندازهگرفته شده سر انجام میشود.
۲. جایگذاری (PLACE): سیستم بین دو استراتژی لنگرگاه (Anchor) انتخاب میکند. استراتژی A چشمها را در یک مختصات Y هدف قرار میدهد (که توسط ICAO و استانداردهای پاسپورت ایالات متحده الزامی شده است). استراتژی B بالای سر را در یک حاشیه هدف قرار میدهد (که در استانداردهای پاسپورتهای آسیایی رایج است).
۳. حفاظت (GUARD): یک گذر نهایی برای مدیریت موارد خاص (Edge Cases) انجام میشود؛ مثلاً زمانی که بالای سر بیش از حد به لبه نزدیک است یا چانه پایینتر از کادر میافتد. اگر هر دو مورد سرریز (Overflow) شوند، سیستم تصویر را کوچک میکند تا کاملاً در کادر جای بگیرد.
برای پرداخت نهایی و صیقل دادن تصویر، سیستم از مدل ISNet از طریق کتابخانه @imgly/background-removal (همان موتوری که پشت جایگزین متنباز remove.bg است) برای حذف پسزمینه استفاده میکند.
برای حذف اثر «هاله» (Halo) که معمولاً اطراف موها دیده میشود و در آن پیکسلهای لبه، رنگ پسزمینه اصلی را با خود حمل میکنند، سیستم از «زدودن آلودگی رنگی» (Color Decontamination) استفاده میکند. این محاسبات ریاضی، فرمول ترکیب آلفا را معکوس میکند. اگر رنگ ترکیبی $C = \alpha F + (1-\alpha)B$ باشد، آنگاه رنگ واقعی پیشزمینه برابر است با $F = (C - (1-\alpha)B) / \alpha$.
مکانیزم زدودن آلودگی
- فرسایش (Erosion): هر پیکسلی که مقدار آلفای آن کمتر از ۰.۱۵ باشد به صفر تبدیل میشود تا هالههای کمرنگ حذف شوند.
- فشار آلفا (Alpha Squeeze): سیستم محدوده آلفا از [۰.۱۵، ۱] را با استفاده از فرمول
(a - 0.15) / 0.85به بازه [۰، ۱] بازنگاری میکند. - اصلاح رنگ: برای پیکسلهایی با مقدار آلفای بین ۰.۰۱ و ۰.۹۵، سیستم تأثیر رنگهای پسزمینه (BG) را کسر میکند تا پیکسلهای واقعی پیشزمینه جداساز شوند.
معماری ارکستراسیون چند-ارائهدهنده
در خارج از محیط مرورگر، سیستم یک بکاند پیچیده را مدیریت میکند که بارهای کاری AI را بین بیش از ۱۰ ارائهدهنده مختلف توزیع میکند. این ارائهدهندگان شامل Fal، WaveSpeed، Volcengine، ChatFire، Google، OpenAI، Kie AI و Meshy هستند. برای جلوگیری از ایجاد زنجیرههای طولانی و دشوار if-else، معماری سیستم از «الگوی رجیستری» (Registry Pattern) بهره میبرد.
هر درخواست کاربر بهعنوان یک «تسک» (Task) تعریف میشود که شامل یک یا چند «زیرتسک» (SubTask) است. این تسکها میتوانند ابتدا بهعنوان پیشنویس (Draft) برای پیشنمایش و تأیید کاربر ایجاد شوند و سپس بهطور اتمیک به وضعیت PENDING ارتقا یابند. هر ارائهدهنده به یک ماژول تولیدکننده خاص در subTaskGeneratorRegistry متصل است. این بدان معناست که افزودن یک ارائهدهنده جدید تنها مستلزم نوشتن یک ماژول ایزوله و ثبت آن است، که دقیقاً مشابه الگوهای مسیریابی (Routing) در شرکت Replicate است.
حالتهای اجرا
موتور اجرا سه حالت متمایز را پشتیبانی میکند:
۱. ناهمگام (Async): زیرتسکها را ارسال کرده و منتظر دریافت Webhook میماند. این حالت شامل یک مکانیزم جایگزین شفاف از طریق handleSubTaskFailureWithFallback است که در صورت شکست ارائهدهنده اصلی، یک زیرتسک جدید با هدف قرار دادن یک ارائهدهنده جایگزین ایجاد میکند.
۲. همگام (Sync): اجرای مستقیم برای دریافت نتایج فوری.
۳. جریانی (Streaming): از رویدادهای ارسالی سرور (SSE) برای تولید متن استفاده میکند. این حالت از یک TransformStream برای ارسال تکههای متن بهره میبرد و تنها پس از تکمیل کامل جریان، نتیجه نهایی را در پایگاهداده ذخیره کرده و تراکنش اعتبار را تأیید میکند.
سیستم اعتبار دو مرحلهای
برای جلوگیری از نشت مالی در محیطهای ناهمگام که دارای جایگزینهای متعدد هستند، سیستم از الگوی «رزرو $\rightarrow$ تأیید/لغو» (Reserve $\rightarrow$ Confirm/Cancel) استفاده میکند. اعتبارها از طریق تابع calculateTaskCredits محاسبه شده و در زمان ایجاد تسک رزرو میشوند. این اعتبارها تنها پس از تکمیل موفقیتآمیز عملیات، بهطور دائمی کسر (تأیید) میگردند.
منطق بازپرداخت
اگر تسکی شکست بخورد، سیستم مبلغ بازپرداخت را از طریق جمع زدن اعتبارهای تمام زیرتسکهای وضعیت FAILED، CANCELLED یا ABORTED محاسبه میکند. علاوه بر این، اگر تسک والد شکست بخورد، زیرتسکهایی که در وضعیت PENDING یا PROCESSING هستند نیز بازپرداخت میشوند.
برای جلوگیری از بازپرداخت بیش از حد در شرایط رقابتی (Race Condition) — برای مثال زمانی که یک تسک جایگزین ایجاد میشود پیش از آنکه اعتبارهای تسک اصلی صفر شده باشند — یک سقف با استفاده از Math.min اعمال میشود. مبلغ بازپرداخت حداکثر برابر با کل اعتبارات اولیه تسک خواهد بود: Math.min(refundCredits, task.credits || 0).
این دقت معماری تضمین میکند که پلتفرم حتی هنگام مسیریابی از طریق APIهای ناپایدار شخص ثالث، سودآور باقی بماند. این چرخش به سمت تشخیص ترکیبی در سمت کلاینت و ارکستراسیون مستحکم در سرور، تأخیر و هزینههای زیرساختی را بهشدت کاهش میدهد. توسعهدهندگان اکنون میتوانند با مرورگر بهعنوان یک موتور استنتاج مشروع برخورد کنند، نه فقط یک لایهی نمایش.
برای کسانی که ابزارهای مشابه میسازند، گام بعدی بررسی ادغام WebGPU است تا نیاز به زنجیرههای جایگزین لایهبندی شده را با یک مدل تک و با کارایی بالا در تمامی مرورگرهای مدرن جایگزین کنند.
گام بعدی شما
- بررسی قابلیتهای WebGPU برای جایگزینی زنجیرههای جایگزین با یک مدل تک-قدرتمند در تمامی مرورگرهای مدرن.
- پیادهسازی الگوی Reserve-Confirm در سیستمهای اعتباری برای مدیریت ریسک APIهای ناپایدار.
- آزمایش مدل ISNet برای جداسازی دقیق سوژه در پروژههای بینایی ماشین لبه.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو