TensorFlow.js рдФрд░ clmtrackr.js: рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЯрдХрдЯрдХреА рдХреА рджрд┐рд╢рд╛ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдирд╛

рд▓реЗрдЦ рдХрд╛ рд▓реЗрдЦрдХ, рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╣рдо рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдВрдкреНрдпреВрдЯрд░ рджреГрд╖реНрдЯрд┐ рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдирд╛ рдЯреЗрдиреНрд╕рд░рдлреНрд▓реЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рддреИрдпрд╛рд░ рдЙрддреНрдкрд╛рдж рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рд╕реАрдзреЗ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрдВрдЧреЗред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИред


рдЖрдк рдЕрдиреБрднрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдпрд╣рд╛рдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╕рдорд░реНрдкрд┐рдд рд╣реИ ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░, рд╡реЗрдм рдХреИрдорд░рд╛ рдФрд░ рдорд╛рдЙрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣рд╛рдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓реЗрдЦрдХ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдЙрдкрдпреБрдХреНрдд рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдк рдПрдХ рдЪрд▓рддреЗ рдХреИрдорд░реЗ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдорд╛рдирд╛ рдЧрдпрд╛ рдХрд╛рд░реНрдп рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рд╡рд┐рдЪрд╛рд░


рдЖрдЗрдП рдорд╢реАрди рд╕реАрдЦрдиреЗ рдХреА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рд╡реЗрдм рдкреЗрдЬ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╣рдо рдПрдХ рд╡реЗрдмрдХреИрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕рдХреА рдЖрдБрдЦреЛрдВ рдХреЛ рджреЗрдЦрдХрд░ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╡реЗрдмрдХреИрдо рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдпрджрд┐ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреИрдорд░реЗ рд╕реЗ рдкреВрд░реА рдЫрд╡рд┐ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдПрдЧреА, рддреЛ рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝реА рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЫрд╡рд┐ рдкрд░ рдЬрдЧрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдЖрдБрдЦреЗрдВ рд╣реИрдВред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЦреБрдж рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рд╣рдо рдПрдХ рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдЯреНрд░реЗрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рддреИрдирд╛рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдХрд┐рд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред

рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЫрд╡рд┐ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдПрдХ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЖрдВрдЦреЗрдВ рдФрд░ рдЙрдирдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЫреЛрдЯрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХреНрд╖реЗрддреНрд░, рдЬреЛ рдЖрдВрдЦреЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЖрдпрдд рд╣реИ, рдХреЛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдХрд╛рдо рдХрд╛ рдкрд╣рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


рд╡реЗрдм рдХреИрдорд░рд╛ рдЗрдирдкреБрдЯ, рдлреЗрд╕ рд░рд┐рдХрдЧреНрдирд┐рд╢рди, рдЖрдИ рдбрд┐рдЯреЗрдХреНрд╢рди, рдХреНрд░реЙрдкреНрдб рдЗрдореЗрдЬ

рдЫрд╡рд┐ рдореЗрдВ рдЪреЗрд╣рд░реЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд┐рд╕реЗ рдХреНрд▓реИрдордЯреНрд░рдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЫреЛрдЯреЗ рдЖрдХрд╛рд░, рдЕрдЪреНрдЫреЗ рдкреНрд░рджрд░реНрд╢рди рдФрд░, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдЧрд░рд┐рдорд╛ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ рд╣реИред

рдпрджрд┐ рдПрдХ рдЫреЛрдЯреА рд▓реЗрдХрд┐рди рд╕рдордЭрджрд╛рд░реА рд╕реЗ рдЪреБрдиреА рдЧрдИ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕рд░рд▓ рджреГрдврд╝ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдиреЗрдЯрд╡рд░реНрдХ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕реАрдЦ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрддреА рд╣реИ:


