ملاحظات إصدار "حزمة اختبار صور الكاميرا" لنظام التشغيل Android 12

تم تضمين عدد من التغييرات في Camera ITS في إصدار Android 12. تلخّص هذه الصفحة التغييرات التي تندرج ضمن أربع فئات عامة:

إعادة صياغة الرمز البرمجي إلى Python 3

بسبب إيقاف لغة Python 2.7 نهائيًا في كانون الثاني (يناير) 2020، تمت إعادة صياغة قاعدة بيانات Camera ITS بالكامل لتصبح متوافقة مع لغة Python 3. يجب توفُّر إصدارات بايثون التالية والمكتبات في Android 12:

لن يتغيّر مشغّل الاختبار الرئيسي tools/run_all_tests.py الذي يخصّ إصدارات Android 11 أو الإصدارات الأقدم، وقد تمت إعادة تحويله إلى إصدار Python 3.

تمّت إعادة صياغة جميع الاختبارات الفردية واستخدام فئة إعداد الاختبار الجديدة المحدّدة في tests/its_base_test.py. ستظل معظم أسماء الاختبارات ووظائفها كما هي. في Android 12، تحمِّل الآن كل الاختبارات الفردية مشاهدها. على الرغم من أنّ تحميل المشهد لكل اختبار يؤدي إلى زيادة وقت الاختبار بشكل عام، إلا أنّه يتيح تصحيح أخطاء الاختبارات الفردية.

لمزيد من المعلومات حول تغييرات الاختبار الفردية، يمكنك الاطّلاع على اختبار التغييرات.

تمّت إعادة صياغة وحدات Python التالية مع تغيير الاسم:

  • pymodules/its/caps.pyutils/camera_properties_utils.py
  • pymodules/its/cv2image.pyutils/opencv_processing_utils.py
  • pymodules/its/device.pyutils/its_session_utils.py
  • pymodules/its/error.pyutils/error_util.py
  • pymodules/its/image.pyutils/image_processing_utils.py
  • pymodules/its/objects.pyutils/capture_request_utils.py
  • pymodules/its/target.pyutils/target_exposure_utils.py
  • tools/hw.pyutils/sensor_fusion_utils.py

استخدام إطار عمل اختبار Mobly

Mobly عبارة عن إطار اختبار يستند إلى بايثون ويتوافق مع حالات الاختبار التي تتطلب أجهزة متعددة مزودة بإعدادات مخصصة للأجهزة. يستخدم اختبار الكاميرا ITS بنية اختبار Mobly الأساسية للسماح بالتحكّم بشكل أفضل في الاختبارات وتسجيلها.

يستخدم فريق ITS للكاميرا بنية اختبار Mobly الأساسية للسماح بإمكانية التحكّم بشكل أفضل في الاختبارات وتسجيلها. Mobly هو إطار عمل اختباري يستند إلى لغة البايثون ويدعم حالات الاختبار التي تتطلب أجهزة متعددة مزودة بإعدادات مخصصة للأجهزة. لمزيد من المعلومات عن Mobly، يُرجى الاطّلاع على google/mobly.

ملفات config.yml

باستخدام إطار عمل Mobly، يمكنك إعداد جهاز قيد الاختبار (DUT) ورسم بياني لجهاز لوحي في فئة its_base_test. يتم استخدام ملف config.yml (YAML) ل إنشاء منصة اختبار Mobly. يمكن ضبط منصات اختبار متعددة ضمن ملف الإعدادات هذا، على سبيل المثال، جهاز لوحي ومنصة اختبار دمج أجهزة الاستشعار. ضمن قسم المشغِّل في كل منصة اختبار، يمكنك تحديد device_ids لتحديد أجهزة Android المناسبة لمسؤول الاختبار. بالإضافة إلى أرقام تعريف الأجهزة، يتم تمرير مَعلمات أخرى في فئة الاختبار، مثل brightness وchart_distance debug_mode وcamera_id وscene_id للأجهزة اللوحية. في ما يلي قيم مَعلمات الاختبار الشائعة:

brightness: 192  (all tablets except Pixel C)
chart_distance: 31.0  (rev1/rev1a box for FoV < 90° cameras)
chart_distance: 22.0 (rev2 test rig for FoV > 90° cameras)

الاختبار المستنِد إلى الأجهزة اللوحية

بالنسبة إلى الاختبار المستنِد إلى الأجهزة اللوحية، يجب أن تكون الكلمة الرئيسية TABLET متوفّرة في اسم قاعدة الاختبار. أثناء الإعداد، يُنشئ مشغّل اختبارات Mobly TestParams ويمرّرها إلى الاختبارات الفردية.

