<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Lucas Lacerda on Medium]]></title>
        <description><![CDATA[Stories by Lucas Lacerda on Medium]]></description>
        <link>https://medium.com/@lucaaslb?source=rss-5685f8a5e094------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/2*CiWF0KYT0MYWexR80z85IQ.jpeg</url>
            <title>Stories by Lucas Lacerda on Medium</title>
            <link>https://medium.com/@lucaaslb?source=rss-5685f8a5e094------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Tue, 19 May 2026 06:55:37 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@lucaaslb/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Deep Learning & Visão computacional: REDES NEURAIS CONVOLUCIONAIS]]></title>
            <link>https://medium.com/@lucaaslb/deep-learning-vis%C3%A3o-computacional-redes-neurais-convolucionais-c21f19f5ec34?source=rss-5685f8a5e094------2</link>
            <guid isPermaLink="false">https://medium.com/p/c21f19f5ec34</guid>
            <category><![CDATA[neural-networks]]></category>
            <category><![CDATA[convolutional-neural-net]]></category>
            <category><![CDATA[convolutional-network]]></category>
            <category><![CDATA[inteligência-artificial]]></category>
            <category><![CDATA[deep-learning]]></category>
            <dc:creator><![CDATA[Lucas Lacerda]]></dc:creator>
            <pubDate>Sun, 11 Aug 2019 02:51:11 GMT</pubDate>
            <atom:updated>2019-09-22T16:55:50.405Z</atom:updated>
            <content:encoded><![CDATA[<h3>Deep Learning &amp; Visão Computacional — REDES NEURAIS CONVOLUCIONAIS</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uiV3lcZtMhhy1dfm_V841w.jpeg" /><figcaption><a href="http://scs.ryerson.ca/~aharley/vis/conv/flat.html">http://scs.ryerson.ca/~aharley/vis/conv/flat.html</a></figcaption></figure><p>Passei o primeiro semestre de 2019 preso em casa e na faculdade estudando sobre Redes Neurais Convolucionais porque precisava apresentar dois trabalhos com esse tema em disciplinas distintas, acabei que gostando bastante de trabalhar com Deep Learning e Visão Computacional. Fizemos um projeto para reconhecimento de dígitos do alfabeto em LIBRAS, para o primeiro contato com a área ficou bem apresentável e funcionando como queríamos. O código esta disponível no meu <a href="https://github.com/lucaaslb/cnn-libras">Github</a>.</p><p>Nesse post vou explicar sobre o funcionamento dessa arquitetura de redes neurais passando pelo funcionamento de todas as camadas.</p><p>Levando em consideração que já existe um breve conhecimento sobre o funcionamento de Redes Neurais Multicamadas (<strong>Multi Layer Perceptron — MLP</strong>), aquelas que dão o nome da área de Deep Learning por possuírem uma ou mais camadas ocultas (profundas) entre a camada de entrada e camada de saída, podemos anotar que Redes Neurais Convolucionais (<strong>Convolutional Neural Network — CNN</strong>) segue essa arquitetura porem incluindo as camadas de convolução no seu processamento.</p><h4>Perceptron Multi Camadas X Redes Neurais Convolucionais</h4><p>As CNN estão incluídas na área de visão computacional por serem utilizadas para o reconhecimento de padrões e classificações de imagens. Para analisar uma imagem uma CNN trabalha com os chamados<em> Campos Receptivos, </em>que tem como base o funcionamento do <a href="https://super.abril.com.br/saude/um-jogo-de-montar-a-visao/"><em>córtex visual biológico</em></a><em>. </em>A ideia é poder analisar a imagem em pequenos pedaços processando pixels em neurônios diferentes sabendo manter a proximidade espacial dos pixels para capturar traços e detalhes importantes. Já uma MLP não leva em consideração a estrutura espacial e trata os pixels de entrada no mesmo nível independente da distância entre eles.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*IRWubxyZqxv48F2q3ExCeA.jpeg" /><figcaption>Fonte: Aula sobre redes neurais convolucionais Parte I — Fundamentos, <a href="http://www.inf.ufg.br/~anderson/deeplearning">www.inf.ufg.br/~anderson/deeplearning</a>, 2018</figcaption></figure><p>Na imagem podemos observar neurônios da camada de entrada de uma MLP analisando uma imagem 200x200 e apenas nessa camada teremos 40000 neurônios e 1,6 bilhões de parâmetros a serem aprendidos/computados, já na CNN é aplicado um filtro 5x5 criando 100 campos receptivos e 2500 parâmetros. Se o tamanho da imagem fosse 1000x1000, em um MLP precisaríamos de 10⁶ neurônios na camada de entrada, isso é um numero muito alto e acaba se tornando o processamento ineficaz.</p><h3>Estrutura: Como a rede funciona ?</h3><p>Podemos dividir a estrutura da CNN em dois blocos, o primeiro é o bloco de extração de características onde existe as camadas de convolução e camadas de pooling o segundo é o bloco de classificação onde possui os camadas totalmente conectadas que se comportam igual a uma MLP.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/850/0*02hsPPOkvJ9ONkCx.png" /></figure><h4>Extração de características: Convolução</h4><p>A camada de convolução é composta por diversos neurônios, onde cada um é responsável por aplicar um filtro, chamado de <a href="https://en.m.wikipedia.org/wiki/Kernel_(image_processing)">kernel</a>, que é uma matriz de convolução responsável para a detecção de bordas, características e traços importantes na imagem. Cada matriz possui valores dos pesos sinápticos da rede e ao percorrer toda a imagem, é gerado uma nova imagem com o nome de mapa de características.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*GA39f62D8ahn0pod" /><figcaption>Exemplo de uma operação de convolução</figcaption></figure><p><a href="http://setosa.io/ev/image-kernels/">Esse site possui um modo interativo para entender como o kernel trabalha, é possível simular valores dos pesos e ver a nova imagem gerada.</a></p><p>Quando você esta criando a estrutura da rede, na convolução é necessário passar alguns parâmetros e inicialmente existem 3 parâmetros importantes para serem usados. São eles o tamanho da matriz do <em>kernel</em>, o salto (<em>stride</em>) e o preenchimento de zero (<em>zero padding</em>).</p><p>O salto é a quantidade de colunas/linhas de pixels que o kernel deve ‘saltar’ ao percorrer a imagem. O preenchimento de zero serve para que as camadas não diminuam muito mais rápido do que é necessário para o aprendizado. Para entender para que ele serve, imagine que enquanto o kernel varre a imagem pulando os pixels de acordo com o valor do salto, possivelmente, pelos valores de tamanho de cada um, alguma coluna ou linha de pixel será perdida e não será analisada. O padding adiciona borda na imagem com valores 0 para não ter interferência no resultado da convolução e o kernel poder analisar toda a imagem.</p><blockquote>Uma imagem gera um conjunto de imagens.</blockquote><p>Com o intuito de obter mais características da imagem original, no kernel é definido uma dimensão, essa dimensão representa quantas vezes o kernel deve percorrer a imagem. Cada vez que é feito uma convolução na imagem é gerado um mapa de características diferente, isso porque os pesos sinápticos podem ser melhorados e em cada mapa conter valores diferentes para a precisão da rede.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*kz_3ms_FSj7wOlqA" /><figcaption>Exemplo de imagem RGB com o Kernel = 3x3, Stride = 1, Zero Padding 1x1. Note que o kernel passa por todos os canais de cor da imagem e em cada um possui pesos diferentes realizando a convolução e gerando o mapa de características.</figcaption></figure><p>Como em toda Rede Neural, a saída do neurônio passa por uma função de ativação. A função de ativação é uma função com grau de não-linearidade. Presente em cada neurônio, ela é responsável por aplicar uma transformação nos dados recebidos.</p><p>De acordo com a literatura, as funções de ativação mais comumente utilizada em uma MLP são a ReLU (unidade linear retificada), <em>Leaky</em> ReLU e Tanh (Tangente hiperbólica). Cada função possui uma particularidade para otimizar o treinamento, podendo desativar neurônios que podem não ser influentes para o aprendizado do neurônios da camada seguinte. Essas funções de ativação devem ser utilizadas nas camadas ocultas.</p><h4>Extração de características: Polling</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/521/0*HLMPzZEsC4jdmRuU" /><figcaption>Imagem de entrada 28x28, após passar por uma convolução e gerar 3 mapas de features com tamanho 24x24 é passado por um pooling 2x2 gerando os mesmo 3 mapas de features resumidos 12x12.</figcaption></figure><p>Após uma camada de convolução ainda no bloco de extração de características, pode-se aplicar uma camada de pooling. Essa camada ajuda a diminuir a quantidade de parâmetros para a próxima camada de convolução ou para as camadas totalmente conectadas. A camada de pooling serve para simplificar a informação e reduzir a dimensionalidade da convolução. Essa redução é importante por questão de agilidade no treinamento. O pooling também possui uma matriz que percorre o mapa de características<em> </em>gerado pela convolução e prepara um mapa de características<em> </em>condensadas. Possui alguns métodos de ativação que podem ser aplicados, onde os mais utilizados são <em>Max Pooling</em> e <em>Average Pooling</em>. Cada neurônio da camada de pooling pode resumir uma região de neurônios da camada de convolução. Utilizando a função de <em>max pooling,</em> por exemplo, um neurônio gera a ativação máxima na região aplicada.</p><h4><strong>Classificação</strong>: Camadas totalmente conectadas</h4><p>Pertencendo ao bloco de classificação, existe a camada totalmente conectada, é uma camada semelhante a uma MLP, onde os neurônios têm conexões completas com todos os neurônios ativados da camada anterior. Sua entrada é a saída da camada anterior, que possui informações das características da imagem e sua saída são N neurônios, com N sendo a quantidade de classes do seu modelo para finalizar a classificação. A função de ativação <em>Softmax</em> pode ser utilizada nessa etapa por ser uma função de classificação que deve ser aplicada na camada de saída da rede. A vantagem do uso da s<em>oftmax</em> é o intervalo de probabilidade de saída com valores entre 0 e 1. Por exemplo, para as saídas como [1.2, 0.9, 0.75] quando aplicamos a função <em>softmax</em>, obteríamos [0.42, 0.31, 0.27] e isso essencialmente dá a probabilidade de identificar qual classe pertence a imagem de entrada.</p><p>A primeira rede neural convolucional implementada e testada com sucesso foi abordada no artigo <em>‘Gradient-based learning applied to document recognition’ </em>escrito por Yann LeCun em 1998, LeCun publicou sua rede neural convolucional para o problema de reconhecimento de dígitos manuscritos, utilizando o dataset <strong><em>MNIST</em></strong>. Existem diferentes arquiteturas que repetem e combinam as camadas do bloco de extração de características para melhorar performance e resultados, a LeNet-5 (LeCun et al., 1998) possui duas camadas de convolução seguidas por camadas de <em>pooling</em> e duas camadas completamente conectadas. Uma versão da denominada GoogLeNet (<em>Inception</em>) segue a arquitetura da LeNet-5 porém conta com mais três camadas de convolução seguidas do <em>pooling</em>.</p><p>O <em>Deep Learning Book </em>em seu capítulo sobre arquitetura de redes neurais possui um trecho interessante sobre a primeira CNN de Yan LeCun: <em>“Em 1998, </em><a href="http://yann.lecun.com/"><em>Yann LeCun</em></a><em> e seus colaboradores desenvolveram um reconhecedor, realmente bom, para dígitos manuscritos chamado </em><a href="http://yann.lecun.com/exdb/lenet/"><em>LeNet</em></a><em>. Ele usou o backpropagation em uma rede feedforward com muitas camadas ocultas, muitos mapas de unidades replicadas em cada camada, agrupando as saídas de unidades próximas, formando uma rede ampla que pôde lidar com vários caracteres ao mesmo tempo, mesmo se eles se sobrepõem. Mais tarde, esta arquitetura foi formalizada sob o nome de redes neurais convolucionais”.</em> A figura abaixo ilustra a estrutura da rede LeNet-5.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/850/0*0tWZpwMRu8ehiUQp" /><figcaption>Arquitetura da LeNet-5</figcaption></figure><p>Decidi escrever essa publicação para registrar o que estudei e entendi sobre as CNN, esperando espalhar o conhecimento e incentivando o uso dessa arquitetura de redes neurais para aumentar os resultados em tecnologias que trabalham com visão computacional. Existem algumas bibliotecas com funções prontas para trabalhar de modo fácil com redes neurais, como por exemplo o Tensorflow, o Keras e o PyTorch. Mas anoto que alguns conceitos matemáticos são sempre bem vindos no conhecimento caso queria desenvolver sua arquitetura, manipular parâmetros e entender melhor os resultados.</p><h4>Referências</h4><p><a href="http://deeplearningbook.com.br/as-10-principais-arquiteturas-de-redes-neurais">AS 10 PRINCIPAIS ARQUITETURAS DE REDES NEURAIS. DEEP LEARNING BOOK.</a></p><p><a href="http://datascienceacademy.com.br/blog/o-que-e-visao-computacional/">O QUE É VISÃO COMPUTACIONAL?</a></p><p><a href="http://cs231n.github.io/convolutional-networks">CONVOLUTIONAL NEURAL NETWORKS FOR VISUAL RECOGNITION.</a></p><p><a href="http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf">LECUN, Y.; BOTTOU, L.; BENGIO, Y. Gradient-based learning applied to nndocument recognition: vol. 86, no. 11, p. 2278–2324: Proceedings of the IEEE, 1998.</a></p><p><a href="https://www.alura.com.br/curso-online-deep-learning-introducao-com-keras">DEEP LEARNING PARTE 1: INTRODUÇÃO COM KERAS.</a></p><p><a href="https://ai.googleblog.com/2014/09/building-deeper-understanding-of-images.html">BUILDING A DEEPER UNDERSTANDING OF IMAGES.</a></p><p>Espero que tenha achado esse post útil.<strong> Se você gostou deixe alguns claps de incentivo. </strong>Comentários com dicas e criticas são bem vindos!</p><blockquote><em>Até a próxima!</em></blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c21f19f5ec34" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Web Scraping com Python]]></title>
            <link>https://medium.com/@lucaaslb/web-scraping-com-python-ada1f5e3f921?source=rss-5685f8a5e094------2</link>
            <guid isPermaLink="false">https://medium.com/p/ada1f5e3f921</guid>
            <category><![CDATA[web-scraping]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[regex]]></category>
            <category><![CDATA[tutorial]]></category>
            <dc:creator><![CDATA[Lucas Lacerda]]></dc:creator>
            <pubDate>Tue, 22 Jan 2019 01:53:50 GMT</pubDate>
            <atom:updated>2019-07-21T13:05:28.294Z</atom:updated>
            <content:encoded><![CDATA[<p>Buscar informações em sites para análise de dados é uma pratica muito comum hoje em dia. Web Scraping é um processo de extração de dados de websites e sabendo obter e trabalhar com esses dados podemos fazer uma análise para observar padrões, tendências, armazenar informações em um banco de dados e até treinar nossos bots de machine learning …</p><p>Nesse tutorial irei mostrar como utilizar <strong>web scraping</strong> em <strong>python</strong> utilizando a biblioteca <strong>BeautifulSoup</strong> para obter a lista de filmes mais avaliados do site <strong>IMDB</strong> e salvar essa informação em um arquivo <strong>csv</strong>. Uma aplicação simples e rapida onde mostrarei como navegar entre tags html e seus atributos para obter o conteúdo que está armazenado no site.</p><h3>Direto ao ponto, vamos por as mãos na massa</h3><h4>Passo 1: Encontre a URL que você quer fazer o scrape</h4><p>É bom conhecer um pouco de html (tags e seus atributos) para localizar na pagina onde estarão as informações que precisamos. No nosso caso, no site <a href="https://www.imdb.com"><strong>IMDB</strong></a> na pagina de <a href="https://www.imdb.com/chart/top?ref_=nv_mv_250"><strong>Top Rated Movies</strong></a>, inspecionando os elementos da pagina pelo navegador encontrei o titulo do filme em uma tag <em>&lt;td&gt;</em> que pertence a classe ‘<em>titleColumn</em>’, o titulo em si esta dentro de uma tag <em>&lt;a&gt;</em> e temos o ano de lançamento em <em>&lt;span&gt;</em>, seguindo a mesma ideia, o valor IMDB Rating esta em <em>&lt;td class=’imdbRating’&gt; &lt;strong …&gt; &lt;/strong&gt; &lt;/td&gt; </em>— importante anotar isso para poder filtrar essa busca no código.</p><h4><strong>Passo 2: Instalando e testando a biblioteca</strong></h4><p>Começamos então fazendo o download da biblioteca que iremos utilizar para capturar dados de um site.</p><pre>$ pip install beautifulsoup4</pre><p>Quando finalizar a instalação, teste criando um arquivo <em>“teste-scraping.py”</em> com o exemplo:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/b3d4670fe57742fc29df3511c6a503e5/href">https://medium.com/media/b3d4670fe57742fc29df3511c6a503e5/href</a></iframe><p>A biblioteca <strong>urlopen</strong> é a responsável para baixar o html da url e depois criamos um objeto BeautifulSoup passando esse html no modo leitura.</p><p>Salve e execute o script em seu terminal. Na saída temos o titulo da pagina dentro de sua tag html…<br>Quando eu for salvar em meu arquivo csv eu quero apenas o titulo da pagina, a tag html não é uma coisa útil para mim nesse caso, somente o conteúdo dentro dela. Para isso eu vou incluir uma chamada de método no objeto BeautifulSoup.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e8cedf6bd4ebe1bc862925473071d1eb/href">https://medium.com/media/e8cedf6bd4ebe1bc862925473071d1eb/href</a></iframe><p>Executando dessa maneira consegui o que queria.</p><h4>Passo 3: Encontrando tag e percorrendo a lista</h4><p>Agora podemos buscar as tags que havíamos separado no primeiro passo e obter seus conteúdos. No BeautifulSoup temos o método <em>find_all</em> onde como parâmetro eu passo a tag que estou buscando e opcionalmente coloco a classe, assim podendo filtrar melhor nosso resultado. Após essa busca, faço um laço percorrendo a lista que foi criada recuperando seu conteúdo. Dessa maneira</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/47708c7ee670b390ce5b2c811a3c2ae4/href">https://medium.com/media/47708c7ee670b390ce5b2c811a3c2ae4/href</a></iframe><p>Como disse, o titulo do filme eu encontrei na tag &lt;a&gt; e o ano de lançamento na &lt;span&gt;, consigo percorrer a hierarquia dessa forma ‘<em>&lt;lista com a tag principal&gt;.&lt;tag que esta dentro da principal&gt;’. Ex: td.span.text.</em></p><p>Algumas tags possuem atributos e também conseguimos obter esses valores. Por exemplo, no html que estamos brincando, a informação da pontuação dos filme esta presente da na tag <em>&lt;td class=”imdbRating”&gt;&lt;</em><strong><em>strong</em></strong><em>&gt;9,2&lt;/..&gt;</em>, porem a tag <em>strong</em> possui o atributo <em>‘title’</em> e nele temos mais informações dos votos de usuários do site. Para obter essa informação podemos fazer assim:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/3cd2401e9fe48ea4354f1301aae4f28e/href">https://medium.com/media/3cd2401e9fe48ea4354f1301aae4f28e/href</a></iframe><h4>Passo 4: Adicionando Expressão Regular para separar informações</h4><p>Minha ideia é criar um arquivo csv com as informações separadas em colunas: ‘Titulo’, ‘Ano lançamento’, ‘IMDB Rating’ e ‘User Rating’. <br>As informações do ano de lançamento e as avaliações dos usuários obtidas no atributo ‘title’ no passo 3 possui mais informações do que eu preciso, se eu separar apenas os números ficará melhor para poder fazer uma analise para algo útil mais tarde. Minha solução foi importar a biblioteca <strong><em>‘re’</em></strong> para trabalhar com expressões regulares e tratar as strings obtidas, segue exemplo:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/5b7334f468ee28426ab4dd06114ad351/href">https://medium.com/media/5b7334f468ee28426ab4dd06114ad351/href</a></iframe><pre>regexMovieYear = re.compile(‘(\d{4})’)</pre><pre>regexUserRating = re.compile(‘\ ((\d{1,3})((\,|\.)\d{1,3})*)’)</pre><p>Analisando a string obtida, criei essas expressões regulares para obter a informação do ano de lançamento sem os <em>parênteses </em>e obter apenas a quantidade de votos dos usuários. Caso não conheça expressões regulares recomendo esse <a href="https://tableless.com.br/o-basico-sobre-expressoes-regulares/">guia inicial</a>. E <a href="https://docs.python.org/3/library/re.html">aqui</a> você encontra a documentação da biblioteca <strong>re</strong> que foi utilizada.</p><h4>Passo 5: Salvando arquivo csv</h4><p>Após todos os valores que precisava estarem salvos em suas respectivas variáveis, preciso apenas criar o arquivo csv com a biblioteca <strong>csv </strong>e escrever seus conteúdos. Deixo no código o comentário do que esta sendo feito, ele fica assim:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a44156e6ecf82048410efb2c30dcbe2d/href">https://medium.com/media/a44156e6ecf82048410efb2c30dcbe2d/href</a></iframe><p>Meu código final com “tratamento” caso a requisição na URL falhe ficou dessa maneira:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c883f0e0a3ffd3d2d90479abfae8b682/href">https://medium.com/media/c883f0e0a3ffd3d2d90479abfae8b682/href</a></iframe><p>E o resultado obtido foi esse:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*y-dojJHvGREhyjlDbcwj7g.jpeg" /></figure><p>Como visto, um código para web-scraping em Python é bem simples. Um uso popular de web scraping é procurar ofertas online como passagens aéreas, shows, etc... Por exemplo, um script automatizado pode fazer um scraping em um site quando as vendas de ingressos ficam online e usar algum bot para comprar os melhores ingressos.</p><h4>Referências:</h4><p>BeautifulSoup: https://www.crummy.com/software/BeautifulSoup/bs4/doc/</p><p>Expressões Regulares (‘re’ Python): <a href="https://docs.python.org/3/library/re.html">https://docs.python.org/3/library/re.html</a></p><p>Espero que tenha achado esse post útil.<strong> Se você gostou deixe alguns claps de incentivo. </strong>Comentários com dicas e criticas são bem vindos!!</p><blockquote>See you next!</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ada1f5e3f921" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>