<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Maritzag</title>
    <description>The latest articles on DEV Community by Maritzag (@maritzag).</description>
    <link>https://dev.to/maritzag</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F307797%2Fb1fd08a4-2ca4-4485-b4af-31b14ec86177.jpeg</url>
      <title>DEV Community: Maritzag</title>
      <link>https://dev.to/maritzag</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maritzag"/>
    <language>en</language>
    <item>
      <title>Ejecutar un Stored Procedure de Oracle desde Data Factory</title>
      <dc:creator>Maritzag</dc:creator>
      <pubDate>Fri, 08 Jan 2021 00:59:34 +0000</pubDate>
      <link>https://dev.to/maritzag/ejecutar-un-stored-procedure-de-oracle-desde-data-factory-2jcp</link>
      <guid>https://dev.to/maritzag/ejecutar-un-stored-procedure-de-oracle-desde-data-factory-2jcp</guid>
      <description>&lt;p&gt;En el momento de la publicación de este tutorial, Data Factory no tiene un conector que permita ejecutar un stored procedure en una base de datos oracle. En este tutorial mostraremos cómo a través de una actividad lookup de un pipeline de Data Factory lograremos ejecutar un Stored Procedure o instrucciones DML en Oracle.&lt;/p&gt;

&lt;h1&gt;
  
  
  Prerrequisitos
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.microsoft.com/es-es/azure/data-factory/quickstart-create-data-factory-portal#create-a-data-factory"&gt;Crear un recurso de Data Factory&lt;/a&gt; en el &lt;a href="//portal.azure.com"&gt;Portal de Azure&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Pasos
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;1. Crear una actividad &lt;a href="https://docs.microsoft.com/en-us/azure/data-factory/control-flow-lookup-activity"&gt;Lookup&lt;/a&gt;.&lt;/strong&gt;&lt;br&gt;
De acuerdo con la documentación oficial una actividad Lookup nos permite recuperar un dataset de cualquiera de los orígenes de datos compatibles con Azure Data Factory. &lt;br&gt;
Como podemos observar la actividad está diseñada para consultar una tabla o la ejecución de una sentencia SELECT de oracle.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i6MXmZ4X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1x9a0fangrfz8lm05m8u.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i6MXmZ4X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1x9a0fangrfz8lm05m8u.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
En Query podemos especificar cualquier instrucción SQL, sin embargo, si la sentencia no es un SELECT válido, Data Factory intentará ejecutar las instrucciones en la base de datos Oracle pero al no recibir el resultado de una consulta, generará un error así haya ejecutado correctamente las instrucciones del query en el servidor de la base de datos.&lt;br&gt;
&lt;strong&gt;2. Crear una sentencia SELECT sobre la tabla &lt;a href="https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries009.htm#:~:text=DUAL%20is%20a%20table%20automatically,row%20with%20a%20value%20X%20."&gt;DUAL&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Debido a que los Stored Procedures no se pueden ejecutar dentro de una sentencia SELECT. Debemos crear una función en Oracle que se encargue de ejecutar el procedimiento. &lt;br&gt;
&lt;strong&gt;2.1 Ejecución de una función Oracle desde el query de una actividad de Lookup.&lt;/strong&gt;&lt;br&gt;
Antes de ejecutar el procedimiento almacenado, revisemos el proceso de ejecutar una función en oracle desde Data Factory empleando la tabla DUAL.&lt;br&gt;
Para esto, hemos creado una función en Oracle que cuenta el número de registros de la tabla EMPLEADOS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;--Tabla&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;empleados&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="n"&gt;emp_id&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
   &lt;span class="n"&gt;nombre&lt;/span&gt; &lt;span class="n"&gt;VARCHAR2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
   &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="n"&gt;empleados_pk&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emp_id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;--Función&lt;/span&gt;
