package Ġcom . sh encoder . arc face . face Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroidx . annotation . Int Range Ċ import Ġcom . arc soft . face .* Ċ import Ġcom . arc soft . face . enums . Compare Model Ċ import Ġcom . arc soft . face . enums . Detect Face Orient Priority Ċ import Ġcom . arc soft . face . enums . Detect Mode Ċ import Ġcom . arc soft . image util . Arc Soft Image Format Ċ import Ġcom . arc soft . image util . Arc Soft Image Util Ċ import Ġcom . arc soft . image util . Arc Soft Image Util Error Ċ import Ġcom . sh encoder . arc face . configuration . Detect Face Orient Ċ import Ġcom . sh encoder . arc face . configuration . Face Feature Data Bean Ċ import Ġcom . sh encoder . arc face . face . model . Compare Result Ċ import Ġcom . sh encoder . arc face . util . Log Util Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ġ çĶ¨äºİ äºº èĦ ¸ æ¯Ķ å¯¹ ãĢģ çĶŁæĪĲ çī¹å¾ģ çłģ Ċ Ġ* Ġåı¯ä»¥ èĩªå·± å°ģè£ħ æĪĲ åįķ ä¾ĭ æ¨¡å¼ı Ċ Ġ* Ċ Ġ* Ġ@ author Ġ ĠSh en Ben Ċ Ġ* Ġ@ date ĠĠĠĠ 2 0 2 1 / 0 2 / 2 4 Ġ 1 4 : 0 8 Ċ Ġ* Ġ@ email ĠĠĠ 7 1 4 0 8 1 6 4 4 @ qq . com Ċ Ġ*/ Ċ class ĠFace Server Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Face Server ->" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġface Engine Ġ= ĠFace Engine () ĊĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠObject () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪĿå§ĭåĮĸ äºº èĦ ¸ å¼ķ æĵ İ ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext Ġä¸Ĭ ä¸ĭ æĸĩ ĊĠĠĠĠ Ġ* Ġ@ param Ġface Orient Ġ äºº èĦ ¸ æ£Ģæµĭ è§Ĵ åº¦ ï¼Į åįķ ä¸Ģ è§Ĵ åº¦ æ£Ģæµĭ ï¼Į ä¸į æĶ¯æĮģ [ Detect Face Orient . ASF _ OP _ ALL _ OUT ] ĊĠĠĠĠ Ġ* Ġ[ Detect Face Orient . ASF _ OP _ 0 _ ONLY ] ĊĠĠĠĠ Ġ* Ġ[ Detect Face Orient . ASF _ OP _ 9 0 _ ONLY ] ĊĠĠĠĠ Ġ* Ġ[ Detect Face Orient . ASF _ OP _ 1 8 0 _ ONLY ] ĊĠĠĠĠ Ġ* Ġ[ Detect Face Orient . ASF _ OP _ 2 7 0 _ ONLY ] ĊĠĠĠĠ Ġ* Ġ@ param Ġdetect Face Scale Val Ġ è¯ĨåĪ« çļĦ æľĢå°ı äºº èĦ ¸ æ¯Ķ ä¾ĭ ï¼Į åıĸ åĢ¼ èĮĥåĽ´ [ 2 , 3 2 ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġinit ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġface Orient : ĠDetect Face Orient Ġ= ĠDetect Face Orient . ASF _ OP _ 0 _ ONLY , ĊĠĠĠĠĠĠĠ Ġ@ Int Range ( from Ġ= Ġ 2 , Ġto Ġ= Ġ 3 2 ) Ġdetect Face Scale Val : ĠInt Ġ= Ġ 1 6 ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorient Priority Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( face Orient Ġ== ĠDetect Face Orient . ASF _ OP _ ALL _ OUT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDetect Face Orient Priority . ASF _ OP _ 0 _ ONLY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDetect Face Orient Priority . valueOf ( face Orient . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġface Engine . init ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDetect Mode . ASF _ DETECT _ MODE _ IMAGE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorient Priority , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetect Face Scale Val , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFace Engine . ASF _ FACE _ DETECT Ġor ĠFace Engine . ASF _ FACE _ RE CO GN ITION ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠLog Util . i ("${ TAG } äºº èĦ ¸ æ¯Ķ å¯¹ å¼ķ æĵ İ åĪĿå§ĭåĮĸ :$ result ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ¯ Ķ å¯¹ äºº èĦ ¸ Ġ 1 : N ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġface Feature Ġ è¦ģ æ¯Ķ å¯¹ çļĦäºº èĦ ¸ çī¹å¾ģ çłģ ĊĠĠĠĠ Ġ* Ġ@ param Ġfeatures Ġ å¾ħ æ¯Ķ å¯¹ çļĦäºº èĦ ¸ åĪĹè¡¨ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġnull : è¯´æĺİ æ¯Ķ å¯¹ åĪĹè¡¨ ä¸ºç©º æĪĸèĢħ äºº èĦ ¸ å¼ķ æĵ İ åĩº éĶĻ ï¼Ľ è¿ĶåĽŀ çĽ¸ ä¼¼ åº¦ æľĢå¤§ çļĦ [ features ] ä¸ŃçļĦ æķ°æį® ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġcompare Face Feature ( ĊĠĠĠĠĠĠĠ Ġface Feature : ĠFace Feature , ĊĠĠĠĠĠĠĠ Ġfeatures : ĠList < Face Feature Data Bean >, ĊĠĠĠĠĠĠĠ Ġcompare Model : ĠCompare Model Ġ= ĠCompare Model . LI FE _ PH OTO ĊĠĠĠ Ġ): ĠCompare Result ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( features . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtemp Face Feature Ġ= ĠFace Feature () ĊĠĠĠĠĠĠĠ Ġval Ġface Similar Ġ= ĠFace Similar () ĊĠĠĠĠĠĠĠ Ġvar Ġmax Similar Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġmax Similar Index Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeatures . forEach Indexed Ġ{ Ġindex , Ġbean Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Face Feature . feature Data Ġ= Ġbean . feature ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface Engine . compare Face Feature ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface Feature , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Face Feature , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompare Model , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface Similar ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== ĠError Info . MO K ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( face Similar . score Ġ> Ġmax Similar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Similar Ġ= Ġface Similar . score ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Similar Index Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . e ("${ TAG } compare Face Feature - errorCode : Ġ$ result ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( max Similar Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCompare Result ( features [ max Similar Index ], Ġmax Similar ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ¯ Ķ å¯¹ ä¸¤ ç»Ħ çī¹å¾ģ çłģ Ġ 1 : 1 ĊĠĠĠĠ Ġ* Ġ@ return Ġè¿ĶåĽŀ çĽ¸ ä¼¼ åº¦ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġcompare Face Feature ( ĊĠĠĠĠĠĠĠ Ġfeature 1 : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġfeature 2 : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġcompare Model : ĠCompare Model Ġ= ĠCompare Model . LI FE _ PH OTO ĊĠĠĠ Ġ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġface Feature 1 Ġ= ĠFace Feature ( feature 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġface Feature 2 Ġ= ĠFace Feature ( feature 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġsimilar Ġ= ĠFace Similar () ĊĠĠĠĠĠĠĠ Ġsynchronized ( face Engine ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface Engine . compare Face Feature ( face Feature 1 , Ġface Feature 2 , Ġcompare Model , Ġsimilar ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= ĠError Info . MO K ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . e ("${ TAG } compare Face Feature - errorCode : Ġ$ result ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsimilar . score ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠéĢļè¿ĩ Bitmap æıĲ åıĸ çī¹å¾ģ çłģ ï¼Į ä»ħ æıĲ åıĸ ä¸Ģ å¼ł äºº èĦ ¸ ĊĠĠĠĠ Ġ* Ġ æľĢ å¥½ åľ¨ åŃĲ çº¿ç¨ĭ è¿Ĳè¡Į ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ çī¹å¾ģ çłģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġextract Face Feature ( bitmap : ĠBitmap ?): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( bitmap Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġfeature : ĠByteArray ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġaligned Bitmap Ġ= ĠArc Soft Image Util . get Aligned Bitmap ( bitmap , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġimage Data Ġ= ĠArc Soft Image Util . create ImageData ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaligned Bitmap . width , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaligned Bitmap . height , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArc Soft Image Format . BGR 2 4 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= ĠArc Soft Image Util . bitmap To ImageData ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaligned Bitmap , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Data , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArc Soft Image Format . BGR 2 4 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( code Ġ== ĠArc Soft Image Util Error . CODE _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// äºº èĦ ¸ æ£Ģæµĭ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Ġ= Ġextract Face Feature ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaligned Bitmap . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaligned Bitmap . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFace Engine . CP _ P AF _ BGR 2 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . e ("${ TAG } extract Face Feature - bitmap To ImageData : Ġ$ code ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfeature ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ ĳ Ħ åĥı æľº é¢Ħ è§Ī æķ°æį® æıĲ åıĸ äºº èĦ ¸ çī¹å¾ģ çłģ ï¼Į ä»ħ æıĲ åıĸ ä¸Ģ å¼ł äºº èĦ ¸ ĊĠĠĠĠ Ġ* Ġ æľĢ å¥½ åľ¨ åŃĲ çº¿ç¨ĭ è¿Ĳè¡Į ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnv 2 1 Ġæ ĳ Ħ åĥı æľº æķ°æį® ĊĠĠĠĠ Ġ* Ġ@ param Ġwidth Ġ é¢Ħ è§Ī å®½åº¦ ĊĠĠĠĠ Ġ* Ġ@ param Ġheight Ġ é¢Ħ è§Ī é«ĺåº¦ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġextract Face Feature ( nv 2 1 : ĠByteArray , Ġwidth : ĠInt , Ġheight : ĠInt ): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġextract Face Feature ( nv 2 1 , Ġwidth , Ġheight , ĠFace Engine . CP _ P AF _ NV 2 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġextract Face Feature ( ĊĠĠĠĠĠĠĠ ĠbyteArray : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġwidth : ĠInt , ĊĠĠĠĠĠĠĠ Ġheight : ĠInt , ĊĠĠĠĠĠĠĠ Ġformat : ĠInt ĊĠĠĠ Ġ): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġfeature : ĠByteArray ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsynchronized ( face Engine ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġface InfoList : ĠList < Face Info > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdetect Face Result Ġ= Ġface Engine . detect Faces ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbyteArray , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface InfoList ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( detect Face Result Ġ== ĠError Info . MO K Ġ&& Ġface InfoList . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġface Feature Ġ= ĠFace Feature () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextract Result Ġ= Ġface Engine . extract Face Feature ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbyteArray , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface InfoList [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface Feature ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( extract Result Ġ== ĠError Info . MO K ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Ġ= Ġface Feature . feature Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . e ("${ TAG } extract Face Feature - extract Face Feature : Ġ$ extract Result ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . e ("${ TAG } extract Face Feature - detect Faces : Ġ${ detect Face Result }, Ġface InfoList . size : Ġ${ face InfoList . size }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfeature ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éĶĢ æ¯ ģ èµĦæºĲ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdestroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( face Engine ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġface Engine . un Init () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . w ("${ TAG } destroy - face Engine . un Init :$ result ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }