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

يستخدم فريق 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

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

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

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

scene1_2/test_yuv_plus_raw.py

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

scene2_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. يتخطّى الإصدار 11 من Android أو الإصدارات الأقدم اختبارات صحة عمليات اقتصاص الصور على أجهزة 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 الكل الاقتصاص
نسبة العرض إلى الارتفاع
مجال الرؤية بتنسيقات 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 أحادي اللون أسود، أبيض
‫< 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"