نکات کلیدی
- تشخیص تفاوت میان دو تصویر، یک وظیفه مهم در اتوماسیون تست بصری است؛ زمانی که لازم است یک اسکرینشات با نسخه قبلی یا یک طراحی مرجع مقایسه شود.
- هوش مصنوعی مولد مبتنی بر مدلهای زبانی چندوجهی در تشخیص و توضیح محتوای یک تصویر عالی است، اما فقط میتواند تفاوتها را در جنبههایی شناسایی کند که بهطور صریح برای آنها آموزش دیده است.
- این مسئله معمولاً با استفاده از یک شبکه عصبی کانولوشنی (CNN) حل میشود؛ با مقایسه بخشهای کوچک تصویر (ناحیه ۹×۹ پیکسل) بهجای مقایسه تکپیکسلها.
- راهکارهای CNN را میتوان با ابزارهایی مانند Tensorflow، PyTorch و API کتابخانه Keras پیادهسازی کرد.
- نمایشگرهای با وضوح بالا میتوانند باعث مثبت کاذب شوند، چون جابهجاییها ممکن است بیش از چند پیکسل باشد. برای حل این موضوع، بهجای افزایش اندازه پنجره برای پوشش طول جابهجاییها، شبکه را طوری آموزش دهید که یک پرچم برابری بولی و مقادیر x و y بردار جابهجایی را خروجی دهد.
مقایسه دو تصویر برای تغییرات ساختاری، کاری است که هوش مصنوعی به شکل عجیب و غافلگیرکنندهای در آن مشکل دارد. هوش مصنوعی مولد مبتنی بر مدلهای زبانی چندوجهی در تشخیص و توضیح محتوای تصویر عالی است، اما فقط میتواند تفاوتها را در جنبههایی شناسایی کند که بهطور صریح برای آنها آموزش دیده است. در همین حال، کتابخانههای مقایسه تصویر به درجه بالایی از همترازی نیاز دارند، اغلب در سطح پیکسل، و حتی کوچکترین اعوجاجها را هم بدون هیچگونه تلورانسی نمیپذیرند.
تشخیص تفاوت، یک وظیفه مرتبط در اتوماسیون تست بصری است وقتی یک اسکرینشات باید با نسخه قبلی یا یک طراحی مرجع مقایسه شود. در حالت ایدهآل، میخواهیم مشخص کنیم کدام عناصر تغییر کردهاند و چگونه. آیا چیزها جابهجا شدهاند، مقیاس گرفتهاند یا جایگزین شدهاند؟ فناوریهای فعلی در اتوماسیون تست بصری با یکی از همین دو ضعف توصیفشده شکست میخورند. روشهای مبتنی بر LLM حتی مشکلات بزرگ چیدمانی را در مورد اشیایی که نمیشناسند از دست میدهند. الگوریتمهای مبتنی بر پیکسل، تفاوتهای بزرگ گزارش میکنند، وقتی فقط یک جابهجایی کوچک چندپیکسلی رخ داده باشد.
بینایی در تست نرمافزار
هدف تست نرمافزار، تشخیص انحرافها از یک وضعیت مورد انتظار است. آخرین و دشوارترین جنبه یک برنامه، ظاهر نهایی آن روی صفحه است. از آنجا که ادراک بصری ما فوقالعاده انعطافپذیر است، میتوانیم به جزئیات بسیار ریز واکنش نشان دهیم و در عین حال بهصورت ناخودآگاه تغییرات بزرگ در موقعیت و رنگ را جبران کنیم. بنابراین، تعیین اینکه چه چیزی «بازچینش معتبر» محسوب میشود در برابر «نقض انتظار»، بهشدت سخت است که به شکل رسمی مدلسازی شود. برای دوری از این مشکلات، بیشتر تستهای نرمافزار فقط وضعیتهای فنی داخلی را بررسی میکنند، مانند درختهای DOM. با این حال، با افزایش تواناییهای هوش مصنوعی، بررسی اینکه یک چیز برای انسان چگونه دیده میشود، هر روز عملیتر میشود.
وضعیت هوش مصنوعی
مثال زیر را در نظر بگیرید: دو نسخه از یک نقشه. از آنجا که بسیاری از ما در کودکی بازی «تفاوتها را پیدا کن» را انجام دادهایم، میتوانیم یک خیابانِ حذفشده که مستقیم به مرکز شهر میرود را ظرف چند ثانیه پیدا کنیم. چون این کار برای ما آنقدر ساده به نظر میرسد، سخت است باور کنیم که الگوریتمهای بینایی ماشین چقدر با آن مشکل دارند. علاوه بر حذف یک خیابان، کل نقشه نیز دو پیکسل به سمت پایین و راست جابهجا شده است. همین جزئیات بهظاهر کوچک باعث میشود همه الگوریتمهای مبتنی بر پیکسل، مثل Pixelmatch، resemble.js، Python Pillow و OpenCV شکست بخورند. مدلهای هوش مصنوعی مولد وعده درک عمیق تصاویر را میدهند. بیایید ببینیم در این مثال چطور عمل میکنند.


