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

يتضمّن إصدار Android 12 عددًا من التغييرات في مجموعة أدوات اختبار توافق الكاميرا (ITS). تلخّص هذه الصفحة التغييرات التي تنقسم إلى أربع فئات رئيسية:

إعادة الهيكلة إلى Python 3

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

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

تمت إعادة تصميم جميع الاختبارات الفردية، وهي تستخدم فئة إعداد الاختبار الجديدة المحدّدة في 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 هو إطار عمل للاختبار يستند إلى لغة Python ويتيح حالات اختبار تتطلّب أجهزة متعدّدة مع إعدادات أجهزة مخصّصة. تستخدم Camera ITS بنية اختبار Mobly الأساسية لتوفير تحكّم أفضل في الاختبارات وتسجيلها.

تستخدم Camera ITS البنية الأساسية لاختبار Mobly من أجل توفير تحكّم أفضل في الاختبارات وتسجيلها. ‫Mobly هو إطار عمل للاختبار مستند إلى Python ويتيح حالات اختبار تتطلّب أجهزة متعددة مع إعدادات أجهزة مخصّصة. لمزيد من المعلومات عن 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 Verifier. بما أنّه لا يمكن استبدال ملفات 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

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

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

  • يحتوي دليل العنصر الاختباري /tmp على CameraITS_ مضافًا إلى السلسلة العشوائية المكوّنة من 8 أحرف لتوضيح الغرض.
  • يتم تخزين نتائج الاختبار والأخطاء في test_log.DEBUG لكل اختبار بدلاً من test_name_stdout.txt وtest_name_stderr.txt.
  • يتم تخزين logcat لجهاز الاختبار اللوحي وجهاز الاختبار من كل اختبار فردي في الدليل /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.

scene2_a/test_format_combos.py

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

scene3/test_flip_mirror.py

يتم إجراء اختبار test_flip_mirror على كاميرات LIMITED في 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. تتخطى الإصدارات 11 من نظام التشغيل Android أو الإصدارات الأقدم تأكيدات اختبار الاقتصاص لأجهزة FULL.

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

مستوى الجهاز أول مستوى لواجهة برمجة التطبيقات التأكيدات
LIMITED الكل نسبة العرض إلى الارتفاع
مجال الرؤية لنسب العرض إلى الارتفاع 4:3 و16:9 و2:1
كامل < 31 نسبة العرض إلى الارتفاع
مجال الرؤية لنسب العرض إلى الارتفاع 4:3 و16:9 و2:1
كامل ‫≥ 31 الاقتصاص
نسبة العرض إلى الارتفاع
مجال الرؤية للصور بنسب العرض إلى الارتفاع 4:3 و16:9 و2:1
LEVEL3 الكل الاقتصاص
نسبة العرض إلى الارتفاع
مجال الرؤية للصور بنسب العرض إلى الارتفاع 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

sensor_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

الفحوصات الجديدة

scene0/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)
WHITE (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 MONO أسود، أبيض
< 31 Bayer/MONO أسود

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

scene2_c/test_camera_launch_perf_class.py

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

scene2_c/test_jpeg_capture_perf_class.py

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