في ما يلي نموذج لملف config.yml لعمليات التنفيذ المستندة إلى الأجهزة اللوحية.

TestBeds:
  - Name: TEST_BED_TABLET_SCENES
    # Test configuration for scenes[0:4, 6, _change]
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut
          - serial: 5B16001229
            label: tablet

    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"
      chart_loc_arg: ""
      camera: 0
      scene: <scene-name>  # if <scene-name> runs all scenes

يمكن استدعاء الاختبار باستخدام tools/run_all_tests.py. في حال عدم توفّر قيم سطر الأوامر ، يتم تنفيذ الاختبارات باستخدام قيم ملف config.yml. بالإضافة إلى ذلك، يمكنك إلغاء قيم ملف الإعداد camera وscene في سطر الأوامر باستخدام أوامر مشابهة لنظام التشغيل Android 11 أو الإصدارات الأقدم.

مثلاً:

python tools/run_all_tests.py
python tools/run_all_tests.py camera=1
python tools/run_all_tests.py scenes=2,1,0
python tools/run_all_tests.py camera=1 scenes=2,1,0

اختبار دمج البيانات من أجهزة الاستشعار

بالنسبة إلى اختبار دمج أجهزة الاستشعار، يجب أن يتضمّن اسم المختبر الكلمة الرئيسية SENSOR_FUSION. يتم تحديد موضع الاختبار الصحيح من خلال المَشاهد التي يتم اختبارها. يتوافق نظام Android 12 مع كلّ من وحدات التحكّم في Arduino وCanakit لدمج البيانات من مختلف الحساسات.

في ما يلي نموذج لملف config.yml لعمليات الدمج باستخدام أداة الاستشعار.

Testbeds
  - Name: TEST_BED_SENSOR_FUSION
    # Test configuration for sensor_fusion/test_sensor_fusion.py
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      fps: 30
      img_size: 640,480
      test_length: 7
      debug_mode: "False"
      chart_distance: 25
      rotator_cntl: arduino         # cntl can be arduino or canakit
      rotator_ch: 1
      camera: 0

لإجراء اختبارات دمج البيانات من أجهزة الاستشعار باستخدام منصّة اختبار دمج البيانات من أجهزة الاستشعار، استخدِم:

python tools/run_all_tests.py scenes=sensor_fusion
python tools/run_all_tests.py scenes=sensor_fusion camera=0

قواعد اختبار متعددة

يمكن تضمين عدة منصات اختبار في ملف الإعداد. أكثر تركيبات شيوعًا هي إجراء اختبار اندماج جهاز لوحي وجهاز استشعار.

في ما يلي نموذج لملف config.yml يتضمّن منصّتَي اختبار هما اختبار دمج الشاشة اللوحي واختبار دمج المستشعر.

Testbeds
  - Name: TEST_BED_TABLET_SCENES
    # Test configuration for scenes[0:4, 6, _change]
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut
          - serial: 5B16001229
            label: tablet

    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"
      chart_loc_arg: ""
      camera: 0
      scene: <scene-name>  # if <scene-name> runs all scenes

  - Name: TEST_BED_SENSOR_FUSION
    # Test configuration for sensor_fusion/test_sensor_fusion.py
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      fps: 30
      img_size: 640,480
      test_length: 7
      debug_mode: "False"
      chart_distance: 25
      rotator_cntl: arduino         # cntl can be arduino or canakit
      rotator_ch: 1
      camera: 0

الاختبار اليدوي

لا يزال الاختبار اليدوي متاحًا في Android 12. ومع ذلك، يجب أن يحدِّد اختبار الأداء الاختبار على أنّه اختبار أداء باستخدام الكلمة الرئيسية MANUAL في اسم اختبار الأداء. بالإضافة إلى ذلك، لا يمكن أن يتضمن الاختبار معرف جهاز لوحي.

في ما يلي نموذج لملف config.yml للاختبار اليدوي.

TestBeds:
  - Name: TEST_BED_MANUAL
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      debug_mode: "False"
      chart_distance: 31.0
      camera: 0
      scene: scene1

اختبار المشاهد بدون استخدام الأجهزة اللوحية

يمكن إجراء الاختبار على المشهد 0 والمشهد 5 باستخدام TEST_BED_TABLET_SCENES أو باستخدام TEST_BED_MANUAL. أمّا إذا تم إجراء الاختبار باستخدام TEST_BED_TABLET_SCENES، فيجب أن يكون الجهاز اللوحي متصلاً وأن يكون المعرّف التسلسلي للجهاز صالحًا حتى وإن لم يتم استخدامه لأنّ إعداد صف الاختبار يحدِّد قيمة المعرّف التسلسلي للجهاز.