شکل ۱: دو نسخه از یک نقشه. خیابانِ حذفشده برای انسانها سریع قابل تشخیص است، اما نه برای هوش مصنوعی.
با مدلهای چندوجهی، میتوانیم هر دو تصویر را مستقیم آپلود کنیم و درباره تفاوت توضیح بخواهیم. این تحلیل با Claude 3.7، Claude 4، Gemini 2.5 pro، ChatGPT-o3 و ChatGPT-4o انجام شد. Claude و Gemmini (جمنّی) از همان ابتدا شکست میخورند و پاسخ میدهند که تغییر قابلتوجهی وجود ندارد. ChatGPT آنقدر قدرتمند است که فقط بعد از تولید کد Python شکست بخورد؛ کدی که جفت تصویر را با چندین کتابخانه گرافیک کامپیوتری موجود تحلیل میکند. به دلیل ناهمترازی خفیف پیکسلی بین دو نقشه، همه الگوریتمهای مبتنی بر پیکسل تغییر رنگ را روی هر لبه تشخیص میدهند، و خیابان حذفشده دیده میشود اما در میان انبوه مثبتهای کاذب کماهمیت و نامشخص میشود، همانطور که در شکل ۲ نشان داده شده است. همه الگوریتمهای مقایسه تصویرِ ذکرشده نتایج مشابه تولید میکنند و نمیتوانند تغییر مهم را برجسته کنند.

شکل ۲: الگوریتمهای مقایسه تصویر مبتنی بر پیکسل، تعداد زیادی مثبت کاذب پیدا میکنند.
مدلهای هوش مصنوعی مولد با جزئیات چشمگیر درباره تصاویر استدلال میکنند، منشأ نقشه را تشخیص میدهند، همه نامها را بررسی میکنند و طرح رنگ را تحلیل میکنند. با این حال، هیچکدام از مدلها اتصال حذفشده را شناسایی نمیکنند. در همه موارد، Claude، Gemmini و ChatGPT بهطور صریح برابری همه مسیرها را تأیید کردند. در یکی از اجراها، جدیدترین مدل GPT-o3 یافتههای خود را اینگونه خلاصه میکند: «هیچ چیز معناداری تغییر نکرده»، همانطور که در شکل ۳ نشان داده شده است.

