נתוני הגרסה של חבילת Android 12 לבדיקת תמונות במצלמה

גרסה 12 של Android כוללת כמה שינויים בCamera ITS. בדף הזה מפורט סיכום של השינויים, שמחולקים לארבע קטגוריות רחבות:

ארגון מחדש ב-Python 3

בעקבות ההוצאה משימוש של Python 2.7 בינואר 2020, כל קוד הבסיס של Camera ITS עובר עיצוב מחדש ל-Python 3. הגרסאות והספריות הבאות של 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 שתומכת במקרי בדיקה שדורשים כמה מכשירים עם הגדרות חומרה בהתאמה אישית. המצלמה 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

בדיקת פריטים שנוצרו בתהליך פיתוח (Artifact)

ב-Android 12, פריטי מידע שנוצרו בתהליך פיתוח (Artifact) לבדיקה של המצלמה מאוחסנים באופן דומה ל-Android 11 ומטה, אבל עם השינויים הבאים:

  • כדי להבהיר, התחילית CameraITS_ מופיעה לפני המחרוזת האקראית בת 8 התווים בספריית הארטיפקט /tmp של הבדיקה.
  • הפלט והשגיאות של הבדיקה נשמרים ב-test_log.DEBUG לכל בדיקה, במקום ב-test_name_stdout.txt וב-test_name_stderr.txt.
  • ה-logcats של ה-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.

שם הבדיקה רמת ה-API הראשונה טענות נכוֹנוּת
segment1_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.

שם הבדיקה רמת ה-API הראשונה טענות נכוֹנוּת
segment1_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.

segment1_2/test_tonemap_sequence.py

הבדיקה test_tonemap_sequence פועלת במצלמות מוגבלות ב-Android 12.

segment1_2/test_yuv_plus_raw.py

הבדיקה test_yuv_plus_raw פועלת במצלמות פיזיות מוסתרות ב-Android 12.

segment2_a/test_format_combos.py

הבדיקה test_format_combos פועלת במצלמות מוגבלות ב-Android 12.

segment3/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 פשוטה יותר ופועלת כדי לפתור את הבעיה של חיתוך תיבה תוחמת (bounding box) בחלק מהטאבלטים. כל המועמדים ליצירת מעגל מתועדים ביומן למטרות ניפוי באגים.

ב-Android 12, בדיקת החיתוך פועלת במכשירי FULL ו-LEVEL3. בגרסאות Android 11 ומטה, טענות הנכוֹנוּת של בדיקת החיתוך מושמטים במכשירי FULL.

בטבלה הבאה מפורטים טענות הנכוֹנוּת (assertions) של test_aspect_ratio_and_crop.py שתואמות לרמת מכשיר נתונה ולרמת ה-API הראשונה.

ברמת המכשיר רמת ה-API הראשונה תביעות
מוגבלת הכול יחס גובה-רוחב
שדה הראייה בפורמטים 4:3, ‏ 16:9, ‏ 2:1
FULL < 31 יחס גובה-רוחב
FoV לפורמטים 4:3, 16:9, 2:1
FULL 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. העלאת הסף המינימלי של דרישות התכונות מובילה לזיהוי תכונות באיכות נמוכה ומשפיעה לרעה על המדידות.

difference in feature detection between Android 11
and Android 12
sensor_fusion feature detection

איור 2. ההבדל בזיהוי התכונות בין Android 11 לבין Android 12

בדיקות חדשות

segment0/test_solid_color_test_pattern.py

בדיקה חדשה, test_solid_color_test_pattern, מופעלת ב-Android 12. הבדיקה הזו מופעלת בכל המצלמות ומתוארת בטבלה הבאה.

Scene שם הבדיקה רמת ה-API הראשונה תיאור
0 test_solid_color_test_pattern 31 אישור פלט תמונה בצבע אחיד ויכולת תכנות של צבעי תמונה.

כדי לתמוך במצב הפרטיות של המצלמה, צריך להפעיל דפוסי בדיקה בצבע אחיד. בדיקת test_solid_color_test_pattern מאשרת את הפלט של תמונה YUV בצבע אחיד עם הצבע שמוגדר על ידי התבנית שנבחרה, וצבע התמונה משתנה בהתאם למפרט.

פרמטרים

  • cameraPrivacyModeSupport: קובע אם המצלמה תומכת במצב פרטיות.
  • android.sensor.testPatternMode: הגדרת מצב דפוס הבדיקה. הבדיקה הזו משתמשת ב-SOLID_COLOR.
  • android.sensor.testPatternData: מגדיר את ערכי דפוס הבדיקה R, Gra, 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)

טבלת טענות נכוֹנוּת

בטבלה הבאה מתוארים טענות הנכוֹנוּת (assertions) של הבדיקה עבור test_solid_color_test_pattern.py.

מצלמה
רמת ה-API הראשונה
סוג המצלמה צבעים שהוגדרו
31 Bayer שחור, לבן, אדום, ירוק, כחול
31 MONO שחור, לבן
פחות מ-31 Bayer/MONO שחור

בדיקות של כיתות ביצועים

segment2_c/test_camera_launch_perf_class.py

מאמתת הפעלה של המצלמה תוך פחות מ-500 אלפיות השנייה עבור המצלמה הראשית הקדמית וגם האחורית בסצנת הפנים שלscene2_c.

scene2_c/test_jpeg_capture_perf_class.py

בדיקה שזמן האחזור של צילום JPEG ברזולוציה של 1080p הוא פחות משנייה, גם במצלמה הקדמית וגם במצלמה הראשית האחורית, באמצעות סצנת הפנים scene2_c.