рдЗрдирдкреБрдЯ рдЫрд╡рд┐, рдореЙрдбрд▓ рдПрдХ рджреГрдврд╝ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд╣реИ, рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рджреНрд╡рд╛рд░рд╛ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреА рдЧрдИ рдЬрдЧрд╣ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреЗрдЦ рд░рд╣рд╛ рд╣реИред

рдЗрд╕ рдЦрдВрдб рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкрд░рд┐рдпреЛрдЬрдирд╛, рдЬрд┐рд╕рдХрд╛ рдХреЛрдб рдЗрд╕ рднрдВрдбрд╛рд░ рдореЗрдВ рд╣реИ, рдореЗрдВ рдХрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред

рдЯреНрд░реЗрдирд┐рдВрдЧ


рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреБрдХреНрдд рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ clmtrackr.js ред рд╣рдо рдПрдХ рдЦрд╛рд▓реА HTML рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЗ рд╕рд╛рде jQuery, TensorFlow.js, clmtrackr.js рдФрд░ main.js рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ:

 <!doctype html> <html> <body>   <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>   <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.12.0"></script>   <script src="clmtrackr.js"></script>   <script src="main.js"></script> </body> </html> 

рдПрдХ рд╡реЗрдм рдХреИрдорд░рд╛ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ


рд╡реЗрдмрдХреИрдо рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдФрд░ рдкреГрд╖реНрда рдкрд░ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рд▓реЗрдиреА рд╣реЛрдЧреАред рдпрд╣рд╛рдВ рдореИрдВ рдХреЛрдб рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдзрд╛рд░рдгрд╛ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ Google Chrome рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

HTML рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВред рдЗрд╕реЗ <body> рднреАрддрд░ рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди <script> рдЯреИрдЧ рдХреЗ рдКрдкрд░:

 <video id="webcam" width="400" height="300" autoplay></video> 

рдЕрдм main.js рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:

 $(document).ready(function() { const video = $('#webcam')[0]; function onStreaming(stream) {   video.srcObject = stream; } navigator.mediaDevices.getUserMedia({ video: true }).then(onStreaming); }); 

рдЗрд╕ рдХреЛрдб рдХреЛ рдЕрдкрдиреЗ рджрдо рдкрд░ рдЖрдЬрд╝рдорд╛рдПрдВред рдЬрдм рдЖрдк рдкреГрд╖реНрда рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдЕрдиреБрдорддрд┐ рдХреЗ рд▓рд┐рдП рдкреВрдЫрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рд╡реЗрдм рдХреИрдорд░рд╛ рд╕реЗ рдПрдХ рддрд╕реНрд╡реАрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред

рдмрд╛рдж рдореЗрдВ рд╣рдо onStreaming() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЛрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдЪреЗрд╣рд░реЗ рдХреА рдЦреЛрдЬ


рдЕрдм рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рдЪреЗрд╣рд░реЗ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП clmtrackr.js рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, const video = ... рдХреЗ рдмрд╛рдж рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝рдХрд░ рдлреЗрд╕ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ const video = ... :

 const ctrack = new clm.tracker(); ctrack.init(); 

рдЕрдм, onStreaming() рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЪреЗрд╣рд░реЗ рдХреА рдЦреЛрдЬ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 ctrack.start(video); 

рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рд╣реА рдЪрд╛рд╣рд┐рдПред рдЕрдм рд╕рд┐рд╕реНрдЯрдо рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЪреЗрд╣рд░реЗ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред

рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реЛрддрд╛? рдпрд╣ рд╕рдЪ рд╣реИ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЪреЗрд╣рд░реЗ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ "рдореБрдЦреМрдЯрд╛" рдмрдирд╛рдПрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рддрддреНрд╡ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреА рд╣реЛрдЧреАред рдЖрдк <canvas> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ HTML рдкреГрд╖реНрдареЛрдВ рдкрд░ рдХреБрдЫ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╡реАрдбрд┐рдпреЛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡ рдкрд░ рд╕реБрдкрд░рдЗрдореНрдкреЛрдЬрд╝ рдХрд░рдХреЗ рдПрдХ рдРрд╕рд╛ рддрддреНрд╡ рдмрдирд╛рдПрдВрдЧреЗред рдирд┐рдореНрди рдХреЛрдб рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕реЗ <video> рддрддреНрд╡ рдХреЗ рддрд╣рдд HTML рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ:

 <canvas id="overlay" width="400" height="300"></canvas> <style>   #webcam, #overlay {       position: absolute;       top: 0;       left: 0;   } </style> 

рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдЗрдирд▓рд╛рдЗрди рд╢реИрд▓реА рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕реАрдПрд╕рдПрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рд╣рдордиреЗ <video> рддрддреНрд╡ рдХреЗ рд╕рдорд╛рди рдкреГрд╖реНрда рдореЗрдВ <canvas> рдЬреЛрдбрд╝рд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рддрддреНрд╡реЛрдВ рдХреЛ рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдпрд╣рд╛рдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЧрдИ рд╢реИрд▓рд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдм, рд╣рд░ рдмрд╛рд░ рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡реАрдбрд┐рдпреЛ рдХреЗ рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо <canvas> рдкрд░ рдХреБрдЫ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рджреМрд░рд╛рди рдХрд┐рд╕реА рднреА рдХреЛрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди requestAnimationLoop() рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо <canvas> рд▓рд┐рдП рдХреБрдЫ рднреА рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдВ, рд╣рдореЗрдВ рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдлрд┐рд░ рд╣рдо рдЧреНрд░рд╛рдлрд┐рдХ рдХреЛ рд╕реАрдзреЗ <canvas> рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП clmtrackr рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣рд╛рдБ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬреЛ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рдЕрднреА рдмрд╛рдд рдХреА рд╣реИред рдЗрд╕реЗ ctrack.init() рдХрдорд╛рдВрдб рдХреЗ рдиреАрдЪреЗ рдЬреЛрдбрд╝реЗрдВ:

 const overlay = $('#overlay')[0]; const overlayCC = overlay.getContext('2d'); function trackingLoop() { // ,     , //     -   . requestAnimationFrame(trackingLoop); let currentPosition = ctrack.getCurrentPosition(); overlayCC.clearRect(0, 0, 400, 300); if (currentPosition) {   ctrack.draw(overlay); } } 

рдЕрдм trackingLoop() рдлрдВрдХреНрд╢рди рдХреЛ onStreaming() рдлрдВрдХреНрд╢рди рдореЗрдВ onStreaming() рддреБрд░рдВрдд рдмрд╛рдж ctrack.start() ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдореЗрдВ рд╕реНрд╡рдпрдВ рдХреЗ рдкреБрдирд░рд╛рд░рдВрдн рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдЧрд╛ред

рдкреЗрдЬ рдХреЛ рд░рд┐рдлреНрд░реЗрд╢ рдХрд░реЗрдВ рдФрд░ рд╡реЗрдмрдХреИрдо рдкрд░ рджреЗрдЦреЗрдВред рдЖрдкрдХреЛ рд╡реАрдбрд┐рдпреЛ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЕрдкрдиреЗ рдЪреЗрд╣рд░реЗ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд╣рд░реЗ рд░рдВрдЧ рдХрд╛ "рдорд╛рд╕реНрдХ" рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрднреА-рдХрднреА, рдЪреЗрд╣рд░реЗ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдлреНрд░реЗрдо рдореЗрдВ рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЛ рдереЛрдбрд╝рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


рдЪреЗрд╣рд░реЗ рдХреА рдкрд╣рдЪрд╛рди рдХреЗ рдкрд░рд┐рдгрд╛рдо

рдЖрдВрдЦреЛрдВ рд╕реЗ рдпреБрдХреНрдд рдЫрд╡рд┐ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд╣рдЪрд╛рдиреЗрдВ


рдЕрдм рд╣рдореЗрдВ рдЙрд╕ рдЫрд╡рд┐ рдХреЗ рдЖрдпрддрд╛рдХрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдБрдЦреЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ <canvas> ред

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, cmltracker рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ рдЪреЗрд╣рд░реЗ рдХреЗ рд╕реНрдерд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ 70 рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБ рднреА рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк cmltracker рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдирд┐рдпрдВрддреНрд░рдг рдЕрдВрдХ

рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдВрдЦреЗрдВ рдЫрд╡рд┐ рдХрд╛ рдЖрдпрддрд╛рдХрд╛рд░ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕реАрдорд╛рдПрдВ 23, 28, 24 рдФрд░ 26 рдХреЛ рдЫреВрддреА рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рджрд┐рд╢рд╛ рдореЗрдВ 5 рдкрд┐рдХреНрд╕реЗрд▓ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИрдВред рдЗрд╕ рдЖрдпрдд рдореЗрдВ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рди рдЭреБрдХрд╛ рд▓реЗред

рдЕрдм, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЫрд╡рд┐ рдХреЗ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ <canvas> рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдбрд╛рдЗрдореЗрдВрд╢рди 50x25 рдкрд┐рдХреНрд╕рд▓ рд╣реЛрдЧрд╛ред рдЖрдБрдЦреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдпрдд рдЗрд╕ рддрддреНрд╡ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдЧрд╛ред рдереЛрдбрд╝рд╛ рдЫрд╡рд┐ рд╡рд┐рд░реВрдкрдг рдПрдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рдЗрд╕ рдХреЛрдб рдХреЛ HTML рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ <canvas> рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрд╕ рдЫрд╡рд┐ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрдБрдЦреЗрдВ рд╣реИрдВ:

 <canvas id="eyes" width="50" height="25"></canvas> <style>   #eyes {       position: absolute;       top: 0;       right: 0;   } </style> 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди x рдФрд░ y рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд▓реМрдЯрд╛рдПрдЧрд╛, рд╕рд╛рде рд╣реА рдЖрдВрдЦреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдЖрдпрдд рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рднреАред рдпрд╣, рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, clmtrackr рд╕реЗ рдкреНрд░рд╛рдкреНрдд positions рдХреА рдПрдХ рд╕рд░рдгреА рд▓реЗрддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ clmtrackr рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рддреНрдпреЗрдХ рд╕рдордиреНрд╡рдп рдореЗрдВ рдШрдЯрдХ x рдФрд░ y ред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ main.js рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 function getEyesRectangle(positions) { const minX = positions[23][0] - 5; const maxX = positions[28][0] + 5; const minY = positions[24][1] - 5; const maxY = positions[26][1] + 5; const width = maxX - minX; const height = maxY - minY; return [minX, minY, width, height]; } 

рдЕрдм, рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдореЗрдВ, рд╣рдо рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЖрдВрдЦреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдпрдд рдирд┐рдХрд╛рд▓рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕реЗ <canvas> рдкрд░ рдПрдХ рд▓рд╛рд▓ рд░реЗрдЦрд╛ рдХреЗ рд╕рд╛рде рд╕рд░реНрдХрд▓ рдХрд░реЗрдВ, рдЬреЛ <video> рддрддреНрд╡ рдкрд░ рд╕реБрдкрд░рд┐рдВрдкреЛрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдирдП <canvas> рдХреЙрдкреА рдХрд░реЗрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреА рд╕рд╣реА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдВрдХреЗрддрдХ resizeFactorX рдФрд░ resizeFactorY рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗред

trackingLoop() рдХреЛрдб рдореЗрдВ if рдмреНрд▓реЙрдХ рдХреЛ рдмрджрд▓реЗрдВ trackingLoop() рдирд┐рдореНрди рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░реЗрдВ:

 if (currentPosition) { //  ,     //   <canvas>,    <video> ctrack.draw(overlay); //  ,  ,    //   const eyesRect = getEyesRectangle(currentPosition); overlayCC.strokeStyle = 'red'; overlayCC.strokeRect(eyesRect[0], eyesRect[1], eyesRect[2], eyesRect[3]); //      , //        //      const resizeFactorX = video.videoWidth / video.width; const resizeFactorY = video.videoHeight / video.height; //          //    <canvas> const eyesCanvas = $('#eyes')[0]; const eyesCC = eyesCanvas.getContext('2d'); eyesCC.drawImage(   video,   eyesRect[0] * resizeFactorX, eyesRect[1] * resizeFactorY,   eyesRect[2] * resizeFactorX, eyesRect[3] * resizeFactorY,   0, 0, eyesCanvas.width, eyesCanvas.height ); } 

рдЕрдм рдкреГрд╖реНрда рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЖрдВрдЦреЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд▓рд╛рд▓ рдЖрдпрдд рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕ рдЖрдпрдд рдореЗрдВ рдЬреЛ рд╕рдВрдЧрдд рд╣реИ рд╡рд╣ рд╣реИ <canvas> ред рдпрджрд┐ рдЖрдкрдХреА рдЖрдВрдЦреЗрдВ рдореЗрд░реА рддреБрд▓рдирд╛ рдореЗрдВ рдмрдбрд╝реА рд╣реИрдВ, рддреЛ getEyeRectangle рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред


<рдХреИрдирд╡рд╛рд╕> рддрддреНрд╡ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЖрдВрдЦреЛрдВ рдХреА рдЫрд╡рд┐ рд╡рд╛рд▓реЗ рдПрдХ рдЖрдпрдд рдХреЛ рдЦреАрдВрдЪрддрд╛ рд╣реИ

рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣


рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЬреЛ рдорд╛рдЙрд╕ рдФрд░ рдХреАрдмреЛрд░реНрдб рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреГрд╖реНрда рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд░реНрд╕рд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдЕрдкрдиреА рдЖрдВрдЦреЛрдВ рд╕реЗ рджреЗрдЦрддрд╛ рд╣реИ, рд╣рд░ рдмрд╛рд░ рдХреАрдмреЛрд░реНрдб рдкрд░ рджрдмрд╛рддреЗ рд╣реБрдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдПрдХ рдФрд░ рдирдореВрдирд╛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдореЙрдбрд▓ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

тЦНMouse рдЯреНрд░реИрдХрд┐рдВрдЧ


рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡реЗрдм рдкреЗрдЬ рдкрд░ рдорд╛рдЙрд╕ рдкреЙрдЗрдВрдЯрд░ рдХрд╣рд╛рдВ рд╕реНрдерд┐рдд рд╣реИ, рд╣рдореЗрдВ рдПрдХ document.onmousemove рдЬрд░реВрд░рдд рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рд╕реАрдорд╛ рдореЗрдВ рдлрд┐рдЯ рд╣реЛ рдЬрд╛рдПрдВ [-1, 1]:

 //   : const mouse = { x: 0, y: 0, handleMouseMove: function(event) {   //      ,    [-1, 1]   mouse.x = (event.clientX / $(window).width()) * 2 - 1;   mouse.y = (event.clientY / $(window).height()) * 2 - 1; }, } document.onmousemove = mouse.handleMouseMove; 

тЦН рдЫрд╡рд┐ рдкрд░ рдХрдмреНрдЬрд╛


<canvas> рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдЫрд╡рд┐ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕реЗ рдЯреЗрдВрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, TensorFlow.js рд╣реЗрд▓реНрдкрд░ рдлрд╝рдВрдХреНрд╢рди tf.fromPixels() рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЫрд╡рд┐ рдХреЛ <canvas> рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЖрдВрдЦреЛрдВ рд╕реЗ рдпреБрдХреНрдд рдЖрдпрдд рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:

 function getImage() { //       return tf.tidy(function() {   const image = tf.fromPixels($('#eyes')[0]);   //  <i><font color="#999999"></font></i>:   const batchedImage = image.expandDims(0);   //    :   return batchedImage.toFloat().div(tf.scalar(127)).sub(tf.scalar(1)); }); } 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ tf.tidy() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕рдлрд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдо рд╕рд┐рд░реНрдл рдПрдХ рдмрдбрд╝реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗрдЯ рдореЗрдВ рд╕рднреА рдирдореВрдиреЛрдВ рдХреЛ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдорд╢реАрди рд╕реАрдЦрдиреЗ рдореЗрдВ рдореЙрдбрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреБрдЫ рдирдореВрдиреЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдирд┐рдпрдВрддреНрд░рдг рдирдореВрдиреЗ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдирдП рдбреЗрдЯрд╛ рдкрд░ рдореЙрдбрд▓ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореЙрдбрд▓ рдХреЛ рдУрд╡рд░-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП, рдирд┐рдпрдВрддреНрд░рдг рдирдореВрдиреЗ рдореЗрдВ рдХреБрд▓ рдирдореВрдиреЛрдВ рдореЗрдВ рд╕реЗ 20% рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдпрд╣рд╛рдВ рдбреЗрдЯрд╛ рдФрд░ рдирдореВрдирд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рд╣реИ:

 const dataset = { train: {   n: 0,   x: null,   y: null, }, val: {   n: 0,   x: null,   y: null, }, } function captureExample() { //            tf.tidy(function() {   const image = getImage();   const mousePos = tf.tensor1d([mouse.x, mouse.y]).expandDims(0);   // ,    (  )     const subset = dataset[Math.random() > 0.2 ? 'train' : 'val'];   if (subset.x == null) {     //        subset.x = tf.keep(image);     subset.y = tf.keep(mousePos);   } else {     //          const oldX = subset.x;     const oldY = subset.y;     subset.x = tf.keep(oldX.concat(image, 0));     subset.y = tf.keep(oldY.concat(mousePos, 0));   }   //     subset.n += 1; }); } 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реЗ рдмрд╛рдБрдзрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 $('body').keyup(function(event) { //         if (event.keyCode == 32) {   captureExample();   event.preventDefault();   return false; } }); 

рдЕрдм рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рджрдмрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдВрдЦ рдХреА рдЫрд╡рд┐ рдФрд░ рдорд╛рдЙрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЬреБрдбрд╝ рдЬрд╛рддреЗ рд╣реИрдВред

рдореЙрдбрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг


рдПрдХ рд╕рд░рд▓ рджреГрдврд╝ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдПрдБред TensorFlow.js рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХреЗрд░рд╕ рдХреА рдПрдХ рдпрд╛рдж рддрд╛рдЬрд╛ рдХрд░рддреА рд╣реИред рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдПрдХ conv2d рдкрд░рдд, рдПрдХ maxPooling2d рдкрд░рдд рдФрд░ рдЕрдВрдд рдореЗрдВ рджреЛ рдЖрдЙрдЯрдкреБрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ dense рдкрд░рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рд╡реЗ рд╕реНрдХреНрд░реАрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ)ред рд░рд╛рд╕реНрддреЗ рдХреЗ рд╕рд╛рде, рдореИрдВрдиреЗ рджреЛ-рдЖрдпрд╛рдореА рдбреЗрдЯрд╛ рдХреЛ рдПрдХ-рдЖрдпрд╛рдореА рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ dropout рдкрд░рдд рдФрд░ рдПрдХ flatten рдкрд░рдд рдХреЛ рдЬреЛрдбрд╝рд╛ред рдПрдбрдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рдореИрдХрдмреБрдХ рдПрдпрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдмрд╕ рдЧрдпрд╛ред рдЖрдк рдореЙрдбрд▓ рдХрд╛ рдЕрдкрдирд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣рд╛рдБ рдореЙрдбрд▓ рдХреЛрдб рд╣реИ:

 let currentModel; function createModel() { const model = tf.sequential(); model.add(tf.layers.conv2d({   kernelSize: 5,   filters: 20,   strides: 1,   activation: 'relu',   inputShape: [$('#eyes').height(), $('#eyes').width(), 3], })); model.add(tf.layers.maxPooling2d({   poolSize: [2, 2],   strides: [2, 2], })); model.add(tf.layers.flatten()); model.add(tf.layers.dropout(0.2)); //    x  y model.add(tf.layers.dense({   units: 2,   activation: 'tanh', })); //   Adam     0.0005     MSE model.compile({   optimizer: tf.train.adam(0.0005),   loss: 'meanSquaredError', }); return model; } 

рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдпреБрдЧ рдФрд░ рдПрдХ рдЪрд░ рдкреИрдХреЗрдЯ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╢рд╛рдпрдж рдмрд╣реБрдд рдЫреЛрдЯреЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ)ред

 function fitModel() { let batchSize = Math.floor(dataset.train.n * 0.1); if (batchSize < 4) {   batchSize = 4; } else if (batchSize > 64) {   batchSize = 64; } if (currentModel == null) {   currentModel = createModel(); } currentModel.fit(dataset.train.x, dataset.train.y, {   batchSize: batchSize,   epochs: 20,   shuffle: true,   validationData: [dataset.val.x, dataset.val.y], }); } 

рдЕрдм рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрдЬ рдкрд░ рдПрдХ рдмрдЯрди рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рдХреЛрдб HTML рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ:

 <button id="train">Train!</button> <style>   #train {       position: absolute;       top: 50%;       left: 50%;       transform: translate(-50%, -50%);       font-size: 24pt;   } </style> 

рдЗрд╕ рдХреЛрдб рдХреЛ JS рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 $('#train').click(function() { fitModel(); }); 

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╣рд╛рдБ рджреЗрдЦ рд░рд╣рд╛ рд╣реИ?


рдЕрдм рдЬрдм рд╣рдо рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореЙрдбрд▓ рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрд╕ рдкреГрд╖реНрда рдкрд░ рдЬрдЧрд╣ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреЗрдЦ рд░рд╣рд╛ рд╣реИред рд╣рдо рдЗрд╕ рд╕реНрдерд╛рди рдХреА рдУрд░ рдПрдХ рд╣рд░реЗ рд╡реГрддреНрдд рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрдХреНрд░реАрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреЗрдЬ рдореЗрдВ рдПрдХ рд╕рд░реНрдХрд▓ рдЬреЛрдбрд╝реЗрдВ:

 <div id="target"></div> <style>   #target {       background-color: lightgreen;       position: absolute;       border-radius: 50%;       height: 40px;       width: 40px;       transition: all 0.1s ease;       box-shadow: 0 0 20px 10px white;       border: 4px solid rgba(0,0,0,0.5);   } </style> 

рдкреГрд╖реНрда рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдордп-рд╕рдордп рдкрд░ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдЖрдВрдЦреЛрдВ рдХреА рд╡рд░реНрддрдорд╛рди рдЫрд╡рд┐ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рд╕реЗ рдПрдХ рд╕рд╡рд╛рд▓ рдкреВрдЫрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╣рд╛рдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдореЙрдбрд▓ рджреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╕рд░реНрдХрд▓ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 function moveTarget() { if (currentModel == null) {   return; } tf.tidy(function() {   const image = getImage();   const prediction = currentModel.predict(image);   //          const targetWidth = $('#target').outerWidth();   const targetHeight = $('#target').outerHeight();   const x = (prediction.get(0, 0) + 1) / 2 * ($(window).width() - targetWidth);   const y = (prediction.get(0, 1) + 1) / 2 * ($(window).height() - targetHeight);   //     :   const $target = $('#target');   $target.css('left', x + 'px');   $target.css('top', y + 'px'); }); } setInterval(moveTarget, 100); 

рдореИрдВрдиреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЛ 100 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдкрдХрд╛ рдХрдВрдкреНрдпреВрдЯрд░ рдореЗрд░рд╛ рдЬрд┐рддрдирд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдмрдбрд╝рд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд░рд┐рдгрд╛рдо


рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдордиреЗ рдЬреЛ рдХрд┐рдпрд╛ рд╣реИ рдЙрд╕рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░реЗрдВред рдЙрд╕рдХреА рдЖрдБрдЦреЛрдВ рдХреЗ рдкреАрдЫреЗ рдорд╛рдЙрд╕ рдХрд░реНрд╕рд░ рд▓реЗ рдЬрд╛рдПрдБ, рдФрд░ рд╕реНрдкреЗрд╕рдмрд╛рд░ рджрдмрд╛рдПрдБред рдЗрд╕рдХреЗ рдмрд╛рдж рд╕реНрдЯрд╛рд░реНрдЯ рдЯреНрд░реЗрдирд┐рдВрдЧ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред

рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░реЗрдВ, рдлрд┐рд░ рд╕реЗ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рдмрд╛рдж, рд╣рд░реЗ рд░рдВрдЧ рдХрд╛ рдЪрдХреНрд░ рдЖрдкрдХреЗ рдЯрдХрдЯрдХреА рдХреЗ рдмрд╛рдж рд╕реНрдХреНрд░реАрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдордирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЙрд╕ рдЬрдЧрд╣ рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдЖрдк рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдХрдИ рдЪрд░рдгреЛрдВ рдХреЗ рдмрд╛рдж, рд▓рдЧрднрдЧ 50 рдПрдХрддреНрд░ рдирдореВрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛, рдФрд░ рдпрджрд┐ рдЖрдк рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрд╕ рдкреГрд╖реНрда рдкрд░ рдмрд┐рдВрджреБ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрд▓реЗрдЧрд╛ рдЬрд┐рд╕реЗ рдЖрдк рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред ред рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд┐рдпрд╛ рдерд╛ рд╡рд╣ рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдлрд┐рд░ рднреА рдХрдИ рд╕реБрдзрд╛рд░ рд╣реИрдВ рдЬреЛ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдирд╛ рд╕рд┐рд░ рдШреБрдорд╛рддрд╛ рд╣реИ рдпрд╛ рдХреИрдорд░реЗ рдХреЗ рд╕рд╛рдордиреЗ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓рддрд╛ рд╣реИ? рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЙрд╕ рдЖрдпрдд рдХреЗ рдЖрдХрд╛рд░, рд╕реНрдерд┐рддрд┐ рдФрд░ рдХреЛрдг рдХреЗ рдЪрдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рдПрдЧреА рдЬреЛ рдЙрд╕ рдЫрд╡рд┐ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдмрд╛рдВрдзрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдБрдЦреЗрдВ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рд╣реИрдВред рдпрд╣рд╛рдБ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣реИрдВ:

  • рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЖрдВрдЦ-рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдЖрдпрдд рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкред
  • рдПрдХ рдЫрд╡рд┐ рдХреЛ рдЧреНрд░реЗрд╕реНрдХреЗрд▓ рдореЗрдВ рдмрджрд▓реЗрдВред
  • CoordConv рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
  • рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕рд╛ рдореЙрдбрд▓ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрд╣рд╛рдБ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред
  • рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
  • рдореЙрдбрд▓ рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
  • рд╡рдЬрди рдХрд╛ рд╕рдВрд░рдХреНрд╖рдг рдЬрд┐рд╕рдиреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдмрд╛рдж рдиреНрдпреВрдирддрдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╣рд╛рдирд┐ рджрд┐рдЦрд╛рдИред
  • рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ред

рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдХреНрдпрд╛ рдЖрдк TensorFlow рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ?

Source: https://habr.com/ru/post/hi426055/


All Articles