{"id":324486,"date":"2021-06-07T15:00:21","date_gmt":"2021-06-07T15:00:21","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=324486"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=324486","title":{"rendered":"\u0421\u0438\u043c-\u0441\u0438\u043c \u043e\u0442\u043a\u0440\u043e\u0439\u0441\u044f: \u043a\u0430\u043a \u044f \u043d\u0430\u0443\u0447\u0438\u043b \u0434\u0432\u0435\u0440\u044c \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u043e\u0434\u044a\u0435\u0437\u0434\u0430 \u0443\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044f \u0432 \u043b\u0438\u0446\u043e"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u041f\u044f\u0442\u043d\u0438\u0447\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0434\u0435\u043d\u044c \u043d\u0430 \u0443\u0434\u0430\u043b\u0451\u043d\u043a\u0435 \u0443\u0436\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b \u043a \u043a\u043e\u043d\u0446\u0443, \u043a\u0430\u043a \u0432 \u0434\u0432\u0435\u0440\u044c \u043f\u043e\u0441\u0442\u0443\u0447\u0430\u043b\u0438, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u0430. \u0423\u0437\u043d\u0430\u0432, \u0447\u0442\u043e \u043d\u043e\u0432\u044b\u0439 \u0434\u043e\u043c\u043e\u0444\u043e\u043d \u0438\u043c\u0435\u0435\u0442 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0437\u0432\u043e\u043d\u043a\u0438 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0441\u044c \u0434\u043e\u043c\u0430, \u044f \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0441\u044f \u0438 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b \u0435\u0433\u043e \u043d\u0430 \u0441\u0432\u043e\u0439 \u0442\u0435\u043b\u0435\u0444\u043e\u043d. \u0417\u0430\u043b\u043e\u0433\u0438\u043d\u0438\u0432\u0448\u0438\u0441\u044c, \u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0443\u044e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2014 \u0434\u0430\u0436\u0435 \u0431\u0435\u0437 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0432 \u043c\u043e\u044e \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0443 \u044f \u043c\u043e\u0433 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043a\u0430\u043c\u0435\u0440\u0443 \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u0430 \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0434\u0432\u0435\u0440\u044c \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. &#171;\u0414\u0430 \u044d\u0442\u043e \u0436\u0435 \u043e\u043d\u043b\u0430\u0439\u043d \u0410\u0420I \u043a \u0434\u0432\u0435\u0440\u0438 \u043f\u043e\u0434\u044a\u0435\u0437\u0434\u0430!&#187; \u2014 \u0449\u0451\u043b\u043a\u043d\u0443\u043b\u043e \u0432 \u0433\u043e\u043b\u043e\u0432\u0435. \u0421\u0443\u0434\u044c\u0431\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u0440\u0435\u0448\u0435\u043d\u0430.<\/p>\n<p>\u0412\u0438\u0434\u0435\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/61a\/a7b\/007\/61aa7b007ec5e2d86e8ea453c9e2b245.jpg\" alt=\"\u041a\u0430\u0434\u0440 \u0438\u0437 \u0444\u0438\u043b\u044c\u043c\u0430 \u00ab\u041f\u044f\u0442\u044b\u0439 \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u00bb\" title=\"\u041a\u0430\u0434\u0440 \u0438\u0437 \u0444\u0438\u043b\u044c\u043c\u0430 \u00ab\u041f\u044f\u0442\u044b\u0439 \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u00bb\" width=\"1271\" height=\"513\"><figcaption>\u041a\u0430\u0434\u0440 \u0438\u0437 \u0444\u0438\u043b\u044c\u043c\u0430 \u00ab\u041f\u044f\u0442\u044b\u0439 \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u00bb<\/figcaption><\/figure>\n<h2>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/h2>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043b\u0438\u0446 \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0430\u0442\u0430\u043a \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0430 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u041e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u0430\u0434\u0440\u043e\u0432 \u0431\u044b\u043b\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043c\u0443-\u0442\u043e \u0438\u0437 \u043c\u043e\u0435\u0439 \u0441\u0435\u043c\u044c\u0438 \u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u043f\u043e\u0434\u044a\u0435\u0437\u0434 \u2014 \u043e\u043d\u0430 \u043d\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u043b\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043b\u0438\u0446 \u0434\u0440\u0443\u0433\u0438\u0445 \u043b\u044e\u0434\u0435\u0439 \u0438 \u043d\u0435 \u043c\u043e\u0433\u043b\u0430 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0434\u043e\u043f\u0443\u0441\u043a\u0443 \u0432 \u043f\u043e\u0434\u044a\u0435\u0437\u0434 \u0442\u0440\u0435\u0442\u044c\u0438\u0445 \u043b\u0438\u0446.<\/p>\n<h2>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 API<\/h2>\n<p>\u0427\u0442\u043e\u0431\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0435\u0440\u044c\u044e, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0443\u0434\u0430 \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441\u0430\u043c\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0420\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433 \u2014 \u0434\u0435\u043b\u043e \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0442\u0440\u0430\u0444\u0438\u043a. \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u044f \u0432\u0437\u044f\u043b \u041d\u0422\u0422\u0420 \u0422\u043e\u043elkit \u2014 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043b\u0430\u0434\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0435 http(s) \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e Android \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0430\u043b\u044c\u043d\u043e\u0439 \u2014 \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d Android-\u0447\u0430\u0441\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e Certificate authority \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u0430 \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0421\u0410. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Android 7 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u0435\u043d \u044f\u0432\u043d\u043e \u0438\u0437\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0439 \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 root \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043b\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0421\u0410, \u044f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u043c Android, \u0438\u0434\u0443\u0449\u0438\u043c \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 \u0441 Android Studio. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <abbr title=\"Android Debug Bridge\">ADB<\/abbr> \u043c\u0435\u043d\u044f \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u043e \u0440\u0430\u0434\u043e\u0441\u0442\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0440\u0430\u0444\u0438\u043a \u043e\u0442 \u0432\u0441\u0435\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0431\u0435\u0437 Certificate pinning \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f19\/d67\/2f3\/f19d672f34b2fc886e63473319634925.png\" alt=\"\u0423\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 HTTP Toolkit\" title=\"\u0423\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 HTTP Toolkit\" width=\"1279\" height=\"1439\"><figcaption>\u0423\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 HTTP Toolkit<\/figcaption><\/figure>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043a\u0430\u043a \u0440\u0430\u0437 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u2014 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0431\u0440\u043e\u0434\u0438\u0432 \u043f\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0438 \u043e\u0442\u043a\u0440\u044b\u0432 \u0434\u0432\u0435\u0440\u044c, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0430\u043d\u0430\u043b\u0438\u0437\u0443 \u043b\u043e\u0433\u043e\u0432.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/54b\/170\/b41\/54b170b41e9b7b6556298ecafc4d59f9.jpg\" alt=\"\u0417\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0432\u0435\u0440\u0438\" title=\"\u0417\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0432\u0435\u0440\u0438\" width=\"2460\" height=\"1439\"><figcaption>\u0417\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0432\u0435\u0440\u0438<\/figcaption><\/figure>\n<p>\u0412\u0441\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0442\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430:<\/p>\n<ol>\n<li>\n<p>\u0417\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0434\u0432\u0435\u0440\u0438 \u043f\u043e\u0434\u044a\u0435\u0437\u0434\u0430: POST \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <code>\/rest\/v1\/places\/{place_id}\/accesscontrols\/{control_id}\/actions<\/code> \u0441 JSON-\u0442\u0435\u043b\u043e\u043c <code>{\"name\": \"accessControlOpen\"}<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043d\u0438\u043c\u043a\u0430 (\u043f\u0440\u0435\u0432\u044c\u044e) \u0441 \u043a\u0430\u043c\u0435\u0440\u044b: GET \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <code>\/rest\/v1\/places\/{place_id}\/accesscontrols\/{control_id}\/videosnapshots<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a \u0441 \u0430\u0443\u0434\u0438\u043e: GET \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <code>\/rest\/v1\/forpost\/cameras\/{camera_id}\/video?LightStream=0<\/code><\/p>\n<\/li>\n<\/ol>\n<p>HTTP \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0451\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043a\u043b\u044e\u0447 Authorization \u2014 \u0441\u0443\u0434\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443, \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e \u043d\u0435\u043c\u0443 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0421\u0434\u0435\u043b\u0430\u0432 \u043f\u0430\u0440\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0440\u0443\u043a\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 Advanced REST Client, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 Authorization \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438 \u0432 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 API \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u0430\u043c\u043d\u0435\u0439, \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0412\u043e\u043e\u0440\u0443\u0436\u0438\u0432\u0448\u0438\u0441\u044c Python \u0438 <code>requests<\/code>, \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u044d\u0442\u0430\u043f\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0442\u0440\u0451\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439:<\/p>\n<pre><code class=\"python\">HEADERS = {\"Authorization\": \"Bearer ###\"} ACTION_URL = \"https:\/\/###.ru\/rest\/v1\/places\/###\/accesscontrols\/###\/\" VIDEO_URL = \"https:\/\/###.ru\/rest\/v1\/forpost\/cameras\/###\/video?LightStream=0\"  def get_image():     result = requests.get(f'{ACTION_URL}\/videosnapshots', headers=HEADERS)     if result.status_code != 200:         logging.error(f\"Failed to get an image with status code {result.status_code}\")         return None     logging.warning(f\"Image received successfully in {result.elapsed.total_seconds()}sec\")     return result.content  def open_door():     result = requests.post(         f'{ACTION_URL}\/actions', headers=HEADERS, json={\"name\": \"accessControlOpen\"})     if result.status_code != 200:         logging.error(f\"Failed to open the door with status code {result.status_code}\")         return False     logging.warning(f\"Door opened successfully in {result.elapsed.total_seconds()}sec\")     return True  def get_videostream_link():     result = requests.get(VIDEO_URL, headers=HEADERS)     if result.status_code != 200:         logging.error(f\"Failed to get stream link with status code {result.status_code}\")         return False     logging.warning(f\"Stream link received successfully in {result.elapsed.total_seconds()}sec\")     return result.json()['data']['URL'] <\/code><\/pre>\n<h2>\u041f\u043e\u0438\u0441\u043a \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0445 \u043b\u0438\u0446 \u0432 \u043a\u0430\u0434\u0440\u0435<\/h2>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u0430\u0437\u0434\u0435\u043b, \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e\u0431 \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443 \u043c\u0435\u043d\u044f \u0432 \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044f\u0445 \u2014 \u044d\u0442\u043e \u043d\u0435\u0434\u043e\u0440\u043e\u0433\u0430\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a\u043e \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443 <code>Intel(R) Xeon(R) CPU E5-2650L v3 @ 1.80GHz<\/code>, 1GB \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 0 GPU. \u0422\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0434\u043e\u0440\u043e\u0433\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0436\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0438\u0437 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043c\u043e\u044f \u0436\u0435\u043d\u0430, \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432\u0437\u044f\u0432\u0448\u0430\u044f \u043d\u0430 \u0441\u0435\u0431\u044f \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d OpenVINO Toolkit \u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 Intel, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430 CPU.<\/p>\n<p>\u041d\u0435\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u0440\u0438\u0432\u0451\u043b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 <a href=\"https:\/\/docs.openvinotoolkit.org\/2020.3\/_demos_python_demos_face_recognition_demo_README.html\" rel=\"noopener noreferrer nofollow\">Interactive Face Recognition Demo<\/a> \u2014 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0435\u043c\u043e, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0440\u043e\u0432\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0432 \u043a\u0430\u0434\u0440\u0435 \u043b\u0438\u0446 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u0438\u0441\u0447\u0435\u0437 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u043b\u0438\u0437\u0430 2020.3, \u0430 \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 pip \u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441 2021.1. \u0411\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e OpenVINO \u0438 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u043e\u0434 \u043d\u0435\u0451.<\/p>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0433\u0438\u0442 \u043f\u043e\u043c\u043d\u0438\u0442 \u0432\u0441\u0451 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043a\u043e\u0434 \u0434\u0435\u043c\u043e \u0438 \u043d\u0443\u0436\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u043e \u0442\u0440\u0443\u0434\u0430. \u041f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 (\u0432\u0437\u044f\u0432 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e), \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0432\u0435\u0431\u043a\u0430\u043c\u0435\u0440\u044b, \u0431\u044b\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043a\u043b\u0430\u0441\u0441, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043b\u0438\u0446\u0430 \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043a\u0430\u0434\u0440\u0435:<\/p>\n<pre><code class=\"python\">class ImageProcessor:     def __init__(self):         self.frame_processor = FrameProcessor()      def process(self, image):         detections = self.frame_processor.process(image)         labels = []         for roi, landmarks, identity in zip(*detections):             label = self.frame_processor.face_identifier.get_identity_label(                 identity.id)             labels.append(label)         return labels<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u0430\u0437\u044b \u043b\u0438\u0446 \u0438\u0437 \u0434\u0435\u0441\u044f\u0442\u043a\u0430 \u0441\u0435\u043b\u0444\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0438\u043c\u0435\u044e\u0449\u0435\u043c\u0441\u044f \u0436\u0435\u043b\u0435\u0437\u0435. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u0434\u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u044f \u0432\u0437\u044f\u043b \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e \u0441\u0435\u0431\u044f \u0438 \u0444\u043e\u0442\u043e \u043f\u0443\u0441\u0442\u043e\u0439 \u0443\u043b\u0438\u0446\u044b, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u043d\u0443\u044e \u043a\u0430\u043c\u0435\u0440\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>get_image()<\/code> \u0432\u044b\u0448\u0435.<\/p>\n<pre><code class=\"cpp\">100 runs on an image with known face: Total time: 7.356s Time per frame: 0.007s FPS: 135.944  100 runs on an image without faces: Total time: 2.985s Time per frame: 0.003s FPS: 334.962<\/code><\/pre>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441 \u0437\u0430\u043f\u0430\u0441\u043e\u043c \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0443\u0436\u0434\u044b \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u0438\u0446 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<h2>1 FPS: \u0420\u0430\u0431\u043e\u0442\u0430 \u0441\u043e \u0441\u043d\u0438\u043c\u043a\u0430\u043c\u0438 \u0441 \u043a\u0430\u043c\u0435\u0440\u044b<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0443 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0431\u044b\u043b \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u0438\u0446 \u0432 \u043a\u0430\u0434\u0440\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043d\u0438\u043c\u043a\u0430 \u0441 \u043a\u0430\u043c\u0435\u0440\u044b \u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a. \u0421 \u0432\u0438\u0434\u0435\u043e \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0434\u043b\u044f MVP \u0440\u0435\u0448\u0438\u043b \u043f\u0435\u0440\u0435\u043b\u043e\u0436\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u043a\u0430\u0434\u0440\u043e\u0432 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043d\u043e\u0432\u0430 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <code>get_image()<\/code>.<\/p>\n<pre><code class=\"python\">class ImageProcessor: \t\t# &lt;...&gt;     def process_single_image(self, image):         nparr = np.fromstring(image, np.uint8)         img_np = cv2.imdecode(nparr, cv2.IMREAD_COLOR)         labels = self.process(img_np)         return labels  def snapshot_based_intercom_id():     processor = ImageProcessor()      last_open_door_time = time.time()     while True:         start_time = time.time()         image = get_image()         result = processor.process_single_image(image)         logging.info(f'{result} in {time.time() - start_time}s')         # Successfull detections are \"face{N}\"         if any(['face' in res for res in result]):             if start_time - last_open_door_time &gt; 5:                 open_door()                 with open(f'images\/{start_time}_OK.jfif', 'wb') as f:                     f.write(image)                 last_open_door_time = start_time<\/code><\/pre>\n<p>\u0426\u0438\u043a\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043e\u0442 \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u0430, \u0438\u0449\u0435\u0442 \u043d\u0430 \u043d\u0438\u0445 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u043b\u0438\u0446\u0430, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0434\u0432\u0435\u0440\u044c \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0434\u0435\u0442\u0435\u043a\u0446\u0438\u0438 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0444\u043e\u0442\u043e \u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c. \u0412\u0430\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0432\u0435\u0440\u0438, \u0442.\u043a. \u043b\u0438\u0446\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0451\u0442\u0441\u044f \u0435\u0449\u0451 \u043d\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u0445 \u043a \u0434\u0432\u0435\u0440\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a97\/761\/19d\/a9776119d4e81bd3340150a49620e547.jpg\" alt=\"\u041c\u043e\u043c\u0435\u043d\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f, \u0432\u0435\u0440\u0441\u0438\u044f \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043d\u0438\u043c\u043a\u043e\u0432\" title=\"\u041c\u043e\u043c\u0435\u043d\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f, \u0432\u0435\u0440\u0441\u0438\u044f \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043d\u0438\u043c\u043a\u043e\u0432\" width=\"916\" height=\"308\"><figcaption>\u041c\u043e\u043c\u0435\u043d\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f, \u0432\u0435\u0440\u0441\u0438\u044f \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043d\u0438\u043c\u043a\u043e\u0432<\/figcaption><\/figure>\n<p>\u0417\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e! \u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c, \u044f \u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f \u0432 \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0443. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u043f\u043e\u0440\u0442\u0438\u043b\u043e \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435 \u043e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u2014 \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043b\u0438\u0446\u0430 \u0432 \u043a\u0430\u0434\u0440\u0435, \u0442.\u043a. \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u043b\u0438\u043a\u0430 API \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u043e \u0436\u0435\u043b\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435\u0433\u043e. \u041d\u0438\u0437\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, 0.7\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0438 0.6\u0441 \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0434\u0432\u0435\u0440\u0438, \u0434\u0430\u0432\u0430\u043b\u0438 \u0432\u0438\u0434\u0438\u043c\u044b\u0439 \u043d\u0435\u0432\u043e\u043e\u0440\u0443\u0436\u0451\u043d\u043d\u044b\u043c \u0432\u0437\u0433\u043b\u044f\u0434\u043e\u043c \u043b\u0430\u0433.<\/p>\n<h2>\u0414\u043e 30 FPS: \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u0430<\/h2>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0430\u0434\u0440\u044b \u0438\u0437 \u0432\u0438\u0434\u0435\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"python\">vcap = cv2.VideoCapture(link) success, frame = vcap.read()<\/code><\/pre>\n<p>\u0417\u0430\u043c\u0435\u0440\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u043a\u0430\u043c\u0435\u0440\u0430 \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 30 FPS. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043a\u0430\u0434\u0440\u043e\u0432: \u043c\u0435\u0442\u043e\u0434 <code>read()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u043a\u0430\u0434\u0440 \u0438\u0437 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043a\u0430\u0434\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 \u044d\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0442\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043a\u0430\u0434\u0440\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u0442\u044c \u043e\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0435. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0441 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f, \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043b\u0438\u0446\u0430 30 \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u2014 \u043f\u0443\u0441\u0442\u0430\u044f \u0442\u0440\u0430\u0442\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u043b\u044e\u0434\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043a \u0434\u0432\u0435\u0440\u0438 \u043f\u043e\u0434\u044a\u0435\u0437\u0434\u0430 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0431\u044b\u043b\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438: <code>vcap.set(CV_CAP_PROP_BUFFERSIZE, 0);<\/code>. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0442\u0430\u043a\u043e\u0439 \u0442\u0440\u044e\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439 OpenCV \u0432\u044b\u0448\u0435 3.4, \u043d\u043e \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435, \u0442\u0430\u043a \u0438 \u043d\u0435 \u043e\u043a\u0430\u0437\u0430\u043b \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u0432 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043e\u0439 \u0441\u0442\u0430\u043b \u043f\u043e\u0434\u0445\u043e\u0434, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432 <a href=\"https:\/\/stackoverflow.com\/a\/65191619\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u043c<\/a> \u043e\u0442\u0432\u0435\u0442\u0435 \u0441\u043e StackOverflow \u2014 \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a, \u0447\u0438\u0442\u0430\u044e\u0449\u0438\u0439 \u043a\u0430\u0434\u0440\u044b \u0438\u0437 \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0449\u0438\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432 \u043f\u043e\u043b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (\u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u0446\u0438\u043a\u043b \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u0435\u043d \u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430).<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f <code>ImageProcessor<\/code> \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u0430 \u0441 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 3 \u043a\u0430\u0434\u0440\u0430 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443:<\/p>\n<pre><code class=\"python\">class CameraBufferCleanerThread(threading.Thread):     def __init__(self, camera, name='camera-buffer-cleaner-thread'):         self.camera = camera         self.last_frame = None         self.finished = False         super(CameraBufferCleanerThread, self).__init__(name=name)         self.start()      def run(self):         while not self.finished:             ret, self.last_frame = self.camera.read()      def __enter__(self): return self      def __exit__(self, type, value, traceback):         self.finished = True         self.join()  class ImageProcessor: \t\t# &lt;...&gt;     def process_stream(self, link):         vcap = cv2.VideoCapture(link)         interval = 0.3 # ~3 FPS         with CameraBufferCleanerThread(vcap) as cam_cleaner:             while True:                 frame = cam_cleaner.last_frame                 if frame is not None:                     yield (self.process(frame), frame)                 else:                     yield (None, None)                 time.sleep(interval)<\/code><\/pre>\n<p>\u0418 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f <code>snapshot_based_intercom_id<\/code>:<\/p>\n<pre><code class=\"python\">def stream_based_intercom_id():     processor = ImageProcessor()      link = get_videostream_link()     # To notify about delays     last_time = time.time()     last_open_door_time = time.time()     for result, np_image in processor.process_stream(link):         current_time = time.time()         delta_time = current_time - last_time         if delta_time &lt; 1:             logging.info(f'{result} in {delta_time}')         else:             logging.warning(f'{result} in {delta_time}')         last_time = current_time         if result is None:             continue         if any(['face' in res for res in result]):             if current_time - last_open_door_time &gt; 5:                 logging.warning(                   \tf'Hey, I know you - {result[0]}! Opening the door...')                 last_open_door_time = current_time                 open_door()                 cv2.imwrite(f'images\/{current_time}_OK.jpg', np_image)<\/code><\/pre>\n<p>\u0422\u0435\u0441\u0442 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u043e\u0449\u0443\u0442\u0438\u043c\u043e\u0435 \u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0442\u043a\u043b\u0438\u043a\u0430 \u2014 \u043f\u0440\u0438 \u0445\u043e\u0440\u043e\u0448\u0435\u043c \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0438 \u043f\u043e\u0434\u044a\u0435\u0437\u0434\u043d\u0430\u044f \u0434\u0432\u0435\u0440\u044c \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0435\u0449\u0451 \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044f \u0443\u0441\u043f\u0435\u0432\u0430\u043b \u043f\u043e\u0434\u043e\u0439\u0442\u0438 \u043a \u043d\u0435\u0439 \u0432\u043f\u043b\u043e\u0442\u043d\u0443\u044e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/44c\/838\/4a2\/44c8384a2b54902ab11f2c6a4564c9ef.jpg\" alt=\"\u041c\u043e\u043c\u0435\u043d\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f, \u0432\u0435\u0440\u0441\u0438\u044f \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u0430\" title=\"\u041c\u043e\u043c\u0435\u043d\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f, \u0432\u0435\u0440\u0441\u0438\u044f \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u0430\" width=\"566\" height=\"161\"><figcaption>\u041c\u043e\u043c\u0435\u043d\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f, \u0432\u0435\u0440\u0441\u0438\u044f \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u0430<\/figcaption><\/figure>\n<h2>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Telegram \u0431\u043e\u0442\u0430<\/h2>\n<p>\u0421\u0430\u043c\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0435\u0451 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\/\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0431\u043e\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u043a\u0435\u0442\u0430 <code>python-telegram-bot<\/code> \u0431\u044b\u043b\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0430\u044f \u0432 \u0441\u0435\u0431\u044f callback \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\/\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u043d\u0438\u043a\u043d\u0435\u0439\u043c\u043e\u0432.<\/p>\n<pre><code class=\"python\">class TelegramInterface:     def __init__(self, login_whitelist, state_callback):         self.state_callback = state_callback         self.login_whitelist = login_whitelist         self.updater = Updater(             token = \"###\", use_context = True)         self.run()      def run(self):         dispatcher = self.updater.dispatcher         dispatcher.add_handler(CommandHandler(\"start\", self.start))         dispatcher.add_handler(CommandHandler(\"run\", self.run_intercom))         dispatcher.add_handler(CommandHandler(\"stop\", self.stop_intercom))          self.updater.start_polling()      def run_intercom(self, update: Update, context: CallbackContext):         user = update.message.from_user         update.message.reply_text(             self.state_callback(True) if user.username in self.login_whitelist else 'not allowed',             reply_to_message_id=update.message.message_id)      def stop_intercom(self, update: Update, context: CallbackContext):         user = update.message.from_user         update.message.reply_text(             self.state_callback(False) if user.username in self.login_whitelist else 'not allowed',             reply_to_message_id=update.message.message_id)      def start(self, update: Update, context: CallbackContext) -&gt; None:         update.message.reply_text('Hi!')                   class TelegramBotThreadWrapper(threading.Thread):     def __init__(self, state_callback, name='telegram-bot-wrapper'):         self.whitelist = [\"###\", \"###\"]         self.state_callback = state_callback         super(TelegramBotThreadWrapper, self).__init__(name=name)         self.start()      def run(self):         self.bot = TelegramInterface(self.whitelist, self.state_callback) <\/code><\/pre>\n<p>\u0418 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0443\u043f\u0435\u043d\u044c \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>intercom_id<\/code>, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434 \u043e\u0442 \u0431\u043e\u0442\u0430:<\/p>\n<pre><code class=\"python\">def stream_based_intercom_id_with_telegram():     processor = ImageProcessor()      loop_state_lock = threading.Lock()      loop_should_run = False     loop_should_change_state_cv = threading.Condition(loop_state_lock)      is_loop_finished = True     loop_changed_state_cv = threading.Condition(loop_state_lock)      def stream_processing_loop():         nonlocal loop_should_run         nonlocal loop_should_change_state_cv         nonlocal is_loop_finished         nonlocal loop_changed_state_cv          while True:             with loop_should_change_state_cv:                 loop_should_change_state_cv.wait_for(lambda: loop_should_run)                 is_loop_finished = False                 loop_changed_state_cv.notify_all()                 logging.warning(f'Loop is started')             link = get_videostream_link()             last_time = time.time()             last_open_door_time = time.time()             for result, np_image in processor.process_stream(link):                 with loop_should_change_state_cv:                     if not loop_should_run:                         is_loop_finished = True                         loop_changed_state_cv.notify_all()                         logging.warning(f'Loop is stopped')                         break                 current_time = time.time()                 delta_time = current_time - last_time                 if delta_time &lt; 1:                     logging.info(f'{result} in {delta_time}')                 else:                     logging.warning(f'{result} in {delta_time}')                 last_time = current_time                 if result is None:                     continue                 if any(['face' in res for res in result]):                     if current_time - last_open_door_time &gt; 5:                         logging.warning(f'Hey, I know you - {result[0]}! Opening the door...')                         last_open_door_time = current_time                         open_door()                         cv2.imwrite(f'images\/{current_time}_OK.jpg', np_image)      def state_callback(is_running):         nonlocal loop_should_run         nonlocal loop_should_change_state_cv         nonlocal is_loop_finished         nonlocal loop_changed_state_cv          with loop_should_change_state_cv:             if is_running == loop_should_run:                 return \"Intercom service state is not changed\"             loop_should_run = is_running             if loop_should_run:                 loop_should_change_state_cv.notify_all()                 loop_changed_state_cv.wait_for(lambda: not is_loop_finished)                 return \"Intercom service is up\"             else:                 loop_changed_state_cv.wait_for(lambda: is_loop_finished)                 return \"Intercom service is down\"      telegram_bot = TelegramBotThreadWrapper(state_callback)     logging.warning(\"Bot is ready\")     stream_processing_loop()<\/code><\/pre>\n<h2>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/h2>\n<p>\u0412\u0438\u0434\u0435\u043e: <\/p>\n<p><iframe id=\"60bd3058864b97c5e1be87d0\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/60bd3058864b97c5e1be87d0\" class=\"embed_video embed__content\" allowfullscreen=\"true\"><\/iframe><\/p>\n<h2>\u041f\u043e\u0441\u043b\u0435\u0441\u043b\u043e\u0432\u0438\u0435<\/h2>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0443\u043c\u043d\u044b\u0445 \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u043e\u0432 \u043d\u0435\u0441\u0451\u0442 \u0436\u0438\u043b\u044c\u0446\u0430\u043c, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u0435 \u0432 \u0435\u0434\u0438\u043d\u0443\u044e \u0441\u0435\u0442\u044c \u0441\u043e\u0442\u043d\u0438 (\u0442\u044b\u0441\u044f\u0447\u0438?) \u043f\u043e\u0434\u044a\u0435\u0437\u0434\u043d\u044b\u0445 \u0434\u0432\u0435\u0440\u0435\u0439 \u0441 \u043a\u0430\u043c\u0435\u0440\u0430\u043c\u0438 \u0438 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430\u043c\u0438 (\u0434\u0430, \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u043c \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u0435 \u0435\u0441\u0442\u044c \u0438 \u0430\u0443\u0434\u0438\u043e!), \u0432\u0435\u0434\u0443\u0449\u0438\u043c\u0438 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u2014 \u043a\u0430\u043a \u043f\u043e \u043c\u043d\u0435, \u0441\u043a\u043e\u0440\u0435\u0435 \u043f\u0443\u0433\u0430\u044e\u0449\u0435\u0435 \u044f\u0432\u043b\u0435\u043d\u0438\u0435, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u042f \u0431\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0451\u043b, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u0443 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0432\u043e\u043d\u043a\u0430 \u0432 \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0443 \u0438 \u0432\u0435\u0434\u0443\u0449\u0430\u044f\u0441\u044f \u0442\u0440\u0451\u0445\u0434\u043d\u0435\u0432\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c, \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u044e\u0449\u0430\u044f\u0441\u044f \u043a\u0430\u043a \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0439, \u0445\u0440\u0430\u043d\u0438\u043b\u0430\u0441\u044c \u043d\u0435 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0430 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u0435, \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u0435\u0439 \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443. \u0418\u043b\u0438 \u043d\u0435 \u0432\u0435\u043b\u0430\u0441\u044c \u0432\u043e\u0432\u0441\u0435.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/561502\/\"> https:\/\/habr.com\/ru\/post\/561502\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u041f\u044f\u0442\u043d\u0438\u0447\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0434\u0435\u043d\u044c \u043d\u0430 \u0443\u0434\u0430\u043b\u0451\u043d\u043a\u0435 \u0443\u0436\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b \u043a \u043a\u043e\u043d\u0446\u0443, \u043a\u0430\u043a \u0432 \u0434\u0432\u0435\u0440\u044c \u043f\u043e\u0441\u0442\u0443\u0447\u0430\u043b\u0438, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u0430. \u0423\u0437\u043d\u0430\u0432, \u0447\u0442\u043e \u043d\u043e\u0432\u044b\u0439 \u0434\u043e\u043c\u043e\u0444\u043e\u043d \u0438\u043c\u0435\u0435\u0442 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0437\u0432\u043e\u043d\u043a\u0438 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0441\u044c \u0434\u043e\u043c\u0430, \u044f \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0441\u044f \u0438 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b \u0435\u0433\u043e \u043d\u0430 \u0441\u0432\u043e\u0439 \u0442\u0435\u043b\u0435\u0444\u043e\u043d. \u0417\u0430\u043b\u043e\u0433\u0438\u043d\u0438\u0432\u0448\u0438\u0441\u044c, \u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0443\u044e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2014 \u0434\u0430\u0436\u0435 \u0431\u0435\u0437 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0432 \u043c\u043e\u044e \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0443 \u044f \u043c\u043e\u0433 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043a\u0430\u043c\u0435\u0440\u0443 \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u0430 \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0434\u0432\u0435\u0440\u044c \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. &#171;\u0414\u0430 \u044d\u0442\u043e \u0436\u0435 \u043e\u043d\u043b\u0430\u0439\u043d \u0410\u0420I \u043a \u0434\u0432\u0435\u0440\u0438 \u043f\u043e\u0434\u044a\u0435\u0437\u0434\u0430!&#187; \u2014 \u0449\u0451\u043b\u043a\u043d\u0443\u043b\u043e \u0432 \u0433\u043e\u043b\u043e\u0432\u0435. \u0421\u0443\u0434\u044c\u0431\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u0440\u0435\u0448\u0435\u043d\u0430.<\/p>\n<p>\u0412\u0438\u0434\u0435\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<figure class=\"full-width\"><figcaption>\u041a\u0430\u0434\u0440 \u0438\u0437 \u0444\u0438\u043b\u044c\u043c\u0430 \u00ab\u041f\u044f\u0442\u044b\u0439 \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u00bb<\/figcaption><\/figure>\n<h2>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/h2>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043b\u0438\u0446 \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0430\u0442\u0430\u043a \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0430 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u041e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u0430\u0434\u0440\u043e\u0432 \u0431\u044b\u043b\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043c\u0443-\u0442\u043e \u0438\u0437 \u043c\u043e\u0435\u0439 \u0441\u0435\u043c\u044c\u0438 \u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u043f\u043e\u0434\u044a\u0435\u0437\u0434 \u2014 \u043e\u043d\u0430 \u043d\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u043b\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043b\u0438\u0446 \u0434\u0440\u0443\u0433\u0438\u0445 \u043b\u044e\u0434\u0435\u0439 \u0438 \u043d\u0435 \u043c\u043e\u0433\u043b\u0430 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0434\u043e\u043f\u0443\u0441\u043a\u0443 \u0432 \u043f\u043e\u0434\u044a\u0435\u0437\u0434 \u0442\u0440\u0435\u0442\u044c\u0438\u0445 \u043b\u0438\u0446.<\/p>\n<h2>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 API<\/h2>\n<p>\u0427\u0442\u043e\u0431\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0435\u0440\u044c\u044e, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0443\u0434\u0430 \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441\u0430\u043c\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0420\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433 \u2014 \u0434\u0435\u043b\u043e \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0442\u0440\u0430\u0444\u0438\u043a. \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u044f \u0432\u0437\u044f\u043b \u041d\u0422\u0422\u0420 \u0422\u043e\u043elkit \u2014 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043b\u0430\u0434\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0435 http(s) \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e Android \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0430\u043b\u044c\u043d\u043e\u0439 \u2014 \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d Android-\u0447\u0430\u0441\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e Certificate authority \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u0430 \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0421\u0410. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Android 7 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u0435\u043d \u044f\u0432\u043d\u043e \u0438\u0437\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0439 \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 root \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043b\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0421\u0410, \u044f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u043c Android, \u0438\u0434\u0443\u0449\u0438\u043c \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 \u0441 Android Studio. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <abbr title=\"Android Debug Bridge\">ADB<\/abbr> \u043c\u0435\u043d\u044f \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u043e \u0440\u0430\u0434\u043e\u0441\u0442\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0440\u0430\u0444\u0438\u043a \u043e\u0442 \u0432\u0441\u0435\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0431\u0435\u0437 Certificate pinning \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d.<\/p>\n<figure class=\"full-width\"><figcaption>\u0423\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 HTTP Toolkit<\/figcaption><\/figure>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043a\u0430\u043a \u0440\u0430\u0437 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u2014 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0431\u0440\u043e\u0434\u0438\u0432 \u043f\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0438 \u043e\u0442\u043a\u0440\u044b\u0432 \u0434\u0432\u0435\u0440\u044c, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0430\u043d\u0430\u043b\u0438\u0437\u0443 \u043b\u043e\u0433\u043e\u0432.<\/p>\n<figure class=\"full-width\"><figcaption>\u0417\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0432\u0435\u0440\u0438<\/figcaption><\/figure>\n<p>\u0412\u0441\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0442\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430:<\/p>\n<ol>\n<li>\n<p>\u0417\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0434\u0432\u0435\u0440\u0438 \u043f\u043e\u0434\u044a\u0435\u0437\u0434\u0430: POST \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <code>\/rest\/v1\/places\/{place_id}\/accesscontrols\/{control_id}\/actions<\/code> \u0441 JSON-\u0442\u0435\u043b\u043e\u043c <code>{\"name\": \"accessControlOpen\"}<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043d\u0438\u043c\u043a\u0430 (\u043f\u0440\u0435\u0432\u044c\u044e) \u0441 \u043a\u0430\u043c\u0435\u0440\u044b: GET \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <code>\/rest\/v1\/places\/{place_id}\/accesscontrols\/{control_id}\/videosnapshots<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a \u0441 \u0430\u0443\u0434\u0438\u043e: GET \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <code>\/rest\/v1\/forpost\/cameras\/{camera_id}\/video?LightStream=0<\/code><\/p>\n<\/li>\n<\/ol>\n<p>HTTP \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0451\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043a\u043b\u044e\u0447 Authorization \u2014 \u0441\u0443\u0434\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443, \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e \u043d\u0435\u043c\u0443 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0421\u0434\u0435\u043b\u0430\u0432 \u043f\u0430\u0440\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0440\u0443\u043a\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 Advanced REST Client, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 Authorization \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438 \u0432 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 API \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u0430\u043c\u043d\u0435\u0439, \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0412\u043e\u043e\u0440\u0443\u0436\u0438\u0432\u0448\u0438\u0441\u044c Python \u0438 <code>requests<\/code>, \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u044d\u0442\u0430\u043f\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0442\u0440\u0451\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439:<\/p>\n<pre><code class=\"python\">HEADERS = {\"Authorization\": \"Bearer ###\"} ACTION_URL = \"https:\/\/###.ru\/rest\/v1\/places\/###\/accesscontrols\/###\/\" VIDEO_URL = \"https:\/\/###.ru\/rest\/v1\/forpost\/cameras\/###\/video?LightStream=0\"  def get_image():     result = requests.get(f'{ACTION_URL}\/videosnapshots', headers=HEADERS)     if result.status_code != 200:         logging.error(f\"Failed to get an image with status code {result.status_code}\")         return None     logging.warning(f\"Image received successfully in {result.elapsed.total_seconds()}sec\")     return result.content  def open_door():     result = requests.post(         f'{ACTION_URL}\/actions', headers=HEADERS, json={\"name\": \"accessControlOpen\"})     if result.status_code != 200:         logging.error(f\"Failed to open the door with status code {result.status_code}\")         return False     logging.warning(f\"Door opened successfully in {result.elapsed.total_seconds()}sec\")     return True  def get_videostream_link():     result = requests.get(VIDEO_URL, headers=HEADERS)     if result.status_code != 200:         logging.error(f\"Failed to get stream link with status code {result.status_code}\")         return False     logging.warning(f\"Stream link received successfully in {result.elapsed.total_seconds()}sec\")     return result.json()['data']['URL'] <\/code><\/pre>\n<h2>\u041f\u043e\u0438\u0441\u043a \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0445 \u043b\u0438\u0446 \u0432 \u043a\u0430\u0434\u0440\u0435<\/h2>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u0430\u0437\u0434\u0435\u043b, \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e\u0431 \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443 \u043c\u0435\u043d\u044f \u0432 \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044f\u0445 \u2014 \u044d\u0442\u043e \u043d\u0435\u0434\u043e\u0440\u043e\u0433\u0430\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a\u043e \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443 <code>Intel(R) Xeon(R) CPU E5-2650L v3 @ 1.80GHz<\/code>, 1GB \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 0 GPU. \u0422\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0434\u043e\u0440\u043e\u0433\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0436\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0438\u0437 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043c\u043e\u044f \u0436\u0435\u043d\u0430, \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432\u0437\u044f\u0432\u0448\u0430\u044f \u043d\u0430 \u0441\u0435\u0431\u044f \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d OpenVINO Toolkit \u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 Intel, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430 CPU.<\/p>\n<p>\u041d\u0435\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u0440\u0438\u0432\u0451\u043b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 <a href=\"https:\/\/docs.openvinotoolkit.org\/2020.3\/_demos_python_demos_face_recognition_demo_README.html\" rel=\"noopener noreferrer nofollow\">Interactive Face Recognition Demo<\/a> \u2014 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0435\u043c\u043e, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0440\u043e\u0432\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0432 \u043a\u0430\u0434\u0440\u0435 \u043b\u0438\u0446 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u0438\u0441\u0447\u0435\u0437 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u043b\u0438\u0437\u0430 2020.3, \u0430 \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 pip \u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441 2021.1. \u0411\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e OpenVINO \u0438 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u043e\u0434 \u043d\u0435\u0451.<\/p>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0433\u0438\u0442 \u043f\u043e\u043c\u043d\u0438\u0442 \u0432\u0441\u0451 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043a\u043e\u0434 \u0434\u0435\u043c\u043e \u0438 \u043d\u0443\u0436\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u043e \u0442\u0440\u0443\u0434\u0430. \u041f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 (\u0432\u0437\u044f\u0432 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e), \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0432\u0435\u0431\u043a\u0430\u043c\u0435\u0440\u044b, \u0431\u044b\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043a\u043b\u0430\u0441\u0441, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043b\u0438\u0446\u0430 \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043a\u0430\u0434\u0440\u0435:<\/p>\n<pre><code class=\"python\">class ImageProcessor:     def __init__(self):         self.frame_processor = FrameProcessor()      def process(self, image):         detections = self.frame_processor.process(image)         labels = []         for roi, landmarks, identity in zip(*detections):             label = self.frame_processor.face_identifier.get_identity_label(                 identity.id)             labels.append(label)         return labels<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u0430\u0437\u044b \u043b\u0438\u0446 \u0438\u0437 \u0434\u0435\u0441\u044f\u0442\u043a\u0430 \u0441\u0435\u043b\u0444\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0438\u043c\u0435\u044e\u0449\u0435\u043c\u0441\u044f \u0436\u0435\u043b\u0435\u0437\u0435. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u0434\u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u044f \u0432\u0437\u044f\u043b \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e \u0441\u0435\u0431\u044f \u0438 \u0444\u043e\u0442\u043e \u043f\u0443\u0441\u0442\u043e\u0439 \u0443\u043b\u0438\u0446\u044b, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u043d\u0443\u044e \u043a\u0430\u043c\u0435\u0440\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>get_image()<\/code> \u0432\u044b\u0448\u0435.<\/p>\n<pre><code class=\"cpp\">100 runs on an image with known face: Total time: 7.356s Time per frame: 0.007s FPS: 135.944  100 runs on an image without faces: Total time: 2.985s Time per frame: 0.003s FPS: 334.962<\/code><\/pre>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441 \u0437\u0430\u043f\u0430\u0441\u043e\u043c \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0443\u0436\u0434\u044b \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u0438\u0446 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<h2>1 FPS: \u0420\u0430\u0431\u043e\u0442\u0430 \u0441\u043e \u0441\u043d\u0438\u043c\u043a\u0430\u043c\u0438 \u0441 \u043a\u0430\u043c\u0435\u0440\u044b<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0443 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0431\u044b\u043b \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u0438\u0446 \u0432 \u043a\u0430\u0434\u0440\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043d\u0438\u043c\u043a\u0430 \u0441 \u043a\u0430\u043c\u0435\u0440\u044b \u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a. \u0421 \u0432\u0438\u0434\u0435\u043e \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0434\u043b\u044f MVP \u0440\u0435\u0448\u0438\u043b \u043f\u0435\u0440\u0435\u043b\u043e\u0436\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u043a\u0430\u0434\u0440\u043e\u0432 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043d\u043e\u0432\u0430 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <code>get_image()<\/code>.<\/p>\n<pre><code class=\"python\">class ImageProcessor: \t\t# &lt;...&gt;     def process_single_image(self, image):         nparr = np.fromstring(image, np.uint8)         img_np = cv2.imdecode(nparr, cv2.IMREAD_COLOR)         labels = self.process(img_np)         return labels  def snapshot_based_intercom_id():     processor = ImageProcessor()      last_open_door_time = time.time()     while True:         start_time = time.time()         image = get_image()         result = processor.process_single_image(image)         logging.info(f'{result} in {time.time() - start_time}s')         # Successfull detections are \"face{N}\"         if any(['face' in res for res in result]):             if start_time - last_open_door_time &gt; 5:                 open_door()                 with open(f'images\/{start_time}_OK.jfif', 'wb') as f:                     f.write(image)                 last_open_door_time = start_time<\/code><\/pre>\n<p>\u0426\u0438\u043a\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043e\u0442 \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u0430, \u0438\u0449\u0435\u0442 \u043d\u0430 \u043d\u0438\u0445 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u043b\u0438\u0446\u0430, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0434\u0432\u0435\u0440\u044c \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0434\u0435\u0442\u0435\u043a\u0446\u0438\u0438 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0444\u043e\u0442\u043e \u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c. \u0412\u0430\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0432\u0435\u0440\u0438, \u0442.\u043a. \u043b\u0438\u0446\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0451\u0442\u0441\u044f \u0435\u0449\u0451 \u043d\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u0445 \u043a \u0434\u0432\u0435\u0440\u0438.<\/p>\n<figure class=\"full-width\"><figcaption>\u041c\u043e\u043c\u0435\u043d\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f, \u0432\u0435\u0440\u0441\u0438\u044f \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043d\u0438\u043c\u043a\u043e\u0432<\/figcaption><\/figure>\n<p>\u0417\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e! \u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c, \u044f \u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f \u0432 \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0443. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u043f\u043e\u0440\u0442\u0438\u043b\u043e \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435 \u043e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u2014 \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043b\u0438\u0446\u0430 \u0432 \u043a\u0430\u0434\u0440\u0435, \u0442.\u043a. \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u043b\u0438\u043a\u0430 API \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u043e \u0436\u0435\u043b\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435\u0433\u043e. \u041d\u0438\u0437\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, 0.7\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0438 0.6\u0441 \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0434\u0432\u0435\u0440\u0438, \u0434\u0430\u0432\u0430\u043b\u0438 \u0432\u0438\u0434\u0438\u043c\u044b\u0439 \u043d\u0435\u0432\u043e\u043e\u0440\u0443\u0436\u0451\u043d\u043d\u044b\u043c \u0432\u0437\u0433\u043b\u044f\u0434\u043e\u043c \u043b\u0430\u0433.<\/p>\n<h2>\u0414\u043e 30 FPS: \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u0430<\/h2>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0430\u0434\u0440\u044b \u0438\u0437 \u0432\u0438\u0434\u0435\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"python\">vcap = cv2.VideoCapture(link) success, frame = vcap.read()<\/code><\/pre>\n<p>\u0417\u0430\u043c\u0435\u0440\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u043a\u0430\u043c\u0435\u0440\u0430 \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 30 FPS. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043a\u0430\u0434\u0440\u043e\u0432: \u043c\u0435\u0442\u043e\u0434 <code>read()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u043a\u0430\u0434\u0440 \u0438\u0437 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043a\u0430\u0434\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 \u044d\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0442\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043a\u0430\u0434\u0440\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u0442\u044c \u043e\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0435. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0441 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f, \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043b\u0438\u0446\u0430 30 \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u2014 \u043f\u0443\u0441\u0442\u0430\u044f \u0442\u0440\u0430\u0442\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u043b\u044e\u0434\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043a \u0434\u0432\u0435\u0440\u0438 \u043f\u043e\u0434\u044a\u0435\u0437\u0434\u0430 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0431\u044b\u043b\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438: <code>vcap.set(CV_CAP_PROP_BUFFERSIZE, 0);<\/code>. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0442\u0430\u043a\u043e\u0439 \u0442\u0440\u044e\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439 OpenCV \u0432\u044b\u0448\u0435 3.4, \u043d\u043e \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435, \u0442\u0430\u043a \u0438 \u043d\u0435 \u043e\u043a\u0430\u0437\u0430\u043b \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u0432 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043e\u0439 \u0441\u0442\u0430\u043b \u043f\u043e\u0434\u0445\u043e\u0434, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432 <a href=\"https:\/\/stackoverflow.com\/a\/65191619\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u043c<\/a> \u043e\u0442\u0432\u0435\u0442\u0435 \u0441\u043e<\/p>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-324486","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/324486","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=324486"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/324486\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=324486"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=324486"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=324486"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}