يتضمّن إصدار Android 12 عددًا من التغييرات في Camera ITS التي تمّ تضمينها. وتلخّص هذه الصفحة التغييرات التي تنقسم إلى أربع فئات واسعة:
- إعادة تصميم الرمز البرمجي إلى Python 3
- اعتماد إطار عمل اختبار Mobly
- تغييرات الاختبار
- الفحوصات الجديدة
إعادة هيكلة إلى Python 3
بسبب إيقاف Python 2.7 نهائيًا في يناير 2020، تمت إعادة تصميم قاعدة الرموز البرمجية الكاملة في Camera ITS إلى Python 3. يتطلّب Android 12 إصدارات Python والمكتبات التالية:
- Python 3.7.9 أو Python 3.7.10
- OpenCV 3.4.2
- Numpy 1.19.2
- Matplotlib 3.3.2
- Scipy 1.5.2
- pySerial 3.5
- Pillow 8.1.0
- PyYAML 5.3.1
يظل مشغّل الاختبار الرئيسي، tools/run_all_tests.py، كما هو في إصدارات Android 11 أو الإصدارات الأقدم، وتمت إعادة تصميمه إلى Python 3.
تمت إعادة تصميم جميع الاختبارات الفردية وتستخدم فئة إعداد الاختبار الجديدة المحدّدة في tests/its_base_test.py. تظل معظم أسماء الاختبارات ووظائفها كما هي.
في Android 12، تحمّل جميع الاختبارات الفردية الآن المشاهد الخاصة بها. في حين أنّ تحميل المشهد لكل اختبار يزيد من وقت الاختبار الإجمالي، فإنّه يتيح تصحيح أخطاء الاختبارات الفردية.
لمزيد من المعلومات حول تغييرات الاختبارات الفردية، يُرجى الاطّلاع على تغييرات الاختبار.
تمت إعادة تصميم وحدات Python التالية مع تغيير الاسم:
pymodules/its/caps.py→utils/camera_properties_utils.pypymodules/its/cv2image.py→utils/opencv_processing_utils.pypymodules/its/device.py→utils/its_session_utils.pypymodules/its/error.py→utils/error_util.pypymodules/its/image.py→utils/image_processing_utils.pypymodules/its/objects.py→utils/capture_request_utils.pypymodules/its/target.py→utils/target_exposure_utils.pytools/hw.py→utils/sensor_fusion_utils.py
اعتماد إطار عمل اختبار Mobly
Mobly هو إطار عمل اختبار يستند إلى Python ويدعم حالات الاختبار التي تتطلّب أجهزة متعدّدة مع إعدادات أجهزة مخصّصة. يستخدم Camera ITS البنية الأساسية لاختبار Mobly من أجل تحسين التحكّم في الاختبارات وتسجيلها.
يستخدم Camera ITS البنية الأساسية لاختبار Mobly من أجل تحسين التحكّم في الاختبارات وتسجيلها. Mobly هو إطار عمل اختبار يستند إلى Python ويدعم حالات الاختبار التي تتطلّب أجهزة متعدّدة مع إعدادات أجهزة مخصّصة. لمزيد من المعلومات حول Mobly، يُرجى الاطّلاع على google/mobly.
ملفات config.yml
باستخدام إطار عمل Mobly، يمكنك إعداد جهاز قيد الاختبار وجهاز لوحي لعرض الرسم البياني في فئة 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. - يتم تخزين logcats للجهاز قيد الاختبار والجهاز اللوحي من كل اختبار فردي في الدليل
/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. تتخطّى إصدارات Android 11 أو الإصدارات الأقدم تأكيدات اختبار الاقتصاص للأجهزة 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. يؤدي رفع الحد الأدنى لمتطلبات الميزات إلى رصد ميزات رديئة الجودة ويؤثر سلبًا في القياسات.
الشكل 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)
|
| أحمر |
(1, 0, 0, 0)
|
| أخضر |
(0, 1, 1, 0)
|
| أزرق |
(0, 0, 0, 1)
|
جدول التأكيدات
يوضّح الجدول التالي تأكيدات الاختبار لـ test_solid_color_test_pattern.py.
| الكاميرا أول مستوى لواجهة برمجة التطبيقات |
نوع الكاميرا | الألوان التي تم التأكيد عليها |
|---|---|---|
| 31 | Bayer | أسود وأبيض وأحمر وأخضر وأزرق |
| 31 | أحادي اللون | أسود وأبيض |
| < 31 | Bayer/أحادي اللون | أسود |
اختبارات فئة الأداء
scene2_c/test_camera_launch_perf_class.py
يتحقّق هذا الاختبار من أنّ وقت بدء تشغيل الكاميرا أقل من 500 ملّي ثانية لكل من الكاميرتَين الأساسيتَين الأمامية والخلفية مع مشهد الوجه scene2_c.
scene2_c/test_jpeg_capture_perf_class.py
يتحقّق هذا الاختبار من أنّ وقت استجابة التقاط صور JPEG بدقة 1080p أقل من ثانية واحدة لكل من الكاميرتَين الأساسيتَين الأمامية والخلفية مع مشهد الوجه scene2_c.