شکل ۳: ChatGPT-o3 پس از ۵۱ ثانیه «فکر کردن»، هیچ اشارهای به خیابانِ حذفشده نمیکند.
انسانها چطور این کار را انجام میدهند؟
بیایید لحظهای دروننگری کنیم که ما انسانها چطور به چنین کاری نزدیک میشویم. شاید حتی بخواهید کمی به بالا اسکرول کنید و ببینید خودتان چطور نقشهها را برای تفاوتها مقایسه کردید. بیشتر افراد حدود ۱۰ تا ۲۰ ثانیه زمان نیاز دارند تا خیابانِ حذفشده را پیدا کنند.
قبل از اینکه بتوانیم شروع کنیم به مقایسه قطعههای تصویر، باید مسئله «تناظر» را حل کنیم. چشمهای شما چپ و راست بین تصاویر حرکت میکنند، روی نقاط مشخص تمرکز میکنند و بین مکانهای مختلف در هر دو نقشه جابهجا میشوند. وقتی نقاط متناظر را پیدا کردید، میتوانید شروع کنید به بررسی ناحیه مورد نظر. نگاه شما روی یکی از تصاویر ثابت نمیماند. حرکتهای کوچک چشم باعث میشوند شبکیه بهطور متناوب روی موقعیتهای مختلف ثابت شود و عملاً نواحی متناظر تصویر روی هم بیفتند. عضلات چشم فاصله فضایی بین دو تصویر را جبران میکنند. مقایسه رنگها حتی میتواند در خود شبکیه شروع شود. سپس سیگنالها از طریق عصب بینایی به تالاموس میروند، جایی که ویژگیهای بصری مهم فیلتر میشوند.
وقتی این فرایند را در سراسر تصویر تکرار میکنید، ممکن است خودتان را در حال ساختن فرضیههایی ببینید، مثل «آیا این جاده واقعاً حذف شده؟» که شما را وادار میکند برای تأیید فرضتان تلاش بیشتری انجام دهید. انسان ادراکِ مبتنی بر فرضیه انجام میدهد: قشر بینایی ده برابر بیشتر اتصال از قشر به تالاموس (و در نهایت بازگشت به چشم) دارد نسبت به مسیرِ برعکس. این یعنی ما ده برابر قدرت پردازش بیشتری را صرف طراحی و اصلاح تستها میکنیم تا صرف ارزیابی سیگنالهای خروجی چشم.
روشی که در بخش قبلی توصیف شد، یک نمونه عالی از زنجیره تفکر است. بهجای تولید مستقیم نتیجه، ما آگاهانه و ناخودآگاه از طریق چندین تکرار، شکست و نتیجهگیری بهتر، یک راهبرد توسعه میدهیم. دقیقاً همینجاست که هوش مصنوعی مولد مشکل دارد. در حالی که پیشرفتهای اخیر، استدلال زنجیرهتفکر را برای محتوای متنی ممکن کردهاند، اعمال همان مفهوم روی تحلیل فضایی دوبعدی در چندین مقیاس، چالش حتی بزرگتری است. مدلهای هوش مصنوعی مولد خیلی دیرتر از پرامپتهای صرفاً متنی یاد گرفتهاند ورودی تصویر را پردازش کنند. حل همه مسائل مرتبط با بینایی احتمالاً سالها طول میکشد، شاید حتی بیشتر، اگر در نظر بگیریم که خود انسانها هم این کار را به قیمتِ آسیبپذیری بالا در برابر خطاهای دید (توهمهای بصری) انجام میدهند.
نکته مهم این است که هوش مصنوعی در تشخیص محرکهایی عالی است که زیاد در دادههای آموزشیاش دیده میشوند. این شامل متن، موقعیتهای ترافیکی، نمای نزدیک اشیا، سلبریتیها و الگوهای بصری رایج در تستهای IQ است. اما عناصر دیگری مثل نقشههای جغرافیایی، همترازسازیهای زیباییشناسانه، و اشکال انتزاعی یا تخیلی بیرون از این حوزه قرار میگیرند؛ نه فقط به دلیل کمبود داده آموزشی، بلکه چون برچسبزدنشان با کلمات سخت است. توصیف تفاوتهای بصری بسیار دشوارتر از استخراج تفاوتها از برچسبهای شناساییشده است. در نتیجه، مقایسه تصویر همچنان یک چالش است و احتمالاً تا مدتی همینطور باقی میماند.
تلورانس نسبت به جابهجایی پیکسلها
در مقایسه تصاویر، دو مفهوم جدا باید در نظر گرفته شوند. اول اینکه تعیین کنیم آیا جفت تصویر برابر است یا نه. دوم اینکه کمینه تغییری که لازم است تا آنها برابر شوند را شناسایی کنیم. در تست نرمافزار، هر دو مرحله حیاتیاند. مرحله اول تعیین میکند آیا تست شکست میخورد و نیاز به بررسی انسانی دارد یا نه، و مرحله دوم تصمیمگیری سریع را تسهیل میکند. اینکه بدانیم یک دکمه «فقط» جابهجا شده، پیامد متفاوتی دارد نسبت به اینکه هم جابهجا شده و هم تغییر کرده است. بدون گزارش قابل اعتماد از تغییر واقعی، تستکنندگان نرمافزار مجبور میشوند به مقایسههای دستی خستهکننده به سبک «تفاوتها را پیدا کن» برگردند.
سادهترین روش برای مقایسه دو تصویر، رویکرد پیکسلبهپیکسل است. این تکنیک در مثال نقشه قبلی توسط ChatGPT امتحان شد. اما این روش وقتی روی رابطهای کاربری مدرن با چیدمانهای پویا اعمال میشود شکست میخورد. پایداری پیکسل تضمینشده نیست، میتواند بین نسخهها تغییر کند یا حتی بهصورت تصادفی تغییر کند وقتی الگوریتمهای بسیار موازی در حال فشار آوردن به مرزهای سریعترین موتور رندر هستند. در نتیجه، رنگهای تکپیکسل برای نتیجهگیری درباره محتوای معادل کافی نیستند. جابهجاییهای فضایی به شکلهای پیچیدهتری از تشخیص الگو نیاز دارند.
یک راهحل رایج برای این مسئله، استفاده از شبکه عصبی کانولوشنی (CNN) است. آموزش شبکه با کل جفتتصاویر پرهزینه خواهد بود، چون اسکرینشاتهای واقعی وضوح بالایی دارند و میلیونها پیکسل دارند. میتوان مسئله را با مقایسه قطعههای کوچک بهجای تکپیکسلها ساده کرد. مثال زیر از یک ناحیه ۹×۹ پیکسل استفاده میکند. این اندازه بهاندازه کافی بزرگ است تا جابهجاییهای کوچک را هنگام تعیین برابری در نظر بگیرد، و بهاندازه کافی کوچک است تا یک شبکه عصبی سبک کفایت کند. با ۹×۹×۲ = ۱۶۲ گره ورودی و یک گره خروجی، شبکه مورد نیاز حداقلی است. از آنجا که هر کانال رنگی میتواند جداگانه در نظر گرفته شود، آموزش نمونههای تکرنگ کافی است.

