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