إجراء اختبارات فردية

يمكن إجراء الاختبارات الفردية لأغراض تصحيح الأخطاء فقط لأنّه لا يتم الإبلاغ عن نتائجها إلى أداة التحقّق من CTS. بما أنّه لا يمكن استبدال ملفات config.yml في سطر الأوامر الخاص بـ camera و scene، يجب أن تكون هذه المَعلمات صحيحة في ملف config.yml الخاص بالاختبار الفردي المعني. بالإضافة إلى ذلك، إذا كان هناك أكثر من منصة اختبار واحدة في ملف الإعدادات، عليك تحديد منصة الاختبار باستخدام العلامة --test_bed. مثلاً:

python tests/scene1_1/test_black_white.py --config config.yml --test_bed TEST_BED_TABLET_SCENES

عناصر الاختبار

في الإصدار 12 من نظام التشغيل Android، يتم تخزين مواد اختبار تقنية ITS للكاميرا بالطريقة نفسها المتّبعة في الإصدار 11 من نظام التشغيل Android أو الإصدارات الأقدم، ولكن مع إجراء التغييرات التالية:

  • تمّ إدراج CameraITS_ في بداية ملف /tmp الذي يتضمن العنصر التجريبي، وذلك قبل السلسلة العشوائية المكونة من 8 أحرف من أجل الوضوح.
  • يتم تخزين نتائج الاختبار والأخطاء في test_log.DEBUG لكل اختبار بدلاً من test_name_stdout.txt وtest_name_stderr.txt.
  • يتم تخزين رموز DUT والأجهزة اللوحية من كل اختبار فردي في دليل /tmp/CameraITS_######## لتبسيط عملية تصحيح الأخطاء، إذ يتم تسجيل جميع المعلومات المطلوبة لتصحيح أخطاء 3A.

اختبار التغييرات

في Android 12، تكون مَشاهد الأجهزة اللوحية ملفات PNG بدلاً من ملفات PDF. يتيح استخدام ملفات PNG لمزيد من طُرز الأجهزة اللوحية عرض المشاهد بشكل صحيح.

scene0/test_jitter.py

يتم إجراء اختبار test_jitter على الكاميرات المقترنة بالأجهزة في Android 12.

scene1_1/test_black_white.py

في نظام التشغيل Android 12، توفّر test_black_white وظيفتَي test_black_white و test_channel_saturation.

يوضِّح الجدول التالي الاختبارَين الفرديَّين في نظام Android 11.

اسم الاختبار المستوى الأول لواجهة برمجة التطبيقات الادّعاءات
scene1_1/test_black_white.py الكل التعرّض لفترة قصيرة، قيم نموذج RGB ذات الكسب المنخفض تقريبًا [0, 0, 0]
التعرّض لفترة طويلة، قيم نموذج RGB ذات الكسب العالي تقريبًا [255, 255, 255]
scene1_1/test_channel_saturation.py 29 تقليل درجة التفاوت في [255، 255، 255] للتخلص من صبغة الألوان في الصور البيضاء.

يصف الجدول التالي الاختبار المدمج، scene1_1/test_black_white.py، في Android 12.

اسم الاختبار المستوى الأول لواجهة برمجة التطبيقات الادّعاءات
scene1_1/test_black_white.py الكل مدة التعرّض قصيرة، وقيم RGB ذات نسبة اكتساب منخفضة تقريبًا [0, 0, 0]
مدة التعرّض طويلة، وقيم RGB ذات نسبة اكتساب عالية تقريبًا [255, 255, 255] وحدود مقبولة مخفضة بين القيم للقضاء على صبغة اللون في الصور البيضاء

scene1_1/test_burst_sameness_manual.py

يتم إجراء اختبار test_burst_sameness_manual على الكاميرات المقترنة بالأجهزة في Android 12.

scene1_2/test_tonemap_sequence.py

يتم إجراء اختبار test_tonemap_sequence على كاميرات LIMITED في Android 12.

scene1_2/test_yuv_plus_raw.py

يتم إجراء اختبار test_yuv_plus_raw على الكاميرات المقترنة بالأجهزة في Android 12.

مشهد2_a/test_format_combos.py

يتم إجراء اختبار test_format_combos على كاميرات محدودة في Android 12.

scene3/test_flip_mirror.py

يتم إجراء اختبار test_flip_mirror على كاميرات محدودة في Android 12.

scene4/test_aspect_ratio_and_crop.py