شکل ۴: قطعه ۹×۹ از جفتتصاویر. برابری ساختاری تصویر ۱ و ۳ را میتوان رد کرد. برای تصویر ۱ و ۲ نمیتوان.
آموزش چنین شبکهای با Tensorflow (و به همان شکل با PyTorch) سرراست است. مثال کد زیر یک شبکه مؤثر را نشان میدهد که از ۲۰۰ هزار تصویر خاکستری برچسبخورده آموزش دیده است. برای بهرهبردن از همه تقارنها، تعداد نمونههای آموزشی میتواند ۱۶ برابر شود، با در نظر گرفتن ۳ محور تقارن و جابجاپذیری دو تصویر ورودی. رویه آموزش عملاً در یک فراخوانی به API کتابخانه Keras تعریف میشود و طی چند دقیقه روی سختافزار معمولی کامل میشود. ۱۵ سال پیش این کار در مرز پژوهش هوش مصنوعی بود. امروز یادگیری ماشینِ سرراست است.
یک نوتبوک Colab موجود است که شامل دستورالعملهای آموزش و دادههای آموزشی است.
طراحی شبکه عصبی بهطور کلی از LeNet اصلی (سال ۱۹۹۰) پیروی میکند، با این تفاوت که روی تصویری اعمال میشود که از پنجره ورودی بزرگتر است. بنابراین بهجای یک برچسب واحد، برای هر نقطه یک برچسب تولید میکند. این کار مسئله مثال اولیه ما درباره دو نقشه که کاملاً همتراز نیستند را حل میکند. شکل ۵ نتیجه این شبکه کانولوشنی ساده را نشان میدهد با ۱۶۲ گره ورودی، ۸ لایه و مجموعاً ۴۸٬۲۱۱ پارامتر قابل آموزش. تمام دادههای آموزشی و چیدمان شبکه از نوتبوک لینکشده در دسترس هستند.

