/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠTensorFlow ĠAuthors . ĠAll ĠRights ĠReserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġorg . tensorflow . lite . examples . detector Ċ Ċ import Ġandroid . content . res . Asset Manager Ċ import Ġandroid . graphics .* Ċ import Ġandroid . util . Size Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġandroidx . test . platform . app . Instrumentation Registry . get Instrumentation Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . tensorflow . lite . examples . detector . enums . Detection Model Ċ import Ġorg . tensorflow . lite . examples . detector . utils . Image Utils Ċ import Ġjava . util .* Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* ĠGold en Ġtest Ġfor ĠObject ĠDetection ĠReference Ġapp . Ċ Ġ*/ Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ class ĠDetector Test Ġ{ ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠMODEL : ĠDetection Model Ġ= ĠDetection Model . YO LO _ V 4 _ 4 1 6 _ FP 3 2 ĊĠĠĠĠĠĠĠ Ġval ĠIMAGE _ SIZE Ġ= ĠSize ( 6 4 0 , Ġ 4 8 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdetector : ĠDetector ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġc ropped Bitmap : ĠBitmap ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġframe To Crop Transform : ĠMatrix ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcrop To Frame Transform : ĠMatrix ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġasset Manager : ĠAsset Manager Ġ= Ġget Instrumentation (). context . resources . assets ĊĊĠĠĠĠĠĠĠ Ġdetector Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDetector Factory . create Detector ( asset Manager , ĠDetection Model . YO LO _ V 4 _ 4 1 6 _ FP 3 2 , Ġ 0 . 0 f ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcrop Size Ġ= ĠMODEL . input Size ĊĠĠĠĠĠĠĠ Ġval Ġpreview Width Ġ= ĠIMAGE _ SIZE . width ĊĠĠĠĠĠĠĠ Ġval Ġpreview Height Ġ= ĠIMAGE _ SIZE . height ĊĠĠĠĠĠĠĠ Ġval Ġsensor Orientation Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġc ropped Bitmap Ġ= ĠBitmap . create Bitmap ( crop Size , Ġcrop Size , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠ Ġframe To Crop Transform Ġ= ĠImage Utils . get Transformation Matrix ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Width , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Height , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Orientation ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcrop To Frame Transform Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġframe To Crop Transform . invert ( crop To Frame Transform ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdetection Results Should Not Change () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( c ropped Bitmap ) ĊĠĠĠĠĠĠĠ Ġcanvas . draw Bitmap ( load Image (" table . jpg "), Ġframe To Crop Transform , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdetection s : ĠList < Detector . Detection > Ġ= Ġdetector . run Detection ( c ropped Bitmap ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Det e ctions : ĠList < Detector . Detection > Ġ= Ġload Det e ctions (" table _ results . txt ") ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( expected Detection Ġin Ġexpected Det e ctions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġa Ġmatching Ġresult Ġin Ġresults ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmatched Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( detection Ġin Ġdetection s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbbox Ġ= ĠRect F () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop To Frame Transform . map Rect ( bbox , Ġdetection . bounding Box ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( detection . className Ġ== Ġexpected Detection . className ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġmatch BoundingBox es ( bbox , Ġexpected Detection . bounding Box ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġmatch Confidence ( detection . score , Ġexpected Detection . score ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatched Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( matched ). isTrue () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠConf idence Ġtolerance : Ġabsolute Ġ 1 % ĊĠĠĠ Ġprivate Ġfun Ġmatch Confidence ( a : ĠFloat , Ġb : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġabs ( a Ġ- Ġb ) Ġ< Ġ 0 . 0 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠBounding ĠBox Ġtolerance : Ġover l apped Ġarea Ġ> Ġ 9 5 % Ġof Ġeach Ġone ĊĠĠĠ Ġprivate Ġfun Ġmatch BoundingBox es ( a : ĠRect F , Ġb : ĠRect F ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarea A : ĠFloat Ġ= Ġa . width () Ġ* Ġa . height () ĊĠĠĠĠĠĠĠ Ġval Ġarea B : ĠFloat Ġ= Ġb . width () Ġ* Ġb . height () ĊĠĠĠĠĠĠĠ Ġval Ġover l apped Ġ= ĠRect F ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax ( a . left , Ġb . left ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax ( a . top , Ġb . top ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin ( a . right , Ġb . right ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin ( a . bottom , Ġb . bottom ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġover l apped Area : ĠFloat Ġ= Ġover l apped . width () Ġ* Ġover l apped . height () ĊĠĠĠĠĠĠĠ Ġreturn Ġover l apped Area Ġ> Ġ 0 . 9 5 Ġ* Ġarea A Ġ&& Ġover l apped Area Ġ> Ġ 0 . 9 5 Ġ* Ġarea B ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Image ( filename : ĠString ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġasset Manager : ĠAsset Manager Ġ= Ġget Instrumentation (). context . assets ĊĠĠĠĠĠĠĠ Ġreturn Ġasset Manager . open ( filename ). use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Factory . decode Stream ( inputStream ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThe Ġformat Ġof Ġresult : ĊĠĠĠ Ġ// Ġcategory Ġbbox . left Ġbbox . top Ġbbox . right Ġbbox . bottom Ġconfidence ĊĠĠĠ Ġ// Ġ... ĊĠĠĠ Ġ// ĠExample : ĊĠĠĠ Ġ// ĠApple Ġ 9 9 Ġ 2 5 Ġ 3 0 Ġ 7 5 Ġ 8 0 Ġ 0 . 9 9 ĊĠĠĠ Ġ// ĠB an ana Ġ 2 5 Ġ 9 0 Ġ 7 5 Ġ 2 0 0 Ġ 0 . 9 8 ĊĠĠĠ Ġ// Ġ... ĊĠĠĠ Ġprivate Ġfun Ġload Det e ctions ( filename : ĠString ): ĠList < Detector . Detection > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġasset Manager : ĠAsset Manager Ġ= Ġget Instrumentation (). context . assets ĊĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠMutable List < Detector . Detection > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġasset Manager . open ( filename ). use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscanner Ġ= ĠScanner ( inputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( scanner . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= Ġscanner . next (). replace ('_ ', Ġ' Ġ') ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! scanner . hasNext Float ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġscanner . next Float () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġscanner . next Float () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġscanner . next Float () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġscanner . next Float () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbounding Box Ġ= ĠRect F ( left , Ġtop , Ġright , Ġbottom ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscore Ġ= Ġscanner . next Float () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdetection Ġ= ĠDetector . Detection ("", ĠclassName , Ġscore , Ġbounding Box , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( detection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ Ċ }