<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Tutorial - Inero Software - Rozwiązania IT i Konsulting</title>
	<atom:link href="https://inero-software.com/pl/category/blog_pl/tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>https://inero-software.com/pl/category/blog_pl/tutorial/</link>
	<description>Tworzymy cyfrowe innowacje</description>
	<lastBuildDate>Wed, 06 Nov 2024 07:28:57 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://inero-software.com/wp-content/uploads/2018/11/inero-logo-favicon.png</url>
	<title>Tutorial - Inero Software - Rozwiązania IT i Konsulting</title>
	<link>https://inero-software.com/pl/category/blog_pl/tutorial/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">153509928</site>	<item>
		<title>Przewodnik krok po kroku- Uwierzytelnianie wieloskładnikowe (MFA) w Keycloak</title>
		<link>https://inero-software.com/pl/przewodnik-krok-po-kroku-uwierzytelnianie-wieloskladnikowe-mfa-w-keycloak/</link>
		
		<dc:creator><![CDATA[Marceli Formela]]></dc:creator>
		<pubDate>Wed, 05 Jun 2024 13:03:04 +0000</pubDate>
				<category><![CDATA[Blog_pl]]></category>
		<category><![CDATA[Firma]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[keycloak]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[OTP]]></category>
		<category><![CDATA[relam]]></category>
		<category><![CDATA[sms]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=5812</guid>

					<description><![CDATA[<p>&#160;</p>
<p>Artykuł <a href="https://inero-software.com/pl/przewodnik-krok-po-kroku-uwierzytelnianie-wieloskladnikowe-mfa-w-keycloak/">Przewodnik krok po kroku- Uwierzytelnianie wieloskładnikowe (MFA) w Keycloak</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>&nbsp;</p>
<div class="row"><div class="col-sm-1"></div><div class="col-sm-10">
<p>Wzrost liczby ataków i zagrożeń cyfrowych sprawił, że zabezpieczanie danych stało się koniecznością. Oszuści wciąż udoskonalają swoje narzędzia, dlatego  tradycyjna metoda polegająca na hasłach okazuje się niewystarczająca do ochrony wrażliwych informacji. Ta eskalacja cyberzagrożeń podkreśliła konieczność wprowadzenia bardziej zaawansowanych środków bezpieczeństwa, co doprowadziło upowszechnienia uwierzytelniania wieloskładnikowego (MFA). W tym wpisie omówimy pojawiające się zagrożenia online i to jak MFA może stać się skutecznym mechanizmem obronnym dla naszych aplikacji.</p>
<p>&nbsp;</p>
<h3>Czym jest MFA?</h3>
<p>Uwierzytelnianie wieloskładnikowe (MFA) zwiększa bezpieczeństwo Twoich aplikacji, wymagając od użytkowników podania wielu form identyfikacji przed przyznaniem dostępu. Oczywiście, narzędzia takie jak Keycloak wspierają MFA i pozwalają administratorom na łatwe skonfigurowanie tego rozwiązania. Ten przewodnik opisuje krok po kroku procedurę włączania MFA w Keycloak, zapewniając, że procesy uwierzytelniania użytkowników staną się bezpieczniejsze,</p>
<p>MFA zostało zaprojektowane, aby chronić użytkowników przed zagrożeniami związanymi z uwierzytelnianiem jednoskładnikowym, gdzie użytkownik musi podać tylko jedną formę uwierzytelnienia, zazwyczaj hasło. MFA dodaje warstwy bezpieczeństwa, wymagając od użytkowników przedstawienia wielu dowodów (czynników) potwierdzających ich tożsamość.</p>
<p>Czynniki uwierzytelniania użytkownika w MFA są zazwyczaj klasyfikowane w trzy typy:</p>
<p style="padding-left: 40px;"><strong>1. Czynniki wiedzy (coś, co wiesz)</strong><br />
&#8211; Hasła<br />
&#8211; PIN-y<br />
&#8211; Pytania bezpieczeństwa<br />
<strong>2. Czynniki posiadania (coś, co masz)</strong><br />
&#8211; Jednorazowe hasło (OTP) generowane przez aplikację uwierzytelniającą<br />
&#8211; Kody SMS<br />
&#8211; Kody e-mail<br />
&#8211; Tokeny sprzętowe<br />
<strong>3. Czynniki inherentne (coś, czym jesteś)</strong><br />
&#8211; Weryfikacja biometryczna (rozpoznawanie twarzy, odcisk palca itp.)</p>
<p><a href="https://inero-software.com/pl/kontakt/"><img fetchpriority="high" decoding="async" data-attachment-id="5827" data-permalink="https://inero-software.com/pl/przewodnik-krok-po-kroku-uwierzytelnianie-wieloskladnikowe-mfa-w-keycloak/1-5/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/06/1-2.png" data-orig-size="1200,100" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="1" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/06/1-2-300x25.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/06/1-2-1030x86.png" tabindex="0" role="button" class="alignleft wp-image-5827 size-full" src="https://inero-software.com/wp-content/uploads/2024/06/1-2.png" alt="" width="1200" height="100" srcset="https://inero-software.com/wp-content/uploads/2024/06/1-2.png 1200w, https://inero-software.com/wp-content/uploads/2024/06/1-2-300x25.png 300w, https://inero-software.com/wp-content/uploads/2024/06/1-2-1030x86.png 1030w, https://inero-software.com/wp-content/uploads/2024/06/1-2-768x64.png 768w" sizes="(max-width: 1200px) 100vw, 1200px" /></a></p>
<p>Pierwszym krokiem jest zawsze początkowe uwierzytelnienie, kiedy użytkownik wprowadza swoją nazwę i hasło (tak zwany czynnik wiedzy). Po początkowym uwierzytelnieniu proszony jest o podanie drugiej formy uwierzytelnienia, która może być jednorazowym hasłem (OTP) wysłanym na telefon, skanem biometrycznym lub inną formą czynnika posiadania/inherentnego. Jeśli oba czynniki zostaną pomyślnie zweryfikowane, użytkownik uzyskuje dostęp do aplikacji. Teraz przyjrzyjmy się kilku przykładowym typom uwierzytelniania oraz ich zaletom i wadom.</p>
<h4 style="padding-left: 40px;"><strong>OTP wysyłane na e-mail</strong></h4>
<p style="padding-left: 80px;">W tej metodzie tymczasowy kod jest wysyłany na zarejestrowany adres e-mail użytkownika, który musi go wprowadzić, aby zakończyć proces logowania. Użytkownicy otrzymują OTP bezpośrednio na e-mail, co nie wymaga instalacji ani konfiguracji dodatkowych aplikacji. Należy jednak pamiętać, że konta e-mail mogą zostać skompromitowane, a przechwycone e-maile mogą stanowić znaczące zagrożenie dla bezpieczeństwa.</p>
<h4 style="padding-left: 40px;">OTP wysyłane SMS-em</h4>
<p style="padding-left: 80px;">Otrzymywanie OTP za pomocą SMS-a jest proste i znane większości użytkowników oraz także nie wymaga instalacji dodatkowych aplikacji. Powinno działać na każdym telefonie komórkowym, co czyni go dostępnym dla szerszej grupy użytkowników. Jednakże, i one mogą być podatne na przechwycenie i ataki polegające na zamianie kart SIM, co sprawia, że są mniej bezpieczne w porównaniu do innych metod. Dostarczanie SMS-ów może być również opóźnione lub nawet zawieść z powodu problemów z siecią. Przyjrzymy się bliżej jego zaletom i wadom w kolejnym poście, który obejmuje rozwój niestandardowych narzędzi uwierzytelniających.</p>
<h4 style="padding-left: 40px;">Powiadomienia push</h4>
<p style="padding-left: 80px;">Powiadomienia push polegają na wysyłaniu w czasie rzeczywistym alertu na zarejestrowane urządzenie mobilne użytkownika, prosząc go o zatwierdzenie lub odrzucenie próby uwierzytelnienia. Użytkownicy są natychmiast powiadamiani o wszelkich próbach logowania, co pozwala im szybko reagować na wszelkie nieautoryzowane próby dostępu. Nie muszą także wprowadzać jednorazowego hasła (OTP), co upraszcza proces uwierzytelniania. Ta metoda oczywiście wymaga aktywnego połączenia internetowego. Należy jednak pamiętać, że zainfekowane urządzenia mogą potencjalnie zagrozić bezpieczeństwu tej funkcji, a użytkownicy muszą być edukowani w zakresie rozpoznawania autentycznych powiadomień push, aby uniknąć przypadkowego zatwierdzenia prób ataku.</p>
<h4 style="padding-left: 40px;"><strong>OTP za pomocą aplikacji uwierzytelniających</strong></h4>
<p style="padding-left: 80px;">OTP generowane przez aplikacje uwierzytelniające, takie jak Google Authenticator, są bardzo bezpieczne, ponieważ są oparte na czasie i trudne do przewidzenia. Mogą generować OTP bez połączenia z internetem, co czyni je niezawodnymi nawet wtedy, gdy użytkownicy są offline. W tym przypadku użytkownicy muszą mieć dostęp do swojego urządzenia mobilnego, aby wygenerować OTP, a początkowa konfiguracja często wymaga zeskanowania kodu QR i skonfigurowania aplikacji uwierzytelniającej, co może być trudne dla użytkowników nietechnicznych.</p>
<p><a href="https://inero-software.com/pl/najlepsze-praktyki-w-keycloak-zadbaj-o-bezpieczenstwo-w-5-krokach/"><img decoding="async" data-attachment-id="5828" data-permalink="https://inero-software.com/pl/przewodnik-krok-po-kroku-uwierzytelnianie-wieloskladnikowe-mfa-w-keycloak/3-4/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/06/3-2.png" data-orig-size="1200,100" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="3" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/06/3-2-300x25.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/06/3-2-1030x86.png" tabindex="0" role="button" class="alignnone wp-image-5828 size-full" src="https://inero-software.com/wp-content/uploads/2024/06/3-2.png" alt="" width="1200" height="100" srcset="https://inero-software.com/wp-content/uploads/2024/06/3-2.png 1200w, https://inero-software.com/wp-content/uploads/2024/06/3-2-300x25.png 300w, https://inero-software.com/wp-content/uploads/2024/06/3-2-1030x86.png 1030w, https://inero-software.com/wp-content/uploads/2024/06/3-2-768x64.png 768w" sizes="(max-width: 1200px) 100vw, 1200px" /></a></p>
<h3>Jak skonfigurować OTP (przez mobilną aplikację uwierzytelniającą) w Keycloak</h3>
<p>Teraz możemy przejść do konsoli Keycloak i spróbować skonfigurować podstawowe OTP w naszym realm. <a href="https://inero-software.com/pl/zabezpieczanie-punktow-koncowych-java-spring-za-pomoca-keycloak/">Przed próbą włączenia MFA w Keycloak upewnij się, że masz działającą instancję Keycloak, dostęp administracyjny do serwera oraz podstawową znajomość koncepcji realm, klienta i zarządzania użytkownikami z poprzednich postów.</a></p>
<p><strong>Krok 1: Polityka OTP</strong><br />
Z menu bocznego wybierz realm, w którym chcesz włączyć MFA. W ustawieniach przejdź do sekcji Uwierzytelnianie i wybierz kartę Polityka OTP. Skonfiguruj ustawienia zgodnie z wymaganiami bezpieczeństwa. Możesz wybrać wartości domyślne, które są dostarczane przez serwer.</p>
<p><img decoding="async" data-attachment-id="5815" data-permalink="https://inero-software.com/pl/przewodnik-krok-po-kroku-uwierzytelnianie-wieloskladnikowe-mfa-w-keycloak/2-5/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/06/2-1.png" data-orig-size="1920,1080" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="2" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/06/2-1-300x169.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/06/2-1-1030x579.png" tabindex="0" role="button" class="wp-image-5815 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/06/2-1-300x169.png" alt="" width="705" height="397" srcset="https://inero-software.com/wp-content/uploads/2024/06/2-1-300x169.png 300w, https://inero-software.com/wp-content/uploads/2024/06/2-1-1030x579.png 1030w, https://inero-software.com/wp-content/uploads/2024/06/2-1-768x432.png 768w, https://inero-software.com/wp-content/uploads/2024/06/2-1-1536x864.png 1536w, https://inero-software.com/wp-content/uploads/2024/06/2-1-533x300.png 533w, https://inero-software.com/wp-content/uploads/2024/06/2-1.png 1920w" sizes="(max-width: 705px) 100vw, 705px" /></p>
<p><strong>Krok 2: Wymagane działania</strong><br />
W ustawieniach uwierzytelniania przejdź do karty Wymagane działania. Teraz możesz aktywować OTP jako domyślne działanie dla każdego nowego użytkownika.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="5814" data-permalink="https://inero-software.com/pl/przewodnik-krok-po-kroku-uwierzytelnianie-wieloskladnikowe-mfa-w-keycloak/1-4/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/06/1-1.png" data-orig-size="1920,1080" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="1" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/06/1-1-300x169.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/06/1-1-1030x579.png" tabindex="0" role="button" class="wp-image-5814 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/06/1-1-300x169.png" alt="" width="701" height="395" srcset="https://inero-software.com/wp-content/uploads/2024/06/1-1-300x169.png 300w, https://inero-software.com/wp-content/uploads/2024/06/1-1-1030x579.png 1030w, https://inero-software.com/wp-content/uploads/2024/06/1-1-768x432.png 768w, https://inero-software.com/wp-content/uploads/2024/06/1-1-1536x864.png 1536w, https://inero-software.com/wp-content/uploads/2024/06/1-1-533x300.png 533w, https://inero-software.com/wp-content/uploads/2024/06/1-1.png 1920w" sizes="(max-width: 701px) 100vw, 701px" /></p>
<p><img loading="lazy" decoding="async" data-attachment-id="5816" data-permalink="https://inero-software.com/pl/przewodnik-krok-po-kroku-uwierzytelnianie-wieloskladnikowe-mfa-w-keycloak/3-3/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/06/3-1.png" data-orig-size="1920,1080" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="3" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/06/3-1-300x169.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/06/3-1-1030x579.png" tabindex="0" role="button" class="wp-image-5816 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/06/3-1-300x169.png" alt="" width="702" height="395" srcset="https://inero-software.com/wp-content/uploads/2024/06/3-1-300x169.png 300w, https://inero-software.com/wp-content/uploads/2024/06/3-1-1030x579.png 1030w, https://inero-software.com/wp-content/uploads/2024/06/3-1-768x432.png 768w, https://inero-software.com/wp-content/uploads/2024/06/3-1-1536x864.png 1536w, https://inero-software.com/wp-content/uploads/2024/06/3-1-533x300.png 533w, https://inero-software.com/wp-content/uploads/2024/06/3-1.png 1920w" sizes="(max-width: 702px) 100vw, 702px" /></p>
<p>&nbsp;</p>
<p>Skonfigurowaliśmy już MFA i każdy nowo zarejestrowany użytkownik będzie musiał z niego korzystać. Oczywiście, tę konfigurację można zmodyfikować w ustawieniach konta aplikacji, aby użytkownicy korzystali z MFA tylko wtedy, gdy specjalnie o to poproszą.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="5817" data-permalink="https://inero-software.com/pl/przewodnik-krok-po-kroku-uwierzytelnianie-wieloskladnikowe-mfa-w-keycloak/4-3/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/06/4-1.png" data-orig-size="1920,1080" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="4" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/06/4-1-300x169.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/06/4-1-1030x579.png" tabindex="0" role="button" class="wp-image-5817 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/06/4-1-300x169.png" alt="" width="705" height="397" srcset="https://inero-software.com/wp-content/uploads/2024/06/4-1-300x169.png 300w, https://inero-software.com/wp-content/uploads/2024/06/4-1-1030x579.png 1030w, https://inero-software.com/wp-content/uploads/2024/06/4-1-768x432.png 768w, https://inero-software.com/wp-content/uploads/2024/06/4-1-1536x864.png 1536w, https://inero-software.com/wp-content/uploads/2024/06/4-1-533x300.png 533w, https://inero-software.com/wp-content/uploads/2024/06/4-1.png 1920w" sizes="(max-width: 705px) 100vw, 705px" /></p>
<p>Jak widzimy, MFA to potężne narzędzie do ochrony wrażliwych informacji i zwiększania bezpieczeństwa aplikacji internetowych. Wymagając wielu form weryfikacji, znacznie utrudnia dostęp nieautoryzowanym użytkownikom do kont i systemów, zmniejszając ryzyko związane z uwierzytelnianiem opartym wyłącznie na hasłach. Wdrożenie tego mechanizmu z pewnością pomaga organizacjom w spełnianiu wymogów regulacyjnych i ochronie przed ciągle ewoluującymi zagrożeniami w sieci.</p>
<p>W następnym artykule przyjrzymy się bliżej niestandardowemu uwierzytelnianiu za pomocą SMS dla Keycloak, omawiając jego zalety i wady.</p>
<p></p></div><div class="col-sm-1"></div></div>
<p>Artykuł <a href="https://inero-software.com/pl/przewodnik-krok-po-kroku-uwierzytelnianie-wieloskladnikowe-mfa-w-keycloak/">Przewodnik krok po kroku- Uwierzytelnianie wieloskładnikowe (MFA) w Keycloak</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5812</post-id>	</item>
		<item>
		<title>Budowa systemu rozpoznawania komend głosowych w języku polskim</title>
		<link>https://inero-software.com/pl/budowa-systemu-rozpoznawania-komend-glosowych/</link>
		
		<dc:creator><![CDATA[Andrzej Chybicki]]></dc:creator>
		<pubDate>Mon, 04 Apr 2022 10:08:58 +0000</pubDate>
				<category><![CDATA[Blog_pl]]></category>
		<category><![CDATA[Firma]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[deepspeech]]></category>
		<category><![CDATA[model językowy]]></category>
		<category><![CDATA[modele ASR]]></category>
		<category><![CDATA[rozpoznawanie komend głosowych]]></category>
		<category><![CDATA[sieci neuronowe]]></category>
		<category><![CDATA[system rozpoznawania głosu]]></category>
		<category><![CDATA[zbiory danych]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=4748</guid>

					<description><![CDATA[<p>System rozpoznawania głosu pełni rolę pomocnika, który wyszuka dla nas odpowiednie informacje, ułatwi zakupy w Internecie czy umożliwi obsługę różnych urządzeń bez wykorzystywania zewnętrznych przycisków czy regulacji.</p>
<p>Artykuł <a href="https://inero-software.com/pl/budowa-systemu-rozpoznawania-komend-glosowych/">Budowa systemu rozpoznawania komend głosowych w języku polskim</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>&nbsp;</p>
<div class="row">
<p><div class="col-sm-1"></div></p>
<p><div class="col-sm-10">
<p><img loading="lazy" decoding="async" class=" wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="" width="75" height="75" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 75px) 100vw, 75px" /></p>
<p>&nbsp;</p>
<h2><span style="color: #800080;">Budowa systemu rozpoznawania komend głosowych w języku polskim</span></h2>
<p>&nbsp;</p>
<p><span data-contrast="auto"><span class="TextRun SCXW189727610 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189727610 BCX0"><span class="TextRun SCXW21457896 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW21457896 BCX0"><img loading="lazy" decoding="async" class=" wp-image-2768 alignleft" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" alt="" width="71" height="71" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w" sizes="(max-width: 71px) 100vw, 71px" /></span></span></span></span></span>System rozpoznawania komend głosowych został stworzony po to, aby usprawnić życie człowieka. Pełni on rolę pomocnika, który wyszuka dla nas odpowiednie informacje, ułatwi zakupy w Internecie czy umożliwi obsługę różnych urządzeń bez wykorzystywania zewnętrznych przycisków czy regulacji. Jednak stworzenie takiego systemu od podstaw może być trudnym wyzwaniem. W szczególności, jeśli chcemy zbudować go w języku polskim.</p>
<p>Istnieją ogólne modele sieci neuronowych, które dedykowane są rozpoznawaniu języka mówionego, czyli transkrypcji nagrania audio do tekstu. Wszystko jednak uwarunkowane jest od tego, ile danych posiadamy. Obecnie istnieje wiele zbiorów nagrań z języka angielskiego, które są odpowiednio przygotowane. Same dane jednak nie wystarczą. Muszą być do nich dołączone transkrypcje. Niestety w języku polskim nie mamy dużej ilości próbek głosowych razem z transkrypcjami. Na dzień dzisiejszy nie jesteśmy więc w stanie tak dobrze wyuczyć modeli, jak to jest robione w języku angielskim.</p>
<p>Jak na razie nie możemy wyuczyć asystentów wykorzystując modele open source’owe z zadowalającą skutecznością, jednak możemy sprawdzić co jesteśmy w stanie zbudować z ogólnie dostępnych danych. Celem naszej pracy jest stworzenie systemu rozpoznawania mowy, który działa w ograniczonym zbiorze komend.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class=" wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="" width="75" height="75" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 75px) 100vw, 75px" /></p>
<p>&nbsp;</p>
<h2><span style="color: #800080;">Główne źródła zbierania danych dla systemu rozpoznawania komend głosowych</span></h2>
<p>&nbsp;</p>
<p><span data-contrast="auto"><span class="TextRun SCXW189727610 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189727610 BCX0"><span class="TextRun SCXW21457896 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW21457896 BCX0"><img loading="lazy" decoding="async" class=" wp-image-2768 alignleft" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" alt="" width="71" height="71" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w" sizes="(max-width: 71px) 100vw, 71px" /></span></span></span></span></span>W ostatnich miesiącach pojawiły się zbiory danych: <strong><a href="https://commonvoice.mozilla.org/pl">Common Voice</a> i <a href="https://zasobynauki.pl/zasoby/korpus-nagran-probek-mowy-do-celow-budowy-modeli-akustycznych-dla-automatycznego-rozpoznawania-mowy,56411/">Zasoby Nauki</a></strong>, które są odpowiednio przygotowane pod modele ASR (Automatic Speech Recognition). Oznacza to, że nagrania dźwiękowe zawierają również transkrypcje. Są to tak naprawdę dwa największe zbiory danych, które można użyć. Do zbudowania własnego systemu wykorzystaliśmy więc je i złączyliśmy w jedno.</p>
<p><a href="https://commonvoice.mozilla.org/pl">Common Voice</a> jest ciekawym zbiorem danych. Jeżeli chcemy aby ich ilość była jeszcze większa, możemy kontrybuować w tym działaniu. Każdy z nas może wejść na stronę i nagrać swój głos, który zostanie zapisany, a następnie sprawdzony przez innych użytkowników. W ten sposób będziemy mogli przyczynić się do powiększenia ilości danych z języka polskiego, dzięki czemu budowanie systemów rozpoznawania komend głosowych będzie łatwiejsze.</p>
<p>W przyszłości istnieje możliwość, że YouTube udostępni do wykorzystania swoje nagrania audio razem z automatycznie generowanymi transkrypcjami. Jest to jednak rozwiązanie, które (być może) powstanie dopiero później. Dodatkowym źródłem danych mogą również być audiobooki, które zawierają transkrypcję książek i nagrania audio. W takim przypadku musimy jednak wykonać pracę przygotowania danych polegającą na pofragmentowaniu danych na krótsze nagrania. Dodatkowo zmienna intonacja lektora może wpływać na dokładność wyuczonych przez nas modeli.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class=" wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="" width="75" height="75" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 75px) 100vw, 75px" /></p>
<p>&nbsp;</p>
<h2><span style="color: #800080;">Przygotowanie i ujednolicenie danych</span></h2>
<p>&nbsp;</p>
<p><span data-contrast="auto"><span class="TextRun SCXW189727610 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189727610 BCX0"><span class="TextRun SCXW21457896 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW21457896 BCX0"><img loading="lazy" decoding="async" class=" wp-image-2768 alignleft" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" alt="" width="87" height="87" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w" sizes="(max-width: 87px) 100vw, 87px" /></span></span></span></span></span>Przede wszystkim musimy zapewnić minimalną i maksymalną długość nagrania. Muszą one znajdować się w określonych ramach czasowych. Zbyt długie nagrania mogą być problemem podczas uczenia modelu, natomiast krótkie nagrania mogą nie nieść ze sobą żadnej istotnej informacji. Musimy także zapewnić jednakową częstotliwość próbkowania sygnału. Jest to bardzo ważna kwestia przy uczeniu modeli opartych na dźwięk.</p>
<p>Fala dźwiękowa czystego tonu, rozchodząca się w przestrzeni, ma charakter sinusoidalny. Zmiana częstotliwości takiego dźwięku oznacza zmianę okresu sinusoidy, więc zmieniają się odległości między jej grzbietami. Jednak dźwięk w komputerze również musi być w jakiś sposób zaprezentowany. Sinusoida jest przebiegiem ciągłym, natomiast komputer zapisuje pojedyncze wartości. Częstotliwość próbkowania mówi nam o tym, ile razy na sekundę została zapisana wartość rejestrowanej fali dźwiękowej. Bardzo ważne jest to, żeby każdy dźwięk, który wchodzi do naszego modelu miał taką samą częstotliwość próbkowania.</p>
<p>Poprzez nieprawidłowe próbkowanie rekonstruowany dźwięk może być zniekształcony lub całkowicie niesłyszalny. Trzeba więc pamiętać o odpowiednim dobraniu częstotliwości próbkowania, aby zminimalizować rozmiar zapisywanych danych przy jednoczesnym braku utraty informacji. Zbyt rzadkie próbkowanie może spowodować pojawienie się zjawiska aliasingu, czyli nakładania się wyższych częstotliwości na niższe.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="4749" data-permalink="https://inero-software.com/pl/budowa-systemu-rozpoznawania-komend-glosowych/picture1/" data-orig-file="https://inero-software.com/wp-content/uploads/2022/03/Picture1.png" data-orig-size="605,454" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Picture1" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2022/03/Picture1-300x225.png" data-large-file="https://inero-software.com/wp-content/uploads/2022/03/Picture1.png" tabindex="0" role="button" class="aligncenter wp-image-4749 size-full" src="https://inero-software.com/wp-content/uploads/2022/03/Picture1.png" alt="częstotliwość próbkowania dźwięku" width="605" height="454" srcset="https://inero-software.com/wp-content/uploads/2022/03/Picture1.png 605w, https://inero-software.com/wp-content/uploads/2022/03/Picture1-300x225.png 300w, https://inero-software.com/wp-content/uploads/2022/03/Picture1-400x300.png 400w" sizes="(max-width: 605px) 100vw, 605px" /></p>
<p style="text-align: center;"><em>Źródło: <a href="https://pbc.gda.pl/dlibra/publication/109835/edition/98484/content">Reprezentacje danych dźwiękowych w kontekście metod uczenia maszynowego</a>, s. 134, Tymoteusz Cejrowski</em></p>
<p>Zapobieganie takiemu zjawisku polega na próbkowaniu sygnału z częstotliwością co najmniej dwa razy większą od najwyższej częstotliwości występującej w sygnale. Częstotliwość ta nazywana jest częstotliwością Nyqiusta. Dla przykładu, nagrania na płytach CD są zapisywane z częstotliwością próbkowania 44100 Hz. Natomiast maksymalna poprawnie zrekonstruowana częstotliwość będzie wynosiła 22050 Hz, co odpowiada górnemu zakresowi dźwięków słyszalnych przez człowieka.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class=" wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="" width="75" height="75" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 75px) 100vw, 75px" /></p>
<p>&nbsp;</p>
<h2><span style="color: #800080;">Opis i uczenie modelu deepspeech w systemie rozpoznawania komend głosowych</span></h2>
<p>&nbsp;</p>
<p><span data-contrast="auto"><span class="TextRun SCXW189727610 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189727610 BCX0"><span class="TextRun SCXW21457896 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW21457896 BCX0"><img loading="lazy" decoding="async" class=" wp-image-2768 alignleft" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" alt="" width="48" height="48" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w" sizes="(max-width: 48px) 100vw, 48px" /></span></span></span></span></span>Sieci neuronowe w pewien sposób przypominają układ nerwowy. Podstawowymi jednostkami w takich sieciach są neurony, które rozmieszczone są w warstwach. Jest to uproszczony model procesu przetwarzania informacji przez ludzki umysł.</p>
<p>Zazwyczaj sieć neuronowa składa się z trzech części. Pierwsza to warstwa wejściowa, która posiada jednostki reprezentujące zmienne wejściowe. Następna część to warstwy ukryte, które zawierają jednostki nieobserwowane i są ukrytym stanem sieci neuronowej. To właśnie od tych warstw w dużej mierze zależy efektywność modelu. Natomiast ostatnią częścią jest oczywiście warstwa wyjściowa, która posiada jednostki reprezentujące zmienne przewidywane. Wszystkie jednostki złączone są konkretnymi połączeniami o różnej wadze. Dane wejściowe znajdują się na pierwszej warstwie, przechodzą one przez kolejne, a ostatecznie z warstwy wyjściowej otrzymujemy wynik.</p>
<p>Sieć neuronowa uczy się przez porównywanie rekordów. Generuje ona predykcje dla konkretnych danych (nagrań audio) i wprowadza korekty wag, jeśli generują one niepoprawną predykcję (złą transkrypcję). Cały proces powtarzany jest wiele razy do uzyskania satysfakcjonującej dokładności. Wszystkie wagi na początku mają charakter losowy, a odpowiedzi wychodzące nie mają dużo sensu, z czasem natomiast sieć poprawia swoje predykcje. Dzieje się tak, ponieważ sieć dopasowuje się do danych w procesie uczenia wykorzystując algorytm wstecznej propagacji błędu.</p>
<p>Jednym z najprostszych modeli Sieci Neuronowych jest <strong>Perceptron wielowarstwowy</strong>. Składa się on z wielu warstw neuronowych. Neurony poprzedniej warstwy tworzą konkretny wektor, który jest podawany na wejście neuronów do warstwy następnej. Pojedynczy neuron w warstwie następnej ma liczbę wejść równej liczbie neuronów z warstwy poprzedniej +1. Jednak w ramach jednej warstwy, neurony między sobą nie mają żadnych połączeń. Taki typ modelu nazywany jest również modelem „Feed-Forward” i jest jedną z podstawowych architektur sieci neuronowych.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="4750" data-permalink="https://inero-software.com/pl/budowa-systemu-rozpoznawania-komend-glosowych/picture2/" data-orig-file="https://inero-software.com/wp-content/uploads/2022/03/Picture2.png" data-orig-size="361,461" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Picture2" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2022/03/Picture2-235x300.png" data-large-file="https://inero-software.com/wp-content/uploads/2022/03/Picture2.png" tabindex="0" role="button" class="wp-image-4750 size-full aligncenter" src="https://inero-software.com/wp-content/uploads/2022/03/Picture2.png" alt="model sieci feed-forward" width="361" height="461" srcset="https://inero-software.com/wp-content/uploads/2022/03/Picture2.png 361w, https://inero-software.com/wp-content/uploads/2022/03/Picture2-235x300.png 235w" sizes="(max-width: 361px) 100vw, 361px" /></p>
<p style="text-align: center;"><em>Rysunek przedstawiający model „Feed-Forward”</em></p>
<p><strong>Sieci rekurencyjne</strong> różnią się od sieci typu „Feed-Forward” w wielu aspektach. Jedną z głównych różnic jest sposób propagacji danych wejściowych na wyjście sieci. W najprostszym modelu wyjście sieci jest niczym innym kombinacją wag i wejścia modelu (pojedynczego rekordu). W przypadku sieci rekurencyjnych wyjście modelu zależy również od poprzedniego wyjścia. Wynik działania modelu dla rekordu X jest brany pod uwagę przy wyliczaniu wyjścia dla kolejnego rekordu Y.</p>
<p><strong>Konwolucyjna sieć neuronowa</strong> jest typem sieci najczęściej stosowanej do analizy obrazów wizualnych z uwagi na swój charakter procesowania wejścia. Podobnie jak człowiek, sieć ta nie analizuje obrazu piksel po pikselu ale wyłapuje wzorce obecne w danych wejściowych dzięki zastosowaniu tzw. Kerneli czyli filtrów. Każda warstwa w sieci neuronowej uczy się cech obrazu takich jak kontury czy nasycenie światłem. Złożenie tych informacji poprawia efektywność modelu.</p>
<p>Poza neuronowymi modelami rozpoznawania mowy, warto pochylić się nad open source’owymi systemami, które umożliwiają zbudowanie systemu rozpoznawania komend głosowych. Jednym z nich jest <a href="http://kaldi-asr.org"><strong>Kaldi</strong></a>, który został napisany w C++. Powstał on w 2009 roku, a jego głównymi cechami jest to, że system ten jest rozszerzalny i cały czas rozwijany. Udostępnia on m.in. narzędzia do pre-procesowania nagrań audio czy modeli opartych o Ukryte Modele Markowa (HMM). Sama społeczność udostępnia wiele innych modułów, które można wykorzystać do własnych zadań. Kaldi, poza modelami statystycznymi, obsługuje także głębokie sieci neuronowe. Pomimo tego, że jest napisany głównie w C++, to posiada on skrypty w jezyku Bash czy Python.</p>
<p>W naszej pracy skupiliśmy się jednak na konkretnym modelu ASR: <a href="https://github.com/SeanNaren/deepspeech.pytorch"><strong>deepspeech</strong></a><strong> 2</strong>. Jest to model, który wykorzystuje głębokie uczenie (ang. Deep Learning), składa się on z 3 warstw konwolucyjnych, 8 rekurencyjnych i jednej Fully-Connected. Deepspeech 2 można z powodzeniem wyuczyć na dowolnym języku, trzeba jednak pamiętać, że takie uczenie wymaga wydajnego systemu komputerowego/serwerowego wyposażonego w odpowiednią ilość kart graficznych lub akceleratorów obliczeń.</p>
<p>W przypadku popularnych języków takich jak angielski czy mandaryński można znaleźć przetrenowane modele gotowe do użycia. W naszym zadaniu wybraliśmy deepspeech 2 z implementacją w <a href="https://github.com/SeanNaren/deepspeech.pytorch">PyTorchu</a>, ponieważ jest on lekki, ma stosunkowo mało parametrów (wag do wyuczenia) i wybrana przez nas implementacja jest aktywnie utrzymywana. W tym modelu oprócz przygotowania odpowiednich częstotliwości próbkowania o których pisaliśmy wyżej, musieliśmy również przygotować odpowiednio dane pod sam model deepspeech. Wiązało się to z zapewnieniem odpowiedniej struktury katalogów.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class=" wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="" width="75" height="75" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 75px) 100vw, 75px" /></p>
<p>&nbsp;</p>
<h2><span style="color: #800080;">Wnioskowanie z użyciem modeli ASR i dodatkowego modelu językowego</span></h2>
<p>&nbsp;</p>
<p><span data-contrast="auto"><span class="TextRun SCXW189727610 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189727610 BCX0"><span class="TextRun SCXW21457896 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW21457896 BCX0"><img loading="lazy" decoding="async" class=" wp-image-2768 alignleft" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" alt="" width="101" height="101" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w" sizes="(max-width: 101px) 100vw, 101px" /></span></span></span></span></span>Wykorzystując deepspeech jesteśmy w stanie zastosować dodatkowy model językowy (model n-gramowy). Opiera się on na statystykach i pomaga w przewidywaniu kolejnego elementu sekwencji w wynikowej transkrypcji. Trzeba pamiętać, że zastosowanie takiego modelu wymaga zgromadzenia dużego zasobu danych statystycznych. N-gramy pomagają maszynom w zrozumieniu słowa w konkretnym kontekście. Dzięki temu mogą one lepiej zrozumieć jego przeznaczenie.</p>
<p>Jeśli chcemy utworzyć taki model, zaczynamy od zliczania wystąpień sekwencji o ustalonej długości <em>n</em> w istniejących już zasobach językowych. Analizuje się więc całe teksty i zlicza się pojedyncze wystąpienia (1-gram), dwójki (2-gramy) i trójki (3-gramy). Możemy również uzyskać model 4-gramowy, jednak tutaj potrzebne są już ogromne zbiory danych, przez co dla języka polskiego jest to niezwykle trudne do zrealizowania. W kolejnym kroku zamienia się liczbę wystąpień na prawdopodobieństwo poprzez normalizację. W ten sposób zyskujemy predykcję kolejnego elementu na podstawie dotychczasowych sekwencji. Warto zaznaczyć, że im więcej przeanalizowanego tekstu, tym wyższa jakość modelu. Dane te są głównie wykorzystywane w aplikacjach przetwarzania języka naturalnego (NLP). Model n-gramowy dla języka polskiego można znaleźć <a href="https://zasobynauki.pl/zasoby/model-jezykowy-dla-jezyka-polskiego,55644/">tutaj</a>.</p>
<p>Użycie modelu n-gramowego na etapie wnioskowania pozwala na skorygowanie wyjścia sieci neuronowej (transkrypcji modelu deepspeech 2) zgodnie z regułami zawartymi w modelu n-gramowym.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class=" wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="" width="75" height="75" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 75px) 100vw, 75px" /></p>
<p>&nbsp;</p>
<h2><span style="color: #800080;">Działanie w ograniczonym zbiorze komend</span></h2>
<p>&nbsp;</p>
<p><span data-contrast="auto"><span class="TextRun SCXW189727610 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189727610 BCX0"><span class="TextRun SCXW21457896 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW21457896 BCX0"><img loading="lazy" decoding="async" class=" wp-image-2768 alignleft" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" alt="" width="101" height="101" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w" sizes="(max-width: 101px) 100vw, 101px" /></span></span></span></span></span>Niestety budowane modele nie mogą być wystarczająco dokładne ze względu na małą ilość danych w języku polskim. W naszym przypadku możemy jednak działać w ograniczonym zbiorze komend. Oznacza to, że rozpoznawaniu podlega konkretna ilość komend głosowych. Nasze zadanie polegało na tym, żeby dopasować odpowiednią komendę ze zbioru z tym co dostarczył nam model. Ważne jest tutaj określenie najwyższego podobieństwa pomiędzy komendą, a tym co zwrócił nam model.</p>
<p>Do tego zadania wykorzystaliśmy miarę zwaną <strong>odległością Levenshteina</strong>, która wskazuje na podobieństwo pomiędzy transkrypcją, a daną komendą. Polega ona na zliczaniu pozycji lub liter, które się nie zgadzają. Przykładowo, odległość Levenshteina pomiędzy wyrazami:</p>
<ul>
<li>drzwi</li>
<li>drzwi</li>
</ul>
<p>Jest zerowa. Są to wyrazy identyczne, więc nie potrzeba tutaj żadnych działań.</p>
<p>Natomiast odległość Levenshteina pomiędzy wyrazami:</p>
<ul>
<li>kołacz</li>
<li>połać</li>
</ul>
<p>wynosi 3, ponieważ potrzeba co najmniej 3 działań: zamiany <strong>k</strong> na <strong>p</strong>, zamiany <strong>c</strong> na <strong>ć</strong> i usunięcia litery <strong>z</strong>.</p>
<p>Tam, gdzie jest najmniej podstawień, posiadamy największe prawdopodobieństwo, że komendy są takie same.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class=" wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="" width="75" height="75" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 75px) 100vw, 75px" /></p>
<p>&nbsp;</p>
<h2><span style="color: #800080;">Podsumowanie</span></h2>
<p>&nbsp;</p>
<p><span data-contrast="auto"><span class="TextRun SCXW189727610 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189727610 BCX0"><span class="TextRun SCXW21457896 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW21457896 BCX0"><img loading="lazy" decoding="async" class=" wp-image-2768 alignleft" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" alt="" width="101" height="101" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w" sizes="(max-width: 101px) 100vw, 101px" /></span></span></span></span></span>Celem systemów rozpoznawania głosu jest zapewnienie łatwości w komunikacji między urządzeniem a człowiekiem. Podejście wykorzystujące narzędzia Open-Source w zadaniu uczenia modeli ASR na razie ogranicza się do rozpoznawania ograniczonego zbioru komend. Budowanie takiego sytemu w oparciu o dane w języku polskim jest trudnym zadaniem, ze względu na małą ilość danych dźwiękowych połączonych z transkrypcjami. Zastosowanie miary podobieństwa pomiędzy transkrypcją a zbiorem komend pozwala na zbudowanie użytecznego systemu ASR działającego w trybie offline. Biorąc pod uwagę aktualne trendy w wykorzystaniu inteligentnych urządzeń oraz możliwości techniczne, warto obserwować dalszy rozwój tych systemów i pojawiające się nowe zbiory danych.</p>
<p><a href="https://inero-software.com/pl/"><span style="color: #800080;"><strong>Inero Software</strong></span></a> oferuje wiedzę i doświadczenie w zakresie skutecznego wykorzystywania najnowocześniejszych technologii i danych do kształtowania korporacyjnych produktów cyfrowych przyszłości.</p>
<p>W sekcji <a href="https://inero-software.com/pl/category/firma/"><span style="color: #800080;"><strong>BLOG</strong></span></a> można znaleźć inne artykuły dotyczące nowoczesnych rozwiązań dla przedsiębiorstw.</p>
<p><strong><span style="color: #000000;">Redakcja: Tymoteusz Cejrowski, Software Developer.</span></strong></p>
<p></p></div><br />
</p></div>
<p>Artykuł <a href="https://inero-software.com/pl/budowa-systemu-rozpoznawania-komend-glosowych/">Budowa systemu rozpoznawania komend głosowych w języku polskim</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4748</post-id>	</item>
		<item>
		<title>Skoruba dla Identity Server &#8211; przegląd modułu autoryzacyjnego dla Aplikacji .NET</title>
		<link>https://inero-software.com/pl/skoruba-dla-identity-server/</link>
		
		<dc:creator><![CDATA[Andrzej Chybicki]]></dc:creator>
		<pubDate>Mon, 07 Feb 2022 11:11:36 +0000</pubDate>
				<category><![CDATA[Blog_pl]]></category>
		<category><![CDATA[Firma]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[aspnetcore]]></category>
		<category><![CDATA[bezpieczeństwo]]></category>
		<category><![CDATA[dotnetcore]]></category>
		<category><![CDATA[identityserver4]]></category>
		<category><![CDATA[skoruba]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=4374</guid>

					<description><![CDATA[<p>.NET Core daje nam wiele możliwości w zakresie budowania rozwiązań biznesowych w sektorze logistycznym, finansowym czy bankowym. Do najważniejszych zalet tego środowiska należą wbudowane mechanizmy uwierzytelniania i autoryzacji użytkowników czy umożliwienie budowania obiegu zgłoszeń w oparciu o moduły zwane middleware.</p>
<p>Artykuł <a href="https://inero-software.com/pl/skoruba-dla-identity-server/">Skoruba dla Identity Server &#8211; przegląd modułu autoryzacyjnego dla Aplikacji .NET</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="row">
<p><div class="col-sm-3"></div></p>
<p><div class="col-sm-6">
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="wp-image-2873 alignleft" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="107" height="107" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 107px) 100vw, 107px" /></span></p>
<p><span style="font-weight: 400;">.NET Core daje nam wiele możliwości w zakresie budowania rozwiązań biznesowych w sektorze logistycznym, finansowym czy bankowym. Do najważniejszych zalet tego środowiska należą wbudowane mechanizmy uwierzytelniania i autoryzacji użytkowników czy umożliwienie budowania obiegu zgłoszeń w oparciu o moduły zwane middleware. Moduły te można wymienić w taki sposób, żeby zmienić zachowanie naszej aplikacji.</span></p>
<p><span style="font-weight: 400;">.NET Core pozwala nam także chronić naszą aplikację przed atakami typu: XSS, SQL Injection, CSRF czy Open Redirect Attack. Ponadto możemy łatwo wymusić na aplikacji używanie HTTPS zamiast mniej bezpiecznego HTTP. Dzięki .NET Core programiści mogą realizować proces autoryzacji na wiele sposobów, m.in.: autoryzacja oparta na rolach, oparta na oświadczeniach czy oparta na zasadach.</span></p>
<p><span style="font-weight: 400;">Z powyższych powodów rozwiązania .NET Core są często wykorzystywane w dużych organizacjach korporacyjnych i przedsiębiorstwach. Ze względu na ogromną liczbę użytkowników i skomplikowane procesy biznesowe systemy te wymagają złożonych i solidnych mechanizmów <a href="https://inero-software.com/pl/rozwiazania-logistyczne/cyberbezpieczenstwo/">ochrony kont użytkowników oraz zarządzania tożsamościami</a> w naszych aplikacjach.</span></p>
<p>Dlatego w tym krótkim poście przeglądowym udostępnimy jedno z narzędzi, które wykorzystaliśmy do bezpiecznej autoryzacji, zbudowane dla jednego z naszych klientów korporacyjnych, a mianowicie oparty na .NET projekt <strong>Skoruba.IdentityServer4.Admin</strong>.</p>
<p><img loading="lazy" decoding="async" class="wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="Separating icon" width="124" height="124" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 124px) 100vw, 124px" /></p>
<h2><strong><span style="color: #800080;">Czym jest Skoruba?</span></strong></h2>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="alignleft wp-image-2873 " src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<p>Skoruba to projekt typu open source zapewniający interfejs użytkownika, który umożliwia administrowanie funkcjami IdentityServer4 i ASP.NET Core Identity. Dzięki temu projektowi jesteśmy w pewien sposób zwolnieni z tworzenia wizualnej strony funkcjonalności związanej z zarządzaniem użytkownikami. Główną zaletą tego projektu jest przyjazny interfejs użytkownika, który opiera się na Bootstrap i pozwala nam w bardzo efektywny sposób zarządzać użytkownikami, hasłami, uwierzytelnianiem dwuskładnikowym, rolami, klientami, zasobami czy strukturą tokenów dostępu i ich roszczeniami.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-3282 size-full" src="https://inero-software.com/wp-content/uploads/2021/02/UI2.png" alt="Skoruba IdentityServer4" width="864" height="512" srcset="https://inero-software.com/wp-content/uploads/2021/02/UI2.png 864w, https://inero-software.com/wp-content/uploads/2021/02/UI2-300x178.png 300w, https://inero-software.com/wp-content/uploads/2021/02/UI2-768x455.png 768w, https://inero-software.com/wp-content/uploads/2021/02/UI2-506x300.png 506w" sizes="(max-width: 864px) 100vw, 864px" /></p>
<p style="text-align: center;"><span style="font-weight: 400;">Źródło: https://github.com/skoruba/IdentityServer4.Admin</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Dodatkowo Skoruba udostępnia również API, które możemy w dowolny sposób konsumować i na jego podstawie budować logikę związaną z zarządzaniem kontem w sposób, który będzie lepiej odpowiadał naszym wymaganiom biznesowym. Cała dokumentacja API jest dostępna dzięki Swagget, co pozwala nam testować poszczególne działania API.</span></p>
<p><span style="font-weight: 400;">Możliwość zmiany dostawcy bazy danych, w którym przechowujemy wszystkie informacje o tożsamości, jest również łatwiejsza i domyślnie mamy do wyboru takich dostawców, jak SQLServer, MySql i PostgreSQL.</span></p>
<p><span style="font-weight: 400;">Kolejną zaletą Skoruby jest bardzo dobrze rozwinięty mechanizm rejestrowania zdarzeń w naszej aplikacji oparty na bibliotece Serilog, co pozwala na bardzo sprawną identyfikację potencjalnych problemów występujących podczas działania aplikacji. Poniżej możesz zobaczyć wizualizację aplikacji Skoruby:</span></p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-3275 size-full" src="https://inero-software.com/wp-content/uploads/2021/02/Components.png" alt="Skoruba visualisation" width="1514" height="686" srcset="https://inero-software.com/wp-content/uploads/2021/02/Components.png 1514w, https://inero-software.com/wp-content/uploads/2021/02/Components-300x136.png 300w, https://inero-software.com/wp-content/uploads/2021/02/Components-768x348.png 768w, https://inero-software.com/wp-content/uploads/2021/02/Components-1030x467.png 1030w, https://inero-software.com/wp-content/uploads/2021/02/Components-662x300.png 662w" sizes="(max-width: 1514px) 100vw, 1514px" /></p>
<p style="text-align: center;"><span style="font-weight: 400;">Źródło: https://github.com/skoruba/IdentityServer4.Admin</span></p>
<p><img loading="lazy" decoding="async" class="wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h2><span style="font-weight: 400; color: #800080;">Jak Skoruba radzi sobie z rolami użytkowników? Przykład</span></h2>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="wp-image-2873 alignleft" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" />W tym przykładzie widzimy, jak wygląda sekcja interfejsu, w której można modyfikować role użytkowników:</span></p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-3283 size-full" src="https://inero-software.com/wp-content/uploads/2021/02/UserRoles2.png" alt="Skoruba interfejs" width="1137" height="817" srcset="https://inero-software.com/wp-content/uploads/2021/02/UserRoles2.png 1137w, https://inero-software.com/wp-content/uploads/2021/02/UserRoles2-300x216.png 300w, https://inero-software.com/wp-content/uploads/2021/02/UserRoles2-768x552.png 768w, https://inero-software.com/wp-content/uploads/2021/02/UserRoles2-1030x740.png 1030w, https://inero-software.com/wp-content/uploads/2021/02/UserRoles2-418x300.png 418w" sizes="(max-width: 1137px) 100vw, 1137px" /></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Gdybyśmy nie korzystali ze Skoruby, musielibyśmy to wszystko stworzyć sami, łącznie z logiką i sposobem, jak to dobrze zaprezentować. Daje nam to wiele funkcji, których nie musimy tworzyć, przez co możemy skupiać się bardziej na naszych wymaganiach biznesowych, zamiast tworzyć zupełnie nowy interfejs użytkownika do obsługi usług IdentityServer4 i ASP.NET Core Identity. Przykładowa logika, która pokazuje nam, w jaki sposób Skoruba generuje role użytkowników, jak przedstawiono powyżej, jest pokazana w poniższym bloku kodu:</span></p>
<pre>public virtual async Task BuildUserRolesViewModel(TKey id, int? page)
{s
    var roles = await GetRolesAsync();
    var userRoles = await GetUserRolesAsync(id.ToString(), page ?? 1);
    userRoles.UserId = id;
    userRoles.RolesList = roles.Select(x =&gt; new SelectItemDto(x.Id.ToString(), x.Name)).ToList();

    return userRoles;
}

public virtual async Task GetUserRolesAsync(string userId, int page = 1, int pageSize = 10)
{
    var userExists = await IdentityRepository.ExistsUserAsync(userId);
    if (!userExists) throw new UserFriendlyErrorPageException(string.Format(IdentityServiceResources.UserDoesNotExist().Description, userId), 
    IdentityServiceResources.UserDoesNotExist().Description);

    var userIdentityRoles = await IdentityRepository.GetUserRolesAsync(userId, page, pageSize);
    var roleDtos = Mapper.Map(userIdentityRoles);

    var user = await IdentityRepository.GetUserAsync(userId);
    roleDtos.UserName = user.UserName;

    await AuditEventLogger.LogEventAsync(new UserRolesRequestedEvent(roleDtos));

    return roleDtos;
}
</pre>
<p><span style="font-weight: 400;">Co więcej? Jeśli chcemy, możemy zmienić wygląd interfejsu. Możemy również modyfikować zawartość witryny, zmieniając logikę, która będzie adekwatna do naszych potrzeb biznesowych.</span></p>
<p><span style="font-weight: 400;">Jeśli potrzebujesz więcej informacji o projekcie Skoruba i jego możliwości, wejdź na stronę projektu na GitHub: </span><a href="https://github.com/skoruba/IdentityServer4.Admin"><span style="font-weight: 400;">https://github.com/skoruba/IdentityServer4.Admin</span></a><span style="font-weight: 400;"> </span></p>
<p><img loading="lazy" decoding="async" class="wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h2><span style="font-weight: 400; color: #800080;">Podsumowanie</span></h2>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="wp-image-2873 alignleft" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<p>W <a href="https://inero-software.com/pl/">Inero Software</a> zajmujemy się ambitnymi i wymagającymi projektami rozwoju oprogramowania. W tym wpisie na blogu pokazaliśmy, jak szybko można wykorzystać gotowe do użycia, istniejące rozwiązania open-source, aby zapewnić efektywny sposób wdrażania zabezpieczeń oprogramowania. Poza przedstawionym przypadkiem użycia, Skoruba i Identity Server mogą być wykorzystywane do pracy z urządzeniami mobilnymi, systemami IoT lub w ramach komunikacji M2M między maszynami lub robotami.</p>
<p>&nbsp;</p>
<p><a href="https://inero-software.com/pl/"><span style="color: #800080;"><strong>Inero Software</strong></span></a> oferuje wiedzę i doświadczenie w zakresie skutecznego wykorzystywania najnowocześniejszych technologii i danych do kształtowania korporacyjnych produktów cyfrowych przyszłości.</p>
<p>W sekcji <a href="https://inero-software.com/pl/category/firma/"><span style="color: #800080;"><strong>BLOG</strong></span></a> można znaleźć inne artykuły dotyczące nowoczesnych rozwiązań dla przedsiębiorstw.</p>
<p>&nbsp;</p>
<p></p></div><br />
</p></div>
<p>Artykuł <a href="https://inero-software.com/pl/skoruba-dla-identity-server/">Skoruba dla Identity Server &#8211; przegląd modułu autoryzacyjnego dla Aplikacji .NET</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4374</post-id>	</item>
		<item>
		<title>Repozytoria dokumentów w chmurze &#8211; jak rozpoznać odręczne podpisy w zeskanowanych dokumentach PDF</title>
		<link>https://inero-software.com/pl/repozytoria-dokumentow/</link>
		
		<dc:creator><![CDATA[Adrian Chojnacki]]></dc:creator>
		<pubDate>Mon, 07 Feb 2022 09:56:58 +0000</pubDate>
				<category><![CDATA[Blog_pl]]></category>
		<category><![CDATA[Firma]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[chmura]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[repozytorium]]></category>
		<category><![CDATA[sztuczna inteligencja]]></category>
		<category><![CDATA[uczenie maszynowe]]></category>
		<category><![CDATA[yolo]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=4365</guid>

					<description><![CDATA[<p>Widzenie komputerowe i detekcja obiektów są coraz częściej wykorzystywane w automatyzacji procesów biznesowych. Wraz z dynamicznym rozwojem technologii, zwłaszcza sztucznej inteligencji, pojawia się wiele nowych innowacyjnych aplikacji biznesowych dla tego typu algorytmów.</p>
<p>Artykuł <a href="https://inero-software.com/pl/repozytoria-dokumentow/">Repozytoria dokumentów w chmurze &#8211; jak rozpoznać odręczne podpisy w zeskanowanych dokumentach PDF</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3></h3>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="wp-image-2873 alignleft" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" />Widzenie komputerowe i detekcja obiektów są coraz częściej wykorzystywane w automatyzacji procesów biznesowych. Wraz z dynamicznym rozwojem technologii, zwłaszcza <a href="https://inero-software.com/pl/uczenie-maszynowe/">sztucznej inteligencji</a>, pojawia się wiele nowych innowacyjnych aplikacji biznesowych dla tego typu algorytmów. W tym artykule pokażemy Ci, jak zrobić to z YOLO v5, które w ostatnich latach stało się bardziej popularne. Jednym z ważnych aspektów ponad innymi rozwiązaniami jest szybkość wnioskowania. W ramach tego artykułu przedstawimy określony przypadek użycia i wszystkie etapy jego realizacji. Życzymy miłej lektury!</span></p>
<p><img loading="lazy" decoding="async" class="wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h2><span style="color: #800080;"><b>Studium przypadku</b></span></h2>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="wp-image-2873 alignleft" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" />Podpisy są nadal jedną z najczęstszych metod uwierzytelniania dokumentów. Szczególnie w przypadku aplikacji korporacyjnych, identyfikacja podpisanych i niepodpisanych kopii dokumentów w repozytoriach cyfrowych może być czasochłonna i wymagająca. Jednak automatyzacja wspierana przez uczenie maszynowe może to ułatwić. W tym kontekście opiszemy możliwości detektora YOLO v5 oraz omówimy kwestie wykrywania podpisów na fakturach. Zacznijmy od przykładu pokazanego na poniższym rysunku. Na potrzeby tego badania przygotowaliśmy fałszywą fakturę, dane sprzedawcy, kupującego i samego produktu. Zbadajmy teraz, jak możemy skupić się na odręcznych podpisach (które też są fałszywe).</span></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-3314 size-full" src="https://inero-software.com/wp-content/uploads/2021/02/invoice.png" alt="faktura" width="675" height="675" srcset="https://inero-software.com/wp-content/uploads/2021/02/invoice.png 675w, https://inero-software.com/wp-content/uploads/2021/02/invoice-80x80.png 80w, https://inero-software.com/wp-content/uploads/2021/02/invoice-300x300.png 300w, https://inero-software.com/wp-content/uploads/2021/02/invoice-50x50.png 50w, https://inero-software.com/wp-content/uploads/2021/02/invoice-512x512.png 512w" sizes="(max-width: 675px) 100vw, 675px" /></p>
<p><img loading="lazy" decoding="async" class="wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h4><span style="color: #800080;"><b>Zbieranie danych</b></span></h4>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="wp-image-2873 alignleft" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" />Jednym z pierwszych kroków jest zebranie zestawu obrazów do trenowania modelu. Dla naszego przypadku przygotowaliśmy mały zestaw 10 przykładowych szkoleń z fakturami wypełnionymi różnymi danymi i rozszerzyliśmy ten zbiór o dedykowany skrypt w języku Python. Aby to ułatwić, użyliśmy <a href="https://roboflow.ai/">Roboflow</a>, który jest przydatnym narzędziem do tagowania danych. Tutaj możesz przesłać swój zbiór danych i wykonać szybki proces dodawania adnotacji, dokładnie jak na tym GIF-ie.</span></p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="wp-image-3310 size-full aligncenter" src="https://inero-software.com/wp-content/uploads/2021/02/annonated-e1646395509809.gif" alt="Upload of the dataset" width="1716" height="913" /></p>
<p>&nbsp;</p>
<p>Dodatkowo możemy wygenerować więcej obrazów wyjściowych z losowymi wartościami obrotu, nasycenia, ekspozycji, szumu, rozmycia i innego rodzaju przekształceń. Co więcej, za pomocą tego narzędzia możemy określić nasz podział danych treningowych, walidacyjnych i testowych &#8211; domyślnie 70%, 10%, 10%. Jest to ważne, ponieważ dzięki temu zapobiegniemy przesunięciu naszego modelu (więcej o tym dowiesz się na tym <a href="http://blog.roboflow.com/train-test-split/">blogu</a>). Dzięki opisanemu narzędziu możemy wyeksportować nasz zbiór danych w <em>formacie YOLO v5 Pytorch</em> i umieścić go w katalogu naszego projektu. Poniższy rysunek przedstawia drzewo selekcji i drzewo docelowe, gdzie jednym z najważniejszych plików jest <strong>data.yml</strong>, który zostanie użyty do uczenia.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-3311 size-full" src="https://inero-software.com/wp-content/uploads/2021/02/export.png" alt="Export of the files" width="555" height="360" srcset="https://inero-software.com/wp-content/uploads/2021/02/export.png 555w, https://inero-software.com/wp-content/uploads/2021/02/export-300x195.png 300w, https://inero-software.com/wp-content/uploads/2021/02/export-463x300.png 463w" sizes="(max-width: 555px) 100vw, 555px" /></p>
<p>W naszym przypadku po pierwszym kroku augmentacji o skrypt Pythona generujemy <strong>69</strong> obrazów. Dodatkowo używamy opcji szumu w Roboflow, która pozwala nam ostatecznie wyeksportować <strong>169</strong> przykładów z adnotacjami. Nasze obrazy zostały ostatecznie podzielone, jak pokazano na poniższym rysunku.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-3316 size-full" src="https://inero-software.com/wp-content/uploads/2021/02/split.png" alt="Split of the images" width="575" height="106" srcset="https://inero-software.com/wp-content/uploads/2021/02/split.png 575w, https://inero-software.com/wp-content/uploads/2021/02/split-300x55.png 300w" sizes="(max-width: 575px) 100vw, 575px" /></p>
<p><span style="font-weight: 400;">Poniżej możesz zobaczyć kilka przykładów:</span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="4939" data-permalink="https://inero-software.com/pl/repozytoria-dokumentow/setcomp-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2022/02/setcomp.gif" data-orig-size="1206,724" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="setcomp" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2022/02/setcomp-300x180.gif" data-large-file="https://inero-software.com/wp-content/uploads/2022/02/setcomp-1030x618.gif" tabindex="0" role="button" class="aligncenter wp-image-4939 size-full" src="https://inero-software.com/wp-content/uploads/2022/02/setcomp.gif" alt="train examples" width="1206" height="724" /></p>
<p><img loading="lazy" decoding="async" class="wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<p>&nbsp;</p>
<h4><span style="color: #800080;"><b>Konfiguracja i architektura modelu</b></span></h4>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="wp-image-2873 alignleft" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" />Kolejnym krokiem w tym procesie jest zdefiniowanie konfiguracji i architektury modelu YOLO. Możemy zbudować własną strukturę sieciową, chociaż w wersji 5 mamy do dyspozycji jeden z następujących modeli:</span></p>
<p>&nbsp;</p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">YOLOv5s,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">YOLOv5m,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">YOLOv5l,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">YOLOv5x.</span></li>
</ul>
<p>&nbsp;</p>
<p>Możemy użyć dowolnego z nich, ale pamiętajmy o przypisaniu do pliku docelowego odpowiedniej wartości parametru zwanej <strong>nc</strong> &#8211; <em>liczba klas</em>. W naszym przypadku jest to 1. Modele różnią się między sobą ilością użytych parametrów, szybkością klatek na sekundę (FPS), dokładnością itd.. Na poniższym rysunku widać, jak radzą sobie one z tym samym <a href="https://cocodataset.org/#home">zbiorem danych COCO</a>. Kliknij na obrazek, aby dowiedzieć się więcej.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-3319 size-full" src="https://inero-software.com/wp-content/uploads/2021/02/yolo.png" alt="YOLO graph" width="2400" height="1200" srcset="https://inero-software.com/wp-content/uploads/2021/02/yolo.png 2400w, https://inero-software.com/wp-content/uploads/2021/02/yolo-300x150.png 300w, https://inero-software.com/wp-content/uploads/2021/02/yolo-768x384.png 768w, https://inero-software.com/wp-content/uploads/2021/02/yolo-1030x515.png 1030w, https://inero-software.com/wp-content/uploads/2021/02/yolo-600x300.png 600w" sizes="(max-width: 2400px) 100vw, 2400px" /></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h4><span style="color: #800080;"><b>Szkolenie</b></span></h4>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="wp-image-2873 alignleft" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" />Co ważne, firma <a href="https://www.ultralytics.com/">Ultralytics</a> udostępnia nam YOLO v5 opracowany w <a href="https://pytorch.org/">PyTorch.</a> Jest to framework wyspecjalizowany w uczeniu maszynowym. Dzięki temu możemy pobrać ich repozytorium z <a href="https://github.com/ultralytics/yolov5">GitHub</a> i wyszkolić własny detektor. Czego jeszcze potrzebujemy, aby wszystko działało dobrze?</span></p>
<p>Aby uruchomić każdy ze skryptów musimy zainstalować zależności zawarte w pliku r<em>equirements.txt</em>. Jeśli używamy <strong>pip</strong>, możemy użyć następującego polecenia w terminalu. Pamiętaj, że musisz znajdować się w katalogu projektu.</p>
<p>&nbsp;</p>
<pre>pip install -r requirements.txt</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>W procesie instalacji problemem może być jedna rzecz. Mianowicie biblioteka <em>PyTorch</em>&#8230;</p>
<p>Inny system operacyjny, używany pakiet, język programowania itp. mogą wymagać określonego polecenia. W tym <a href="https://pytorch.org/get-started/locally/">samouczku</a> znajdziesz wszystko, czego potrzebujesz.</p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Załóżmy, że spełniłeś wszystkie wymagania. Możesz już rozpocząć szkolenie!</span></p>
<p>&nbsp;</p>
<p>Do uruchomienia tego procesu wystarczy jedna linijka kodu, ale musimy się upewnić, że przygotowaliśmy dwa ważne pliki &#8211; <strong>data.yaml</strong> i np. <strong>yolov5l.yaml</strong>. Pierwszą powinieneś mieć z etapu zbierania danych, a drugą znajdziesz w repozytorium YOLO v5, w katalogu <em>Models</em>.</p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Przeprowadźmy szkolenie następującą komendą:</span></p>
<p>&nbsp;</p>
<pre>python train.py --data dataset/data.yaml --cfg models/yolov5l.yaml --weights ''</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Powyższe polecenie jest najprostsze z możliwych. Dodatkowo można zdefiniować następujące opcje lub parametry:</span></p>
<p>&nbsp;</p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">img-size,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">batch-size,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">epochs, </span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">name,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">no-save,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">cache…</span></li>
</ul>
<p>&nbsp;</p>
<p>Na potrzeby tego artykułu przeprowadziliśmy stosunkowo krótkie szkolenie dla obrazów o rozmiarze zmienionym do <strong>416&#215;416</strong>, wielkości partii <strong>32</strong> i <strong>1500</strong> epok. Po zakończeniu procesu wynikiem będzie plik o nazwie <strong>best.pt</strong>.</p>
<p>&nbsp;</p>
<p>Możesz przerwać proces uczenia się, jeśli w danym momencie Twoje wagi są dla Ciebie optymalne. Szkolenie przerwaliśmy po <strong>650 epokach</strong>, co w sumie trwało około <strong>15 godzin</strong>. Trzeba pamiętać, że używany komputer nie posiada dedykowanej karty graficznej.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" data-attachment-id="4940" data-permalink="https://inero-software.com/pl/repozytoria-dokumentow/trainingcomp-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2022/02/trainingcomp.gif" data-orig-size="1888,212" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="trainingcomp" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2022/02/trainingcomp-300x34.gif" data-large-file="https://inero-software.com/wp-content/uploads/2022/02/trainingcomp-1030x116.gif" tabindex="0" role="button" class="aligncenter wp-image-4940 size-full" src="https://inero-software.com/wp-content/uploads/2022/02/trainingcomp.gif" alt="visualisation of training" width="1888" height="212" /></p>
<h5></h5>
<p>&nbsp;</p>
<h5><strong><span style="color: #800080;">Szczegółowe metryki naszego szkolenia:</span></strong></h5>
<p>&nbsp;</p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">precision &#8211; </span><strong>0.93507</strong><span style="font-weight: 400;">,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">recall &#8211; </span><strong>0.96429</strong><span style="font-weight: 400;">,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">mAP_0.5 &#8211; </span><strong>0.94755</strong><span style="font-weight: 400;">,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">mAP_0.5:0.95 &#8211;</span> <strong>0.48702</strong><span style="font-weight: 400;">,<br />
</span></li>
</ul>
<p><span style="font-weight: 400;">gdzie:</span></p>
<p><i><span style="font-weight: 400;">precision</span></i><span style="font-weight: 400;"> &#8211; mierzy, jak trafne są Twoje przewidywania,</span></p>
<p><i><span style="font-weight: 400;">recall </span></i><span style="font-weight: 400;">&#8211; mierzy, jak dobrze oceniasz wszystkie pozytywy,</span></p>
<p><i><span style="font-weight: 400;">mAP_0.5</span></i><span style="font-weight: 400;"> &#8211; średnia precyzja dla IoU* &#8211; 0,5</span></p>
<p><i><span style="font-weight: 400;">mAP_0.5:0.95</span></i><span style="font-weight: 400;"> &#8211; średnia precyzja dla IoU* od 0,5 do 0,95 z krokiem 0,005,</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">* IoU (</span><i><span style="font-weight: 400;">Intersection over Union</span></i><span style="font-weight: 400;">) &#8211; mierzy nakładanie się dwóch granic. Dowiedz się więcej o wskaźnikach <a href="https://jonathan-hui.medium.com/map-mean-average-precision-for-object-detection-45c121a31173">tutaj</a>.</span></p>
<p><img loading="lazy" decoding="async" class="wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h4><span style="color: #800080;"><b>Wnioskowanie</b></span></h4>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="wp-image-2873 alignleft" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" />Teraz, możemy przejść do wnioskowania na obrazach testowych. Jak pamiętasz, jeden z katalogów wyeksportowanych z <em>Roboflow</em> nazywał się <strong>test</strong>. Możemy z niego skorzystać, wstawiając w terminalu następującą linię.</span></p>
<p>&nbsp;</p>
<pre>python detect.py --weights best.pt --source dataset/test --conf 0.6 --img-size 600</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>gdzie <em>conf</em> jest ufnością modelu &#8211; wyższy oznacza mniej przewidywań.</p>
<p>&nbsp;</p>
<p>Na koniec możemy zobaczyć wizualizację wyniku. Przybliżony czas wnioskowania na jednym obrazie testowym <strong>416&#215;416</strong> wyniósł <strong>~0,3s</strong>, natomiast dla <strong>700&#215;700 ~0,8s</strong>.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="4941" data-permalink="https://inero-software.com/pl/repozytoria-dokumentow/inferencecomp-3/" data-orig-file="https://inero-software.com/wp-content/uploads/2022/02/inferencecomp.gif" data-orig-size="1138,406" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inferencecomp" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2022/02/inferencecomp-300x107.gif" data-large-file="https://inero-software.com/wp-content/uploads/2022/02/inferencecomp-1030x367.gif" tabindex="0" role="button" class="aligncenter wp-image-4941 size-full" src="https://inero-software.com/wp-content/uploads/2022/02/inferencecomp.gif" alt="inference" width="1138" height="406" /><br />
<img loading="lazy" decoding="async" class="aligncenter wp-image-3309 size-full" src="https://inero-software.com/wp-content/uploads/2021/02/10.png" alt="podpisy na fakturze" width="675" height="675" srcset="https://inero-software.com/wp-content/uploads/2021/02/10.png 675w, https://inero-software.com/wp-content/uploads/2021/02/10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2021/02/10-300x300.png 300w, https://inero-software.com/wp-content/uploads/2021/02/10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2021/02/10-512x512.png 512w" sizes="(max-width: 675px) 100vw, 675px" /> <img loading="lazy" decoding="async" class="aligncenter wp-image-3313 size-full" src="https://inero-software.com/wp-content/uploads/2021/02/inv_inference.jpg" alt="podpisy na fakturze" width="1236" height="416" srcset="https://inero-software.com/wp-content/uploads/2021/02/inv_inference.jpg 1236w, https://inero-software.com/wp-content/uploads/2021/02/inv_inference-300x101.jpg 300w, https://inero-software.com/wp-content/uploads/2021/02/inv_inference-768x258.jpg 768w, https://inero-software.com/wp-content/uploads/2021/02/inv_inference-1030x347.jpg 1030w, https://inero-software.com/wp-content/uploads/2021/02/inv_inference-891x300.jpg 891w" sizes="(max-width: 1236px) 100vw, 1236px" /> <img loading="lazy" decoding="async" class="aligncenter wp-image-3317 size-full" src="https://inero-software.com/wp-content/uploads/2021/02/test_batch0_pred.jpg" alt="podpisy na fakturze" width="1280" height="1280" srcset="https://inero-software.com/wp-content/uploads/2021/02/test_batch0_pred.jpg 1280w, https://inero-software.com/wp-content/uploads/2021/02/test_batch0_pred-80x80.jpg 80w, https://inero-software.com/wp-content/uploads/2021/02/test_batch0_pred-300x300.jpg 300w, https://inero-software.com/wp-content/uploads/2021/02/test_batch0_pred-768x768.jpg 768w, https://inero-software.com/wp-content/uploads/2021/02/test_batch0_pred-1030x1030.jpg 1030w, https://inero-software.com/wp-content/uploads/2021/02/test_batch0_pred-50x50.jpg 50w, https://inero-software.com/wp-content/uploads/2021/02/test_batch0_pred-512x512.jpg 512w, https://inero-software.com/wp-content/uploads/2021/02/test_batch0_pred-1024x1024.jpg 1024w" sizes="(max-width: 1280px) 100vw, 1280px" /><br />
<img loading="lazy" decoding="async" class="wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #800080;"><b>Podsumowanie</b></span></h3>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="wp-image-2873 alignleft" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" />Do implementacji opisywanego detektora wykorzystaliśmy tylko 10 obrazów, rozszerzając zbiór danych o proces augmentacji. Dzięki narzędziu Roboflow możliwe było szybkie opisywanie i eksportowanie danych do formatu YOLO. Proces uczenia pozwolił nam uzyskać detektor celu, który skutecznie rozpoznaje podpisy na fakturach.</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Należy pamiętać, że przy tak małym zbiorze danych jest on przystosowany tylko do rozpoznawania podobnych faktur. Gdybyśmy chcieli rozszerzyć możliwości naszego detektora, musielibyśmy wyposażyć się w lepszą kartę graficzną i więcej danych.</span></p>
<p>&nbsp;</p>
<p><a href="https://inero-software.com/pl/"><span style="color: #800080;"><strong>Inero Software</strong></span></a> oferuje wiedzę i doświadczenie w zakresie skutecznego wykorzystywania najnowocześniejszych technologii i danych do kształtowania korporacyjnych produktów cyfrowych przyszłości.</p>
<p>Aby uzyskać więcej informacji, odwiedź nas na naszej <a href="https://inero-software.com/pl/"><strong><span style="color: #800080;">stronie internetowej</span></strong></a> lub śledź nas na <a href="https://www.linkedin.com/company/inero-software/"><span style="color: #800080;"><strong>LinkedIn</strong></span></a>.</p>
<p>Artykuł <a href="https://inero-software.com/pl/repozytoria-dokumentow/">Repozytoria dokumentów w chmurze &#8211; jak rozpoznać odręczne podpisy w zeskanowanych dokumentach PDF</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4365</post-id>	</item>
		<item>
		<title>Adroid Kiosk Mode &#8211; jak zmienić urządzenie z Androidem w urządzenie do dedykowanego użytku</title>
		<link>https://inero-software.com/pl/android-kiosk-mode/</link>
		
		<dc:creator><![CDATA[Andrzej Chybicki]]></dc:creator>
		<pubDate>Thu, 03 Feb 2022 14:08:19 +0000</pubDate>
				<category><![CDATA[Blog_pl]]></category>
		<category><![CDATA[Firma]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[android kiosk mode]]></category>
		<category><![CDATA[aplikacja]]></category>
		<category><![CDATA[urządzenia mobilne]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=4354</guid>

					<description><![CDATA[<p>W pełni zarządzane, dedykowane urządzenia służą określonemu celu. Dzięki temu możliwe jest maksymalne wykorzystanie urządzenia, przy jednoczesnym ograniczeniu korzystania z funkcji osobistych takich jak np. komunikatory. Z wieloma takimi urządzeniami mamy do czynienia na co dzień. Są to między innymi automaty, drukarki biletów czy parkomaty.</p>
<p>Artykuł <a href="https://inero-software.com/pl/android-kiosk-mode/">Adroid Kiosk Mode &#8211; jak zmienić urządzenie z Androidem w urządzenie do dedykowanego użytku</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="row"><div class="col-sm-1"></div><div class="col-sm-10">
<p><img loading="lazy" decoding="async" class="wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<p>Systemu Android nie trzeba przedstawiać. Obecnie jest to najbardziej popularny system operacyjny dla smartfonów. Jednak Android nie jest już używany tylko w elektronice użytkowej. Dziś urządzenia z Androidem możemy spotkać na każdym kroku. System ten jest coraz częściej stosowany w takich branżach jak: bezpieczeństwo, automatyzacja, logistyka, sprzedaż, hotelarstwo itp. Ze względu na łatwość użytkowania, poziom dostosowania i niższe koszty, urządzenia z Androidem są wybierane przez wiele przedsiębiorstw. Jednak dla wielu firm systemy Android nie są uważane za wystarczająco bezpieczne do użytku w miejscu pracy. Jednym z najlepszych rozwiązań dla powyższych problemów jest narzędzie Kiosk Mode, które pozwala przekonwertować Twoje urządzenie z Androidem w dedykowaną aplikację, zapewniając jednocześnie dodatkowe bezpieczeństwo i redukując dodatkowe elementy rozpraszające uwagę. Życzymy miłej lektury!</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h2><span style="color: #800080;"><b>COSU &#8211; corporate-owned single use device (urządzenie do dedykowanego użytku dla firm)</b></span></h2>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />W pełni zarządzane, dedykowane urządzenia służą określonemu celu. Dzięki temu możliwe jest maksymalne wykorzystanie urządzenia, przy jednoczesnym ograniczeniu korzystania z funkcji osobistych takich jak np. komunikatory. Z wieloma takimi urządzeniami mamy do czynienia na co dzień. Są to między innymi automaty, drukarki biletów czy parkomaty. COSU umożliwia administratorom IT zdalne sterowanie wszystkimi tymi urządzeniami i blokowanie urządzeń dla określonej aplikacji. Uniemożliwia to użytkownikom korzystanie z innych aplikacji lub wykonywanie innych czynności na tych urządzeniach.</span></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h2><span style="color: #800080;"><b>Kiosk Mode</b></span></h2>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<p><span style="font-weight: 400;">Kiosk Mode pozwala zamienić urządzenia z Androidem w urządzenia do dedykowanego użytku (Single-Use Device), uruchamiając tylko jedną aplikację lub określony zestaw aplikacji. Począwszy od Androida 5.0 Lollipop, system oferuje dwa sposoby blokowania urządzenia w określonym celu:</span></p>
<p>&nbsp;</p>
<ul>
<li aria-level="1">App pinning &#8211; korzystając z funkcji przypinania aplikacji, użytkownicy mogą tymczasowo przypiąć dowolną zainstalowaną aplikację na ekranie. Przyciski nawigacyjne są widoczne, ale nieaktywne. Użytkownik może wyjść z tego trybu, przytrzymując jednocześnie przycisk &#8222;Home&#8221; i &#8222;Recent apps&#8221;.</li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Lock task mode &#8211; jest to jeszcze skuteczniejszy sposób na przekształcenie urządzenia z Androidem w dedykowane urządzenie o tylko jednym przeznaczeniu. Tylko aplikacje umieszczone na białej liście przez Device Policy Controller (DPC) mogą być blokowane. Przyciski nawigacyjne są ukryte. Jest to tryb dostępny tylko dla właścicieli urządzeń.</span></li>
</ul>
<p><span style="font-weight: 400;">Uruchomienie aplikacji w trybie Kiosk Mode daje nam szereg korzyści:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">urządzenie działa jako pojedyncza platforma,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">ukryte przyciski nawigacyjne (lock task mode),</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">nieaktywny pasek stanu,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">automatyczne uruchamianie aplikacji wraz ze startem systemu,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">wyłączone powiadomienia,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">zablokowane połączenia przychodzące,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">nieaktywne przejście do ustawień,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">praca w trybie pełnoekranowym,</span></li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h2><span style="color: #800080;"><b>Jak włączyć tryb Android Kiosk Mode?</b></span></h2>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Pierwszym krokiem jest zaimplementowanie klasy dziedziczącej po klasie DeviceAdminReceiver:</span></p>
<p>&nbsp;</p>
<pre><span style="font-weight: 400;">class MyDeviceAdminReceiver : DeviceAdminReceiver() {</span>
<span style="font-weight: 400;">    companion object {</span>
<span style="font-weight: 400;">        fun getComponentName(context: Context): ComponentName {</span>
<span style="font-weight: 400;">            return ComponentName(context.applicationContext, MyDeviceAdminReceiver::class.java)</span>
<span style="font-weight: 400;">        }</span>
<span style="font-weight: 400;">    }</span>
<span style="font-weight: 400;">}</span></pre>
<p><span style="font-weight: 400;">DeviceAdminReceiver to klasa, która zapewnia wygodę w interpretacji surowych działań intencji, które są wysyłane przez system.</span></p>
<p><span style="font-weight: 400;">Następnie musimy poinformować system, że nasza aplikacja ma zostać administratorem urządzenia. Możemy to zrobić dodając odbiornik w pliku AndroidManifest.xml:</span></p>
<pre><span style="font-weight: 400;">&lt;application&gt;</span>
<span style="font-weight: 400;">          ...</span>
<span style="font-weight: 400;">      &lt;receiver</span>
<span style="font-weight: 400;">            android:name=".MyDeviceAdminReceiver"</span>
<span style="font-weight: 400;">            android:description="@string/app_desc"</span>
<span style="font-weight: 400;">            android:label="@string/app_name"</span>
<span style="font-weight: 400;">            android:permission="android.permission.BIND_DEVICE_ADMIN"&gt;</span>
<span style="font-weight: 400;">            &lt;meta-data</span>
<span style="font-weight: 400;">                android:name="android.app.device_admin" /&gt;</span>
<span style="font-weight: 400;">            &lt;intent-filter&gt;</span>
<span style="font-weight: 400;">                &lt;action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /&gt;</span>
<span style="font-weight: 400;">            &lt;/intent-filter&gt;</span>
<span style="font-weight: 400;">        &lt;/receiver&gt;</span>
<span style="font-weight: 400;">    &lt;/application&gt;</span></pre>
<p><span style="font-weight: 400;">W tym momencie możemy przystąpić do instalacji aplikacji. Pamiętaj, że jeśli chcesz przyznać uprawnienia administracyjne do aplikacji, musisz usunąć wszystkich istniejących użytkowników. Najprostszym sposobem jest przywrócenie fabrycznych ustawień urządzenia. Ważne jest, aby podczas pierwszego uruchomienia po resecie nie dodawać konta Google do urządzenia. Lista kroków do poprawnej konfiguracji jest następująca:</span></p>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">przywrócenie ustawień fabrycznych na urządzeniu mobilnym,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">pominięcie dodawanie konta Google,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">włączenie trybu deweloperskiego i debugowania USB na urządzeniu mobilnym,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">zainstalowanie adb (Android Device Bridge) na swoim komputerze &#8211; jest on automatycznie instalowany z Android Studio,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">zainstalowanie aplikacji na urządzeniu mobilnym za pomocą Android Studio lub wpisując w konsoli następujące polecenia: </span><span style="font-weight: 400;"> </span>
<ol>
<li style="font-weight: 400;" aria-level="1">
<pre>adb install path / to / kiosk / application.apk</pre>
</li>
</ol>
</li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">nadanie uprawnień administratora urządzenia aplikacji:</span>
<ol>
<li style="font-weight: 400;" aria-level="2">
<pre><span style="font-weight: 400;">adb shell dpm set-device-owner pl.inero.deliverM8 / .MyDeviceAdminReceiver</span></pre>
</li>
</ol>
</li>
</ol>
<p><span style="font-weight: 400;">Użyj następującego fragmentu kodu, aby sprawdzić czy proces przyznawania się powiódł:</span></p>
<pre><span style="font-weight: 400;">override fun onCreate(savedInstanceState: Bundle?) {</span>
<span style="font-weight: 400;">        super.onCreate(savedInstanceState)</span>
<span style="font-weight: 400;">        mDevicePolicyManager = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager</span>
<span style="font-weight: 400;">        val isAdmin = mDevicePolicyManager.isDeviceOwnerApp(packageName)</span>
<span style="font-weight: 400;">        if (isAdmin) {</span>
<span style="font-weight: 400;">            println("You are an admin")</span>
<span style="font-weight: 400;">        } else {</span>
<span style="font-weight: 400;">            println("You are not an admin")</span>
<span style="font-weight: 400;">        }</span>
<span style="font-weight: 400;">    }</span></pre>
<p><span style="font-weight: 400;">W zależności od potrzeb możemy umożliwić użytkownikowi wyłączenie Kiosk Mode poprzez interfejs (np. poprzez potwierdzenie hasłem) lub całkowicie zablokować wyjście z aplikacji. Za pomocą poniższych fragmentów kodu postaram się wyjaśnić, w jaki sposób możesz kontrolować ustawienia, aby uzyskać rozwiązanie najlepiej odpowiadające Twoim potrzebom.</span></p>
<p><span style="font-weight: 400;">Jednym z parametrów, które możemy kontrolować jest to, czy utrzymujemy urządzenie włączone, gdy jest ono podłączone. &#8222;0&#8221; oznacza, że nigdy nie pozostaje włączone, gdy jest podłączone.</span></p>
<pre><span style="font-weight: 400;">private fun enableStayOnWhilePluggedIn(active: Boolean) = if (active) {</span>
<span style="font-weight: 400;">        mDevicePolicyManager.setGlobalSetting(mAdminComponentName,</span>
<span style="font-weight: 400;">                Settings.Global.STAY_ON_WHILE_PLUGGED_IN,</span>
<span style="font-weight: 400;">                (BatteryManager.BATTERY_PLUGGED_AC</span>
<span style="font-weight: 400;">                        or BatteryManager.BATTERY_PLUGGED_USB</span>
<span style="font-weight: 400;">                        or BatteryManager.BATTERY_PLUGGED_WIRELESS).toString())</span>
<span style="font-weight: 400;">    } else {</span>
<span style="font-weight: 400;">        mDevicePolicyManager.setGlobalSetting(mAdminComponentName, Settings.Global.STAY_ON_WHILE_PLUGGED_IN, "0")</span>
<span style="font-weight: 400;">    }</span></pre>
<p>Jeżeli chcemy nałożyć ograniczenia na użytkownika, możemy skorzystać z metody addUserRestrictrion (ComponentName admin, String key). Użytkownik urządzenia musi mieć uprawnienia administratora, w przeciwnym razie zostanie zgłoszony wyjątek bezpieczeństwa. Tę metodę można wywołać na instancji DevicePolicyManager.</p>
<pre><span style="font-weight: 400;">mDevicePolicyManager = getSystemService (Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager</span></pre>
<p><span style="font-weight: 400;">W naszym przypadku zablokowaliśmy użytkownikowi przywracanie ustawień fabrycznych, dodawanie nowych użytkowników, podłączanie nośników zewnętrznych, kontrolowanie głośności urządzenia i wyłączanie paska statusu:</span></p>
<pre><span style="font-weight: 400;">private fun setRestrictions(disallow: Boolean) {</span>
<span style="font-weight: 400;">        setUserRestriction(UserManager.DISALLOW_FACTORY_RESET, disallow)</span>
<span style="font-weight: 400;">        setUserRestriction(UserManager.DISALLOW_ADD_USER, disallow)</span>
<span style="font-weight: 400;">        setUserRestriction(UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA, disallow)</span>
<span style="font-weight: 400;">        setUserRestriction(UserManager.DISALLOW_ADJUST_VOLUME, disallow)</span>
<span style="font-weight: 400;">        mDevicePolicyManager.setStatusBarDisabled(mAdminComponentName, disallow)</span>
<span style="font-weight: 400;">    }
</span><span style="font-weight: 400;">private fun setUserRestriction(restriction: String, disallow: Boolean) = if (disallow) {</span>
<span style="font-weight: 400;">        mDevicePolicyManager.addUserRestriction(mAdminComponentName, restriction)</span>
<span style="font-weight: 400;">    } else {</span>
<span style="font-weight: 400;">        mDevicePolicyManager.clearUserRestriction(mAdminComponentName, restriction)</span>
<span style="font-weight: 400;">    }</span></pre>
<p><span style="font-weight: 400;">Jeżeli chcemy, aby nasza aplikacja startowała wraz ze startem systemu, to musimy dodać odpowiednie filtry:</span></p>
<pre><span style="font-weight: 400;">private fun setAsHomeApp(enable: Boolean) {</span>
<span style="font-weight: 400;">        if (enable) {</span>
<span style="font-weight: 400;">            val intentFilter = IntentFilter(Intent.ACTION_MAIN).apply {</span>
<span style="font-weight: 400;">                addCategory(Intent.CATEGORY_HOME)</span>
<span style="font-weight: 400;">                addCategory(Intent.CATEGORY_DEFAULT)</span>
<span style="font-weight: 400;">            }</span>
<span style="font-weight: 400;">            mDevicePolicyManager.addPersistentPreferredActivity(</span>
<span style="font-weight: 400;">                    mAdminComponentName, intentFilter, ComponentName(packageName, MainActivity::class.java.name))</span>
<span style="font-weight: 400;">        } else {</span>
<span style="font-weight: 400;">            mDevicePolicyManager.clearPackagePersistentPreferredActivities(</span>
<span style="font-weight: 400;">                    mAdminComponentName, packageName)</span>
<span style="font-weight: 400;">        }</span>
<span style="font-weight: 400;">    }</span></pre>
<p><span style="font-weight: 400;">W celu uruchomienia aplikacji w trybie pełnoekranowym należy dodać odpowiednie flagi:</span></p>
<pre><span style="font-weight: 400;">private fun setImmersiveMode(enable: Boolean) {</span>
<span style="font-weight: 400;">        if (enable) {</span>
<span style="font-weight: 400;">            val flags = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE</span>
<span style="font-weight: 400;">                    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION</span>
<span style="font-weight: 400;">                    or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN</span>
<span style="font-weight: 400;">                    or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION</span>
<span style="font-weight: 400;">                    or View.SYSTEM_UI_FLAG_FULLSCREEN</span>
<span style="font-weight: 400;">                    or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY</span>
<span style="font-weight: 400;">                    )</span>
<span style="font-weight: 400;">            window.decorView.systemUiVisibility = flags</span>
<span style="font-weight: 400;">            window.decorView.setOnSystemUiVisibilityChangeListener {</span>
<span style="font-weight: 400;">                window.decorView.systemUiVisibility = flags;</span>
<span style="font-weight: 400;">            }</span>
<span style="font-weight: 400;">        } else {</span>
<span style="font-weight: 400;">            val flags = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE</span>
<span style="font-weight: 400;">                    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION</span>
<span style="font-weight: 400;">                    or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)</span>
<span style="font-weight: 400;">            window.decorView.systemUiVisibility = flags</span>
<span style="font-weight: 400;">        }</span>
<span style="font-weight: 400;">    }</span></pre>
<p><span style="font-weight: 400;">Na koniec używamy metod startLockTask() i stopLockTask(), aby włączyć/wyłączyć tryb blokady zadań:</span></p>
<pre><span style="font-weight: 400;">private fun setLockTask(start: Boolean, isAdmin: Boolean) {</span>
<span style="font-weight: 400;">        if (isAdmin) {</span>
<span style="font-weight: 400;">            mDevicePolicyManager.setLockTaskPackages(</span>
<span style="font-weight: 400;">                    mAdminComponentName, if (start) arrayOf(packageName) else arrayOf())</span>
<span style="font-weight: 400;">        }</span>
<span style="font-weight: 400;">        if (start) {</span>
<span style="font-weight: 400;">            startLockTask()</span>
<span style="font-weight: 400;">        } else {</span>
<span style="font-weight: 400;">            stopLockTask()</span>
<span style="font-weight: 400;">        }</span>
<span style="font-weight: 400;">    }</span></pre>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<h2><span style="color: #800080;"><b>Wynik</b></span></h2>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />Powyższe operacje pozwalają zmienić urządzenie z systemem Android w urządzenie dedykowane, działające w trybie pełnoekranowym i uniemożliwiające użytkownikowi korzystanie z innych funkcjonalności. Na potrzeby egzemplifikacji naszej sprawy wykorzystaliśmy opracowaną w naszej firmie aplikację mobilną do <a href="https://inero-software.com/pl/zarzadzanie-lancuchem-dostaw/">zarządzania łańcuchem dostaw</a>. Aplikacja ta jest częścią platformy <a href="https://deliverm8.com/">DeliverM8</a>, którą opracowaliśmy w celu optymalizacji i planowania zadań związanych z zarządzaniem łańcuchem dostaw dla <a href="https://inero-software.com/pl/deliverm8-dostawa-ostatniej-mili/">Dostawy Ostatniej Mili</a>. Wracając do tematu, efekt końcowy wygląda następująco:</span></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-3356 size-full" src="https://inero-software.com/wp-content/uploads/2021/03/deliverM8-kiosk.png" alt="Android Kiosk mode visualisation" width="441" height="864" srcset="https://inero-software.com/wp-content/uploads/2021/03/deliverM8-kiosk.png 441w, https://inero-software.com/wp-content/uploads/2021/03/deliverM8-kiosk-153x300.png 153w" sizes="(max-width: 441px) 100vw, 441px" /></p>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<h2><span style="color: #800080;"><b>Podsumowanie</b></span></h2>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<p><span style="font-weight: 400;">W tym wpisie pokazaliśmy jak szybko skonfigurować aplikację mobilną, aby uzyskać jednocelowe urządzenie, które w jak największym stopniu spełnia nasze potrzeby. Korzystanie z Kiosk Mode niesie za sobą wiele korzyści, takich jak zwiększenie bezpieczeństwa czy ograniczenie dostępu do niepożądanych funkcjonalności, stworzenie rozwiązania dostosowanego zarówno do potrzeb pracowników (zarządzanie zasobami, zarządzanie <a href="https://inero-software.com/pl/rozwiazania-logistyczne/">transportem i logistyką</a>) jak i klientów.<br />
</span></p>
<p>&nbsp;</p>
<p><a href="https://inero-software.com/pl/"><span style="color: #800080;"><strong>Inero Software</strong></span></a> oferuje wiedzę i doświadczenie w zakresie skutecznego wykorzystywania najnowocześniejszych technologii i danych do kształtowania korporacyjnych produktów cyfrowych przyszłości.</p>
<p>W sekcji <a href="https://inero-software.com/pl/category/firma/"><span style="color: #800080;"><strong>BLOG</strong></span></a> można znaleźć inne artykuły dotyczące nowoczesnych rozwiązań dla przedsiębiorstw.</p>
<p>&nbsp;</p>
<p></p></div><div class="col-sm-1"></div></div>
<p>Artykuł <a href="https://inero-software.com/pl/android-kiosk-mode/">Adroid Kiosk Mode &#8211; jak zmienić urządzenie z Androidem w urządzenie do dedykowanego użytku</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4354</post-id>	</item>
	</channel>
</rss>
