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

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

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

بسبب إيقاف الإصدار 2.7 من Python نهائيًا في يناير 2020، تمت إعادة تصميم قاعدة بيانات رمز Camera ITS بالكامل لتتوافق مع الإصدار 3 من Python. يجب توفُّر إصدارات Python والمكتبات التالية في نظام 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 هو إطار عمل للاختبار يستند إلى لغة 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 أو الإصدارات الأقدم، ولكن مع إجراء التغييرات التالية:

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

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 اللوحية. يتم تسجيل جميع المرشحين الذين يقعون ضمن دائرة لأغراض تصحيح الأخطاء.

في نظام التشغيل 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)
أبيض (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.