تمّت إعادة تنظيم عملية العثور على الدوائر في scene4/test_aspect_ratio_and_crop.py في Android 12.

استخدمت إصدارات Android السابقة طريقة تضمنت تحديد محيط ثانوي (الدائرة) داخل الخط المحيط الرئيسي (المربع) باستخدام فلاتر للحجم واللون. يستخدم نظام التشغيل Android 12 طريقة تتضمن العثور على جميع الخطوط الخارجية ثم الفلترة من خلال العثور على العناصر التي تبدو أكثر استدارة. لاستبعاد الدوائر الزائفة على الشاشة، يجب أن يكون هناك حد أدنى لمساحة المحيط، ويجب أن يكون محيط الدائرة أسود.

تظهر الخطوط الخارجية ومعايير اختيارها في الصورة التالية.

رسم مفاهيمي لخطوط الكنتور ومعايير الاختيار

الشكل 1: رسم مفاهيمي لخطوط الكنتور ومعايير الاختيار

إنّ طريقة Android 12 أبسط وتعمل على حلّ مشكلة اقتصاص مربّع الحدود في بعض أجهزة التابلت المزوّدة بشاشة. يتم تسجيل جميع الدائرة المرشحة لأغراض تصحيح الأخطاء.

في Android 12، يتم إجراء اختبار الاقتصاص على أجهزة FULL وLEVEL3. تتخطى إصدارات Android 11 أو الإصدارات الأقدم تأكيدات اختبار الاقتصاص لأجهزة FULL.

يسرد الجدول التالي التأكيدات المتعلّقة بملف APK لنظام التشغيل test_aspect_ratio_and_crop.py والتي تتوافق مع مستوى جهاز معيّن و مستوى واجهة برمجة التطبيقات الأول.

على مستوى الجهاز المستوى الأول من واجهة برمجة التطبيقات الادّعاءات
محدودة الكل نسبة العرض إلى الارتفاع
مجال الرؤية بتنسيقات 4:3 و16:9 و2:1
كامل ‫< 31 نسبة العرض إلى الارتفاع
مجال الرؤية بتنسيقات 4:3 و16:9 و2:1
كامل ≥ 31 الاقتصاص
نسبة العرض إلى الارتفاع
مجال الرؤية بتنسيقات 4:3 و16:9 و2:1
المستوى 3 الكل الاقتصاص
نسبة العرض إلى الارتفاع
FoV للتنسيقات 4:3 و16:9 و2:1

scene4/test_multi_camera_alignment.py

تمّت إعادة صياغة الطريقة undo_zoom() لعمليات التقاط YUV في scene4/test_multi_camera_alignment.py من أجل مراعاة القص بدقة أكبر على أجهزة الاستشعار التي لا تتطابق مع نسبة العرض إلى الارتفاع لعمليات الالتقاط.

رمز Python 2 لنظام التشغيل Android 11

zoom_ratio = min(1.0 * yuv_w / cr_w, 1.0 * yuv_h / cr_h)
circle[i]['x'] = cr['left'] + circle[i]['x'] / zoom_ratio
circle[i]['y'] = cr['top'] + circle[i]['y'] / zoom_ratio
circle[i]['r'] = circle[i]['r'] / zoom_ratio

رمز Python 3 في Android 12

yuv_aspect = yuv_w / yuv_h
relative_aspect = yuv_aspect / (cr_w/cr_h)
if relative_aspect > 1:
  zoom_ratio = yuv_w / cr_w
  yuv_x = 0
  yuv_y = (cr_h - cr_w / yuv_aspect) / 2
else:
  zoom_ratio = yuv_h / cr_h
  yuv_x = (cr_w - cr_h * yuv_aspect) / 2
  yuv_y = 0
circle['x'] = cr['left'] + yuv_x + circle['x'] / zoom_ratio
circle['y'] = cr['top'] + yuv_y + circle['y'] / zoom_ratio
circle['r'] = circle['r'] / zoom_ratio

filter_fusion/test_sensor_fusion.py

في Android 12، تمت إضافة طريقة لرصد العناصر في الصور لاختبار دمج البيانات من أجهزة الاستشعار.

في الإصدارات الأقدم من Android 12، يتم استخدام الصورة بأكملها للعثور على أفضل 240 ميزة، ويتم حجبها بعد ذلك في المركز بنسبة% 20 لتجنُّب أثر التقاط الصور المتلاحقة، مع أنّ الحد الأدنى لمتطلبات الميزات هو 30 ميزة.

