package Ġcom . ml . projects . be auty detection Ċ Ċ // Ġimport Ġandroid . util . Log Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . graphics . Point Ċ import Ġandroid . util . Base 6 4 Ċ import Ġandroid . util . Log Ċ import Ġandroidx . core . graphics . to Point Ċ import Ġcom . cha quo . python . Python Ċ import Ġcom . google . ml kit . vision . common . Input Image Ċ import Ġcom . google . ml kit . vision . face . Face Contour Ċ import Ġcom . google . ml kit . vision . face . Face Detection Ċ import Ġcom . google . ml kit . vision . face . Face Detector Options Ċ import Ġcom . google . ml kit . vision . face . Face Land mark Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . tensorflow . lite . Interpreter Ċ import Ġorg . tensorflow . lite . support . common . ops . Normalize Op Ċ import Ġorg . tensorflow . lite . support . image . Image Processor Ċ import Ġorg . tensorflow . lite . support . image . Tensor Image Ċ import Ġorg . tensorflow . lite . support . image . ops . Resize Op Ċ import Ġjava . io . ByteArray OutputStream Ċ Ċ // ĠHelper Ġclass Ġfor Ġface Ġskin Ġestimation Ġmodel Ċ class ĠSk in Estimation Model Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġhigh Accuracy Opts Ġ= ĠFace Detector Options . Builder () ĊĠĠĠĠĠĠĠ Ġ. set Performance Mode ( Face Detector Options . PER FORMANCE _ MODE _ AC CUR ATE ) ĊĠĠĠĠĠĠĠ Ġ. set Land mark Mode ( Face Detector Options . LAND MARK _ MODE _ ALL ) ĊĠĠĠĠĠĠĠ Ġ. set Classification Mode ( Face Detector Options . CLAS SIF ICATION _ MODE _ ALL ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ// ĠInput Ġimage Ġsize Ġfor Ġour Ġmodel ĊĠĠĠ Ġprivate Ġval Ġinput Image Width Ġ= Ġ 8 0 ĊĠĠĠ Ġprivate Ġval Ġinput Image Height Ġ= Ġ 9 6 ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġche ek Bit Map : ĠBitmap ĊĊĠĠĠ Ġ// ĠImage Ġprocessor Ġfor Ġmodel Ġinputs . ĊĠĠĠ Ġ// ĠResize Ġ+ ĠNormalize ĊĠĠĠ Ġ// Ġ è¿ĻéĩĮ resize åĲİ ï¼Į çĲĨ è®º ä¸Ĭ åºĶè¯¥ æĺ¯ Ġ 1 Ġ* Ġ 8 0 Ġ* Ġ 9 6 Ġ* Ġ 3 Ġ= Ġ 2 3 0 4 0 , Ġ ä½Ĩ å®ŀéĻħ åį´ æĺ¯ Ġ 1 4 7 0 0 0 0 , Ġ åĪļ å¥½ æĺ¯ é¢Ħ æľŁ è¾ĵåħ¥ çļĦ 4 åĢ į ĊĠĠĠ Ġ// Ġæĺ¯ çĶ±äºİ float ä¸º 4 åŃĹèĬĤ ï¼Į ä½Ĩ int ä¸º 1 åŃĹèĬĤ ĊĠĠĠ Ġ// Ġtensorflow Ġlite Ġå¯¹ æ¨¡åŀĭ è¿Ľè¡Į è½¬æį¢ åĲİ ï¼Į æĮī æŃ£å¸¸ æĥħåĨµ åºĶè¯¥ èĩªåĬ¨ éĢĤ åºĶ Ġkotlin Ġbitmap ĠçļĦ è¾ĵåħ¥ æł¼å¼ı ĊĠĠĠ Ġprivate Ġval Ġinput Image Processor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImage Processor . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Resize Op ( input Image Width , Ġinput Image Height , ĠResize Op . Resize Method . B IL INE AR )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Normalize Op ( 0 f , Ġ 2 5 5 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ// ĠInterpreter Ġobject Ġto Ġuse Ġthe ĠT FL ite Ġmodel . ĊĠĠĠ Ġvar Ġinterpreter Ġ: ĠInterpreter ? Ġ= Ġnull ĊĊĊĠĠĠ Ġprivate Ġfun Ġbitmap ToString ( input Face : ĠBitmap ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġinput Face . compress ( Bitmap . Compress Format . PNG , Ġ 9 0 , Ġstream ) ĊĠĠĠĠĠĠĠ Ġval Ġpy Image Ġ= Ġstream . toByteArray () ĊĠĠĠĠĠĠĠ Ġreturn ĠBase 6 4 . encode ToString ( py Image , ĠBase 6 4 . DEFAULT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcut Image ( input Face : ĠBitmap , Ġpy : Python ){ ĊĠĠĠĠĠĠĠ Ġval Ġimage Ġ= ĠInput Image . from Bitmap ( input Face , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġdetector Ġ= ĠFace Detection . getClient ( high Accuracy Opts ) ĊĠĠĠĠĠĠĠ Ġvar Ġpoints : ArrayList < Point > Ġ= ĠArrayList < Point >() ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġdetector . process ( image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġfaces Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTask Ġcompleted Ġsuccessfully ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( face Ġin Ġfaces ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġland mark Ġdetection Ġwas Ġenabled Ġ( m outh , Ġe ars , Ġeyes , Ġche eks , Ġand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnose Ġavailable ): ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" check Ġland mark ", Ġ" start Ġcheck Ġland Ġmarks ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft E ar Ġ= Ġface . get Land mark ( Face Land mark . LEFT _ EAR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft E ar ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft E ar Pos Ġ= Ġleft E ar . position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" check Ġland mark ", Ġleft E ar Pos . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( left E ar Pos . to Point ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTask Ġfailed Ġwith Ġan Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" error ", Ġe . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġencoding Str Ġ= Ġbitmap ToString ( input Face ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġpy . getModule (" skin _ predict "). call Attr (" cut _ che ek ", Ġencoding Str , Ġpoints ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Java ( ByteArray :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġche ek Bit Map Ġ= ĠBitmap Factory . decode ByteArray ( bytes , Ġ 0 , Ġbytes . size ) ĊĠĠĠĠĠĠĠ Ġ} catch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" error ", Ġe . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpredict Class ( by ol Array : Float Array , Ġpy : Python ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġclass Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Index Ġ= Ġpy . getModule (" skin _ predict "). call Attr (" predict ", Ġby ol Array ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Java ( Int :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} catch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" error ", Ġe . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġclass Index ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠGiven Ġan Ġinput Ġimage , Ġreturn Ġthe Ġestimated Ġscore . ĊĠĠĠ Ġ// ĠNote : ĠThis Ġis Ġa Ġsus pended Ġfunction , Ġand Ġwill Ġrun Ġwithin Ġa ĠCor outine Scope . ĊĠĠĠ Ġsuspend Ġfun Ġpredict Skin ( image : ĠBitmap , Ġpy : Python ) Ġ= Ġwith Context ( ĠDispatch ers . Main Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 . åĪĩ åī² åĽ¾åĥı ĊĠĠĠĠĠĠĠ Ġcut Image ( image , Ġpy ) ĊĠĠĠĠĠĠĠ Ġ// Ġ 2 . çĶŁæĪĲ by ol çī¹å¾ģ ĊĠĠĠĠĠĠĠ Ġval Ġscore Output Array Ġ= ĠArray ( 1 ) Ġ{ ĠFloat Array ( 5 1 2 ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(:: che ek Bit Map . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInput Ġimage Ġtensor Ġshape Ġ-> Ġ[ Ġ 1 Ġ, Ġ 8 0 Ġ, Ġ 9 6 Ġ, Ġ 3 Ġ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtensor Input Image Ġ= ĠTensor Image . from Bitmap ( che ek Bit Map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOutput Ġtensor Ġshape Ġ-> Ġ[ Ġ 1 Ġ, Ġ 1 Ġ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocessed Image Buffer Ġ= Ġinput Image Processor . process ( tensor Input Image ). buffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCannot Ġcopy Ġto Ġa ĠTensorFlow Lite Ġtensor Ġ( serving _ default _ input : 0 ) Ġwith Ġ 9 2 1 6 0 Ġbytes Ġfrom Ġa ĠJava ĠBuffer Ġwith Ġ 1 0 8 0 0 0 0 Ġbytes . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCannot Ġcopy Ġfrom Ġa ĠTensorFlow Lite Ġtensor Ġ( Partition ed Call : 0 ) Ġwith Ġshape Ġ[ 1 , Ġ 5 1 2 ] Ġto Ġa ĠJava Ġobject Ġwith Ġshape Ġ[ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterpreter ?. run ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessed Image Buffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscore Output Array ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLog . i (" Score ", Ġscore Output Array [ 0 ]. toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġ 3 . è°ĥçĶ¨ lda ĊĠĠĠĠĠĠĠ Ġreturn @ with Context Ġpredict Class ( score Output Array [ 0 ], Ġpy ) ĊĠĠĠ Ġ} Ċ } ĊĊĊĊ