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