&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="k"&gt;replace&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;func_contar_empleados&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt; 
&lt;span class="k"&gt;is&lt;/span&gt;
   &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;begin&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="n"&gt;emp_id&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;empleados&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;loop&lt;/span&gt;
        &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="n"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En Data Factory configuramos el query agregando la siguiente consulta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;  &lt;span class="n"&gt;func_contar_empleados&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;DUAL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2wd7UcFi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jrvpyvsc6fog7ml1zejq.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2wd7UcFi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jrvpyvsc6fog7ml1zejq.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Al ejecutar el pipeline podemos verificar que la consulta se ejecutó correctamente. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F2fq_dKr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/542rkbmca9l69axjqrqj.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F2fq_dKr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/542rkbmca9l69axjqrqj.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;2.2 Ejecución de Stored Procedure a través de una Función Oracle.&lt;/strong&gt; &lt;br&gt;
Un &lt;a href="https://docs.oracle.com/cd/B28359_01/appdev.111/b28843/tdddg_procedures.htm"&gt;Stored Procedure de Oracle&lt;/a&gt; es un bloque de código PL/SQL que comunmente va a estar asociado a instrucciones DML.&lt;br&gt;
Para ejecutar el Sotred Procedure hemos creado una función en Oracle que recibe los parámetros y en su implementación hace el llamado al Stored Procedure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="k"&gt;replace&lt;/span&gt; &lt;span class="k"&gt;procedure&lt;/span&gt; &lt;span class="n"&gt;insert_empleado&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nombre&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;VARCHAR2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt;
 &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;empleados&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emp_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;Values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="k"&gt;replace&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;funcinsert_empleado&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nombre&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;VARCHAR2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;VARCHAR2&lt;/span&gt; 
&lt;span class="k"&gt;is&lt;/span&gt;
&lt;span class="k"&gt;begin&lt;/span&gt;
  &lt;span class="n"&gt;insert_empleado&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'done'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Siguiendo los pasos de ejecución de una función en Oracle usando la tabla DUAL, tendríamos la siguiente consulta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;  &lt;span class="n"&gt;funcinsert_empleado&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Roger Federer'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;DUAL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sin embargo, cuando intentamos ejecutar la instrucción obtenemos un error de Oracle que nos notifica que no podemos ejecutar operaciones DML dentro de una instrucción SELECT.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gOXV7jlJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qhgmozbrg6higmbplvva.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gOXV7jlJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qhgmozbrg6higmbplvva.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;2.3 Ejecutar una función Oracle como una transacción Autónoma.&lt;/strong&gt;&lt;br&gt;
Debido a que Oracle no permite por defecto la ejecución de instrucciones DML, debemos especificar que la ejecución de la función se realizará como una &lt;a href="https://docs.oracle.com/cd/B14117_01/appdev.101/b10807/13_elems002.htm"&gt;TRANSACCIÓN AUTONOMA&lt;/a&gt;.&lt;br&gt;
Las Transacciones autónomas van acompañadas de la cláusula AUTONOMOUS_TRANSACTION Pragma. Esta directiva cambia la manera como se ejecutan los subprogramas en una transacción.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="k"&gt;replace&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;funcinsert_empleado&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nombre&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;VARCHAR2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;VARCHAR2&lt;/span&gt; 
&lt;span class="k"&gt;is&lt;/span&gt;
&lt;span class="n"&gt;PRAGMA&lt;/span&gt; &lt;span class="n"&gt;AUTONOMOUS_TRANSACTION&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;begin&lt;/span&gt;
  &lt;span class="n"&gt;insert_empleado&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'done'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La solución aquí planteada permite ejecutar la función que ejecuta el procedimiento almacenado garantizando una transacción autónoma en la ejecución de las instrucciones DML.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;  &lt;span class="n"&gt;funcinsert_empleado&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Roger Federer'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;DUAL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con estos ajustes, Data Factory ya puede ejecutar la sentencia SELECT.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vLzmCpg1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/y7b3csjufi7wspg1ykfb.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vLzmCpg1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/y7b3csjufi7wspg1ykfb.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Tenga en cuenta que, al ejecutar la consulta desde Data Factory, el id del empleado que está pasando como parámetro no se encuentre registrado en la tabla EMPLEADOS, ya que esto generaría un error de primary key. &lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusiones
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Este tutorial muestra cómo usar la actividad de Lookup de Data Factory para ejecutar un Stored Procedure o instrucciones DML en una base de datos de Oracle. &lt;/li&gt;
&lt;li&gt;Si tiene varios Stored Procedures podría definir condicionales dentro de la función que se llama desde la instrucción SELECT y dependiendo de un parámetro, determinar qué Stored Procedure ejecutar.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  ¡Gracias por leer!
&lt;/h1&gt;

