تم تضمين عدد من التغييرات في Camera ITS في إصدار Android 12. تلخّص هذه الصفحة التغييرات التي تندرج ضمن أربع فئات عامة:
- إعادة صياغة الرمز البرمجي إلى Python 3
- استخدام إطار عمل اختبار Mobly
- اختبار التغييرات
- الفحوصات الجديدة
إعادة صياغة الرمز البرمجي إلى Python 3
بسبب إيقاف لغة Python 2.7 نهائيًا في كانون الثاني (يناير) 2020، تمت إعادة صياغة قاعدة بيانات Camera ITS بالكامل لتصبح متوافقة مع لغة Python 3. يجب توفُّر إصدارات بايثون التالية والمكتبات في Android 12:
- 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.py
pymodules/its/cv2image.py
←utils/opencv_processing_utils.py
pymodules/its/device.py
←utils/its_session_utils.py
pymodules/its/error.py
←utils/error_util.py
pymodules/its/image.py
←utils/image_processing_utils.py
pymodules/its/objects.py
←utils/capture_request_utils.py
pymodules/its/target.py
←utils/target_exposure_utils.py
tools/hw.py
←utils/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. يؤدّي رفع الحدّ الأدنى لمتطلبات ميزات التحسين إلى رصد ميزات ذات جودة رديئة ويؤثّر سلبًا في القياسات.
الشكل 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"