נתוני הגרסה של חבילת 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 כדי לאפשר שליטה טובה יותר ביומן של הבדיקות.

מערכת 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

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

ב-Android 12, ארטיפקטים של בדיקות ל-ITS של מצלמה מאוחסנים באופן דומה ל-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 הראשונה טענות נכוֹנוּת
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.

שם הבדיקה רמת ה-API הראשונה טענות נכוֹנוּת
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. בגרסאות Android 11 ומטה, טענות הנכוֹנוּת של בדיקת החיתוך מושמטים במכשירי FULL.

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

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

בדיקות חדשות

scene0/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, ‏ 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)

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

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

מצלמה
רמת ה-API הראשונה
סוג המצלמה צבעים שהוגדרו
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.