&lt;p&gt;Si tienes una duda, no dudes en escribir.&lt;br&gt;
&lt;a href="//www.twitter.com/maritzag_123"&gt;maritzag&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>storedprocedure</category>
      <category>datafactory</category>
      <category>pipeline</category>
    </item>
    <item>
      <title>Crear un clasificador de imágenes usando Custom Vision</title>
      <dc:creator>Maritzag</dc:creator>
      <pubDate>Wed, 15 Apr 2020 23:20:05 +0000</pubDate>
      <link>https://dev.to/maritzag/crear-un-clasificador-de-imagenes-usando-custom-vision-305p</link>
      <guid>https://dev.to/maritzag/crear-un-clasificador-de-imagenes-usando-custom-vision-305p</guid>
      <description>&lt;p&gt;En esta guía se mostrará como emplear &lt;a href="https://www.customvision.ai/"&gt;Custom Vision&lt;/a&gt; para la creación de un clasificador de imágenes. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Prerrequisitos&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;• Imágenes para entrenar y probar el clasificador. Puedes descargar las imágenes empleadas en este tutorial &lt;a href="https://github.com/Maritzag/devto/tree/master/contenido%20dev_to/1.customvision/imgs_recycling"&gt;aquí&lt;/a&gt;.&lt;br&gt;
• Cuenta en azure, sino tiene solicite una cuenta de acceso gratuito &lt;a href="https://azure.microsoft.com/es-es/free/?WT.mc_id=A261C142F"&gt;aquí&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Portal Custom Vision&lt;/strong&gt;&lt;br&gt;
Inicie sesión en la página web de &lt;a href="https://www.customvision.ai/"&gt;Custom Vision&lt;/a&gt; con su cuenta de Azure. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wnmqDSdh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ewzv7j969rhcmwu9vl3x.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wnmqDSdh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ewzv7j969rhcmwu9vl3x.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Pasos&lt;/strong&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Crear Proyecto
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Seleccione la opción &lt;strong&gt;Nuevo Proyecto&lt;/strong&gt; en el área de trabajo que se muestra cuando inicia sesión. &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e7FKbJi---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/uhzif3gfqyeca48e157u.PNG" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;li&gt;Especifique el &lt;strong&gt;nombre&lt;/strong&gt;, &lt;strong&gt;descripción&lt;/strong&gt; y &lt;strong&gt;recurso de custom vision&lt;/strong&gt; del proyecto. El &lt;strong&gt;recurso&lt;/strong&gt; hace referencia a un elemento administrable que se gestiona a través de Azure Portal. 
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--soelfMev--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zwiaxiw2o0qyiocsh480.PNG" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;li&gt;Si no tiene un recurso de custom vision creado, podrá crear uno nuevo desde la creación del proyecto. Para la creación del nuevo recurso se debe especificar el &lt;strong&gt;nombre&lt;/strong&gt;, &lt;strong&gt;suscripción&lt;/strong&gt;, &lt;strong&gt;grupo de recursos&lt;/strong&gt;, &lt;strong&gt;tipo&lt;/strong&gt;, entre otros.  La suscripción hace referencia al método de pago empleado para pagar los servicios de azure, el &lt;strong&gt;grupo de recursos&lt;/strong&gt; corresponde a un contenedor que agrupa los recursos de una solución y el tipo representa en este caso, un servicio de entrenamiento y predicción.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Bpl4po96--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fc3pvzv7d6wdy2zzyeqr.PNG" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;li&gt;Si no tiene grupos de recursos creados, podrá crearlos desde este panel o podría ir directamente a Azure Portal para hacerlo. Si crea el grupo desde este panel solo tendrá que especificar el nombre y la ubicación geográfica en dónde lo desplegará.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8OLS99lW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/n38r6gmg1ckzjcxunv3k.PNG" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;li&gt;Una vez haya creado el grupo de recursos, podrá seleccionarlo en la creación del proyecto y podrá realizar la configuración del tipo de clasificador que desea.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ty8gEM2s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qlirg9igh16fa23m3z8s.PNG" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;li&gt;Para la configuración del proyecto seleccione &lt;strong&gt;Clasificación&lt;/strong&gt; en &lt;strong&gt;Tipos de Proyecto&lt;/strong&gt;. En &lt;strong&gt;Tipos de clasificación&lt;/strong&gt; seleccione &lt;strong&gt;Multinivel&lt;/strong&gt; si cada imagen puede pertenecer a varias clases o etiquetas, en caso contrario, elija &lt;strong&gt;Multiclase&lt;/strong&gt;, para este tipo se considera que cada imagen solo puede estar asociada a una clase. El tipo de clasificación puede ser modificado en cualquier momento.&lt;/li&gt;
&lt;li&gt;El dominio es un parámetro empleado para optimizar el clasificador. Así, cada dominio ejecturá una versión optimizada para el tipo de imágenes que está procesando. Si no está seguro el domino al que pertenecen las imágenes, seleccione &lt;strong&gt;General&lt;/strong&gt;. Los dominios compactos permiten exportar el modelo del entrenamiento.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Selección de imágenes de entrenamiento.
&lt;/h2&gt;

