/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠThe ĠBook Lab ĠAuthors . Ċ Ġ* Ċ Ġ* Ġ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 Ġnl . t ude lf t . book lab . vision . detection . tensorflow Ċ Ċ import Ġnl . t ude lf t . book lab . vision . detection . Book Detector Ċ import Ġorg . opencv . core . Cv Type Ċ import Ġorg . opencv . core . Mat Ċ import Ġorg . opencv . core . Point Ċ import Ġorg . opencv . core . Rect Ċ import Ġorg . opencv . img proc . Img proc Ċ import Ġorg . tensorflow . Graph Ċ import Ġorg . tensorflow . Session Ċ import Ġorg . tensorflow . Tensor Ċ import Ġorg . tensorflow . types . UInt 8 Ċ import Ġjava . io . Closeable Ċ import Ġjava . io . InputStream Ċ import Ġjava . nio . ByteBuffer Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Book Detector ] Ġthat Ġuses Ġa ĠTensor flow Ġmodel Ġto Ġdetect Ġbooks Ġin Ġimages . Ċ Ġ* Ċ Ġ* Ġ@ property Ġgraph ĠThe ĠTensor flow Ġmodel Ġto Ġuse Ġas Ġa Ġfrozen Ġinference Ġgraph . Ċ Ġ* Ġ@ property Ġscore ĠThe Ġminimum Ġprobability Ġrequired Ġfor Ġa Ġbook Ġto Ġbe Ġaccepted Ġ( between Ġ 0 Ġand Ġ 1 ). Ċ Ġ*/ Ċ class ĠTensor flow Book Detector ( private Ġval Ġgraph : ĠGraph , Ġprivate Ġval Ġscore : ĠFloat Ġ= Ġ 0 . 5 f ) Ġ: ĠBook Detector , ĠClose able Ġ{ ĊĠĠĠ Ġprivate Ġval Ġsession Ġ= ĠSession ( graph ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġconvenience Ġconstructor Ġfor Ġconstructing Ġthe Ġdetector Ġfrom Ġa Ġmodel Ġgiven Ġas Ġ[ InputStream ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinput ĠThe Ġinput Ġstream Ġto Ġread Ġthe Ġdefinition Ġfrom . ĊĠĠĠĠ Ġ* Ġ@ param Ġestimated Size ĠThe Ġestimated Ġsize Ġof Ġthe Ġinput Ġstream . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( input : ĠInputStream , Ġestimated Size : ĠInt Ġ= ĠDEFAULT _ BUFFER _ SIZE ) Ġ: Ġthis ( Graph (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġimport Graph Def ( input . read Bytes ( estimated Size )) ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġoverride Ġfun Ġdetect ( mat : ĠMat ): ĠList < Rect > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutputs Ġ= Ġmat . to Image Tensor (). use Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . runner () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. feed (" image _ tensor ", Ġinput ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fetch (" detection _ scores ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fetch (" detection _ classes ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fetch (" detection _ boxes ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. run () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġscores T Ġ= Ġoutputs [ 0 ]. expect ( Float :: class . java ObjectType ) ĊĠĠĠĠĠĠĠ Ġval Ġboxes T Ġ= Ġoutputs [ 2 ]. expect ( Float :: class . java ObjectType ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmax Objects Ġ= Ġscores T . shape ()[ 1 ]. toInt () ĊĠĠĠĠĠĠĠ Ġval Ġscores Ġ= Ġscores T . copy To ( Array ( 1 ) Ġ{ ĠFloat Array ( max Objects ) Ġ}) [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġboxes Ġ= Ġboxes T . copy To ( Array ( 1 ) Ġ{ ĠArray ( max Objects ) Ġ{ ĠFloat Array ( 4 ) Ġ} Ġ}) [ 0 ] ĊĊĠĠĠĠĠĠĠ Ġscores T . close () ĊĠĠĠĠĠĠĠ Ġboxes T . close () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġscores . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġindex , Ġscore Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbox Ġ= Ġboxes [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Ġ= ĠPoint ( box [ 1 ]. toDouble () Ġ* Ġmat . width (), Ġbox [ 0 ]. toDouble () Ġ* Ġmat . height ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Ġ= ĠPoint ( box [ 3 ]. toDouble () Ġ* Ġmat . width (), Ġbox [ 2 ]. toDouble () Ġ* Ġmat . height ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( score Ġ>= Ġthis . score ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( min , Ġmax ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġsession . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvert Ġthe Ġgiven ĠOpenCV Ġmatrix Ġto Ġan Ġimage Ġtensor . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġmatrix Ġrepresented Ġas Ġan Ġimage Ġtensor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠMat . to Image Tensor (): ĠTensor < UInt 8 > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠConvert Ġthe Ġimage Ġto ĠRGB Ġformat Ġused Ġby Ġthe ĠTensor flow Ġmodel Ġ( OpenCV Ġuses ĠB GR ) ĊĠĠĠĠĠĠĠ Ġval Ġrgb Ġ= ĠMat ( width (), Ġheight (), ĠC v Type . CV _ 8 UC 3 ) ĊĠĠĠĠĠĠĠ ĠImg proc . cvt Color ( this , Ġrgb , ĠImg proc . COLOR _ BGR 2 RGB ) ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġrgb . total () Ġ* Ġrgb . elem Size () ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByteArray ( size . toInt ()) ĊĠĠĠĠĠĠĠ Ġrgb . get ( 0 , Ġ 0 , Ġbytes ) ĊĠĠĠĠĠĠĠ Ġval Ġbatch Size Ġ= Ġ 1 L ĊĠĠĠĠĠĠĠ Ġval Ġchannels Ġ= Ġrgb . channels (). to Long () ĊĠĠĠĠĠĠĠ Ġval Ġshape Ġ= Ġlong ArrayOf ( batch Size , Ġheight (). to Long (), Ġwidth (). to Long (), Ġchannels ) ĊĠĠĠĠĠĠĠ Ġreturn ĠTensor . create ( UInt 8 :: class . java , Ġshape , ĠByteBuffer . wrap ( bytes )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T , ĠR > ĠTensor < T >. use ( block : Ġ( Tensor < T >) Ġ-> ĠR ): ĠR Ġ= Ġblock ( this ). also Ġ{ Ġclose () Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnu . pattern . OpenCV . load Shared () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . load Library ( org . opencv . core . Core . NATIVE _ LIBRARY _ NAME ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