<p><div><div><div><div data-show-faces="false" data-height="21" data-width="100" data-layout="button_count" data-send="true" data-href="https://www.r-bloggers.com/extending-the-openimager-package-with-gabor-feature-extraction/"></div></div><div></div></div><div></div></div>
<div>
(This article was first published on <strong><a href="http://mlampros.github.io/mlampros.github.io/2018/08/08/Gabor_Feature_Extraction/"> mlampros</a></strong>, and kindly contributed to <a rel="nofollow" href="https://www.r-bloggers.com/">R-bloggers)</a> </div>
<p>This blog post illustrates the new functionality of the OpenImageR package (<em>Gabor Feature Extraction</em>). The Gabor features have been used extensively in <a rel="nofollow" href="https://en.wikipedia.org/wiki/Gabor_filter" target="_blank">image analysis and processing</a> (Character and Face recognition). <a rel="nofollow" href="https://en.wikipedia.org/wiki/Dennis_Gabor" target="_blank">Gabor</a> (Nobel prize winner, an electrical engineer, and physicist) used the following wording which I think it’s worth mentioning in this blog post, <em>“You can’t predict the future, but you can invent it.”</em> (<a rel="nofollow" href="http://www.it.lut.fi/project/gabor/" target="_blank">source</a>).</p>
<p>In the following lines I’ll describe the <em>GaborFeatureExtract</em> R6 class which includes the following methods,</p>
<p></p>
<table>
<thead>
<tr>
<th>GaborFeatureExtract</th>
</tr>
</thead>
<tbody>
<tr>
<td>gabor_filter_bank()</td>
</tr>
<tr>
<td>gabor_feature_extraction()</td>
</tr>
<tr>
<td>gabor_feature_engine()</td>
</tr>
<tr>
<td>plot_gabor()</td>
</tr>
</tbody>
</table>
<p>These methods are based on the Matlab code <em><a rel="nofollow" href="https://github.com/mhaghighat/gabor" target="_blank">Gabor Feature Extraction</a></em> of the paper <em>M. Haghighat, S. Zonouz, M. Abdel-Mottaleb, “CloudID: Trustworthy cloud-based and cross-enterprise biometric identification,” Expert Systems with Applications, vol. 42, no. 21, pp. 7905-7916, 2015</em>, http://dx.doi.org/10.1016/j.eswa.2015.06.025. The initial Matlab code was modified (I added the <strong>Magnitude</strong> feature and the <strong>gabor_feature_engine()</strong> method) and parallelized using Rcpp wherever it was possible.</p>
<p></p>
<h3>Gabor Features</h3>
<p></p>
<p>I came across the Gabor Features last month when I had to process images and I needed an additional function besides the already existing <a rel="nofollow" href="https://www.rdocumentation.org/packages/OpenImageR/versions/1.0.8/topics/HOG?tap_a=5644-dce66f&tap_s=10907-287229" target="_blank">HoG features</a>. I did the regular search on CRAN (Comprehensive R Archive Network) but I couldn’t find anything related to Gabor Feature Extraction (as of August 2018), therefore I decided to port the Matlab code into R.<br>
There are many resources on the web if someone intends to deepen his / her knowledge on the subject and I’ll add some of these that I found useful at the end of the blog post (References). I’ll explain the methods of the <em>GaborFeatureExtract</em> R6 class using an image found on a <a rel="nofollow" href="https://stackoverflow.com/a/20610474/8302386" target="_blank">Stackoverflow question</a>.</p>
<p></p>
<p><img alt="" src="https://i1.wp.com/mlampros.github.io/mlampros.github.io/2018/08/08/Gabor_Feature_Extraction/car.png?w=456" data-recalc-dims="1"></p>
<h3>gabor_filter_bank</h3>
<p></p>
<p>The <strong>gabor_filter_bank</strong> method <em>“… generates a custom-sized Gabor filter bank. It creates a UxV cell array, whose elements are MxN matrices; each matrix being a 2-D Gabor filter”</em> according to the <a rel="nofollow" href="https://github.com/mhaghighat/gabor" target="_blank">author of the Matlab</a> code. The following code chunk shows how this works in R,</p>
<p></p>
<div>
<div>
<pre><code><span>
</span><span>library</span><span>(</span><span>OpenImageR</span><span>)</span><span>
</span><span>init_gb</span><span> </span><span>=</span><span> </span><span>GaborFeatureExtract</span><span>$</span><span>new</span><span>()</span><span>
</span><span>#------------------</span><span>
</span><span># gabor-filter-bank</span><span>
</span><span>#------------------</span><span>
</span><span>gb_f</span><span> </span><span>=</span><span> </span><span>init_gb</span><span>$</span><span>gabor_filter_bank</span><span>(</span><span>scales</span><span> </span><span>=</span><span> </span><span>5</span><span>,</span><span> </span><span>orientations</span><span> </span><span>=</span><span> </span><span>8</span><span>,</span><span> </span><span>gabor_rows</span><span> </span><span>=</span><span> </span><span>39</span><span>,</span><span>
</span><span>gabor_columns</span><span> </span><span>=</span><span> </span><span>39</span><span>,</span><span> </span><span>plot_data</span><span> </span><span>=</span><span> </span><span>TRUE</span><span>)</span><span>
</span><span>#-----------------------------------------------</span><span>
</span><span># plot of the real part of the gabor-filter-bank</span><span>
</span><span>#-----------------------------------------------</span><span>
</span><span>plt_f</span><span> </span><span>=</span><span> </span><span>init_gb</span><span>$</span><span>plot_gabor</span><span>(</span><span>real_matrices</span><span> </span><span>=</span><span> </span><span>gb_f</span><span>$</span><span>gabor_real</span><span>,</span><span> </span><span>margin_btw_plots</span><span> </span><span>=</span><span> </span><span>0.65</span><span>,</span><span>
</span><span>thresholding</span><span> </span><span>=</span><span> </span><span>FALSE</span><span>)</span><span>
</span></code></pre>
</div>
</div>
<p></p>
<p><img alt="" src="https://i1.wp.com/mlampros.github.io/mlampros.github.io/2018/08/08/Gabor_Feature_Extraction/gabor_filter_bank.png?w=456" data-recalc-dims="1"></p>
<p></p>
<p>For the <em>gabor_filter_bank</em> I use 5 <em>scales</em> and 8 <em>orientations</em> to build filters of size 39 x 39. The output of the method is a list of length 3,</p>
<p></p>
<div>
<div>
<pre><code><span>
</span><span>str</span><span>(</span><span>gb_f</span><span>)</span><span>
</span><span>List</span><span> </span><span>of</span><span> </span><span>3</span><span>
</span><span>$</span><span> </span><span>gaborArray</span><span> </span><span>:</span><span>List</span><span> </span><span>of</span><span> </span><span>40</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>cplx</span><span> </span><span>[</span><span>1</span><span>:</span><span>39</span><span>,</span><span> </span><span>1</span><span>:</span><span>39</span><span>]</span><span> </span><span>-1.58e-12-0.00i</span><span> </span><span>0.00-5.02e-12i</span><span> </span><span>1.50e-11-0.00i</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>cplx</span><span> </span><span>[</span><span>1</span><span>:</span><span>39</span><span>,</span><span> </span><span>1</span><span>:</span><span>39</span><span>]</span><span> </span><span>4.86e-08-3.96e-08i</span><span> </span><span>1.02e-07+4.63e-08i</span><span> </span><span>6.31e-09+1.93e-07i</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>cplx</span><span> </span><span>[</span><span>1</span><span>:</span><span>39</span><span>,</span><span> </span><span>1</span><span>:</span><span>39</span><span>]</span><span> </span><span>6.24e-06-6.24e-06i</span><span> </span><span>1.18e-05+0.00i</span><span> </span><span>1.10e-05+1.10e-05i</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>cplx</span><span> </span><span>[</span><span>1</span><span>:</span><span>39</span><span>,</span><span> </span><span>1</span><span>:</span><span>39</span><span>]</span><span> </span><span>-6.69e-05-3.18e-05i</span><span> </span><span>-4.63e-05-7.20e-05i</span><span> </span><span>-1.60e-06-9.81e-05i</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>cplx</span><span> </span><span>[</span><span>1</span><span>:</span><span>39</span><span>,</span><span> </span><span>1</span><span>:</span><span>39</span><span>]</span><span> </span><span>1.40e-04+5.81e-05i</span><span> </span><span>1.15e-04+1.15e-04i</span><span> </span><span>6.68e-05+1.61e-04i</span><span> </span><span>...</span><span>
</span><span>.......</span><span>
</span><span>$</span><span> </span><span>gabor_imaginary</span><span>:</span><span>List</span><span> </span><span>of</span><span> </span><span>40</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>39</span><span>,</span><span> </span><span>1</span><span>:</span><span>39</span><span>]</span><span> </span><span>-4.65e-27</span><span> </span><span>-5.02e-12</span><span> </span><span>-1.10e-26</span><span> </span><span>4.21e-11</span><span> </span><span>-2.99e-25</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>39</span><span>,</span><span> </span><span>1</span><span>:</span><span>39</span><span>]</span><span> </span><span>-3.96e-08</span><span> </span><span>4.63e-08</span><span> </span><span>1.93e-07</span><span> </span><span>1.53e-07</span><span> </span><span>-3.04e-07</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>39</span><span>,</span><span> </span><span>1</span><span>:</span><span>39</span><span>]</span><span> </span><span>-6.24e-06</span><span> </span><span>4.84e-20</span><span> </span><span>1.10e-05</span><span> </span><span>2.01e-05</span><span> </span><span>1.81e-05</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>39</span><span>,</span><span> </span><span>1</span><span>:</span><span>39</span><span>]</span><span> </span><span>-3.18e-05</span><span> </span><span>-7.20e-05</span><span> </span><span>-9.81e-05</span><span> </span><span>-9.58e-05</span><span> </span><span>-5.78e-05</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>39</span><span>,</span><span> </span><span>1</span><span>:</span><span>39</span><span>]</span><span> </span><span>5.81e-05</span><span> </span><span>1.15e-04</span><span> </span><span>1.61e-04</span><span> </span><span>1.86e-04</span><span> </span><span>1.83e-04</span><span> </span><span>...</span><span>
</span><span>.......</span><span>
</span><span>$</span><span> </span><span>gabor_real</span><span> </span><span>:</span><span>List</span><span> </span><span>of</span><span> </span><span>40</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>39</span><span>,</span><span> </span><span>1</span><span>:</span><span>39</span><span>]</span><span> </span><span>-1.58e-12</span><span> </span><span>5.54e-27</span><span> </span><span>1.50e-11</span><span> </span><span>-4.12e-26</span><span> </span><span>-1.11e-10</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>39</span><span>,</span><span> </span><span>1</span><span>:</span><span>39</span><span>]</span><span> </span><span>4.86e-08</span><span> </span><span>1.02e-07</span><span> </span><span>6.31e-09</span><span> </span><span>-2.85e-07</span><span> </span><span>-4.28e-07</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>39</span><span>,</span><span> </span><span>1</span><span>:</span><span>39</span><span>]</span><span> </span><span>6.24e-06</span><span> </span><span>1.18e-05</span><span> </span><span>1.10e-05</span><span> </span><span>-8.11e-20</span><span> </span><span>-1.81e-05</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>39</span><span>,</span><span> </span><span>1</span><span>:</span><span>39</span><span>]</span><span> </span><span>-6.69e-05</span><span> </span><span>-4.63e-05</span><span> </span><span>-1.60e-06</span><span> </span><span>5.73e-05</span><span> </span><span>1.12e-04</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>39</span><span>,</span><span> </span><span>1</span><span>:</span><span>39</span><span>]</span><span> </span><span>1.40e-04</span><span> </span><span>1.15e-04</span><span> </span><span>6.68e-05</span><span> </span><span>-3.77e-19</span><span> </span><span>-7.57e-05</span><span> </span><span>...</span><span>
</span><span>.......</span><span>
</span></code></pre>
</div>
</div>
<p></p>
<p>The first sublist (<em>gaborArray</em>) consists of 40 matrices (5 scales x 8 orientations) of type complex, where each matix is of dimension 39 x 39 (gabor filter). The second sublist (<em>gabor_imaginary</em>) is the imaginary part (numeric) whereas the third sublist is the real part (<em>gabor_real</em>). The real part (numeric) is used to plot the gabor filters.</p>
<p>The documentation includes more details for each of the parameters used.</p>
<p></p>
<h3>gabor_feature_extraction</h3>
<p></p>
<p>The <strong>gabor_feature_extraction</strong> method extracts the Gabor Features of the image. This method is modified in comparison to the initial Matlab code to give users the option to downsample the image or to normalize the features. Moreover, I added the <strong>Magnitude</strong> feature because according to <a rel="nofollow" href="https://www.researchgate.net/publication/283539985_Gabor_Feature_Based_Unsupervised_Change_Detection_of_Multitemporal_SAR_Images_Based_on_Two-Level_Clustering" target="_blank">literature</a> it improves predictability.</p>
<p>Based on the previously mentioned <em>car.png</em> image,</p>
<p></p>
<div>
<div>
<pre><code><span>
</span><span># read image</span><span>
</span><span>#-----------</span><span>
</span><span>pth_im</span><span> </span><span>=</span><span> </span><span>system.file</span><span>(</span><span>&quot;tmp_images&quot;</span><span>,</span><span> </span><span>&quot;car.png&quot;</span><span>,</span><span> </span><span>package</span><span> </span><span>=</span><span> </span><span>&quot;OpenImageR&quot;</span><span>)</span><span>
</span><span>im</span><span> </span><span>=</span><span> </span><span>readImage</span><span>(</span><span>pth_im</span><span>)</span><span> </span><span>*</span><span> </span><span>255</span><span>
</span><span># gabor-feature-extract</span><span>
</span><span>#----------------------</span><span>
</span><span>gb_im</span><span> </span><span>=</span><span> </span><span>init_gb</span><span>$</span><span>gabor_feature_extraction</span><span>(</span><span>image</span><span> </span><span>=</span><span> </span><span>im</span><span>,</span><span> </span><span>scales</span><span> </span><span>=</span><span> </span><span>5</span><span>,</span><span> </span><span>orientations</span><span> </span><span>=</span><span> </span><span>8</span><span>,</span><span>
</span><span>downsample_gabor</span><span> </span><span>=</span><span> </span><span>FALSE</span><span>,</span><span> </span><span>downsample_rows</span><span> </span><span>=</span><span> </span><span>NULL</span><span>,</span><span>
</span><span>downsample_cols</span><span> </span><span>=</span><span> </span><span>NULL</span><span>,</span><span> </span><span>gabor_rows</span><span> </span><span>=</span><span> </span><span>39</span><span>,</span><span> </span><span>gabor_columns</span><span> </span><span>=</span><span> </span><span>39</span><span>,</span><span> </span><span>plot_data</span><span> </span><span>=</span><span> </span><span>TRUE</span><span>,</span><span> </span><span>normalize_features</span><span> </span><span>=</span><span> </span><span>FALSE</span><span>,</span><span> </span><span>threads</span><span> </span><span>=</span><span> </span><span>3</span><span>)</span><span>
</span></code></pre>
</div>
</div>
<p></p>
<p>This function again returns a list of length 3,</p>
<p></p>
<div>
<div>
<pre><code><span>
</span><span>str</span><span>(</span><span>gb_im</span><span>)</span><span>
</span><span>List</span><span> </span><span>of</span><span> </span><span>3</span><span>
</span><span>$</span><span> </span><span>gaborFeatures</span><span> </span><span>:</span><span>List</span><span> </span><span>of</span><span> </span><span>2</span><span>
</span><span>..</span><span>$</span><span> </span><span>magnitude</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>,</span><span> </span><span>1</span><span>:</span><span>206670</span><span>]</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>energy_aptitude</span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>,</span><span> </span><span>1</span><span>:</span><span>80</span><span>]</span><span> </span><span>115823</span><span> </span><span>27566</span><span> </span><span>33289</span><span> </span><span>20074</span><span> </span><span>26918</span><span> </span><span>...</span><span>
</span><span>$</span><span> </span><span>gabor_features_imaginary</span><span>:</span><span>List</span><span> </span><span>of</span><span> </span><span>5</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>166</span><span>,</span><span> </span><span>1</span><span>:</span><span>249</span><span>,</span><span> </span><span>1</span><span>:</span><span>8</span><span>]</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>166</span><span>,</span><span> </span><span>1</span><span>:</span><span>249</span><span>,</span><span> </span><span>1</span><span>:</span><span>8</span><span>]</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>166</span><span>,</span><span> </span><span>1</span><span>:</span><span>249</span><span>,</span><span> </span><span>1</span><span>:</span><span>8</span><span>]</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>166</span><span>,</span><span> </span><span>1</span><span>:</span><span>249</span><span>,</span><span> </span><span>1</span><span>:</span><span>8</span><span>]</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>166</span><span>,</span><span> </span><span>1</span><span>:</span><span>249</span><span>,</span><span> </span><span>1</span><span>:</span><span>8</span><span>]</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>...</span><span>
</span><span>$</span><span> </span><span>gabor_features_real</span><span> </span><span>:</span><span>List</span><span> </span><span>of</span><span> </span><span>5</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>166</span><span>,</span><span> </span><span>1</span><span>:</span><span>249</span><span>,</span><span> </span><span>1</span><span>:</span><span>8</span><span>]</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>166</span><span>,</span><span> </span><span>1</span><span>:</span><span>249</span><span>,</span><span> </span><span>1</span><span>:</span><span>8</span><span>]</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>166</span><span>,</span><span> </span><span>1</span><span>:</span><span>249</span><span>,</span><span> </span><span>1</span><span>:</span><span>8</span><span>]</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>166</span><span>,</span><span> </span><span>1</span><span>:</span><span>249</span><span>,</span><span> </span><span>1</span><span>:</span><span>8</span><span>]</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>...</span><span>
</span><span>..</span><span>$</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>166</span><span>,</span><span> </span><span>1</span><span>:</span><span>249</span><span>,</span><span> </span><span>1</span><span>:</span><span>8</span><span>]</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>...</span><span>
</span></code></pre>
</div>
</div>
<p></p>
<p>where <em>gaborFeatures</em> are the extracted features with number of rows equal to nrow(im) x ncol(im) (or 166 x 249) and number of columns equal to scales x orientations (or 5 x 8). The second and third sublists are the imaginary and real part of the image resulted after the convolution with the gabor filters. The following code chunk allows the user to plot the different <em>scales</em> and <em>orientations</em> of the image,</p>
<p></p>
<div>
<div>
<pre><code><span>
</span><span>plt_im</span><span> </span><span>=</span><span> </span><span>init_gb</span><span>$</span><span>plot_gabor</span><span>(</span><span>real_matrices</span><span> </span><span>=</span><span> </span><span>gb_im</span><span>$</span><span>gabor_features_real</span><span>,</span><span>
</span><span>margin_btw_plots</span><span> </span><span>=</span><span> </span><span>0.65</span><span>,</span><span> </span><span>thresholding</span><span> </span><span>=</span><span> </span><span>FALSE</span><span>)</span><span>
</span></code></pre>
</div>
</div>
<p></p>
<p><img alt="" src="https://i0.wp.com/mlampros.github.io/mlampros.github.io/2018/08/08/Gabor_Feature_Extraction/gabor_car.png?w=456" data-recalc-dims="1"></p>
<p></p>
<p>By thresholding the <em>gb_im$gabor_features_real</em> object (scales, orientations) to [0,1] the images can be visually explored,</p>
<p></p>
<div>
<div>
<pre><code><span>
</span><span># thresholding parameter is set to TRUE</span><span>
</span><span>#--------------------------------------</span><span>
</span><span>plt_im_thresh</span><span> </span><span>=</span><span> </span><span>init_gb</span><span>$</span><span>plot_gabor</span><span>(</span><span>real_matrices</span><span> </span><span>=</span><span> </span><span>gb_im</span><span>$</span><span>gabor_features_real</span><span>,</span><span>
</span><span>margin_btw_plots</span><span> </span><span>=</span><span> </span><span>0.65</span><span>,</span><span> </span><span>thresholding</span><span> </span><span>=</span><span> </span><span>TRUE</span><span>)</span><span>
</span></code></pre>
</div>
</div>
<p></p>
<p><img alt="" src="https://i1.wp.com/mlampros.github.io/mlampros.github.io/2018/08/08/Gabor_Feature_Extraction/gabor_car_thresholding.png?w=456" data-recalc-dims="1"></p>
<p></p>
<h3>gabor_feature_engine</h3>
<p></p>
<p>The <em>gabor_feature_engine</em> method is an extension of the initial Matlab code and allows the user to extract gabor features from multiple images. This method works in the same way as the <em>HOG_apply</em> method, which takes a matrix of images – such as the mnist data set – and after processing it returns the features. The following example illustrates how to use the <em>gabor_feature_engine</em> method with the mnist data set,</p>
<p></p>
<div>
<div>
<pre><code><span>
</span><span># for instance downloading of the mnist data on a linux OS</span><span>
</span><span>#----------------------------------------------------------</span><span>
</span><span>system</span><span>(</span><span>&quot;wget https://raw.githubusercontent.com/mlampros/DataSets/master/mnist.zip&quot;</span><span>)</span><span>
</span><span># or just navigate to &quot;https://github.com/mlampros/DataSets/blob/master/mnist.zip&quot; and click the download button</span><span>
</span><span>#-------------------------------------------------------------------------------------------</span><span>
</span><span>mnist</span><span> </span><span>&lt;-</span><span> </span><span>read.table</span><span>(</span><span>unz</span><span>(</span><span>&quot;mnist.zip&quot;</span><span>,</span><span> </span><span>&quot;mnist.csv&quot;</span><span>),</span><span> </span><span>nrows</span><span> </span><span>=</span><span> </span><span>70000</span><span>,</span><span> </span><span>header</span><span> </span><span>=</span><span> </span><span>T</span><span>,</span><span> </span><span>quote</span><span> </span><span>=</span><span> </span><span>&quot;\&quot;&quot;</span><span>,</span><span> </span><span>sep</span><span> </span><span>=</span><span> </span><span>&quot;,&quot;</span><span>)</span><span>
</span><span>mnist</span><span> </span><span>=</span><span> </span><span>as.matrix</span><span>(</span><span>mnist</span><span>)</span><span>
</span><span>x</span><span> </span><span>=</span><span> </span><span>mnist</span><span>[,</span><span> </span><span>-</span><span>ncol</span><span>(</span><span>mnist</span><span>)]</span><span>
</span><span>y</span><span> </span><span>=</span><span> </span><span>mnist</span><span>[,</span><span> </span><span>ncol</span><span>(</span><span>mnist</span><span>)]</span><span> </span><span>+</span><span> </span><span>1</span><span>
</span><span>dat</span><span> </span><span>=</span><span> </span><span>init_gb</span><span>$</span><span>gabor_feature_engine</span><span>(</span><span>img_data</span><span> </span><span>=</span><span> </span><span>x</span><span>,</span><span> </span><span>img_nrow</span><span> </span><span>=</span><span> </span><span>28</span><span>,</span><span> </span><span>img_ncol</span><span> </span><span>=</span><span> </span><span>28</span><span>,</span><span>
</span><span>scales</span><span> </span><span>=</span><span> </span><span>4</span><span>,</span><span> </span><span>orientations</span><span> </span><span>=</span><span> </span><span>8</span><span>,</span><span> </span><span>gabor_rows</span><span> </span><span>=</span><span> </span><span>13</span><span>,</span><span>
</span><span>gabor_columns</span><span> </span><span>=</span><span> </span><span>13</span><span>,</span><span> </span><span>downsample_gabor</span><span> </span><span>=</span><span> </span><span>FALSE</span><span>,</span><span>
</span><span>downsample_rows</span><span> </span><span>=</span><span> </span><span>NULL</span><span>,</span><span> </span><span>downsample_cols</span><span> </span><span>=</span><span> </span><span>NULL</span><span>,</span><span>
</span><span>normalize_features</span><span> </span><span>=</span><span> </span><span>FALSE</span><span>,</span><span> </span><span>threads</span><span> </span><span>=</span><span> </span><span>6</span><span>,</span><span> </span><span>verbose</span><span> </span><span>=</span><span> </span><span>TRUE</span><span>)</span><span>
</span><span>Time</span><span> </span><span>to</span><span> </span><span>complete</span><span> </span><span>:</span><span> </span><span>4.111672</span><span> </span><span>mins</span><span> </span></code></pre>
</div>
</div>
<p></p>
<div>
<div>
<pre><code><span>
</span><span>></span><span> </span><span>str</span><span>(</span><span>dat</span><span>)</span><span>
</span><span>List</span><span> </span><span>of</span><span> </span><span>2</span><span>
</span><span>$</span><span> </span><span>magnitude</span><span> </span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>70000</span><span>,</span><span> </span><span>1</span><span>:</span><span>3136</span><span>]</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span> </span><span>...</span><span>
</span><span>$</span><span> </span><span>energy_aptitude</span><span>:</span><span> </span><span>num</span><span> </span><span>[</span><span>1</span><span>:</span><span>70000</span><span>,</span><span> </span><span>1</span><span>:</span><span>64</span><span>]</span><span> </span><span>2682</span><span> </span><span>2576</span><span> </span><span>1399</span><span> </span><span>1178</span><span> </span><span>2240</span><span> </span><span>...</span><span>
</span></code></pre>
</div>
</div>
<p></p>
<p>The <em>dat</em> object is a list of length 2. The first sublist corresponds to <em>magnitude</em> whereas the second sublist to <em>local-energy</em> and <em>mean-aptitude</em>. The first thing to do before calculating the accuracy for the mnist data is to reduce the dimensionality of the <em>magnitude</em> feature (I’ll use the <a rel="nofollow" href="https://github.com/bwlewis/irlba" target="_blank">irlba</a> package for this purpose),</p>
<p></p>
<div>
<div>
<pre><code><span>
</span><span>svd_irlb</span><span> </span><span>=</span><span> </span><span>irlba</span><span>::</span><span>irlba</span><span>(</span><span>as.matrix</span><span>(</span><span>dat</span><span>$</span><span>magnitude</span><span>),</span><span> </span><span>nv</span><span> </span><span>=</span><span> </span><span>100</span><span>,</span><span> </span><span>nu</span><span> </span><span>=</span><span> </span><span>100</span><span>,</span><span> </span><span>verbose</span><span> </span><span>=</span><span> </span><span>T</span><span>)</span><span>
</span><span>new_x</span><span> </span><span>=</span><span> </span><span>as.matrix</span><span>(</span><span>dat</span><span>$</span><span>magnitude</span><span>)</span><span> </span><span>%*%</span><span> </span><span>svd_irlb</span><span>$</span><span>v</span><span>
</span></code></pre>
</div>
</div>
<p></p>
<p>and I’ll create a centered-scaled matrix of the reduced <em>magnitude</em> and the <em>energy-aptitude</em> data,</p>
<p></p>
<div>
<div>
<pre><code><span>
</span><span>dat</span><span> </span><span>=</span><span> </span><span>ClusterR</span><span>::</span><span>center_scale</span><span>(</span><span>cbind</span><span>(</span><span>new_x</span><span>,</span><span> </span><span>dat</span><span>$</span><span>energy_aptitude</span><span>))</span><span>
</span><span>dim</span><span>(</span><span>dat</span><span>)</span><span>
</span><span>[</span><span>1</span><span>]</span><span> </span><span>70000</span><span> </span><span>164</span><span>
</span></code></pre>
</div>
</div>
<p></p>
<p>then I’ll utilize the <em>nmslibR</em> library (approximate method ‘hnsw’) to calculate the accuracy for the mnist data,</p>
<div>
<div>
<pre><code><span>
</span><span>M</span><span> </span><span>=</span><span> </span><span>30</span><span>
</span><span>efC</span><span> </span><span>=</span><span> </span><span>100</span><span>
</span><span>num_threads</span><span> </span><span>=</span><span> </span><span>6</span><span>
</span><span>index_params</span><span> </span><span>=</span><span> </span><span>list</span><span>(</span><span>'M'</span><span>=</span><span> </span><span>M</span><span>,</span><span> </span><span>'indexThreadQty'</span><span> </span><span>=</span><span> </span><span>num_threads</span><span>,</span><span> </span><span>'efConstruction'</span><span> </span><span>=</span><span> </span><span>efC</span><span>,</span><span>
</span><span>'post'</span><span> </span><span>=</span><span> </span><span>0</span><span>,</span><span> </span><span>'skip_optimized_index'</span><span> </span><span>=</span><span> </span><span>1</span><span> </span><span>)</span><span>
</span><span>efS</span><span> </span><span>=</span><span> </span><span>100</span><span>
</span><span>query_time_params</span><span> </span><span>=</span><span> </span><span>list</span><span>(</span><span>'efSearch'</span><span> </span><span>=</span><span> </span><span>efS</span><span>)</span><span>
</span><span>fit_gab</span><span> </span><span>=</span><span> </span><span>nmslibR</span><span>::</span><span>KernelKnnCV_nmslib</span><span>(</span><span>dat</span><span>,</span><span> </span><span>y</span><span>,</span><span> </span><span>k</span><span> </span><span>=</span><span> </span><span>20</span><span>,</span><span> </span><span>folds</span><span> </span><span>=</span><span> </span><span>4</span><span>,</span><span> </span><span>h</span><span> </span><span>=</span><span> </span><span>1</span><span>,</span><span>
</span><span>weights_function</span><span> </span><span>=</span><span> </span><span>'biweight_triangular_tricube_MULT'</span><span>,</span><span>
</span><span>Levels</span><span> </span><span>=</span><span> </span><span>sort</span><span>(</span><span>unique</span><span>(</span><span>y</span><span>)),</span><span> </span><span>Index_Params</span><span> </span><span>=</span><span> </span><span>index_params</span><span>,</span><span>
</span><span>Time_Params</span><span> </span><span>=</span><span> </span><span>query_time_params</span><span>,</span><span> </span><span>space</span><span> </span><span>=</span><span> </span><span>&quot;cosinesimil&quot;</span><span>,</span><span>
</span><span>space_params</span><span> </span><span>=</span><span> </span><span>NULL</span><span>,</span><span> </span><span>method</span><span> </span><span>=</span><span> </span><span>&quot;hnsw&quot;</span><span>,</span><span> </span><span>data_type</span><span> </span><span>=</span><span> </span><span>&quot;DENSE_VECTOR&quot;</span><span>,</span><span> </span><span>dtype</span><span> </span><span>=</span><span> </span><span>&quot;FLOAT&quot;</span><span>,</span><span> </span><span>index_filepath</span><span> </span><span>=</span><span> </span><span>NULL</span><span>,</span><span> </span><span>print_progress</span><span> </span><span>=</span><span> </span><span>T</span><span>,</span><span>
</span><span>num_threads</span><span> </span><span>=</span><span> </span><span>6</span><span>,</span><span> </span><span>seed_num</span><span> </span><span>=</span><span> </span><span>1</span><span>)</span><span>
</span><span>time</span><span> </span><span>to</span><span> </span><span>complete</span><span> </span><span>:</span><span> </span><span>30.82252</span><span> </span><span>secs</span><span>
</span></code></pre>
</div>
</div>
<p></p>
<div>
<div>
<pre><code><span>
</span><span>acc_fit_gab</span><span> </span><span>=</span><span> </span><span>unlist</span><span>(</span><span>lapply</span><span>(</span><span>1</span><span>:</span><span>length</span><span>(</span><span>fit_gab</span><span>$</span><span>preds</span><span>),</span><span>
</span><span>function</span><span>(</span><span>x</span><span>)</span><span> </span><span>{</span><span> </span><span>mean</span><span>(</span><span>y</span><span>[</span><span>fit_gab</span><span>$</span><span>folds</span><span>[[</span><span>x</span><span>]]]</span><span> </span><span>==</span><span> </span><span>max.col</span><span>(</span><span> </span><span>fit_gab</span><span>$</span><span>preds</span><span>[[</span><span>x</span><span>]],</span><span> </span><span>ties.method</span><span> </span><span>=</span><span> </span><span>'random'</span><span>))</span><span> </span><span>}))</span><span>
</span><span>mean</span><span>(</span><span>acc_fit_gab</span><span>)</span><span>
</span><span>[</span><span>1</span><span>]</span><span> </span><span>0.9752714</span><span>
</span></code></pre>
</div>
</div>
<p></p>
<p>I’ll do the same using the <em>HOG_apply</em> function,</p>
<p></p>
<div>
<div>
<pre><code><span>
</span><span># hog-features for the mnist data</span><span>
</span><span>#--------------------------------</span><span>
</span><span>hog</span><span> </span><span>=</span><span> </span><span>OpenImageR</span><span>::</span><span>HOG_apply</span><span>(</span><span>x</span><span>,</span><span> </span><span>cells</span><span> </span><span>=</span><span> </span><span>6</span><span>,</span><span> </span><span>orientations</span><span> </span><span>=</span><span> </span><span>9</span><span>,</span><span> </span><span>rows</span><span> </span><span>=</span><span> </span><span>28</span><span>,</span><span> </span><span>columns</span><span> </span><span>=</span><span> </span><span>28</span><span>,</span><span> </span><span>threads</span><span> </span><span>=</span><span> </span><span>6</span><span>)</span><span>
</span><span>fit_hog</span><span> </span><span>=</span><span> </span><span>nmslibR</span><span>::</span><span>KernelKnnCV_nmslib</span><span>(</span><span>hog</span><span>,</span><span> </span><span>y</span><span>,</span><span> </span><span>k</span><span> </span><span>=</span><span> </span><span>20</span><span>,</span><span> </span><span>folds</span><span> </span><span>=</span><span> </span><span>4</span><span>,</span><span> </span><span>h</span><span> </span><span>=</span><span> </span><span>1</span><span>,</span><span>
</span><span>weights_function</span><span> </span><span>=</span><span> </span><span>'biweight_triangular_tricube_MULT'</span><span>,</span><span>
</span><span>Levels</span><span> </span><span>=</span><span> </span><span>sort</span><span>(</span><span>unique</span><span>(</span><span>y</span><span>)),</span><span> </span><span>Index_Params</span><span> </span><span>=</span><span> </span><span>index_params</span><span>,</span><span>
</span><span>Time_Params</span><span> </span><span>=</span><span> </span><span>query_time_params</span><span>,</span><span> </span><span>space</span><span> </span><span>=</span><span> </span><span>&quot;cosinesimil&quot;</span><span>,</span><span>
</span><span>space_params</span><span> </span><span>=</span><span> </span><span>NULL</span><span>,</span><span> </span><span>method</span><span> </span><span>=</span><span> </span><span>&quot;hnsw&quot;</span><span>,</span><span> </span><span>data_type</span><span> </span><span>=</span><span> </span><span>&quot;DENSE_VECTOR&quot;</span><span>,</span><span> </span><span>dtype</span><span> </span><span>=</span><span> </span><span>&quot;FLOAT&quot;</span><span>,</span><span> </span><span>index_filepath</span><span> </span><span>=</span><span> </span><span>NULL</span><span>,</span><span> </span><span>print_progress</span><span> </span><span>=</span><span> </span><span>T</span><span>,</span><span>
</span><span>num_threads</span><span> </span><span>=</span><span> </span><span>6</span><span>,</span><span> </span><span>seed_num</span><span> </span><span>=</span><span> </span><span>1</span><span>)</span><span>
</span><span>time</span><span> </span><span>to</span><span> </span><span>complete</span><span> </span><span>:</span><span> </span><span>41.00309</span><span> </span><span>secs</span><span>
</span></code></pre>
</div>
</div>
<p></p>
<div>
<div>
<pre><code><span>
</span><span>acc_fit_hog</span><span> </span><span>=</span><span> </span><span>unlist</span><span>(</span><span>lapply</span><span>(</span><span>1</span><span>:</span><span>length</span><span>(</span><span>fit_hog</span><span>$</span><span>preds</span><span>),</span><span> </span><span>function</span><span>(</span><span>x</span><span>)</span><span> </span><span>{</span><span> </span><span>mean</span><span>(</span><span>y</span><span>[</span><span>fit_hog</span><span>$</span><span>folds</span><span>[[</span><span>x</span><span>]]]</span><span> </span><span>==</span><span> </span><span>max.col</span><span>(</span><span> </span><span>fit_hog</span><span>$</span><span>preds</span><span>[[</span><span>x</span><span>]],</span><span> </span><span>ties.method</span><span> </span><span>=</span><span> </span><span>'random'</span><span>))</span><span> </span><span>}))</span><span>
</span><span>mean</span><span>(</span><span>acc_fit_hog</span><span>)</span><span>
</span><span>[</span><span>1</span><span>]</span><span> </span><span>0.9787429</span><span>
</span></code></pre>
</div>
</div>
<p></p>
<p>By averaging both the <em>gabor</em> and the <em>HoG</em> features the mean accuracy increases to 98.34 % which is very close to the score of the <a rel="nofollow" href="http://mlampros.github.io/2016/07/10/KernelKnn/" target="_blank">HoG + brute force method of KernelKnn</a> (98.4),<br>
</p>
<div>
<div>
<pre><code><span>
</span><span>acc_fit_gab_hog</span><span> </span><span>=</span><span> </span><span>unlist</span><span>(</span><span>lapply</span><span>(</span><span>1</span><span>:</span><span>length</span><span>(</span><span>fit_gab</span><span>$</span><span>preds</span><span>),</span><span>
</span><span>function</span><span>(</span><span>x</span><span>)</span><span> </span><span>{</span><span> </span><span>mean</span><span>(</span><span>y</span><span>[</span><span>fit_gab</span><span>$</span><span>folds</span><span>[[</span><span>x</span><span>]]]</span><span> </span><span>==</span><span> </span><span>max.col</span><span>(</span><span> </span><span>(</span><span>fit_gab</span><span>$</span><span>preds</span><span>[[</span><span>x</span><span>]]</span><span> </span><span>+</span><span> </span><span>fit_hog</span><span>$</span><span>preds</span><span>[[</span><span>x</span><span>]])</span><span> </span><span>/</span><span> </span><span>2</span><span>,</span><span> </span><span>ties.method</span><span> </span><span>=</span><span> </span><span>'random'</span><span>))</span><span> </span><span>}))</span><span>
</span><span>mean</span><span>(</span><span>acc_fit_gab_hog</span><span>)</span><span>
</span><span>[</span><span>1</span><span>]</span><span> </span><span>0.9833857</span><span>
</span></code></pre>
</div>
</div>
<p><em>References :</em></p>
<ul>
<li><a rel="nofollow" href="https://github.com/mhaghighat/gabor" target="_blank">https://github.com/mhaghighat/gabor</a></li>
<li><a rel="nofollow" href="https://stackoverflow.com/questions/20608458/gabor-feature-extraction" target="_blank">Gabor feature extraction Stackoverflow question</a></li>
<li><a rel="nofollow" href="http://www.paper.edu.cn/scholar/showpdf/NUz2MN4IMTD0kxeQh" target="_blank">Features Extraction using a Gabor Filter Family</a></li>
<li><a rel="nofollow" href="https://www.researchgate.net/publication/283539985_Gabor_Feature_Based_Unsupervised_Change_Detection_of_Multitemporal_SAR_Images_Based_on_Two-Level_Clustering" target="_blank">Gabor Feature Based Unsupervised Change Detection of Multitemporal SAR Images Based on Two-Level Clustering</a></li>
</ul>
<p></p>
<p>The updated version of the <em>OpenImageR</em> package can be found in my <a rel="nofollow" href="https://github.com/mlampros/OpenImageR" target="_blank">Github repository</a> and to report bugs/issues please use the following link, <a rel="nofollow" href="https://github.com/mlampros/OpenImageR/issues" target="_blank">https://github.com/mlampros/OpenImageR/issues</a>.</p>
<p></p>
	<p>