إذا كانت الميزات التي تم العثور عليها باستخدام هذه الطريقة غير كافية، يحجب نظام التشغيل Android 12 منطقة رصد الميزات في المركز بنسبة% 20 أولاً، ويحدّ من الحد الأقصى لعدد الميزات ليكون ضعف الحد الأدنى لمتطلبات الميزات.

توضِّح الصورة التالية الفرق بين ميزة رصد الميزات في Android 11 وAndroid 12. إنّ رفع الحدّ الأدنى لمتطلّبات الميزات يؤدي إلى رصد الميزات ذات الجودة الرديئة ويؤثر سلبًا في عمليات القياس.

الفرق في ميزة رصد العناصر بين Android 11
وAndroid 12
رصد ميزة sensor_fusion

الشكل 2: الفرق في رصد الميزات بين Android 11 وAndroid 12

الاختبارات الجديدة

المشهد0/test_solid_color_test_pattern.py

تم تفعيل اختبار جديد، وهو test_solid_color_test_pattern، لنظام التشغيل Android 12. تم تفعيل هذا الاختبار لجميع الكاميرات وهو описан في الجدول التالي.

المشهد اسم الاختبار المستوى الأول من واجهة برمجة التطبيقات الوصف
0 test_solid_color_test_pattern 31 التأكّد من إمكانية ضبط لون الصورة وإخراج صورة بلون واحد

يجب تفعيل أنماط اختبار الألوان الثابتة لتفعيل وضع خصوصية الكاميرا. يؤكد اختبار test_solid_color_test_pattern إخراج صورة YUV بلون ثابت باللون المحدّد من خلال النمط المحدّد، ويتغيّر لون الصورة وفقًا للمواصفات.

المعلمات

  • cameraPrivacyModeSupport: لتحديد ما إذا كانت الكاميرا تتيح استخدام وضع الخصوصية
  • android.sensor.testPatternMode: لضبط وضع نقش الاختبار. يستخدم هذا الاختبار SOLID_COLOR.
  • android.sensor.testPatternData: لضبط قيم نمط الاختبار R وGr وGb وG لوضع نمط الاختبار

للحصول على وصف لنمط اختبار اللون الواحد، يُرجى الاطّلاع على SENSOR_TEST_PATTERN_MODE_SOLID_COLOR.

الطريقة

يتم التقاط إطارات YUV لمجموعة المعلمات ويتم التحقق من صحة محتوى الصورة. يتم عرض نمط الاختبار مباشرةً من أداة استشعار الصور، لذلك لا يلزم استخدام مشهد معيّن. إذا كان PER_FRAME_CONTROL متاحًا، يتم تسجيل إطار YUV واحد لكل إعداد تم اختباره. إذا كانت ميزة PER_FRAME_CONTROL غير متاحة، يتم التقاط أربعة لقطات ويتم تحليل اللقطة الأخيرة فقط لزيادة تغطية الاختبار إلى أقصى حد في كاميرات LIMITED.

يتم ضبط عمليات الالتقاط بتنسيق YUV على أنماط الاختبار BLACK وWHITE وRED وGREEN و BLUE التي تكون مشبعة بالكامل. ونظرًا لأن تعريف نمط الاختبار يتماشى مع نمط أداة الاستشعار Bayer، يجب ضبط قنوات الألوان لكل لون على النحو الموضّح في الجدول التالي.

اللون testPatternData (RGGB)
أسود (0, 0, 0, 0)
أبيض (1, 1, 1, 1)
التوجيه الأوروبي بشأن المعدات اللاسلكية (RED) (1, 0, 0, 0)
أخضر (0, 1, 1, 0)
أزرق (0, 0, 0, 1)

جدول التأكيد

يوضّح الجدول التالي تأكيدات الاختبار لمحاولة test_solid_color_test_pattern.py.

الكاميرا
المستوى الأول من واجهة برمجة التطبيقات
نوع الكاميرا الألوان التي تم تأكيدها
31 Bayer أسود، أبيض، أحمر، أخضر، أزرق
31 أحادي اللون أسود، أبيض
‫< 31 Bayer/MONO أسود

اختبارات فئة الأداء

المشهد2_c/test_camera_launch_perf_class.py

التحقّق من أنّ مدة بدء تشغيل الكاميرا أقل من 500 ملي ثانية لكل من الكاميرا الأمامية والخلفية الأساسيتين مع مشهد الوجه scene2_c

scene2_c/test_jpeg_capture_perf_class.py

التحقّق من أنّ وقت استجابة التقاط الصور بتنسيق JPEG بدقة 1080p أقل من ثانية واحدة لكل من الكاميرات الأمامية والخلفية الأساسية باستخدام المشهد "وجه scene2_c"