شکل ۵: شبکه عصبی کانولوشنی میتواند محل انحراف را روی نقشه تشخیص دهد.
کنار آمدن با جابهجاییهای بزرگ
در نمایشگرهای با وضوح بالا یا با چیدمانهای پیچیدهتر، تفاوتهای دو تصویر ممکن است از جابهجاییهایی بیش از چند پیکسل ناشی شود. در کاربردهای اتوماسیون تست، چنین بازچینشهایی معمولاً به شکست تست منجر میشوند. تلاش دستی برای بررسی همه اسکرینشاتهای کمی بازفرمتشده از نظر سازگاری، بسیار زیاد است. اگر یک ابزار هوش مصنوعی بتواند بهدرستی تشخیص دهد که آیا تغییرات قابلتوجهی خارج از این تنظیمات جزئی چیدمان رخ داده یا نه، فوقالعاده ارزشمند خواهد بود.
یک فکر سادهلوحانه این است که اندازه پنجره شبکه عصبی را بزرگتر کنیم. فرض کنیم شبکهای داریم که میتواند جابهجاییهایی با طول «n» را جبران کند و میخواهیم توانش را ۲ برابر کنیم. چون جابهجایی اضافی میتواند در هرکدام از دو بعد رخ دهد، باید جستوجو را به چهار قطعه مختلف با اندازه اصلی گسترش دهیم. چون هرکدام از این چهار قطعه را بهعنوان تطابق میپذیریم، چهار برابر بیشتر احتمال دارد مثبت کاذب بگیریم. نواحی کوچک ممکن است صرفاً شبیه به هم باشند، مثلاً نوع خط یکسان داشته باشند، اما نتیجه جابهجایی سازگارِ یک ناحیه کامل نباشند. برای جلوگیری از افت ویژگیمندی (specificity)، باید نواحی صفحه را با اندازه ۴ برابر مقایسه کنیم. این یعنی مجموعاً ۱۶ برابر تلاش، یا پیچیدگی O(n^4) برای شبکه مقایسه تصویر که نسبت به جابهجایی با طول n تلورانس دارد. این احتمالاً حد پایین است، چون در نواحی بزرگتر ممکن است جابهجایی یکنواخت نباشد و سناریوهای اعوجاج پیچیدهتری باید در نظر گرفته شوند.
سناریویی را در نظر بگیرید که جابهجایی بزرگ و غیر یکنواخت است. شکل ۶ نمونهای از بازی «تفاوتها را پیدا کن» را نشان میدهد همانطور که کودکان خردسال انجام میدهند. نمایش کجشده تصویر دوم برای انسانها تلاش اضافی کمی میطلبد، چون ما عادت داریم چیزها را از زاویه ببینیم. برای هدف تست نرمافزار، چنین اعوجاجی ممکن است غیرواقعی به نظر برسد. اما با چیدمانهای سیال و مقیاسها و موقعیتهای مدام در حال تغییر، خیلی هم دور از واقعیت نیست. نکته مهم این است که هوش مصنوعی کاملاً در تشخیص هرکدام از تفاوتهای مرتبط شکست میخورد.

شکل ۶: در حالی که کودکان خردسال مشکلی در یافتن تفاوتهای مرتبط ندارند، هوش مصنوعی کاملاً شکست میخورد.
یک راهحل ممکن
همانطور که قبلاً بحث شد، افزایش اندازه پنجره برای پوشش کل طول جابهجاییها گزینه مناسبی نیست. بهجای آموزش شبکه برای تولید یک پرچم برابری بولی، میتوان آن را طوری آموزش داد که مقادیر x و y بردار جابهجایی را برگرداند. در نگاه اول، این متفاوت به نظر نمیرسد، چون طول واقعی همچنان داخل پنجره لغزان محاسبه جا نمیشود. اما حالا میتوانیم تصویر را کوچکمقیاس کنیم، جزئیات لازم برای مقایسه را قربانی کنیم، و در عوض مزیت «دید کلی» را به دست آوریم که اجازه میدهد یک تقریب از جهت جابهجایی استخراج کنیم و ناحیه جستوجو را در سطوح دقیقتر محدود کنیم.
شبهالگوریتم زیر یک راهحل برای مسئله تناظر پیادهسازی میکند. این الگوریتم یک نقشه از بردارها تولید میکند که به موقعیتهای متناظر در تصویر چپ و راست اشاره میکنند. الگوریتم بهصورت بازگشتی خودش را با تصاویر کوچکمقیاسشده فراخوانی میکند. شبکه آموزشدیده فقط باید خطاهای سطح درشتتر را اصلاح کند، یعنی فقط لازم است ویژگیهای همسان را در یک ناحیه جستوجوی بسیار کوچک پیدا کند. این الگوریتم از متد “resize” در چارچوب OpenCV برای بزرگ و کوچک کردن تصاویر استفاده میکند و از “remap” برای اعمال جابهجاییهایی که در سطوح درشتتر پیشبینی شدهاند. همچنین از یک متد cnn_predict برای گرفتن تخمین شبکه عصبی از جابهجایی نسبی استفاده میکند. پیشبینی شامل دو کانال خروجی برای مؤلفههای x و y است.