&lt;p&gt;La selección de imágenes para entrenamiento debe considerar una serie de requerimientos básicos para que el clasificador esté en la capacidad de identificar variaciones de la forma estandar del objeto u objetos contenidos en las imágenes. En este sentido, se recomienda tener el mayor número de imágenes disponibles de cada clase, de tal manera que representen diferentes características como ángulos de cámara, iluminación, fondo, tamaño, número de objetos o personas, entre otras. &lt;/p&gt;

&lt;p&gt;Adicionalmente, se debe garantizar que las imágenes tienen un tamaño menor a 6MB y corresponden a un formato .jpg, .png, .bmp o .gif&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Carga de las imágenes con sus etiquetas.
A través del portal se podrá cargar y etiquetar manualemente las imágenes para el entrenamiento del clasificador. 
Para agregar las imágenes haga click en el botón &lt;strong&gt;Adicionar imágenes&lt;/strong&gt; o &lt;strong&gt;+&lt;/strong&gt; como se indica en la siguiente figura. 
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IUrIkbte--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4llvyzxtbcydcmsiadwy.PNG" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;li&gt;Vaya a la carpeta en dónde se encuentren las imágenes, seleccionelas y haga click en &lt;strong&gt;abrir&lt;/strong&gt; para agregar las imágenes. 
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hoVUApxT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/59xwwfro9xyifec4nhve.PNG" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;li&gt;Especifique la o las etiquetas (clases) de las imágenes seleccionadas. Tenga en cuenta que, si en su problema de clasificación cada imagen solo puede tener una etiqueta, deberá realizar el proceso de agregar y etiquetar las imágenes por cada etiqueta. Para agregar una etiqueta escriba la descripción en la caja de texto marcada con el cuadro rojo y presione &lt;strong&gt;enter&lt;/strong&gt;.  Cuando haya agregado todas las etiquetas, haga click en &lt;strong&gt;Cargar archivos&lt;/strong&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V_iGHs64--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/a8nc6f3jkpuo4fv6hgqn.PNG" alt="Alt Text"&gt;
Una vez las imágenes se han cargado, tendrá la siguiente notificación
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1Y5JVFkY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wi76uvx3y6frnjox0x7v.PNG" alt="Alt Text"&gt;
Cuando haya cargado todas las imágenes, podrá usar las opciones marcadas con el cuadro rojo de la izquiera para conusltar las imágenes de cada etiqueta, agregar etiquetas o consultar las imágenes sin etiqueta. Con las opciones marcadas por el cuadro rojo superior, podrá agregar imágenes, borrar imágenes, etiquetar las imágenes seleccionadas o quitar la selección de las imágenes.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O_RuvPUE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xefsd3gnyiylk9r83cw3.PNG" alt="Alt Text"&gt; &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Entrenamiento del Clasificador
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Para entrenar el modelo de clasificación haga click en &lt;strong&gt;Entrenar&lt;/strong&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_9UGrojH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3b1m2whej3j3q96ow629.PNG" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;li&gt;En el cuadro de dialogo que aperece, seleccione entrenamiento rápido y haga click en &lt;strong&gt;Entrenar&lt;/strong&gt; 
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fOTlPLH9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u56ihr4g4r5u1cpfkg9m.PNG" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Evaluación del Clasificador
&lt;/h2&gt;

