<?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 Kajol Shah on Medium]]></title>
        <description><![CDATA[Stories by Kajol Shah on Medium]]></description>
        <link>https://medium.com/@kajolshah?source=rss-86223ee87573------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*p-Em4OEV2F35swDaXOP2dg.jpeg</url>
            <title>Stories by Kajol Shah on Medium</title>
            <link>https://medium.com/@kajolshah?source=rss-86223ee87573------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 22:18:21 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@kajolshah/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[Ever wondered how Deepfakes are created? Let’s understand the science behind it.]]></title>
            <link>https://medium.com/@kajolshah/ever-wondered-how-deepfakes-are-created-lets-understand-the-science-behind-it-9c88125891f5?source=rss-86223ee87573------2</link>
            <guid isPermaLink="false">https://medium.com/p/9c88125891f5</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[computer-vision]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Kajol Shah]]></dc:creator>
            <pubDate>Mon, 06 Mar 2023 23:19:42 GMT</pubDate>
            <atom:updated>2023-03-06T23:19:42.126Z</atom:updated>
            <content:encoded><![CDATA[<p>GANs or Generative Adversarial Networks are a class of ML frameworks used to generate Deepfakes where two neural network networks are pitted against each other in a min-max approach. This deep-learning based algorithm is used to generate Deepfakes.</p><blockquote>What are Deepfakes? Deepfakes are manufactured works of art in which the likeness of a different person is used to replace a real person in a photograph or video.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*duY8MeBscVP3MCTJC6U3Gg.png" /><figcaption>Image by liuzishan on Freepik</figcaption></figure><p>GANs utilize a deep learning approach in which two neural networks compete with each other. The two neural networks which are used are named as <strong><em>generative</em></strong> network and <strong><em>discriminative</em></strong> network. After being trained, the generative network will be able to create a new image using the information from an input image that appears to human observers to be essentially legitimate. The discriminative network is in charge of determining/classifying whether the input is a real image or a false one.</p><p>The generator and discriminator are constantly participating in an optimal two player game (min-max approach) during training. The aim of the generative network will be to create images such that it can trick the discriminator into thinking that the created image is authentic and not a fake one. The aim of the discriminative network will be to correctly classify the real and fake images. GANs require paired training samples to help the model learn what an output from the generator should look like.</p><p>Below is the architecture of a Generative Adversarial Network</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cbcQILI-bj3WygTAxVSk3w.png" /><figcaption>Image source:- <a href="https://developers.google.com/machine-learning/gan/images/gan_diagram.svg">https://developers.google.com/machine-learning/gan/images/gan_diagram.svg</a></figcaption></figure><p>Working:-</p><ol><li>Random input is passed to the generator. The generator processes the input to produce new images</li><li>The image generated by generator is given as input to the discriminator along with a set of real images</li><li>The discriminator processes the input images, compares them and tries to determine whether the image generated by generator is real or fake</li><li>Based on whether the discriminator is able to classify correctly or not, and whether generator is able to create images which look authentic or not, the generative and discriminative loss functions are calculated. The loss functions are used as a feedback signal to improve the neural networks</li></ol><p>Loss function:- The generator will try to minimize this below loss function while the discriminator will try to maximize it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*S7d1w6pruw_0fEnKp9QfqA.png" /><figcaption>Image source:- <a href="https://developers.google.com/machine-learning/gan/loss">https://developers.google.com/machine-learning/gan/loss</a></figcaption></figure><p>For the generator, minimizing the loss is identical to minimizing log(1 — D(G(z)) because the generator cannot directly influence the log(D(x)) term in the function.</p><p>In the case of <strong>Deepfakes</strong>, the Generator is provided with some random input and it processes it to create new images of people(which may not be real). The Discriminator will then try to determine whether the image generated by Generator is a real image or a deepfake image.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*S9Ubkl4qBy_fbeIy5wOuRQ.png" /><figcaption>Image taken from <a href="https://www.forbes.com/sites/robtoews/2020/05/25/deepfakes-are-going-to-wreak-havoc-on-society-we-are-not-prepared/?sh=71665a037494">https://www.forbes.com/sites/robtoews/2020/05/25/deepfakes-are-going-to-wreak-havoc-on-society-we-are-not-prepared/?sh=71665a037494</a></figcaption></figure><p>In the above image, even though it looks realistic, none of these people exist. These images are deepfakes.</p><p>Let’s see some more examples of GANs.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1AqdrfJmg92_yzzdZlKPfA.png" /><figcaption>Image source:- Visualization samples of GAN model from the paper “Generative Adversarial Networks” by <a href="https://arxiv.org/search/stat?searchtype=author&amp;query=Goodfellow%2C+I+J">Ian J. Goodfellow</a></figcaption></figure><p>In the above set of images, the ones highlighted in yellow are generated by GANs whereas the non-highlighted ones are the real images. The model is trained on a set of images and it produces new images as output. We can see that it is difficult to determine whether the new images generated by the generator are real or fake for the naked eye.</p><p>In some cases, simple GANs, also known as <strong>Vanilla GANs</strong>, may not completely serve the purpose. So, there are different variations available in GANs to achieve better results.</p><p>The different types of GANs are:-</p><ol><li><strong>Progressive GAN</strong></li></ol><p>Only low-resolution images can be produced using traditional GAN-based approaches. Therefore, the progressive GAN is suggested to improve training quality and produce huge images. Progressive GAN naturally extracts the image’s structure utilizing lower layers before focusing on the image’s features. Consequently, images with low resolution are initially created during training, and later their resolutions are raised by the addition of more layers.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PhnNFLzLZg_VOBC7zWJrFw.png" /><figcaption>Progressive GAN for generating facial images taken from “Progressive growing of GANs for improved quality, stability, and variation”</figcaption></figure><p><strong>2. Conditional GANs</strong></p><p>Conditional GANs let you to provide the label for each produced instance and train on a labeled data set. For instance, a conditional MNIST GAN allows you to choose which digit the GAN should create rather than producing random numbers like an unconditional MNIST GAN would.</p><p>Conditional GANs simulate the conditional probability P(X | Y) rather than the joint probability P(X, Y).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1004/1*Gl88lgt6w5AUh_1OHYu4ng.png" /><figcaption>Generated MNIST digits, each row conditioned on one label and each column is a different generated sample. This image is taken from the paper “Conditional Generative Adversarial Nets” by Mehdi Mirza</figcaption></figure><p><strong>3. Deep Convolutional GANs</strong></p><p>In order to create its discriminator and generator models, the DC-GAN model uses deep CNN(Convolutional Neural Network). This arrangement essentially employs CNNs in the Generator-Discriminator framework to produce images from noisy data that fall under a particular distribution. While DC-GANs exhibit that they are a strong choice for unsupervised learning, they do have some architectural limitations.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Mfme4dEOZXO9h1k5e1_Ypw.png" /><figcaption>A DC-GAN Generator with multiple Convolutional layers taken from the paper “Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks”</figcaption></figure><p><strong>4. CycleGAN</strong></p><p>CycleGANs acquire the ability to change images from one set into images that could perhaps come from a different collection. In order to enable training without the necessity for paired data, CycleGAN implements a cycle consistency loss. As a result, it is possible to translate across different domains without there being a one-to-one mapping between the source and target domains.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*W9-KbaNhsERJFd0AQl4eMQ.png" /><figcaption>Image taken from the paper “Unpaired Image-to-Image Translation<br>using Cycle-Consistent Adversarial Networks”</figcaption></figure><p>The CycleGAN model contains two mapping functions G:X→Y and F:Y→X, and associated adversarial discriminators Dy and Dx. Dy encourages G to translate X into outputs indistinguishable from domain Y, and vice versa for Dx, F, and X. There are two cycle consistency losses that encapsulate the idea that if we translate from one domain to the other and back again, we should end up where we started in order to further regularize the mappings.</p><p>Forward cycle-consistency loss: x→G(x)→F(G(x))≈x</p><p>Backward cycle-consistency loss: y→F(y)→G(F(y))≈y</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PFTQRdQnH7bW-f4it3QTjw.png" /><figcaption>Image taken from <a href="https://www.tensorflow.org/tutorials/generative/cyclegan">https://www.tensorflow.org/tutorials/generative/cyclegan</a></figcaption></figure><p>You can try implementing CycleGAN by using the code from TensorFlow. Following is the link for the same:- <a href="https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/tutorials/generative/cyclegan.ipynb">Run in Google Colab</a></p><p><strong>5. Image-to-Image Translation</strong></p><p>Image-to-Image translation GANs take an image as input and map it to a generated output image with different properties.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/678/1*ki6OtSmVQlRRw5zilUgn3Q.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/678/1*SxWMG3msmxayIiBoyA1Hpw.png" /><figcaption>Image taken from “Image-to-Image Translation with Conditional Adversarial Networks”</figcaption></figure><p>In the above images, we can see the results of Image-to-Image Translation. In the first case, we try to translate the input image from day → night. In the second case, we try to translate the sketches of handbags → photorealistic handbags.</p><p><strong>6. Text-to-image GANs</strong></p><p>A deep learning model called Text-to-Image Generative Adversarial Networks (GAN) can generate images from text descriptions. There are different methods available for this. One of them is using StackGAN which generates 256×256 photo-realistic images conditioned on text descriptions. Based on the provided written description, the Stage-I GAN sketches the basic shape and colors of the object, producing Stage-I low-resolution pictures. The Stage-II GAN creates high-resolution images with photorealistic features using the Stage-I results and text descriptions as inputs. Using the refinement process, it is able to fix flaws in Stage-I results and add interesting details.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/678/1*46HN7azvLTi6bvHPTHsQrg.png" /><figcaption>Image taken from “StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks”</figcaption></figure><p>In the above image, in (a) low resolution image is generated based on the text description. In (b) high resolution image with photo realistic details is generated.</p><p><strong>Applications of GANs:</strong></p><ol><li>Deepfakes</li><li>Text-to-image synthesis</li><li>Image-to-image translation</li><li>Generate Cartoon Characters</li><li>Photos to Emojis</li><li>Face Aging</li><li>Photo Inpainting</li><li>Video Prediction</li><li>3D object generation</li><li>Generate new human poses</li></ol><p>In one of my projects, I have used CycleGAN for Multi-Collection Style Transfer. Style transfer is the process of redrawing or generating a new image that combines the content or scene from one image and the artistic style from a different image or a collection of images. One of the disadvantages of CycleGAN is that you cannot transfer more than one style at a time on an image. I tried some variations in CycleGAN by referring the paper “Gated-GAN: Adversarial Gated Networks for Multi-Collection Style Transfer”. In this paper, they have used another variation of GAN i.e. Gated-GAN. I tried to apply similar logic but using CycleGAN.</p><p>Below is the github link for my project:-</p><p><a href="https://github.com/kajolshah310/Style_transfer_using_CycleGAN">GitHub - kajolshah310/Style_transfer_using_CycleGAN: Multi-collection Style Transfer Using CycleGAN</a></p><p><strong>Conclusion:</strong></p><p>In this blog, we have learnt about GANs and different variations of GANs which are highly used in Computer Vision problems. I will continue to explore some other CV techniques in my next blog. If you find any mistakes in my blog or have any suggestions, please feel free to let me know about it.</p><p>You can subscribe to get an email whenever I post or follow me to read more of my blogs in future.</p><p><strong>References:</strong></p><ol><li>“Generative Adversarial Networks” by I. J. Goodfellow <a href="https://arxiv.org/pdf/1406.2661v1.pdf">https://arxiv.org/pdf/1406.2661v1.pdf</a></li><li><a href="https://developers.google.com/machine-learning/gan">https://developers.google.com/machine-learning/gan</a></li><li><a href="https://www.cs.cmu.edu/~epxing/Class/10708-20/scribe/lec13_scribe.pdf">https://www.cs.cmu.edu/~epxing/Class/10708-20/scribe/lec13_scribe.pdf</a></li><li>Tero Karras, Timo Aila, Samuli Laine, and Jaakko Lehtinen. “Progressive growing of GANs for improved quality, stability, and variation”. In International Conference on Learning Representations, 2018. <a href="https://arxiv.org/pdf/1710.10196.pdf">https://arxiv.org/pdf/1710.10196.pdf</a></li><li>“Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks” by A. Racford <a href="https://arxiv.org/abs/1511.06434">https://arxiv.org/abs/1511.06434</a></li><li>“Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks” by <strong>J. Zhu </strong><a href="https://www.arxiv-vanity.com/papers/1703.10593/">https://www.arxiv-vanity.com/papers/1703.10593/</a></li><li>“Image-to-Image Translation with Conditional Adversarial Networks” by Phillip Isola <a href="https://arxiv.org/pdf/1611.07004.pdf">https://arxiv.org/pdf/1611.07004.pdf</a></li><li>“StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks” by H. Zhang <a href="https://arxiv.org/pdf/1612.03242.pdf">https://arxiv.org/pdf/1612.03242.pdf</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9c88125891f5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to perform basic image transformations in Computer Vision?]]></title>
            <link>https://medium.com/@kajolshah/how-to-perform-basic-image-transformations-in-computer-vision-cfc90982b53f?source=rss-86223ee87573------2</link>
            <guid isPermaLink="false">https://medium.com/p/cfc90982b53f</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[computer-vision]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <dc:creator><![CDATA[Kajol Shah]]></dc:creator>
            <pubDate>Sun, 19 Feb 2023 15:24:08 GMT</pubDate>
            <atom:updated>2023-02-20T01:54:37.435Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Before solving some major Computer Vision problems like image classification or object detection, let’s first learn how to perform some basic transformations on images in Python. Try it yourself and start with your Computer Vision journey.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*78_3ZWNRpVU_Nx0UN6TeEQ.jpeg" /><figcaption>Image by Freepik</figcaption></figure><p>We will be using the OpenCV library for our basic image processing. You can try to implement all the functions yourself by using the code blocks provided in this blog.</p><p><em>But what is OpenCV?</em></p><blockquote>OpenCV is an open source C/C++ library with Python wrappers which is used for implementation of standard computer vision algorithms. It can be used to read, write and capture images or videos in various formats as well as perform image processing techniques like filtering, edge detection, corner detection, etc.</blockquote><p>There are two Python wrapper versions of OpenCV available:-</p><p>cv (older, non python standard image storage)</p><ul><li>cv2 (contains cv, uses numpy n-dimensional arrays)</li></ul><p>We will use cv2 wrapper version for our implementation.</p><p>To install OpenCV python package, you can enter either of the below commands in terminal:-</p><blockquote>pip install opencv-python or</blockquote><blockquote>pip3 install opencv-python</blockquote><p>Now, let’s start our implementation by first importing the necessary libraries.</p><pre>import cv2<br>import numpy as np<br>import sys<br>from PIL import Image<br>import matplotlib.pyplot as plt</pre><p>To read the images, we will use the imread() function in opencv.</p><pre>filename = &quot;friends.jpeg&quot; # file path<br>image = cv2.imread(filename)<br>print(image.shape)  # shape of the image<br><br># Output:<br># (400, 700, 3)</pre><p>To obtain image size, we use image.shape. A color image is a 3D n-dimensional array of (rows * columns * colors) i.e. (height * width * number of color channels). For a color image, the number of color channels will be 3 based on the RGB color model.</p><p>eg. shape of image:- (400, 700, 3)</p><blockquote>The <strong>RGB color model</strong> is an additive color model in which the red, green and blue primary colors of light are added together in various ways to reproduce a broad array of colors.</blockquote><p>To capture a live image from our webcam, we will use the cv2.VideoCapture() function.</p><pre>cap = cv2.VideoCapture(0) <br>retval, image = cap.read()</pre><p>To resize an image, we will use the cv2.resize() function</p><pre>resize_im = cv2.resize(image,(800,600))<br>print(resize_im.shape)<br><br># Output:<br># (600, 800, 3)</pre><p>To display an image, we will use the cv2.imshow() function</p><pre>cv2.imshow(&#39;Original image&#39;,image) # &#39;Original image&#39; is the title of the image window <br>cv2.waitKey(0)<br>cv2.destroyAllWindows()</pre><p>Here, the cv2.waitkey() function lets us display a window for the specified number of milliseconds and if 0 is passed, it will wait forever until any key is pressed. The cv2.destroyAllWindows() function will close or destroy all the image windows. To stop or close the image window, press any key.</p><p>Output:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BtrvOpF7VEJIOv-P1ASMdQ.png" /><figcaption>Output of imshow() function</figcaption></figure><p>To convert an RGB image to greyscale, we will use the cv2.cvtColor() function which is used to convert an image from one color space to another. cv2.COLOR_BGR2GRAY color conversion method will convert the image to grayscale. Here, the image will be converted from 3 dimensions to 2 dimensions.</p><pre>gimage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)<br>cv2.imshow(&#39;Grayscale&#39;,gimage)<br>cv2.waitKey(0)<br>cv2.destroyAllWindows()<br>print(gimage.shape)<br><br>#Output:<br>#(400, 700)</pre><p>Output:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rfjG5NHcGcJ4XCn9FBpDGg.png" /><figcaption>RGB to Grayscale output</figcaption></figure><p>Below are the ways to convert RGB image to grayscale without using in-built OpenCV functions:-</p><pre>grayimage = np.dot(image[...,:3],[0.299, 0.587, 0.114])<br>cv2.imshow(&#39;Grayscale without OpenCV&#39;,gimage)<br>cv2.waitKey(0)<br>cv2.destroyAllWindows()<br>print(grayimage.shape)<br><br>#Output:<br>#(400, 700)</pre><p>Output:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*U2hZO67yEz_N9N_ERGyfAg.png" /></figure><p>Another way by using loops and Python Imaging Library(PIL):</p><pre>arr = np.array(image)<br>for i in range(len(arr)):<br>    for j in range(len(arr[i])):<br>        b = arr[i, j, 0]<br>        g = arr[i, j, 1]<br>        r = arr[i, j, 2]<br>        grayimage = b * 0.114 + g * 0.587 + r * 0.299<br>        arr[i, j] = grayimage<br>Image.fromarray(arr).show()</pre><p>Output:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KN_XfmYpJOSBt_rbyEWU_A.png" /></figure><p>To rotate an image from 0 to 360 degrees, we can use the getRotationMatrix2D() function which will create the transformation rotation matrix. The cv2.warpAffine() function will apply the transformation on the image. The cv2.createTrackbar() function will help us to change the angle of rotation of our image.</p><pre>def sliderHandler(theta):<br>    rows = image.shape[0]<br>    cols = image.shape[1]<br>    M = cv2.getRotationMatrix2D((cols/2, rows/2), theta, 1)<br>    dst = cv2.warpAffine(image, M, (cols, rows))<br>    cv2.imshow(winName, dst)<br><br>cv2.namedWindow(&quot;RotationWindow&quot;)<br>winName = &quot;RotationWindow&quot;<br>cv2.createTrackbar(&#39;r&#39;, &quot;RotationWindow&quot;, 0, 360, sliderHandler)   <br>cv2.imshow(&quot;RotationWindow&quot;, image)<br>cv2.waitKey(0)<br>cv2.destroyAllWindows()</pre><p>Output:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-SVVvDs-6oXsNp0kAWdPMA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Nvp4avf4ynI8gbuVH89PDQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CdZngsmBETd6O2TAAw9NYQ.png" /><figcaption>Image rotated at angles 181, 304 and 90 degrees</figcaption></figure><p>Now, we will see how to cycle through the color channels of the image. For this, we will take an image in which we can clearly see the RGB colors distinctly.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/314/1*0nxixLYWehBwuVKlsl-JMw.png" /><figcaption>Input image</figcaption></figure><p>We will use the cv2.split() function to separate the colored multi-channel image into single-channel images i.e. into Red, Blue and Green channels.</p><pre>filename2 = &quot;rgb01.png&quot;<br>image = cv2.imread(filename2)<br>b, g, r = cv2.split(image)<br>cv2.imshow(&quot;Blue&quot;, b)<br>cv2.waitKey(0)<br>cv2.destroyAllWindows()<br>print(b.shape)<br><br>#Output:<br>#(316, 314, 3) -  image shape before using split function<br>#(316, 314) - after using split function</pre><p>The shape of the image before split is 3D and after split becomes 2D.</p><p>Output of blue channel:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/628/1*oOkcVnYMyhuGhmr1Tx-jQA.png" /><figcaption>Output of Blue channel</figcaption></figure><p>We can see that as the channel is blue, the intensity of blue color in the image is very high.</p><pre>cv2.imshow(&quot;Green&quot;, g)<br>cv2.waitKey(0)<br>cv2.destroyAllWindows()<br>print(g.shape)<br><br>#Output:<br>#(316, 314)</pre><p>Output of green channel:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/628/1*_6miiEPruzZ5TPyJDKlEaA.png" /><figcaption>Output of green channel</figcaption></figure><p>We can see that as the channel is green, the intensity of green color in the image is very high.</p><pre>cv2.imshow(&quot;Red&quot;, r)<br>cv2.waitKey(0)<br>cv2.destroyAllWindows()<br>print(r.shape)<br><br>#Output:<br>#(316, 314)</pre><p>Output of red channel:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/628/1*GYjLSc-99Bz_6Ig5rxdVJw.png" /><figcaption>Output of red channel</figcaption></figure><p>Let’s take another image example to see the proper outputs of our functions.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/318/1*F0FMa_b5ZKeXendbXRiYOw.jpeg" /></figure><p>We will now see how to implement image blurring i.e. image smoothing. For this, we will convolve the image with a low-pass filter. Smoothing is used to remove noise and high frequency content(eg. edges, corners, etc) from the image. There are different ways by which we can achieve smoothing. First is by using cv2.filter2D() function.</p><pre>kernel = np.ones((5,5),np.float32)/25 #using a 5x5 filter<br>dst = cv2.filter2D(image,-1,kernel)<br>cv2.imshow(&#39;Smoothing using filter2D&#39;, dst)<br>cv2.waitKey(0)<br>cv2.destroyAllWindows()</pre><p>Output:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/636/1*D4_uN3KnzrnQpAZL08hjEw.png" /></figure><p>Let’s see how to implement smoothing by keeping the kernel size variable. Here, we will first convert the image to grayscale and then implement variable smoothing.</p><pre>def sliderHandler1(n):   <br>    image = cv2.imread(filename3)<br>    gimage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)<br>    kernel = np.ones((n,n),np.float32)/(n*n)    #make a smoothing filter<br>    sm = cv2.filter2D(gimage, -1, kernel)    #convolve<br>    cv2.imshow(winName, sm)<br>winName = &#39;Smoothing&#39;<br>cv2.imshow(winName, image)<br>cv2.createTrackbar(&#39;s&#39;,winName, 0, 255, sliderHandler1) #slider bar [0, 255]<br>cv2.waitKey(0)<br>cv2.destroyAllWindows()</pre><p>Output:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/638/1*govAfrCaHU8iDn4uV0vknQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/638/1*Dk7mcS7fsIpVRyj_pPMboQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/638/1*0RkYHVLDnHdNbHH9_obvlg.png" /><figcaption>Smoothing output</figcaption></figure><p>Now we will see how to upsample or upscale an image i.e. increase its spatial resolution by a factor of 2. One way to do this is using the cv2.resize() function which we have already used above. Another way is using cv2.pyrUp() function.</p><pre>print(image.shape) #before upscaling<br>uimage = cv2.pyrUp(image)<br>cv2.imshow(&#39;Upscaling&#39;,uimage)<br>cv2.waitKey(0)<br>cv2.destroyAllWindows()<br>print(uimage.shape) #after upscaling<br><br>#Output:<br><br>#(159, 318, 3) #image size before upscaling<br>#(318, 636, 3) #image size after upscaling<br></pre><p>Output:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AaSkbZBmFpX5cCfM0Qv5Jg.png" /><figcaption>Upscaling output</figcaption></figure><p>Next, we will see how to downsample or downscale an image i.e. decrease its spatial resolution by a factor of 2 using cv2.pyrDown()</p><pre>print(image.shape) #before downscaling<br>dimage = cv2.pyrDown(image)<br>cv2.imshow(&#39;Downscaling&#39;,dimage)<br>cv2.waitKey(0)<br>cv2.destroyAllWindows()<br>print(dimage.shape) #after downscaling<br><br>#Output:<br>#(159, 318, 3) #image size before downscaling<br>#(80, 159, 3) #image size after downscaling</pre><p>Output:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/398/1*5mjofe2jivFBaEPR-EgF1Q.png" /><figcaption>Downscaling output</figcaption></figure><p>To detect the corners in an image, we will use cv2.cornerHarris() function. We will handle the number of corners detected in the image by increasing or decreasing the threshold value.</p><pre>def sliderHandler1(n2):    <br>    global imagec<br>    n2 = n2*0.01<br>    imagec = np.float32(image3)    #make a smoothing filter<br>    dst = cv2.cornerHarris(imagec, 2, 3, n2) <br>    dst = cv2.dilate(dst, None)<br>    imagec=cv2.merge((image3, image3, image3))<br>    threshold = 0.01*dst.max() #threshold value for detecting the corners<br>    imagec[dst&gt;threshold]=[0,0,255]<br>    cv2.imshow(winName2,imagec)<br><br>winName2 = &#39;corner detection&#39;       <br>image = cv2.imread(filename3)<br>image3 = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)<br>cv2.imshow(winName2, image3)<br>cv2.createTrackbar(&#39;c&#39;,winName2, 0, 100, sliderHandler1) #slider bar to handle number of corners<br>cv2.waitKey(0)<br>cv2.destroyAllWindows()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/636/1*DtUO17UfzykWU8TTyl--xA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/634/1*icekThiec-AamB0mRzJ0hA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/634/1*j255yGjugMDPnT3foyv0iA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/634/1*7c1r4ATj_1_IYTtsBZlVjw.png" /><figcaption>Corners detected</figcaption></figure><p>In the above output, we can see that if the threshold value is low, more corners will be detected and if it is high, less corners will be detected.</p><p>We will try corner detection on another image where we can see corners clearly.</p><p>Output:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/522/1*DJaDyPW-Ghn1x8qIDFJUZA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/522/1*u0Idg4CM4S1X18-V7813sg.png" /><figcaption>Corner detection output</figcaption></figure><p><strong>Conclusion: </strong>In this blog, we have learnt about the different image processing techniques in Computer Vision. I will continue to explore some other CV techniques in my next blog. If you find any mistakes in my blog or have any suggestions, please feel free to let me know about it.</p><p>You can subscribe to get an email whenever I post or follow me to read more of my blogs in future.</p><p>You can find the code for the implementation here:- <a href="https://github.com/kajolshah310/basic_image_transformations_in_CV">https://github.com/kajolshah310/basic_image_transformations_in_CV</a></p><p>References:</p><p><a href="https://docs.opencv.org/4.x/">https://docs.opencv.org/4.x/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cfc90982b53f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Computer Vision Basics: Image Formation using Geometric Camera Models]]></title>
            <link>https://medium.com/@kajolshah/computer-vision-basics-image-formation-using-geometric-camera-models-416c1cfc57e?source=rss-86223ee87573------2</link>
            <guid isPermaLink="false">https://medium.com/p/416c1cfc57e</guid>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[computer-science]]></category>
            <category><![CDATA[computer-vision]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Kajol Shah]]></dc:creator>
            <pubDate>Sun, 05 Feb 2023 13:04:51 GMT</pubDate>
            <atom:updated>2023-02-06T15:46:35.312Z</atom:updated>
            <content:encoded><![CDATA[<p><em>What is Computer Vision? Enter into the world of Computer Vision by understanding the basics of it.</em></p><p>Computer Vision is a sub-area of AI which enables computers to analyze images or videos and extract meaningful information from them, mimicking human vision. Some of the applications of CV are face recognition, self driving cars, object detection, etc.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0qgFcNWUHG2xw5lRCSgpFg.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@opticonor?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Conor Luddy</a> on <a href="https://unsplash.com/s/photos/computer-vision?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>When we click a picture, a real scenario which is in 3D is captured by a real camera in 2D. So here, 3D to 2D conversion takes place which means we have lost information about a dimension. This is where computer vision enters the scene. Using CV, we can try to recover the missing information, or you can say, a missing dimension and gain high level understanding of the image.</p><p>Real Scene (3D) → Real Cameras (2D) → CV Output (3D)</p><p>Now, let’s understand the basics of CV. For this, we need to first understand about image formation. Below, we will see how images are formed using Geometric Camera models.</p><p><strong>Pinhole Camera Model</strong></p><p>Before lenses came into existence, pinholes were used to capture images. World’s first camera model was invented using this model. For a pinhole camera, a hole of the size of a pin is created on one side of a box and a thin paper on the other side of the box. The light entering this hole will then project the image of the world on the paper. The image captured will be upside down i.e. an inverted image. Below is the example of an image captured by a pinhole camera.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/550/1*L4Y2ppctrxOV-CgI7T37JA.png" /><figcaption>Image formation on the backplate of a photographic camera. Figure from US NAVY MANUAL OF BASIC OPTICS AND OPTICAL INSTRUMENTS, prepared by the Bureau of Naval Personnel, reprinted by Dover Publications, Inc. (1969). Taken from the book ‘Computer Vision — A Modern Approach — D. Forsyth, J. Ponce’.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/902/1*JQaUBo6UhGOEa4uE6XZsoQ.png" /><figcaption>By en:User:DrBob (original); en:User:Pbroks13 (redraw) — <a href="http://commons.wikimedia.org/wiki/Image:Pinhole-camera.png">http://commons.wikimedia.org/wiki/Image:Pinhole-camera.png</a>, Public Domain, <a href="https://commons.wikimedia.org/w/index.php?curid=4099853">https://commons.wikimedia.org/w/index.php?curid=4099853</a></figcaption></figure><p>In this above image, we can see that a real world 3D object tree’s inverted 2D image is formed by using a pinhole camera model.</p><p>Now, let’s understand some basic notations for image formation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*86oRrjd0OlucFT8dZYc3YQ.jpeg" /><figcaption>Pinhole Perspective image formation</figcaption></figure><p>f → distance between the image and the screen (in pinhole camera) and in terms of lens camera, focal length</p><p>z → distance of the object from the screen</p><p>(x, y, z) → real 3D world coordinates</p><p>(u, v) → 2D image coordinates</p><ul><li>Bigger the focal length (f), bigger will be the image</li><li>Ratio of both the triangles will be the same and will have the same angle</li><li>Size of image (u, v) is directly proportional to f. So, bigger the focal length(f), bigger the image</li><li>Size of image (u, v) is inversely proportional to z. So, the further the object, the smaller it will appear on the image plane</li><li>As the image formed is inverted, the pinhole perspective projective equations will have a negative sign</li></ul><p>Pinhole Perspective projection equations:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vqHM9MLFyjAFzlSw1rbGOg.jpeg" /></figure><p>In matrix form:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*V4yZnAaHYkBd8cyc1aKUQA.jpeg" /></figure><p><strong>Alternative Pinhole Camera Model</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mn0m8f6GkA3HDxR1rEV0wA.jpeg" /><figcaption>Alternative Pinhole perspective image formation</figcaption></figure><p>Without inversion, based on triangle similarity, the equations will be:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*v05SFgeEl5Abl4ePZ3hMNw.jpeg" /></figure><p>Both models are the same with just a sign difference.</p><p>To get rid of z and to get linear equations, we will convert the cartesian coordinates to homogeneous coordinates.</p><p>2D → 2DH</p><p>(x, y) → (x, y, 1)</p><p>Moving from 2DH to 2D:-</p><p>(x/w, y/w) ← → (x, y, w) where w is a homogeneous component.</p><p>Perspective projection equation in Homogeneous coordinates:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zABZr3l5Y078QvzG6S1TRA.jpeg" /><figcaption>3D to 2DH</figcaption></figure><p>3D to 2DH matrix equation is not balanced. Below is the balanced matrix representation of pinhole model from 3DH to 2DH:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-uv7uj7nWqFfwEXnmMaqDA.jpeg" /><figcaption>3DH to 2DH</figcaption></figure><p>As we have added 1 to the 3D coordinates, we add a column of zeros to the projection matrix to balance the equation.</p><p><strong>A final word</strong></p><p>Computer Vision is a vast and complex field but to learn anything, we need to take baby steps. I will be continuing with the basics of CV in my future blogs.</p><p>You can subscribe to get an email whenever I post or follow me to read more of my blogs in future.</p><p><strong>References:-</strong></p><ul><li>Computer Vision — A Modern Approach — D. Forsyth, J. Ponce</li><li>Lecture notes of Professor Gady Agam, Illinois Institute of Technology</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=416c1cfc57e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How can you summarize a document even without reading it?]]></title>
            <link>https://medium.com/@kajolshah/how-can-you-summarize-a-document-even-without-reading-it-60c4a60d29d?source=rss-86223ee87573------2</link>
            <guid isPermaLink="false">https://medium.com/p/60c4a60d29d</guid>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[deep-learning]]></category>
            <category><![CDATA[nlp]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[python3]]></category>
            <dc:creator><![CDATA[Kajol Shah]]></dc:creator>
            <pubDate>Tue, 23 Mar 2021 20:29:46 GMT</pubDate>
            <atom:updated>2021-03-24T07:42:03.022Z</atom:updated>
            <content:encoded><![CDATA[<p>What would you do when you have too many documents to read but not enough time? How will you decide which are the ones worth reading? How will you know the contents of each document even without reading them?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/612/1*Js9lRVjX_AIJ5F9AAGJJFg.jpeg" /><figcaption>Source: Pixabay</figcaption></figure><p>Well, there are two possible solutions for this. One — going by the traditional method and reading all the documents which may result in you wasting too much time on insignificant content. A better solution — using a text summarizer.</p><blockquote>Text Summarizer — A tool which generates a condensed version of the original document</blockquote><p><strong>But how do you create a Text Summarizer?</strong></p><p>In this blog, we will see how to develop a query oriented extractive Text Summarizer using Unsupervised Deep Learning techniques. The term query oriented here means the summary will be generated according to the query/ topic entered by the users as per their interests. This can be best implemented using Python as it provides an extensive set of libraries like Pdfminer, NLTK, NumPy, etc. that have functions which can be used for our process.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*bufa7RMmTWa5Ap6KivsZpQ.jpeg" /><figcaption>Source: Pexels</figcaption></figure><blockquote>Extractive text summarization — In this method, sentences are directly picked from the document based on some features to form a brief summary</blockquote><blockquote>Unsupervised learning — where a machine learns and looks for patterns in a dataset having no labels or outcomes</blockquote><blockquote>Deep learning — this type of learning involves multiple processing layers to extract features from data</blockquote><h3><strong>Steps to create a Text Summarizer</strong></h3><p><strong>A] Input</strong> — In the first step, the user will give a single PDF or a text document they want to summarize as input. Read the contents of this file and store it in a variable.</p><p><strong>B] Pre-processing</strong> — In this step, the words which are not important are removed in order to structure the document and reduce its density. This makes the further processing of the document easier. The four techniques used are:-</p><ol><li><strong>Stop-word removal </strong>— Stop-words i.e. words which are not important and don’t have any meaning on their own are filtered in this step. Usually articles, prepositions, etc. are considered as stop words and are removed. Here, we have considered words such as a, an, the, is, are, on, etc. as stop-words. NLTK corpus provides you with a bunch of stops words and using this set, you can remove these stop-words from your text.</li><li><strong>Part of Speech Tagging </strong>— Categorizing the words of text on the basis of part of speech (noun, adverb, verb, adjective etc.) is called as Part of Speech Tagging. So, in this step, the words are marked corresponding to a part of speech.</li><li><strong>Stemming </strong>— In this step, all the words are brought to their base or root form except for the words which belong to the proper nouns category. Example: the word ‘boys’ reduced to ‘boy’, ‘swimming’ reduced to ‘swim’. It will not always be the case that the stemmed word would be the same as the root form of the word.</li><li><strong>Punctuation marks removal</strong> — The punctuation marks like “, . : ; ? / “ etc from the document are removed in this step, hence making the document light-weight and further simplifying the summary generation process.</li></ol><p>The NLTK library provides functions which can be used to execute the above pre-processing techniques.</p><p><strong>C] Feature Vector extraction — </strong>The document which is made light weight in the pre-processing phase is now structured into a matrix. A sentence matrix ‘M’ of order n*v contains the features for every sentence of a matrix. Here, ‘n’ is the number of sentences in the document and ‘v’ is the number of features. The five features that we will be considering are:-</p><ol><li><strong>Title Similarity</strong> — A sentence in the document is said to be important for the summary if it is similar to title of the document. The title similarity is calculated using the sentence score which is defined as the ratio of number of common words occurring between the title and the sentences in the document to the total number of words of the document. The feature sentence of a sentence is said to be good if it has maximum number of words common to the title.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/522/1*C5vOCLqDqjuHLRQhnlO4OQ.png" /></figure><p><strong>2. Sentence Position </strong>— The position of the sentence can determine the relevance of the sentence for the summary. Usually the sentences that appear in the starting and ending of the text are of more importance. So, based on this the sentence score is calculated. The positional score in our case is calculated by considering the following conditions:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/536/1*iNbYtJjiiisvOGEqTrIELw.png" /></figure><p>Here, we have considered 20% of sentences from the start and the end of the text as important and marked their p2 value as 1.</p><p><strong>3. Term Weight </strong>— Term weight means the term frequency and its importance. The term frequency(tf) gives the total number of times the term has occurred in the whole document which depicts the importance of the term in a document. The inverse sentence frequency(isf) tells whether the term is common or rare across the document.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/574/1*beWrVGU5MIHthdmJ12eGSA.png" /></figure><p><strong>4. Sentence Length</strong> — The sentence length decides the importance of the sentence in summarization. The sentences that are too short do not give much information about the document. Whereas sentences that are too long will have unnecessary information about the document that will not be useful for summarization.</p><p><strong>5. Proper Noun Score</strong> — In the process of summary generation, important role is played by the Proper Nouns. It gives information regarding, to whom or to what the author is referring. Roles played by individuals or description of locations will be different more number of times in a document. Here, the number of words which are proper nouns are counted.</p><p><strong>D] Feature Matrix Generation</strong> — The above calculated features’ values are then stored in a matrix form where the columns represent the features and rows represent the sentences.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/831/1*rUFHJe1vGgNgDr9QBECh8A.png" /><figcaption>Feature matrix generated for sample text</figcaption></figure><p><strong>E] Algorithm for Deep Learning</strong> — Here, we are using Restricted Boltzmann Machine(RBM) for deep learning. The sentence matrix containing a set of feature vectors is given as an input to the RBM phase as a visible layer.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/936/1*ZtsubpNjgfltgX1Z1IW3aQ.png" /></figure><p><strong>F] Enhanced Feature Matrix</strong> — An Enhanced feature matrix is obtained from the deep learning phase which is used for the further summary generation phase.</p><p>G] <strong>Generation of Summary</strong> — Summary can be generated in two ways. One is a generalized summary of the whole document and the other way is based on the user query entered by the user.</p><ol><li><strong>Sentence score</strong> — This step is performed only for user-query based summary generation. Here, the ratio of the number of words which are common in the sentence and the query entered by the user to the total number of words in the document are calculated.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/611/1*fdDm4s2STlNt3TBkdKQprQ.png" /></figure><p><strong>2. Sentence ranking</strong> — The number of sentences which should be there in the summary is calculated by</p><p>N=0.3* total number of sentences in the text</p><p>Here, we are considering 30% of the sentences in the document for the summary. You can change this numeric value if you want a more shorter or longer summary.</p><p><strong>Sentence ranking for generalized summary: </strong>The sum of the feature values for each sentence in the enhanced matrix is calculated. Now based on these values, the sentences are arranged in descending order(sentences having higher feature sum). Now, the top N sentences are selected from this sorted order of sentences.</p><p><strong>Sentence ranking for user-query based summary: </strong>Here, based on the sentence score, sentences are arranged in descending order. Now, the top N sentences are selected from this sorted order of sentences.</p><p><strong>3. Summary generation — </strong>The N sentences selected are now arranged according to their position in the text and then displayed to the user. In this way, extractive summary is generated.</p><p>The summary produced by the above text summarization method using unsupervised deep learning algorithm is better than the summary produced by methods using supervised learning techniques as no training data-set is required in the proposed approach. Hence, the time and cost required to train the data-set is saved. So, this method is more efficient.</p><p>You can also develop a GUI for this tool using Python package Tkinter. Below is a basic sample GUI developed by me using Tkinter.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/328/1*0MfwYlC-Cf1IjAHQbgUq9g.png" /><figcaption>Text Summarizer GUI</figcaption></figure><p><strong>Future Applications:-</strong> This method can be further improved for generating summaries of books of large volumes. Also, we can add some features to this summarization method to generate user-query based summary of medical reports. Researchers can use this tool to generate summaries of their papers and anyone can use it to summarize any books or papers.</p><p><strong>Conclusion</strong></p><p>In this blog, we have seen how we can reduce our burden of reading as well as analyzing bulk and bulk of documents by creating a smart tool called Text Summarizer. We have seen a few applications of this tool in this blog and you can also let me know your ideas on this.</p><p><strong>References</strong></p><p>M Yousefi-Azar, ”Text Summarization using unsupervised deep learning”, Science Direct, Volume:68, 2017, Page:93–105</p><p>PadmaPriya G. and 2K. Duraiswamy , ”An Approach for Text Summarization using deep learning approach”, Journal of Computer Science, Volume:10, 2014, Page:1–9</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=60c4a60d29d" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>