<div>
<div>To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="http://mlampros.github.io/mlampros.github.io/2018/08/08/Gabor_Feature_Extraction/"> mlampros</a></strong>.</div>
<hr>
<a rel="nofollow" href="https://www.r-bloggers.com/">R-bloggers.com</a> offers <strong><a rel="nofollow" href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers">daily e-mail updates</a></strong> about <a rel="nofollow" href="https://www.r-project.org/" title="The R Project for Statistical Computing">R</a> news and <a rel="nofollow" href="https://www.r-bloggers.com/search/tutorial" title="R tutorials">tutorials</a> on topics such as: <a rel="nofollow" href="https://www.r-bloggers.com/search/data%20science" title="Data science">Data science</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/Big%20Data" title="Big Data">Big Data, <a rel="nofollow" href="https://www.r-users.com/" title="R jobs">R jobs</a>, visualization (<a rel="nofollow" href="https://www.r-bloggers.com/search/ggplot2" title="ggplot and ggplot2 tutorials">ggplot2</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/boxplot" title="Boxplots using lattice and ggplot2 tutorials">Boxplots</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/map" title="Maps and gis">maps</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/animation" title="Animation in R">animation</a>), programming (<a rel="nofollow" href="https://www.r-bloggers.com/search/RStudio" title="RStudio IDE for R">RStudio</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/sweave" title="Sweave and literate programming">Sweave</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/LaTeX" title="LaTeX in R">LaTeX</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/SQL" title="SQL and databases">SQL</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/eclipse" title="Eclipse IDE for R">Eclipse</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/git" title="git and github, Version Control System">git</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/hadoop" title="Large data in R using Hadoop">hadoop</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/Web+Scraping" title="Web Scraping of google, facebook, yahoo, twitter and more using R">Web Scraping</a>) statistics (<a rel="nofollow" href="https://www.r-bloggers.com/search/regression" title="Regressions and ANOVA analysis tutorials">regression</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/PCA" title="principal component analysis tutorial">PCA</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/time+series" title="Time series">time series</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/trading" title="finance trading">trading</a>) and more...
<img width="1" alt="" src="http://feeds.feedburner.com/~r/RBloggers/~4/DQcmKrMHmwM" height="1"></a></div>