این برگه Colab الگوریتم کامل را با همه حالتهای مرزی در Python با استفاده از OpenCV و یک شبکه از پیش آموزشدیده نشان میدهد که میتواند جابهجاییهایی تا اندازه ۳ پیکسل را از یک پنجره ۱۵×۱۱ با ۶۴٬۷۴۱ پارامتر تشخیص دهد.
پس از بازسازی نقشه جابهجایی، نصف اثر را روی هر تصویر اعمال میکنیم. حالا دو تصویر در میانه به هم میرسند و میتوان آنها را با روشهای استاندارد مقایسه کرد. بدیهی است که اعوجاج، aliasing اضافی ایجاد میکند و تطابق پیکسلبهپیکسل نخواهد بود. شبکه عصبی بخش قبلی این مشکل را بدون هیچ تغییر اضافی حل میکند. همه تفاوتهای مرتبط تشخیص داده میشوند، با فقط دو مثبت کاذب در گوشه بالا سمت راست. لازم به گفتن نیست که هیچکدام از این تصاویر تست در مرحله آموزش استفاده نشده بودند.

شکل ۷: پس از جبران اعوجاج، میتوان الگوریتمهای ساده تشخیص تفاوت را اعمال کرد.
این راهحل پیشنهادی کمک میکند تفاوتهای مرتبط حتی پس از تغییر چشمگیر چیدمان پیدا شوند. این روش میتواند تشخیص دهد آیتمها با هم حرکت کردهاند، اما نمیتواند آیتمهای منفردی را که جایشان با هم عوض میشود یا به نواحی کاملاً جدید میپرند ردیابی کند. همچنان یک انسان یا هوش مصنوعی باید بررسی کند و توضیح دهد دقیقاً چه چیزی تغییر کرده است. با این حال، با محدود کردن اینکه «کجا باید نگاه کرد»، کار بسیار آسانتر میشود.
نتیجهگیری
مقایسه دو خروجی گرافیکی، چالش اصلی در تست رگرسیون بصری است. در حالی که تشخیص اینکه دو تصویر در سطح پیکسل متفاوتاند آسان است، خلاصهکردن یافتهها به شکلی مثل «لوگوی X به اندازه n پیکسل جابهجا شده» بسیار سختتر است. متأسفانه، مدلهای فعلی هوش مصنوعی مولد چندوجهی از پس این کار برنمیآیند. آنها در یافتن تفاوتهایی که میتوانند نامگذاری کنند بسیار خوباند، مثل مقادیر متن یا ترتیب دکمهها، اما وقتی چیزها قابل نامگذاری نیستند کاملاً شکست میخورند؛ مثل همترازسازیهای زیباییشناسانه، اتصالها روی یک نقشه نامنظم، یا هر شیئی که برای توکنسازی آن آموزش ندیدهاند.
برای تسهیل مقایسه تصویر، دو راهحل دستساز پیشنهاد شد. آموزش یک CNN برای مقایسه قطعههای تصویر با تلورانس نسبت به جابهجاییهای کوچک میتواند نیاز به همترازی کامل پیکسلها را کاهش دهد. برای تشخیص و جبران اعوجاجهای بزرگ، الگوریتمی نشان داده شد که با کار کردن روی چندین مقیاس تصویر چنین کاری را انجام میدهد. این شبیه چیزی است که احتمالاً قشر بینایی انسان انجام میدهد: روی چند مقیاس عمل میکند، فرضیه میسازد و اثر را جبران میکند. در نهایت، تغییر باقیمانده میتواند روی آن تمرکز شود و تفاوتهای ناشی از جابهجایی از تفاوتهای غیرجابهجایی جدا شوند. از آنجا که مقایسه تصاویر ثابت فقط نوک کوه یخ پردازش بصری است، انتظار دارم فناوریهای هوش مصنوعی برای مدت قابلتوجهی در آینده همچنان با کارهای ساده مرتبط با تصویر دستوپنجه نرم کنند.