&lt;p&gt;Los resultados del entrenamiento son presentados en términos de 3 métricas de clasificación de Aprendizaje de Máquina. Precisón, Recall y AP. Las tres métricas buscan evaluar la confiabilidad del modelo de clasificación. Adicionalmente, cada vez que se agreguen nuevas imágenes al clasificador, se podrá volver a evalular el modelo y el resultado será una nueva iteración. Cada iteración podrá ser publicada para que sea consultada como servicio por cualquier aplicación a través de la opción &lt;strong&gt;Publicar&lt;/strong&gt; mostrada en el cuadro rojo superior.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gi-BJEXO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b79efkepvz2ygdetnfk6.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gi-BJEXO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b79efkepvz2ygdetnfk6.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Una vez seleccione la opción &lt;strong&gt;Publicar&lt;/strong&gt;, se desplegará un cuadro de dialogo en el que se debe especificar el nombre de la iteración, el recurso de Azure en el que se desplegará y posteriormente debe dar click en la opción &lt;strong&gt;Publicar&lt;/strong&gt;.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FNQrhuxZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4fi7wsy8m8fpl2jzxvqi.PNG" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;li&gt;Para consultar la información del servicio, haga click en el icono de configuración y se desplegará la información de la configuración del proyecto y los datos de &lt;em&gt;Clave de Aplicación&lt;/em&gt; y &lt;em&gt;Endpoint&lt;/em&gt; que permiten consultar el servicio.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TWGbU7tB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/54hgp607oit55a7dcje8.PNG" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Probar el servicio
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Para probar el servicio, haga click en el botón &lt;strong&gt;Test rápido&lt;/strong&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iuhh2tOc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5d2b1qo3yy73cnz105mh.PNG" alt="Alt Text"&gt;
Se desplegará un cuadro de dialogo en el que podrá seleccionar una imagen para probar el clasificador por medio de una URL o un archivo local. &lt;/li&gt;
&lt;li&gt;Adicionalmente, podrá seleccionar la iteración que desea emplear para la consulta.
Una vez se consulta la imagen, el servicio se prueba y se despliegan los porcentajes de probabilidad de la imagen para cada clase o etiqueta. 
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--64vYSE8i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/a6ecpy5j0e1jp7tfq3ug.PNG" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Siguiente paso&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Crea tu propio clasificador de imágenes. &lt;/p&gt;

&lt;p&gt;¡Gracias por leer!&lt;br&gt;
Si tienes una duda, no dudes en contactarme.&lt;/p&gt;

&lt;p&gt;Nos vemos en &lt;a href="//www.twitter.com/maritzag_123"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>customvision</category>
      <category>machinelearning</category>
      <category>cognitiveservices</category>
      <category>azure</category>
    </item>
  </channel>
</rss>
