<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-1927580253011932483</atom:id><lastBuildDate>Mon, 22 May 2023 08:41:32 +0000</lastBuildDate><category>Data Science</category><category>Pyhton</category><category>R</category><category>Machine Learning</category><category>General</category><category>My Black Belt Experience</category><category>Case Study</category><category>Lean</category><category>Others</category><category>Six Sigma</category><title>My Journey in Six Sigma, Lean, Data Science</title><description>Six Sigma + Lean + Data Science = Future Solution</description><link>http://6sigmaforum.blogspot.com/</link><managingEditor>noreply@blogger.com (I Talk - You Do)</managingEditor><generator>Blogger</generator><openSearch:totalResults>36</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-3635722222979812679</guid><pubDate>Sat, 24 Sep 2022 04:44:00 +0000</pubDate><atom:updated>2022-09-24T12:44:28.928+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>How To Read And Convert XML Table To DataFrame</title><description>&lt;p&gt;code 到用时方恨少。之前就有想过把工作上某个 copy paste 的程式自动化，但都没有去执行。主要原因还是因为一直以来都是我自己在做，copy paste 嘛，原本就是一件很简单不过的事情，几秒钟的时间就能完成。但是，当我把这份简单的工作传给其他人来做的时后，我开始发现，原来，这 copy paste 的动作，对其他人来说并不那么容易掌控，错误百出，搞到自己接到不少的投诉。&lt;/p&gt;&lt;p&gt;有些人就是这样，一个简单的动作都不能做好，也不问问自己身体哪方面出了问题，尽会投诉。既然那么会投诉，但从来不投诉自己为啥那么残。&lt;/p&gt;&lt;p&gt;没办法，我唯一能做的就是把这我看似简单不过的动作再进一步自动化。这一个小小的投诉，又让我前进一小步。&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&amp;nbsp;以下是我再 stackoverflow 趴回来的 code，已试过。没问题。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# function to convert refx.xml to dataframe
# https://stackoverflow.com/questions/53317592/reading-pascal-voc-annotations-in-python
def read_content(xml_file: str):


    tree = ET.parse(xml_file)
    root = tree.getroot()

    list_with_all_boxes = []

    for boxes in root.iter(&#39;object&#39;):

        filename = root.find(&#39;filename&#39;).text

        ymin, xmin, ymax, xmax = None, None, None, None

        ymin = int(boxes.find(&quot;bndbox/ymin&quot;).text)
        xmin = int(boxes.find(&quot;bndbox/xmin&quot;).text)
        ymax = int(boxes.find(&quot;bndbox/ymax&quot;).text)
        xmax = int(boxes.find(&quot;bndbox/xmax&quot;).text)

        list_with_single_boxes = [xmin, ymin, xmax, ymax]
        list_with_all_boxes.append(list_with_single_boxes)
        
    return filename, list_with_all_boxes&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;过后把这 code 发给了另外一个同事，她帮我修改了一下，还没经过测试。从 code 的流程来看，应该没什么问题。anyway，先把它给收藏好。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;#code from ayuni

def read_xml(path):
    obj_list = []
    tree = ET.parse(open(path,&#39;r&#39;))
    root = tree.getroot()
    for objects in root.findall(&#39;object&#39;):
        name = objects.find(&#39;name&#39;).text
        bndbox = objects.find(&#39;bndbox&#39;)
        xmin = int(bndbox.find(&#39;xmin&#39;).text)
        ymin = int(bndbox.find(&#39;ymin&#39;).text)
        xmax = int(bndbox.find(&#39;xmax&#39;).text)
        ymax = int(bndbox.find(&#39;ymax&#39;).text)
        class_name = objects.find(&#39;name&#39;).text
        obj_list.append({&#39;class&#39;:class_name, &#39;bbox&#39;:{&#39;x1&#39;: xmin, &#39;x2&#39;: xmax, &#39;y1&#39;:ymin, &#39;y2&#39;:ymax }})
    
    return obj_list&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
</description><link>http://6sigmaforum.blogspot.com/2022/09/how-to-read-and-convert-xml-table-to.html</link><author>noreply@blogger.com (I Talk - You Do)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-3626102229467816969</guid><pubDate>Tue, 24 May 2022 15:22:00 +0000</pubDate><atom:updated>2022-05-24T23:22:47.901+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>How To Load Yolov5 Custom Object Detection Model For Inferencing</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;之前的 post，我用了 Roboflow 的 detect.py script 来做 inferencing，这个 script 基本上没什么问题，问题是他们的 script 只是把 detect 到的 object 用 bounding box frame 起来，然后 save 在一个 location。就这样完事。但没有我要的 inferencing data。那天花了我半天的时间尝试在 detect.py 加上自己的 script，的确是可以把 inferencing data 给 show 出来，但是就是无法把那些 data 收进一个 dataframe。&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;幸好，在网上给我趴到另外一个比较简单的 inferencing 方法（link 又弄丢了）。Anyway，最重要的还是 code 没问题。&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;以下是 yolov5 的步骤：&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;1。第一件事就是把 Google Drive 的 folder 联上，和 import 需要用到的 package&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;how&amp;nbsp;to&amp;nbsp;load&amp;nbsp;trained&amp;nbsp;yolov5&amp;nbsp;custom&amp;nbsp;object&amp;nbsp;detection&amp;nbsp;model&amp;nbsp;weight&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;ref&amp;nbsp;:&amp;nbsp;https://github.com/pylabel-project/samples/blob/main/pylabeler.ipynb&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;import&amp;nbsp;required&amp;nbsp;pkg&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;os&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;torch&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;pandas&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;from&lt;/span&gt;&amp;nbsp;google.colab&amp;nbsp;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;drive&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;mount&amp;nbsp;google&amp;nbsp;drive&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;drive.mount(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;/content/drive&#39;&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;os.chdir(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;/content/drive/My&amp;nbsp;Drive/yolov5&#39;&lt;/span&gt;)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2。设定好 weight, image 和其他的 parameter。（model_iou 是什么来的？）&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;defind&amp;nbsp;weight&amp;nbsp;and&amp;nbsp;image&amp;nbsp;location&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;define&amp;nbsp;model_conf&amp;nbsp;and&amp;nbsp;model_iou&amp;nbsp;parameter&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;model_path&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;/content/drive/My&amp;nbsp;Drive/yolov5/yolov5/runs/train/exp2/weights/best.pt&#39;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;imgs&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;/content/drive/My&amp;nbsp;Drive/yolov5/test/images/test1.jpg&#39;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;model_conf&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #09885a;&quot;&gt;0.85&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;&amp;nbsp;#@param&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;&amp;nbsp;{type:&quot;slider&quot;,&amp;nbsp;min:0,&amp;nbsp;max:1,&amp;nbsp;step:0.01}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;model_iou&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #09885a;&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;&amp;nbsp;#@param&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;&amp;nbsp;{type:&quot;slider&quot;,&amp;nbsp;min:0,&amp;nbsp;max:1,&amp;nbsp;step:0.01}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;img_size&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #09885a;&quot;&gt;416&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;  
  
  
  3。把 model load 出来&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;load&amp;nbsp;the&amp;nbsp;model&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;model&amp;nbsp;=&amp;nbsp;torch.hub.load(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;ultralytics/yolov5&#39;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;custom&#39;&lt;/span&gt;,&amp;nbsp;path=model_path,&amp;nbsp;force_reload=&lt;span style=&quot;color: blue;&quot;&gt;False&lt;/span&gt;)&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;span style=&quot;background-color: white; color: #212121; font-family: monospace;&quot;&gt;Using cache found in /root/.cache/torch/hub/ultralytics_yolov5_master
YOLOv5 🚀 2022-5-24 Python-3.7.13 torch-1.11.0+cu113 CUDA:0 (Tesla T4, 15110MiB)

Fusing layers... 
Model summary: 213 layers, 7018216 parameters, 0 gradients
Adding AutoShape... &lt;/span&gt;&lt;/div&gt;

&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;4。开始做 inference&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;start&amp;nbsp;inferencing&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;model.conf&amp;nbsp;=&amp;nbsp;model_conf&lt;/div&gt;&lt;div&gt;model.iou&amp;nbsp;=&amp;nbsp;model_iou&lt;/div&gt;&lt;br /&gt;&lt;div&gt;result&amp;nbsp;=&amp;nbsp;model(imgs,&amp;nbsp;size&amp;nbsp;=&amp;nbsp;img_size)&lt;span style=&quot;background-color: transparent;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;5。把 inference result print 出来看看&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;print&amp;nbsp;out&amp;nbsp;the&amp;nbsp;result&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;result.&lt;span style=&quot;color: #795e26;&quot;&gt;print&lt;/span&gt;()&lt;span style=&quot;background-color: transparent;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;




&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;span style=&quot;background-color: white; color: #212121; font-family: monospace;&quot;&gt;image 1/1: 416x416 2 RBCs
Speed: 15.2ms pre-process, 56.1ms inference, 1.7ms NMS per image at shape (1, 3, 416, 416)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;6。最后，把 inference data 弄出来 (这才是重要的 data，有了这些 data，接下来要做什么都行）&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;print&amp;nbsp;out&amp;nbsp;tensor&lt;/span&gt;&lt;/div&gt;&lt;div&gt;result.xyxy[&lt;span style=&quot;color: #09885a;&quot;&gt;0&lt;/span&gt;]&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;tensor([[178.00841, 160.75742, 219.08293, 290.41403,   0.89994,   1.00000],
        [ 36.04726, 184.86021,  78.96355, 306.03784,   0.87737,   1.00000]], device=&#39;cuda:0&#39;)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;7。最后把 tensor data 转换成 pandas dataframe。就这样完成。&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;div style=&quot;color: black; line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;convert&amp;nbsp;result&amp;nbsp;into&amp;nbsp;Pandas&amp;nbsp;dataframe&lt;/span&gt;&lt;/div&gt;&lt;div&gt;pred_score&amp;nbsp;=&amp;nbsp;result.pandas().xyxy[&lt;span style=&quot;color: #09885a;&quot;&gt;0&lt;/span&gt;]&lt;/div&gt;&lt;div&gt;pred_score&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;pre style=&quot;background-color: white; border: none; box-sizing: unset; color: var(--jp-content-font-color1); font-family: var(--jp-code-font-family); font-size: var(--jp-code-font-size); line-height: var(--jp-code-line-height); margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; overflow: auto; padding: 0px; white-space: pre-wrap; word-break: break-all;&quot;&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: white; border: none; box-sizing: unset; color: var(--jp-content-font-color1); font-family: var(--jp-code-font-family); font-size: var(--jp-code-font-size); line-height: var(--jp-code-line-height); margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; overflow: auto; padding: 0px; white-space: pre-wrap; word-break: break-all;&quot;&gt;&lt;table border=&quot;1&quot; class=&quot;dataframe&quot; style=&quot;border-collapse: collapse; border-spacing: 0px; border: none; color: #212121; font-family: Roboto, Noto, sans-serif; font-size: 14px; table-layout: fixed;&quot;&gt;&lt;thead style=&quot;border-bottom: 1px solid var(--colab-border-color); font-family: var(--colab-code-font-family); text-align: right;&quot;&gt;&lt;tr style=&quot;border: none; padding: 0.5em;&quot;&gt;&lt;th style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;xmin&lt;/th&gt;&lt;th style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;ymin&lt;/th&gt;&lt;th style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;xmax&lt;/th&gt;&lt;th style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;ymax&lt;/th&gt;&lt;th style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;confidence&lt;/th&gt;&lt;th style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;class&lt;/th&gt;&lt;th style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;name&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr style=&quot;background: var(--colab-secondary-surface-color); border: none; padding: 0.5em;&quot;&gt;&lt;th style=&quot;border: none; padding: 0.5em; vertical-align: middle;&quot;&gt;0&lt;/th&gt;&lt;td style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;178.008408&lt;/td&gt;&lt;td style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;160.757416&lt;/td&gt;&lt;td style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;219.082932&lt;/td&gt;&lt;td style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;290.414032&lt;/td&gt;&lt;td style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;0.899943&lt;/td&gt;&lt;td style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;1&lt;/td&gt;&lt;td style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;RBC&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;border: none; padding: 0.5em;&quot;&gt;&lt;th style=&quot;border: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1&lt;/th&gt;&lt;td style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;36.047264&lt;/td&gt;&lt;td style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;184.860214&lt;/td&gt;&lt;td style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;78.963554&lt;/td&gt;&lt;td style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;306.037842&lt;/td&gt;&lt;td style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;0.877368&lt;/td&gt;&lt;td style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;1&lt;/td&gt;&lt;td style=&quot;border: none; padding: 0.5em; text-align: right;&quot;&gt;RBC&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;总算掌握了 Yolov5 custom object detection model training, data labling 和 inferencing 的过程。&lt;/div&gt;
</description><link>http://6sigmaforum.blogspot.com/2022/05/how-to-load-yolov5-custom-object.html</link><author>noreply@blogger.com (I Talk - You Do)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-4666987716000209462</guid><pubDate>Sat, 21 May 2022 06:14:00 +0000</pubDate><atom:updated>2022-05-21T14:14:27.522+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>How To Build Custom Object Detection Model With YoloV5</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;在上一个&amp;nbsp; post 我分享用 Roboflow 来准备 YoloV5 的 dataset 格式。也提过其实我们也可以利用 Roboflow 所提供的 training script 来做 YoloV5 的 model training。的确是很方便，但如果你把 dataset 转移到其他 drive 的时候，Roboflow 的 script 就用不着了。所以，今天我还是得记录一下我自己写出来的 training script。好让我日后有个参考。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;1。首先，在 Google Drive 开个新的 Folder ，然后把 data set upload 上去。（我们只是 upload train, test, valid dataset 上去 Google Drive，其他两个 folder ，run 和 yolov5 其实是跑 script 的时候从 github 那里 download 下来的 system files。其他的 files 也是一样。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7S1V9AbYsESIQkbmgk2d6O91CkSzlz9L1s8Rba1OPNPjXgpn5JLDYOcmioCYvCdKihpvdWqjpxdbChz6dGyophrWUl1A2_eEexxFVW3vIUIarhrd7E7FGc82upRSNscBRyVIGOIA9iqVN-TEDj-HdCPAeOcdDAdQD2h-zdNbxT70hkEWF_1rFI4QC/s730/Screenshot%202022-05-21%20115649.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;590&quot; data-original-width=&quot;730&quot; height=&quot;324&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7S1V9AbYsESIQkbmgk2d6O91CkSzlz9L1s8Rba1OPNPjXgpn5JLDYOcmioCYvCdKihpvdWqjpxdbChz6dGyophrWUl1A2_eEexxFVW3vIUIarhrd7E7FGc82upRSNscBRyVIGOIA9iqVN-TEDj-HdCPAeOcdDAdQD2h-zdNbxT70hkEWF_1rFI4QC/w400-h324/Screenshot%202022-05-21%20115649.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;2。可以在 Google Colab 开干了。第一件事就是把 Google Drive 的 folder 联上。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;mount&amp;nbsp;google&amp;nbsp;drive&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;os&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;from&lt;/span&gt;&amp;nbsp;google.colab&amp;nbsp;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;drive&lt;/div&gt;&lt;br /&gt;&lt;div&gt;drive.mount(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;/content/drive&#39;&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;os.chdir(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;/content/drive/My&amp;nbsp;Drive/yolov5&#39;&lt;/span&gt;)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;div style=&quot;color: black; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#clone&amp;nbsp;YOLOv5&amp;nbsp;-&amp;nbsp;this&amp;nbsp;is&amp;nbsp;for&amp;nbsp;1st&amp;nbsp;time&amp;nbsp;insallation,&amp;nbsp;can&amp;nbsp;skip&amp;nbsp;this&amp;nbsp;step&amp;nbsp;after&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;# 1st&amp;nbsp;installation&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;!&lt;/span&gt;git&amp;nbsp;clone&amp;nbsp;https://github.com/ultralytics/yolov5&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;clone&amp;nbsp;repo&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;%cd&amp;nbsp;&lt;/span&gt;yolov5&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;%pip&amp;nbsp;&lt;/span&gt;install&amp;nbsp;-qr&amp;nbsp;requirements.txt&amp;nbsp;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;install&amp;nbsp;dependencies&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;%pip&amp;nbsp;&lt;/span&gt;install&amp;nbsp;-q&amp;nbsp;roboflow&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3。这里我们可以检查一下每个 folder 里图片的数量&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;check&amp;nbsp;images&amp;nbsp;qty&amp;nbsp;in&amp;nbsp;each&amp;nbsp;folder&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;from&lt;/span&gt;&amp;nbsp;IPython.display&amp;nbsp;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;Image,&amp;nbsp;clear_output&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;to&amp;nbsp;display&amp;nbsp;images&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;total&amp;nbsp;images&amp;nbsp;found&amp;nbsp;in&amp;nbsp;train&amp;nbsp;folder&amp;nbsp;=&amp;nbsp;&#39;&lt;/span&gt;&amp;nbsp;,&amp;nbsp;&lt;span style=&quot;color: #795e26;&quot;&gt;len&lt;/span&gt;(os.listdir(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;/content/drive/My&amp;nbsp;Drive/yolov5/train/images&#39;&lt;/span&gt;)))&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;total&amp;nbsp;images&amp;nbsp;found&amp;nbsp;in&amp;nbsp;test&amp;nbsp;folder&amp;nbsp;=&amp;nbsp;&#39;&lt;/span&gt;&amp;nbsp;,&amp;nbsp;&lt;span style=&quot;color: #795e26;&quot;&gt;len&lt;/span&gt;(os.listdir(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;/content/drive/My&amp;nbsp;Drive/yolov5/test/images&#39;&lt;/span&gt;)))&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;total&amp;nbsp;images&amp;nbsp;found&amp;nbsp;in&amp;nbsp;valid&amp;nbsp;folder&amp;nbsp;=&amp;nbsp;&#39;&lt;/span&gt;&amp;nbsp;,&amp;nbsp;&lt;span style=&quot;color: #795e26;&quot;&gt;len&lt;/span&gt;(os.listdir(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;/content/drive/My&amp;nbsp;Drive/yolov5/valid/images&#39;&lt;/span&gt;)))&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;span style=&quot;background-color: white; color: #212121; font-family: monospace;&quot;&gt;total images found in train folder =  1827
total images found in test folder =  87
total images found in valid folder =  175&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;  
  
  
  4。setup 需要的 environment&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;set&amp;nbsp;up&amp;nbsp;environment&lt;/span&gt;&lt;/div&gt;&lt;div&gt;os.environ[&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;DATASET_DIRECTORY&quot;&lt;/span&gt;]&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;/content/drive/My&amp;nbsp;Drive/yolov5&quot;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;ptint&amp;nbsp;content&amp;nbsp;in&amp;nbsp;yaml&amp;nbsp;file&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;nc&amp;nbsp;=&amp;nbsp;number&amp;nbsp;of&amp;nbsp;class&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;%cat&amp;nbsp;&lt;/span&gt;data.yaml&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;span style=&quot;background-color: white; color: #212121; font-family: monospace;&quot;&gt;train: ../train/images
val: ../valid/images

nc: 3
names: [&#39;Platelets&#39;, &#39;RBC&#39;, &#39;WBC&#39;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;5。可以开始做 model training 了，就这么简单。这里要注意的是那几个重要的 arguement，我们可以根据需要开调整那些 parameter。另外一个需要注意的就是 image size，这个 parameter 需要根据 training dataset 图片而调整。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;启动了 training script 之后，就可以看到其他的 hyper parameter，如果需要调整那些 hyper parameter 的话，那么我们需要打开 train.py 的 file 来调整里面的 hyperparameter。Anyway，在大部分的情况都不需要调整的.&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;required&amp;nbsp;arguments&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;img:&amp;nbsp;define&amp;nbsp;input&amp;nbsp;image&amp;nbsp;size&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;batch:&amp;nbsp;determine&amp;nbsp;batch&amp;nbsp;size&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;epochs:&amp;nbsp;define&amp;nbsp;the&amp;nbsp;number&amp;nbsp;of&amp;nbsp;training&amp;nbsp;epochs.&amp;nbsp;(Note:&amp;nbsp;often,&amp;nbsp;3000+&amp;nbsp;are&amp;nbsp;common&amp;nbsp;here!)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;data:&amp;nbsp;Our&amp;nbsp;dataset&amp;nbsp;locaiton&amp;nbsp;is&amp;nbsp;saved&amp;nbsp;in&amp;nbsp;the&amp;nbsp;dataset.location&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;weights:&amp;nbsp;specify&amp;nbsp;a&amp;nbsp;path&amp;nbsp;to&amp;nbsp;weights&amp;nbsp;to&amp;nbsp;start&amp;nbsp;transfer&amp;nbsp;learning&amp;nbsp;from.&amp;nbsp;Here&amp;nbsp;we&amp;nbsp;choose&amp;nbsp;the&amp;nbsp;generic&amp;nbsp;COCO&amp;nbsp;pretrained&amp;nbsp;checkpoint.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;cache:&amp;nbsp;cache&amp;nbsp;images&amp;nbsp;for&amp;nbsp;faster&amp;nbsp;training&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;model&amp;nbsp;training&amp;nbsp;command&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;!&lt;/span&gt;python&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;/content/drive/My&amp;nbsp;Drive/yolov5/yolov5/train.py&quot;&lt;/span&gt;&amp;nbsp;--img&amp;nbsp;&lt;span style=&quot;color: #098658;&quot;&gt;416&lt;/span&gt;&amp;nbsp;--batch&amp;nbsp;&lt;span style=&quot;color: #098658;&quot;&gt;16&lt;/span&gt;&amp;nbsp;--epochs&amp;nbsp;&lt;span style=&quot;color: #098658;&quot;&gt;150&lt;/span&gt;&amp;nbsp;--data&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;/content/drive/My&amp;nbsp;Drive/yolov5/yolov5/data.yaml&quot;&lt;/span&gt;&amp;nbsp;--weights&amp;nbsp;yolov5s.pt&amp;nbsp;--cache&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;span style=&quot;background-color: white; color: #212121; font-family: monospace;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;background-color: white; color: var(--ansi-blue); font-weight: bold;&quot;&gt;train: &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #212121;&quot;&gt;weights=yolov5s.pt, cfg=, data=/content/drive/My Drive/yolov5/yolov5/data.yaml, hyp=data/hyps/hyp.scratch-low.yaml, epochs=150, batch_size=16, imgsz=416, rect=False, resume=False, nosave=False, noval=False, noautoanchor=False, noplots=False, evolve=None, bucket=, cache=ram, image_weights=False, device=, multi_scale=False, single_cls=False, optimizer=SGD, sync_bn=False, workers=8, project=runs/train, name=exp, exist_ok=False, quad=False, cos_lr=False, label_smoothing=0.0, patience=100, freeze=[0], save_period=-1, local_rank=-1, entity=None, upload_dataset=False, bbox_interval=-1, artifact_alias=latest&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;Command &#39;git fetch &amp;amp;&amp;amp; git config --get remote.origin.url&#39; timed out after 5 seconds
fatal: cannot change to &#39;/content/drive/My&#39;: No such file or directory
YOLOv5 🚀 2022-4-30 torch 1.11.0+cu113 CUDA:0 (Tesla T4, 15110MiB)

&lt;/span&gt;&lt;span style=&quot;background-color: white; color: var(--ansi-blue); font-size: 14px; font-weight: bold;&quot;&gt;hyperparameters: &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=0.05, cls=0.5, cls_pw=1.0, obj=1.0, obj_pw=1.0, iou_t=0.2, anchor_t=4.0, fl_gamma=0.0, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, mosaic=1.0, mixup=0.0, copy_paste=0.0
&lt;/span&gt;&lt;span style=&quot;background-color: white; color: var(--ansi-blue); font-size: 14px; font-weight: bold;&quot;&gt;Weights &amp;amp; Biases: &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;run &#39;pip install wandb&#39; to automatically track and visualize YOLOv5 🚀 runs (RECOMMENDED)
&lt;/span&gt;&lt;span style=&quot;background-color: white; color: var(--ansi-blue); font-size: 14px; font-weight: bold;&quot;&gt;TensorBoard: &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;Start with &#39;tensorboard --logdir runs/train&#39;, view at &lt;a href=&quot;http://localhost:6006/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://localhost:6006/&lt;/a&gt;
Downloading &lt;a href=&quot;https://ultralytics.com/assets/Arial.ttf&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://ultralytics.com/assets/Arial.ttf&lt;/a&gt; to /root/.config/Ultralytics/Arial.ttf...
100% 755k/755k [00:00&amp;lt;00:00, 124MB/s]
Overriding model.yaml nc=80 with nc=3

                 from  n    params  module                                  arguments                     
  0                -1  1      3520  models.common.Conv                      [3, 32, 6, 2, 2]              
  1                -1  1     18560  models.common.Conv                      [32, 64, 3, 2]                
  2                -1  1     18816  models.common.C3                        [64, 64, 1]                   
  3                -1  1     73984  models.common.Conv                      [64, 128, 3, 2]               
  4                -1  2    115712  models.common.C3                        [128, 128, 2]                 
  5                -1  1    295424  models.common.Conv                      [128, 256, 3, 2]              
  6                -1  3    625152  models.common.C3                        [256, 256, 3]                 
  7                -1  1   1180672  models.common.Conv                      [256, 512, 3, 2]              
  8                -1  1   1182720  models.common.C3                        [512, 512, 1]                 
  9                -1  1    656896  models.common.SPPF                      [512, 512, 5]                 
 10                -1  1    131584  models.common.Conv                      [512, 256, 1, 1]              
 11                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, &#39;nearest&#39;]          
 12           [-1, 6]  1         0  models.common.Concat                    [1]                           
 13                -1  1    361984  models.common.C3                        [512, 256, 1, False]          
 14                -1  1     33024  models.common.Conv                      [256, 128, 1, 1]              
 15                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, &#39;nearest&#39;]          
 16           [-1, 4]  1         0  models.common.Concat                    [1]                           
 17                -1  1     90880  models.common.C3                        [256, 128, 1, False]          
 18                -1  1    147712  models.common.Conv                      [128, 128, 3, 2]              
 19          [-1, 14]  1         0  models.common.Concat                    [1]                           
 20                -1  1    296448  models.common.C3                        [256, 256, 1, False]          
 21                -1  1    590336  models.common.Conv                      [256, 256, 3, 2]              
 22          [-1, 10]  1         0  models.common.Concat                    [1]                           
 23                -1  1   1182720  models.common.C3                        [512, 512, 1, False]          
 24      [17, 20, 23]  1     21576  models.yolo.Detect                      [3, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [128, 256, 512]]
Model summary: 270 layers, 7027720 parameters, 7027720 gradients, 15.9 GFLOPs

Transferred 343/349 items from yolov5s.pt
Scaled weight_decay = 0.0005
&lt;/span&gt;&lt;span style=&quot;background-color: white; color: var(--ansi-blue); font-size: 14px; font-weight: bold;&quot;&gt;optimizer:&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt; SGD with parameter groups 57 weight (no decay), 60 weight, 60 bias
&lt;/span&gt;&lt;span style=&quot;background-color: white; color: var(--ansi-blue); font-size: 14px; font-weight: bold;&quot;&gt;albumentations: &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;version 1.0.3 required by YOLOv5, but version 0.1.12 is currently installed
&lt;/span&gt;&lt;span style=&quot;background-color: white; color: var(--ansi-blue); font-size: 14px; font-weight: bold;&quot;&gt;train: &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;Scanning &#39;/content/drive/My Drive/yolov5/yolov5/../train/labels.cache&#39; images and labels... 1827 found, 0 missing, 0 empty, 0 corrupt: 100% 1827/1827 [00:00&amp;lt;?, ?it/s]
&lt;/span&gt;&lt;span style=&quot;background-color: white; color: var(--ansi-blue); font-size: 14px; font-weight: bold;&quot;&gt;train: &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;Caching images (0.9GB ram): 100% 1827/1827 [00:20&amp;lt;00:00, 89.92it/s] 
&lt;/span&gt;&lt;span style=&quot;background-color: white; color: var(--ansi-blue); font-size: 14px; font-weight: bold;&quot;&gt;val: &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;Scanning &#39;/content/drive/My Drive/yolov5/yolov5/../valid/labels.cache&#39; images and labels... 175 found, 0 missing, 0 empty, 0 corrupt: 100% 175/175 [00:00&amp;lt;?, ?it/s]
&lt;/span&gt;&lt;span style=&quot;background-color: white; color: var(--ansi-blue); font-size: 14px; font-weight: bold;&quot;&gt;val: &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;Caching images (0.1GB ram): 100% 175/175 [00:01&amp;lt;00:00, 120.25it/s]
Plotting labels to runs/train/exp3/labels.jpg... 

&lt;/span&gt;&lt;span style=&quot;background-color: white; color: var(--ansi-blue); font-size: 14px; font-weight: bold;&quot;&gt;AutoAnchor: &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;5.85 anchors/target, 1.000 Best Possible Recall (BPR). Current anchors are a good fit to dataset ✅
Image sizes 416 train, 416 val
Using 2 dataloader workers
Logging results to &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px; font-weight: bold;&quot;&gt;runs/train/exp3&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;
Starting training for 150 epochs...

     Epoch   gpu_mem       box       obj       cls    labels  img_size
     0/149     1.61G   0.08572    0.1166   0.02635        36       416: 100% 115/115 [00:20&amp;lt;00:00,  5.55it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 6/6 [00:00&amp;lt;00:00,  6.00it/s]
                 all        175       2250      0.502      0.231      0.138     0.0433

     Epoch   gpu_mem       box       obj       cls    labels  img_size
     1/149     1.97G   0.06362    0.1082   0.01141        73       416: 100% 115/115 [00:17&amp;lt;00:00,  6.52it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 6/6 [00:00&amp;lt;00:00,  6.66it/s]
                 all        175       2250      0.386      0.561      0.402      0.104&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;     Epoch   gpu_mem       box       obj       cls    labels  img_size
   149/149     1.97G   0.01586    0.0505 0.0003206        28       416: 100% 115/115 [00:17&amp;lt;00:00,  6.66it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 6/6 [00:00&amp;lt;00:00,  7.82it/s]
                 all        175       2250      0.884      0.821      0.886      0.602

150 epochs completed in 0.766 hours.
Optimizer stripped from runs/train/exp3/weights/last.pt, 14.3MB
Optimizer stripped from runs/train/exp3/weights/best.pt, 14.3MB

Validating runs/train/exp3/weights/best.pt...
Fusing layers... 
Model summary: 213 layers, 7018216 parameters, 0 gradients, 15.8 GFLOPs
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 6/6 [00:03&amp;lt;00:00,  1.70it/s]
                 all        175       2250      0.863      0.834      0.888      0.604
           Platelets        175        173      0.779      0.879      0.886      0.456
                 RBC        175       1908      0.854      0.642      0.798      0.556
                 WBC        175        169      0.956      0.982       0.98        0.8
Results saved to &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px; font-weight: bold;&quot;&gt;runs/train/exp3&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;6。ok, 跑完了 150 个 epoch，总算把 model train 完，其实还蛮快的。 Train 好的 model 会收在&amp;nbsp;&lt;span style=&quot;background-color: white; color: #212121; font-family: monospace; font-size: 14px; white-space: pre;&quot;&gt;runs/train/exp3/weights/ 的 folder 里，里面有一个 best.pt 的 file, 那是整个 training 过&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: white; color: #212121; font-family: monospace; font-size: 14px; white-space: pre;&quot;&gt;程中找到最  optimized 的 model 。至于其他的 model training 资料也可以在 exp3 的 folder 里&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: white; color: #212121; font-family: monospace; font-size: 14px; white-space: pre;&quot;&gt;面找到。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE9ISylJMqHcdSCu3Is3TQ0pUEl44Xj7RdYPI47zmIWBIGYZ8JbtPNkC8afah1YbRKo75AeN0JstFxyNKgH_e6BzRBXzqroJLh8K1tvCUYQSuUj9OwLOXNe7cig1iHUZ2Mx5PfTFHjKAaY0-fIAlNC-7qWu_GzGQZ6joVsYY0KrsvxRjLPKfPpW24R/s679/Screenshot%202022-05-21%20134229.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;299&quot; data-original-width=&quot;679&quot; height=&quot;176&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE9ISylJMqHcdSCu3Is3TQ0pUEl44Xj7RdYPI47zmIWBIGYZ8JbtPNkC8afah1YbRKo75AeN0JstFxyNKgH_e6BzRBXzqroJLh8K1tvCUYQSuUj9OwLOXNe7cig1iHUZ2Mx5PfTFHjKAaY0-fIAlNC-7qWu_GzGQZ6joVsYY0KrsvxRjLPKfPpW24R/w400-h176/Screenshot%202022-05-21%20134229.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;7。接下来可以用 tensorboard 把 model training performance display 出来，这可是我第一次成功的用到 tensorboard。真的要感谢 Roboflow 的 script。至于要怎样看这些 chart，这里我不多记录。&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;Start&amp;nbsp;tensorboard&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;Launch&amp;nbsp;after&amp;nbsp;you&amp;nbsp;have&amp;nbsp;started&amp;nbsp;training&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;logs&amp;nbsp;save&amp;nbsp;in&amp;nbsp;the&amp;nbsp;folder&amp;nbsp;&quot;runs&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;%load_ext&amp;nbsp;&lt;/span&gt;tensorboard&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;%tensorboard&amp;nbsp;&lt;/span&gt;--logdir&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;/content/drive/My&amp;nbsp;Drive/yolov5/yolov5/runs&#39;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtY5Mzny20TiWUXLsrmAC5hirDUgslysptseTAAPU_ar_Ut3DhoFaTnTvgxQST_pelRNPCnsWR7N2i-Tr6TZ4I_HhxqhHZwJArER4UCsV8CsDkB_j39Hkvfzk5o95ftHtNdDxyN0rbIIeSbBDrQprOjtRv2H5-Sy6hqFeHG85YNZgTlN7V2HhSSdzS/s1757/Screenshot%202022-05-21%20135302.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;752&quot; data-original-width=&quot;1757&quot; height=&quot;171&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtY5Mzny20TiWUXLsrmAC5hirDUgslysptseTAAPU_ar_Ut3DhoFaTnTvgxQST_pelRNPCnsWR7N2i-Tr6TZ4I_HhxqhHZwJArER4UCsV8CsDkB_j39Hkvfzk5o95ftHtNdDxyN0rbIIeSbBDrQprOjtRv2H5-Sy6hqFeHG85YNZgTlN7V2HhSSdzS/w400-h171/Screenshot%202022-05-21%20135302.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;8。最后，我们可以用以下的 code 来把 model call 出来做 influencing 。Influence result 会收在 runs/detect/exp2 的 folder。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;现在问题来了，runs/detect/exp2 folder 里面收的都是处理好的图片，如果说我要 object detection 的 coordinate data，要怎么弄出来？这个还得去 detect.py 的 script 里面研究研究。&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;test&amp;nbsp;the&amp;nbsp;model&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;!&lt;/span&gt;python&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;/content/drive/My&amp;nbsp;Drive/yolov5/yolov5/detect.py&quot;&lt;/span&gt;&amp;nbsp;--weights&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;/content/drive/My&amp;nbsp;Drive/yolov5/yolov5/runs/train/exp2/weights/best.pt&#39;&lt;/span&gt;&amp;nbsp;--img&amp;nbsp;&lt;span style=&quot;color: #098658;&quot;&gt;416&lt;/span&gt;&amp;nbsp;--conf&amp;nbsp;&lt;span style=&quot;color: #098658;&quot;&gt;0.1&lt;/span&gt;&amp;nbsp;--source&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;/content/drive/My&amp;nbsp;Drive/yolov5/test/images&#39;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;background-color: white; color: var(--ansi-blue); font-size: 14px; font-weight: bold;&quot;&gt;detect: &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;weights=[&#39;/content/drive/My Drive/yolov5/yolov5/runs/train/exp2/weights/best.pt&#39;], source=/content/drive/My Drive/yolov5/test/images, data=data/coco128.yaml, imgsz=[416, 416], conf_thres=0.1, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs/detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False, dnn=False
fatal: cannot change to &#39;/content/drive/My&#39;: No such file or directory
YOLOv5 🚀 2022-4-30 torch 1.11.0+cu113 CUDA:0 (Tesla T4, 15110MiB)

Fusing layers... 
Model summary: 213 layers, 7018216 parameters, 0 gradients, 15.8 GFLOPs
image 1/87 /content/drive/My Drive/yolov5/test/images/BloodImage_00002_jpg.rf.995f1b91c3e39b6a26382e05a028a74d.jpg: 416x416 1 Platelets, 41 RBCs, 1 WBC, Done. (0.009s)
image 2/87 /content/drive/My Drive/yolov5/test/images/BloodImage_00005_jpg.rf.a13d592d5f2b1c5c16de54558237b636.jpg: 416x416 2 Plateletss, 44 RBCs, 1 WBC, Done. (0.012s)
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;span style=&quot;color: #212121;&quot;&gt;&lt;span style=&quot;background-color: white; font-size: 14px;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;span style=&quot;color: #212121;&quot;&gt;&lt;span style=&quot;background-color: white; font-size: 14px;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;span style=&quot;color: #212121;&quot;&gt;&lt;span style=&quot;background-color: white; font-size: 14px;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;span style=&quot;color: #212121;&quot;&gt;&lt;span style=&quot;background-color: white; font-size: 14px;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;image 85/87 /content/drive/My Drive/yolov5/test/images/BloodImage_00390_jpg.rf.cb25074254c90ec49780905d99593c5e.jpg: 416x416 26 RBCs, 1 WBC, Done. (0.010s)
image 86/87 /content/drive/My Drive/yolov5/test/images/BloodImage_00405_jpg.rf.6b1b91f7b89d81bf525f941752af9606.jpg: 416x416 5 Plateletss, 39 RBCs, 2 WBCs, Done. (0.010s)
image 87/87 /content/drive/My Drive/yolov5/test/images/BloodImage_00409_jpg.rf.f9ee5147e9335ba5f06ff49435673a8e.jpg: 416x416 12 Plateletss, 51 RBCs, 1 WBC, Done. (0.011s)
Speed: 0.4ms pre-process, 11.1ms inference, 1.0ms NMS per image at shape (1, 3, 416, 416)
Results saved to &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px; font-weight: bold;&quot;&gt;runs/detect/exp2&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;background-color: white; color: #212121; font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;9。如果说要把 runs/detect/exp2 里面的图片从 notebook 里 display 出来，可以试用以下的 code&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;div style=&quot;color: black; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#display&amp;nbsp;inference&amp;nbsp;on&amp;nbsp;ALL&amp;nbsp;test&amp;nbsp;images&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;glob&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;from&lt;/span&gt;&amp;nbsp;IPython.display&amp;nbsp;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;Image,&amp;nbsp;display&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;for&lt;/span&gt;&amp;nbsp;imageName&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;in&lt;/span&gt;&amp;nbsp;glob.glob(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;/content/drive/My&amp;nbsp;Drive/yolov5/yolov5/runs/detect/exp2/*.jpg&#39;&lt;/span&gt;):&amp;nbsp;&lt;span style=&quot;color: green;&quot;&gt;#assuming&amp;nbsp;JPG&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;display(Image(filename=imageName))&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #795e26;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;\n&quot;&lt;/span&gt;)&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Ok，完成。&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;pre style=&quot;background-color: white; border: none; box-sizing: unset; color: var(--jp-content-font-color1); font-family: var(--jp-code-font-family); font-size: var(--jp-code-font-size); line-height: var(--jp-code-line-height); margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; overflow: auto; padding: 0px; white-space: pre-wrap; word-break: break-all;&quot;&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;</description><link>http://6sigmaforum.blogspot.com/2022/05/how-to-build-custom-object-detection.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7S1V9AbYsESIQkbmgk2d6O91CkSzlz9L1s8Rba1OPNPjXgpn5JLDYOcmioCYvCdKihpvdWqjpxdbChz6dGyophrWUl1A2_eEexxFVW3vIUIarhrd7E7FGc82upRSNscBRyVIGOIA9iqVN-TEDj-HdCPAeOcdDAdQD2h-zdNbxT70hkEWF_1rFI4QC/s72-w400-h324-c/Screenshot%202022-05-21%20115649.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-5124523372283869915</guid><pubDate>Sat, 07 May 2022 05:11:00 +0000</pubDate><atom:updated>2022-05-07T13:11:43.009+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">General</category><category domain="http://www.blogger.com/atom/ns#">Others</category><title>How To Prepare Training Dataset For Yolo v5 PyTorch Object Detection Model With Roboflow</title><description>&lt;p&gt;&lt;a href=&quot;https://roboflow.com/&quot; target=&quot;_blank&quot;&gt;&amp;nbsp;Roboflow&lt;/a&gt; 主要是一个 image analytic ai model training platform。&lt;/p&gt;&lt;p&gt;去年的时候我就发现这个工具，也开了一个 account，但也只是路过，由于不想把一些和工作有关的图片上传到这些陌生的免费工具上，所以，当时也没有停留多加了解这工具的欲愿。&lt;/p&gt;&lt;p&gt;也不知吹了什么头风，今天突然下定决心必须执行给自己欠下已久的 action item，那就是把 yolo object detection model training 学上，在网上趴了这个 &lt;a href=&quot;https://www.bing.com/videos/search?q=roboflow&amp;amp;docid=608046650787517554&amp;amp;mid=BCF1B3736F879531F0D7BCF1B3736F879531F0D7&amp;amp;view=detail&amp;amp;FORM=VIRE&quot; target=&quot;_blank&quot;&gt;Youtube link&lt;/a&gt; 回来。(一般来说，在网上趴资料的话，我还是比较喜欢看那些如 toward datascience 或是 medium 之类的 web page，我很少回去开 Youtube 的 tutuorial 来看的，也不知道为什么，今天我会去 click 这个 link，而且还吧他给看完)&lt;/p&gt;&lt;p&gt;也因为这个视频，我学上了如何用 Roboflow 来准备 yolov5 需要的 training data set format。（原来是那么简单的）。&lt;/p&gt;&lt;p&gt;由于视频的 tutorial 是以 macbook 来做示范，展示的界面和 windows 有些不同，所以我觉得还是把我用 roboflow 准备 dataset 的过程给记录下来，方便以后参考。&lt;/p&gt;&lt;p&gt;Step 1 在 Roboflow 开一个户口。如果没有记错的话，然后 sign in。如果么有记错的话，Roboflow 好像不接受 gmail 或是 yahoo 的个人 emial。需要公司或是大学的 email 来注册。&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp0LgsGrX7qmYzpZgs2ORGB-NrlcqYKrlFqJaJWnoqyvx7c6-SNC_mz88XrnviA42y0Fafsa3acOGHWBdSeWFnBWd-t56_3WAspaMkJKsD0ZphGOQ-Amls5NKVVNvMTCYUh8kr9ry0jiUkwllaW7m5bNMV8sdO4zz6hxNOumX-hdmwtZu1piOcMAqX/s1839/Screenshot%202022-05-07%20105536.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;816&quot; data-original-width=&quot;1839&quot; height=&quot;178&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp0LgsGrX7qmYzpZgs2ORGB-NrlcqYKrlFqJaJWnoqyvx7c6-SNC_mz88XrnviA42y0Fafsa3acOGHWBdSeWFnBWd-t56_3WAspaMkJKsD0ZphGOQ-Amls5NKVVNvMTCYUh8kr9ry0jiUkwllaW7m5bNMV8sdO4zz6hxNOumX-hdmwtZu1piOcMAqX/w400-h178/Screenshot%202022-05-07%20105536.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Step 2 Sign in 了过后会来到这个界面。&amp;nbsp;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDQIlhajgbHHut55UZBDkqQTG07LrLu2CDxdEr8kScqR-5b8dNcGZZWOUhHMCUn0FXWCd3AdMze5Qp8SPKWSZbHcSVMGSyTrzw-4rtGGzfWxt8rHvbgjSzIyz1DYMWJGnKzammNA7NDxwgUfw0mpK7oMwn0hbK9N0Dqpo9-ShCFDtNKxYsWcFJjthk/s1712/Screenshot%202022-05-07%20105827.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;661&quot; data-original-width=&quot;1712&quot; height=&quot;155&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDQIlhajgbHHut55UZBDkqQTG07LrLu2CDxdEr8kScqR-5b8dNcGZZWOUhHMCUn0FXWCd3AdMze5Qp8SPKWSZbHcSVMGSyTrzw-4rtGGzfWxt8rHvbgjSzIyz1DYMWJGnKzammNA7NDxwgUfw0mpK7oMwn0hbK9N0Dqpo9-ShCFDtNKxYsWcFJjthk/w400-h155/Screenshot%202022-05-07%20105827.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Step 3 Upload dataset，Roboflow 也提供了不少免费的 dataset 供试验使用，今天我就根据 Youtube 视频的示范 dowloand 了blood cell dataset 来做试验 （注意 step 2 图左边的 side bar，click Public Datasets。我选了以下的 Dataset&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbrMLbThpJwwYP9F4j-HBlkXMIAqKIEbsQS67sGR3sztrGg6TT5Bc2gDsHu_0FnDciLszP_Xom5cXontJHoWBP1G576ef4DvjICaI0AMUUoHmNZzEeOO_ddOUvHViYULEjc-BH-945EYC6bd5Ogd8ROwo9aj0_co_H_E2090DFxmEaGppLmoMRiKx8/s899/Screenshot%202022-05-07%20110839.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;125&quot; data-original-width=&quot;899&quot; height=&quot;55&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbrMLbThpJwwYP9F4j-HBlkXMIAqKIEbsQS67sGR3sztrGg6TT5Bc2gDsHu_0FnDciLszP_Xom5cXontJHoWBP1G576ef4DvjICaI0AMUUoHmNZzEeOO_ddOUvHViYULEjc-BH-945EYC6bd5Ogd8ROwo9aj0_co_H_E2090DFxmEaGppLmoMRiKx8/w400-h55/Screenshot%202022-05-07%20110839.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;点了小格子后就会来到这个 data 下载界面。这界面也提供了一些 dataset 的 property。至于 dataset 的 property，这里就不多解释。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik-xBGcun2dPdyirqkIkci3xtHqvknU3p4wDN-ERqJeASpUaVOP2xM6ZuKJvMxaPiwVtkBv8lUEMX4ddUabvn309v2ZNCk2SYvOFdN-3Im0rvJmWgTGU8fHNqz3bQpXANokjBCRrN3bxVPMBusZ8sqieQ2bUMUPigIO95XDEU6NBsNPlzmHVs0urrd/s1118/Screenshot%202022-05-07%20111318.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;795&quot; data-original-width=&quot;1118&quot; height=&quot;228&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik-xBGcun2dPdyirqkIkci3xtHqvknU3p4wDN-ERqJeASpUaVOP2xM6ZuKJvMxaPiwVtkBv8lUEMX4ddUabvn309v2ZNCk2SYvOFdN-3Im0rvJmWgTGU8fHNqz3bQpXANokjBCRrN3bxVPMBusZ8sqieQ2bUMUPigIO95XDEU6NBsNPlzmHVs0urrd/s320/Screenshot%202022-05-07%20111318.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;我点了 raw （ 这里我选了 raw 主要是接下来我要自己做 data augmentation ）之后，就来到这个下载的界面。要注意的是，这里提供了不同的 data label format，我选了 Pascal VOC XML format。还有我们也可以设定 train, valid 和 test data split。Roboflow 会在下载的时候自动的把 data 分出来。（多么的方便，是吧？）&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJkDtgdLBBoeLKs5DDGAXMkqr3_NWk0PON9YgqPQ8PmiUc_gzIF-_0sO2-KjgN1-NVTk4hsHySI7oIH_TAmwKfrkjIL-ycE3sY6Ry9p0wLjQbARWSOjdrqxFodukKjK-cSTg3vEkCNb_1nLiubVujnwoXye9RH8Vb_5rQ40ZGwpxK9d7HTOuwmtQey/s1823/Screenshot%202022-05-07%20112158.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;915&quot; data-original-width=&quot;1823&quot; height=&quot;201&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJkDtgdLBBoeLKs5DDGAXMkqr3_NWk0PON9YgqPQ8PmiUc_gzIF-_0sO2-KjgN1-NVTk4hsHySI7oIH_TAmwKfrkjIL-ycE3sY6Ry9p0wLjQbARWSOjdrqxFodukKjK-cSTg3vEkCNb_1nLiubVujnwoXye9RH8Vb_5rQ40ZGwpxK9d7HTOuwmtQey/w400-h201/Screenshot%202022-05-07%20112158.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;点了 Pascal VOC XML 之后， 这个窗口就自动弹出，确定了就可以点 Continue&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3yTCRgNokC3aJtwsITgBIVHXHGCyBIfDN91G3UuddWYwLuHxcrZtuEBCbjrSpJ-YZ2izp8uj_b4Vv-Mh9eBLb3bLxCuKM7yWwnGTlk_lCqLJGSthRXH1kKVftSQWT1fKu1Z63t9ZfdLfXvndZJA7gaKB6uFVCPEWgHwWDMqGvtl1tUsHJkH3fW7Gh/s543/Screenshot%202022-05-07%20113248.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;323&quot; data-original-width=&quot;543&quot; height=&quot;238&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3yTCRgNokC3aJtwsITgBIVHXHGCyBIfDN91G3UuddWYwLuHxcrZtuEBCbjrSpJ-YZ2izp8uj_b4Vv-Mh9eBLb3bLxCuKM7yWwnGTlk_lCqLJGSthRXH1kKVftSQWT1fKu1Z63t9ZfdLfXvndZJA7gaKB6uFVCPEWgHwWDMqGvtl1tUsHJkH3fW7Gh/w400-h238/Screenshot%202022-05-07%20113248.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;下载完成，去 Downloads folder 查看下载的 dataset对不对。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;下载的 zip file 里面应该是个样子的，test, train, valid folder 里面每一张图都带有一个 xml file。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;OK，data download 成功。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_8957AEYpB1wnhKkBV24pivfDjkZR69KtrqtiP4I0GM3ZbQOWYHwqqGO8xFcWYcpmwJJym0Ru0V2RuHuxi2jbGYXS1VPhsyqUIqStF6RPuDwX_zBxkW1nzes7kT5hOy_acUE5TcmpyPDmhFQZgOEpVbEN8Dc37JolXeeYoOK2l4CzTVi7qz62qy_Z/s641/Screenshot%202022-05-07%20113945.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;171&quot; data-original-width=&quot;641&quot; height=&quot;106&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_8957AEYpB1wnhKkBV24pivfDjkZR69KtrqtiP4I0GM3ZbQOWYHwqqGO8xFcWYcpmwJJym0Ru0V2RuHuxi2jbGYXS1VPhsyqUIqStF6RPuDwX_zBxkW1nzes7kT5hOy_acUE5TcmpyPDmhFQZgOEpVbEN8Dc37JolXeeYoOK2l4CzTVi7qz62qy_Z/w400-h106/Screenshot%202022-05-07%20113945.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Step 4 下来的是步骤就是如何用 Roboflow 这个工具把 Pascal VOL XML label format 的 dataset 转换为 YoloV5 competible 的 dataset。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;如果是新 user 的话，首先我们需要在 Roboflow Home 那里开一个新的 Workspace。（一般 Roboflow 会有一个 default 的 Workspace，叫 Roboflowtest。我就直接用这个 Workspace 上载我的 dataset。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;先点一下 + Create New Project ，然后把弹出来的 form 给填好 （这里出现 Create Public Project。如果你开新的 Workspace，选择 Business 的话，Roboflow 会建议你开一个 Private Sand Box，这个时候弹出来的窗口会有点不一样）&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUrVX2PmjzRHYKz0AHd3FzazM21ioRghZ8cWF2CnLvMXIgbeNsF1hNxaeGn2Taq5DVuthXcOaG-WqqNiuknvg-gwSBvvPomfD5vlTDGXUYh4we54sxxKpZ8Uf2E2lsUlBN0a0eg7nPldOtVcrEzGxe6ZXKjbopHSZ5Nx8_l3Zr8G3Bk82qTj-d1eov/s526/Screenshot%202022-05-07%20115505.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;504&quot; data-original-width=&quot;526&quot; height=&quot;384&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUrVX2PmjzRHYKz0AHd3FzazM21ioRghZ8cWF2CnLvMXIgbeNsF1hNxaeGn2Taq5DVuthXcOaG-WqqNiuknvg-gwSBvvPomfD5vlTDGXUYh4we54sxxKpZ8Uf2E2lsUlBN0a0eg7nPldOtVcrEzGxe6ZXKjbopHSZ5Nx8_l3Zr8G3Bk82qTj-d1eov/w400-h384/Screenshot%202022-05-07%20115505.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;之后就来到这个界面，然后选 select folder。可以一次过把 train test valid folder 的data upload 上去，到时候 Roboflow 会把所有的 data combine，再 split 过。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3SXfOVbMF4N6-zlJx-W20aXA8gKUqNPgZEgiwJtySTWQNAZykkhYjo3qrTxNJ-sNsIEJQIfSA4QlkcfDjxrz1dH7NMXoJTxhA_ceI5NE-BOSojD3S4wsLQLb9JrPfIc1OLK3R5VsbPebXxa8MGkqafjQB8XrO9JH9tcj46fcYFolxUzZdCe3pQPAt/s1632/Screenshot%202022-05-07%20120004.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;785&quot; data-original-width=&quot;1632&quot; height=&quot;193&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3SXfOVbMF4N6-zlJx-W20aXA8gKUqNPgZEgiwJtySTWQNAZykkhYjo3qrTxNJ-sNsIEJQIfSA4QlkcfDjxrz1dH7NMXoJTxhA_ceI5NE-BOSojD3S4wsLQLb9JrPfIc1OLK3R5VsbPebXxa8MGkqafjQB8XrO9JH9tcj46fcYFolxUzZdCe3pQPAt/w400-h193/Screenshot%202022-05-07%20120004.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Upload 之后就会出现这养的界面，这个界面也提供了一些 data property 的资料&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHtiSn0XDfT7P6OvUtICZ-6OY-oVIelAbyhHj2iycxqiJmSNS7d9T9DpKN7leoj9RPhfJQqMvBL0vMY1VRDn3088jKqky5DvddOTs6-RhrLfvy5j6P6J1x6pXzXJg_mM27wM1xI7Pkd_vBieZPW-WliAQbK8rO5VXErakALQOdE2iGfK0tnSYEa5nt/s1639/Screenshot%202022-05-07%20121132.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;657&quot; data-original-width=&quot;1639&quot; height=&quot;160&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHtiSn0XDfT7P6OvUtICZ-6OY-oVIelAbyhHj2iycxqiJmSNS7d9T9DpKN7leoj9RPhfJQqMvBL0vMY1VRDn3088jKqky5DvddOTs6-RhrLfvy5j6P6J1x6pXzXJg_mM27wM1xI7Pkd_vBieZPW-WliAQbK8rO5VXErakALQOdE2iGfK0tnSYEa5nt/w400-h160/Screenshot%202022-05-07%20121132.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;其实刚刚上载上去的都是 Pascal VOC XML 的 dataset。接下来点 Generate New Version&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;在这个界面，如果有需要的话，我们还可以做一些 data preprocessing，data augmentation 的步骤，最后才点 Generate。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpB1Cg8F5I8fXStwMn2XYLDr0ejeDXHgbwPmhPcxhUW3mFzDlPMBZBiSLaHATDf4KPbj4V48UmqzIHIDr6P4tHozUgtWybit4Mt4JOzip639WQkVLsoV6TwFxjR9g8GTm0Rt_3gZvMMojGmZNYDgCnld6ujaRJitzXBGTbExisRpeRQdvcAPqNiaBV/s1127/Screenshot%202022-05-07%20122815.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;919&quot; data-original-width=&quot;1127&quot; height=&quot;326&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpB1Cg8F5I8fXStwMn2XYLDr0ejeDXHgbwPmhPcxhUW3mFzDlPMBZBiSLaHATDf4KPbj4V48UmqzIHIDr6P4tHozUgtWybit4Mt4JOzip639WQkVLsoV6TwFxjR9g8GTm0Rt_3gZvMMojGmZNYDgCnld6ujaRJitzXBGTbExisRpeRQdvcAPqNiaBV/w400-h326/Screenshot%202022-05-07%20122815.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;点了 Generate 以后，就会有新的界面跳出来。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-TASYQ33p2QmIelTE82JkleXqyPDeUdMW02RBDURDSPrp3k9JAHF2O_4TZfz-JWwv76sErdoETVi14yTfPYlPy9aMIPz1xk8JEzASc7h2RQHfoak5fkE_6aLfj-sNZ7JAuteSkMurdoyTRg53gMofwj6KShOC89FCVa8E_obgLMH0w0ewpBQExULa/s1164/Screenshot%202022-05-07%20123022.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;812&quot; data-original-width=&quot;1164&quot; height=&quot;279&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-TASYQ33p2QmIelTE82JkleXqyPDeUdMW02RBDURDSPrp3k9JAHF2O_4TZfz-JWwv76sErdoETVi14yTfPYlPy9aMIPz1xk8JEzASc7h2RQHfoak5fkE_6aLfj-sNZ7JAuteSkMurdoyTRg53gMofwj6KShOC89FCVa8E_obgLMH0w0ewpBQExULa/w400-h279/Screenshot%202022-05-07%20123022.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Step 5 点 Export 刚弄好的新 data set，在弹出来的窗口上选择新的 dataset format，Roboflow 就会自动的把需要的格式转换好才下载。由于接下来我要做的是 train Yolo v5 PyTorch 的 object detection model，Yolo v5 PyTorch 用的 data 是 csv format，所以我 download 下来的 annotation file 应该是 csv 的格式。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx3brnM_u8RaB5t2q6RsOVynz7Md3GnJ9uQ2YsDPfDdJEzPUhroSfQMAV5zkZKe1UzqdW474Laridx_usE7oZ4szAVtK2O5bzJZFN4UiDbGRS_id695WE34q9U0bLmcIqE0i5mA0wmYB-kieULQK0nDBFk6wXKmeohX-MbE0FDV1xS7SScC68WjPrN/s529/Screenshot%202022-05-07%20123153.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;310&quot; data-original-width=&quot;529&quot; height=&quot;235&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx3brnM_u8RaB5t2q6RsOVynz7Md3GnJ9uQ2YsDPfDdJEzPUhroSfQMAV5zkZKe1UzqdW474Laridx_usE7oZ4szAVtK2O5bzJZFN4UiDbGRS_id695WE34q9U0bLmcIqE0i5mA0wmYB-kieULQK0nDBFk6wXKmeohX-MbE0FDV1xS7SScC68WjPrN/w400-h235/Screenshot%202022-05-07%20123153.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;好，我来看看我 downlaod 下来的 dataset 是不是对的。&lt;div&gt;从 download 下来的 file structure，我们可以看到 Yolo v5 PyTorch 的 dataset，images 和 label 是收在分开的 folder 的，annotation file 也是 csv 格式。也就是说，datasets 格式转换成功。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz4BLOuCnQ7zBs8CngAtB7Zvu2BpVsKlDs8emUUAxqm8GXRH3tfGWVHAQG6sU62ZazASDsgr5uLXBB9GCEG7-fyV01ZO5-jaK43lZpWyskJfttHem3ArPwDNC8caUQC-Ouse6RGdnuGNATBSV8Yk_JFK14atG-KzBl_PFLdqFyMxebHyxWfJb_ohiL/s889/Screenshot%202022-05-07%20124058.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;123&quot; data-original-width=&quot;889&quot; height=&quot;55&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz4BLOuCnQ7zBs8CngAtB7Zvu2BpVsKlDs8emUUAxqm8GXRH3tfGWVHAQG6sU62ZazASDsgr5uLXBB9GCEG7-fyV01ZO5-jaK43lZpWyskJfttHem3ArPwDNC8caUQC-Ouse6RGdnuGNATBSV8Yk_JFK14atG-KzBl_PFLdqFyMxebHyxWfJb_ohiL/w400-h55/Screenshot%202022-05-07%20124058.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;dataset 弄好，接下来就是 model training script setup 了。至于 training script，也可以在 Roboflow 的网页里面找到（但需要做一些 modification 才会跑 ）。这里我只是 show 如何弄到 Roboflow 的 training script，至于那些细节，我在下一个 post 才谈。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;去 Roboflow Project 左边的 side bar 点 Model Library，选 Yolo v5 PyTorch 点进&amp;nbsp;&amp;nbsp;YOLOR Colab Notebook 的 link，就可以在 colab 拿到 training script，还有清楚的备注。多好。&lt;/div&gt;&lt;div&gt;但，这个原本的 script 毕竟是 for demo purpose，还需要 Roboflow 的 security key，我不太喜欢，所以需要做一些修改。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;至于需要做哪些修改，下个 post 再谈吧。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGT0QD0wh2P3BecvklX0lxIX64MnzSN9cPKTmUrI5TurMipFxLfZ9Iv7tkAtyDDMk_jWb1j6rFTZoQsSdXdsGgbhyJeJyQHrcr2Ek24oeHdTc-OsOTGD7AGHJQAXTuqGtubGctjPuFHCDVplYos14xfJEdB5f1Tx7KhiuCufXxGO9m0QyPOCwPlgWq/s906/Screenshot%202022-05-07%20125434.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;631&quot; data-original-width=&quot;906&quot; height=&quot;223&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGT0QD0wh2P3BecvklX0lxIX64MnzSN9cPKTmUrI5TurMipFxLfZ9Iv7tkAtyDDMk_jWb1j6rFTZoQsSdXdsGgbhyJeJyQHrcr2Ek24oeHdTc-OsOTGD7AGHJQAXTuqGtubGctjPuFHCDVplYos14xfJEdB5f1Tx7KhiuCufXxGO9m0QyPOCwPlgWq/s320/Screenshot%202022-05-07%20125434.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;好，今天到处为止。&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><link>http://6sigmaforum.blogspot.com/2022/05/how-to-prepare-training-dataset-for.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp0LgsGrX7qmYzpZgs2ORGB-NrlcqYKrlFqJaJWnoqyvx7c6-SNC_mz88XrnviA42y0Fafsa3acOGHWBdSeWFnBWd-t56_3WAspaMkJKsD0ZphGOQ-Amls5NKVVNvMTCYUh8kr9ry0jiUkwllaW7m5bNMV8sdO4zz6hxNOumX-hdmwtZu1piOcMAqX/s72-w400-h178-c/Screenshot%202022-05-07%20105536.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-2913266813227104864</guid><pubDate>Sun, 17 Apr 2022 03:37:00 +0000</pubDate><atom:updated>2022-04-17T11:37:33.351+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Case Study</category><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>How To Build A Gaussian Mixed Model (GMM) Model For Data Clustering </title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;很久以前就有听过这 GMM 的玩意儿，至于 GMM 这葫芦里卖的是什么药，说实在的，我真的是没有什么概念。只知道它是 unsupervised learning 的一种。每次想到这个 topic，就会提醒自己必须花些时间来把这个 topic 搞清楚。讲了一年多，都没有实际行动，一大堆理由倒是真的。直到去年年尾总结的时候，告诉自己，无论如何都要把这债还清。所以，逼自己花了两天的时间来研究研究。至少让我对 GMM 这玩意多一些了解。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;从网上趴回来的资料，得到了一个重点，其实 GMM 和 k-mean 差不多。但是 k-mean 本身有一个缺点，那就是当它找到某个 cluster data 的 mean 值的时候，它会假设所有在 mean 值直径范围内的点都属于同样一个 cluster。但，实际上我们的 data 不是这样分布，一般的 data 都是比较倾向于正态分布的，所以很多时候 k-mean 会把不同 的 cluster 归类于同样一个 cluster，结果影响了 classification accuracy。GMM 的出现把这问题解决，这也是为啥 GMM 会普遍使用的其中一个原因。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;几个网上趴回来的资料当中，这资料对我来说是比较完整，而且 code 也可以用。所以我必须把它给记录下来，以防万一。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;ref link :&amp;nbsp;&lt;a href=&quot;https://towardsdatascience.com/gmm-gaussian-mixture-models-how-to-successfully-use-it-to-cluster-your-data-891dc8ac058f&quot; target=&quot;_blank&quot;&gt;GMM: Gaussian Mixture Models — How toSuccessfully Use IttoClusterYour Data?&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;以下是从参考资料那来复制过来的码，试过了，行得通。可以留着自己用。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# ref : https://towardsdatascience.com/gmm-gaussian-mixture-models-how-to-successfully-use-it-to-cluster-your-data-891dc8ac058f
# map can&#39;t show up if open with jupyterlab. have to open with juypternotebook

import pandas as pd # for data manipulation
import numpy as np # for data manipulation

from sklearn.mixture import GaussianMixture # for GMM clustering
from sklearn import metrics # for calculating Silhouette score

import matplotlib.pyplot as plt # for data visualization
import plotly.express as px  # for data visualization
import plotly.graph_objects as go # for data visualization

from geopy.geocoders import Nominatim # for getting city coordinates
from progressbar import ProgressBar # for displaying progress 
import time # for adding time delays&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# Set Pandas options to display more columns
pd.options.display.max_columns=50

# Read in the weather data csv
df=pd.read_csv(&#39;weatherAUS.csv&#39;, encoding=&#39;utf-8&#39;)

# Drop records where target RainTomorrow=NaN
df=df[pd.isnull(df[&#39;RainTomorrow&#39;])==False]

# For other columns with missing values, fill them in with column mean
df=df.fillna(df.mean())

# Add spaces between multiple words in location names
df[&#39;Location2&#39;]=df[&#39;Location&#39;].str.replace( r&quot;([A-Z])&quot;, r&quot; \1&quot;).str.strip()
# Update Location for Pearce RAAF so it can be found by geolocator
df[&#39;Location2&#39;]=df[&#39;Location2&#39;].apply(lambda x: &#39;Pearce, Bullsbrook&#39; if x==&#39;Pearce R A A F&#39; else x)

# Show a snaphsot of data
df
&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;/pre&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;table border=&quot;1&quot; class=&quot;dataframe&quot; style=&quot;background-color: white; border-collapse: collapse; border-spacing: 0px; border: none; box-sizing: unset; color: rgba(0, 0, 0, 0.87); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 12px; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; table-layout: fixed;&quot;&gt;&lt;thead style=&quot;border-bottom: var(--jp-border-width) solid var(--jp-border-color1); box-sizing: unset; vertical-align: bottom;&quot;&gt;&lt;tr style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Date&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Location&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;MinTemp&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;MaxTemp&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Rainfall&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Evaporation&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Sunshine&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;WindGustDir&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;WindGustSpeed&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;WindDir9am&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;WindDir3pm&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;WindSpeed9am&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;WindSpeed3pm&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Humidity9am&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Humidity3pm&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Pressure9am&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Pressure3pm&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Cloud9am&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Cloud3pm&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Temp9am&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Temp3pm&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;RainToday&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;RainTomorrow&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Location2&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;box-sizing: unset;&quot;&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;0&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;2008-12-01&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Albury&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;13.4&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;22.9&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;0.6&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;5.469824&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;7.624853&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;W&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;44.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;W&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;WNW&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;20.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;24.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;71.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;22.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1007.7&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1007.1&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;8.000000&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;4.503167&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;16.9&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;21.8&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Albury&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;1&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;2008-12-02&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Albury&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;7.4&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;25.1&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;0.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;5.469824&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;7.624853&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;WNW&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;44.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;NNW&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;WSW&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;4.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;22.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;44.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;25.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1010.6&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1007.8&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;4.437189&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;4.503167&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;17.2&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;24.3&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Albury&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;2&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;2008-12-03&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Albury&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;12.9&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;25.7&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;0.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;5.469824&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;7.624853&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;WSW&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;46.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;W&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;WSW&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;19.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;26.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;38.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;30.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1007.6&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1008.7&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;4.437189&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;2.000000&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;21.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;23.2&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Albury&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;3&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;2008-12-04&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Albury&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;9.2&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;28.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;0.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;5.469824&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;7.624853&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;NE&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;24.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;SE&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;E&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;11.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;9.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;45.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;16.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1017.6&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1012.8&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;4.437189&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;4.503167&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;18.1&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;26.5&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Albury&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;4&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;2008-12-05&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Albury&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;17.5&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;32.3&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;5.469824&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;7.624853&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;W&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;41.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;ENE&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;NW&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;7.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;20.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;82.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;33.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1010.8&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1006.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;7.000000&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;8.000000&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;17.8&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;29.7&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Albury&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;...&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;...&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;145454&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;2017-06-20&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Uluru&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;3.5&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;21.8&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;0.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;5.469824&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;7.624853&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;E&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;31.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;ESE&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;E&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;15.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;13.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;59.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;27.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1024.7&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1021.2&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;4.437189&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;4.503167&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;9.4&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;20.9&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Uluru&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;145455&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;2017-06-21&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Uluru&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;2.8&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;23.4&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;0.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;5.469824&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;7.624853&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;E&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;31.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;SE&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;ENE&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;13.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;11.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;51.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;24.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1024.6&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1020.3&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;4.437189&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;4.503167&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;10.1&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;22.4&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Uluru&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;145456&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;2017-06-22&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Uluru&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;3.6&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;25.3&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;0.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;5.469824&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;7.624853&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;NNW&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;22.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;SE&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;N&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;13.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;9.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;56.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;21.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1023.5&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1019.1&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;4.437189&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;4.503167&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;10.9&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;24.5&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Uluru&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;145457&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;2017-06-23&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Uluru&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;5.4&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;26.9&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;0.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;5.469824&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;7.624853&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;N&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;37.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;SE&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;WNW&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;9.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;9.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;53.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;24.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1021.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1016.8&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;4.437189&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;4.503167&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;12.5&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;26.1&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Uluru&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;145458&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;2017-06-24&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Uluru&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;7.8&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;27.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;0.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;5.469824&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;7.624853&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;SE&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;28.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;SSE&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;N&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;13.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;7.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;51.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;24.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1019.4&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;1016.5&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;3.000000&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;2.000000&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;15.1&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;26.0&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;No&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Uluru&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;background-color: white; box-sizing: unset; color: rgba(0, 0, 0, 0.87); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; margin: 0px 0px 1em; white-space: normal;&quot;&gt;142193 rows × 24 columns&lt;/p&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# Create a list of unique locations (cities)
loc_list=list(df.Location2.unique())

geolocator = Nominatim(user_agent=&quot;add-your-agent-name&quot;)
country =&quot;Australia&quot;
loc_res=[]

pbar=ProgressBar() # This will help us to show the progress of our iteration
for city in pbar(loc_list):
    loc = geolocator.geocode(city+&#39;,&#39;+ country)
    res = [city, loc.latitude, loc.longitude]
    loc_res = loc_res + [res]
    time.sleep(1) # sleep for 1 second before submitting the next query

# Add locations to a dataframe
df_loc=pd.DataFrame(loc_res, columns=[&#39;Loc&#39;, &#39;Latitude&#39;, &#39;Longitude&#39;])

# Show data
df_loc&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;table border=&quot;1&quot; class=&quot;dataframe&quot; style=&quot;background-color: white; border-collapse: collapse; border-spacing: 0px; border: none; box-sizing: unset; color: rgba(0, 0, 0, 0.87); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 12px; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; table-layout: fixed;&quot;&gt;&lt;thead style=&quot;border-bottom: var(--jp-border-width) solid var(--jp-border-color1); box-sizing: unset; vertical-align: bottom;&quot;&gt;&lt;tr style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Loc&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Latitude&lt;/th&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;Longitude&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;box-sizing: unset;&quot;&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;0&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Albury&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-36.080477&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;146.916280&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;1&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Badgerys Creek&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-33.881667&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;150.744163&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;2&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Cobar&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-31.498333&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;145.834444&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;3&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Coffs Harbour&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-30.296241&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;153.113529&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;4&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Moree&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-29.461720&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;149.840715&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;5&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Newcastle&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-32.919295&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;151.779535&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;6&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Norah Head&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-33.281667&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;151.567778&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;7&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Norfolk Island&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-29.028958&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;167.958729&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;8&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Penrith&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-33.751079&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;150.694168&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;9&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Richmond&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-37.820395&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;145.002515&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;10&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Sydney&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-33.869844&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;151.208285&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;11&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Sydney Airport&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-33.933776&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;151.179927&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;12&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Wagga Wagga&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-35.115000&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;147.367778&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;13&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Williamtown&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-32.815000&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;151.842778&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;14&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Wollongong&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-34.424394&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;150.893850&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;15&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Canberra&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-35.297591&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;149.101268&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;16&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Tuggeranong&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-35.420977&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;149.092134&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;17&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Mount Ginini&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-35.529744&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;148.772540&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;18&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Ballarat&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-37.562303&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;143.860565&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;19&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Bendigo&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-36.758877&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;144.282593&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;20&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Sale&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-38.105036&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;147.064790&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;21&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Melbourne Airport&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-37.666951&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;144.833493&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;22&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Melbourne&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-37.814218&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;144.963161&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;23&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Mildura&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-34.184726&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;142.162497&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;24&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Nhil&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-35.471309&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;141.306236&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;25&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Portland&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-38.345623&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;141.604230&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;26&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Watsonia&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-37.711002&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;145.083635&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;27&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Dartmoor&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-37.922544&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;141.276655&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;28&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Brisbane&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-27.468968&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;153.023499&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;29&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Cairns&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-16.920666&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;145.772185&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;30&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Gold Coast&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-28.002373&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;153.414599&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;31&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Townsville&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-19.256939&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;146.823954&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;32&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Adelaide&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-34.928181&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;138.599931&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;33&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Mount Gambier&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-37.824670&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;140.782007&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;34&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Nuriootpa&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-34.469335&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;138.993901&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;35&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Woomera&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-31.199914&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;136.825353&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;36&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Albany&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-35.024782&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;117.883608&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;37&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Witchcliffe&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-34.026335&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;115.100477&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;38&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Pearce, Bullsbrook&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-31.673960&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;116.017544&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;39&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Perth Airport&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-31.940610&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;115.967608&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;40&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Perth&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-31.955896&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;115.860580&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;41&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Salmon Gums&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-32.981535&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;121.643942&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;42&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Walpole&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-34.977680&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;116.731006&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;43&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Hobart&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-42.882509&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;147.328123&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;44&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Launceston&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-41.434081&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;147.137350&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;45&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Alice Springs&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-23.698388&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;133.881289&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;46&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Darwin&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-12.460440&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;130.841047&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-rendermime-table-row-background); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;47&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Katherine&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-14.464616&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;132.263599&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;background: var(--jp-layout-color0); border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;&lt;th style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; text-align: right; vertical-align: middle;&quot;&gt;48&lt;/th&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;Uluru&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;-25.344857&lt;/td&gt;&lt;td style=&quot;border: none; box-sizing: unset; line-height: normal; max-width: none; padding: 0.5em; vertical-align: middle;&quot;&gt;131.032517&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# Create a figure
fig = go.Figure(data=go.Scattergeo(
        lat=df_loc[&#39;Latitude&#39;],
        lon=df_loc[&#39;Longitude&#39;],
        hovertext=df_loc[&#39;Loc&#39;], 
        mode = &#39;markers&#39;,
        marker_color = &#39;red&#39;,
        ))

# Update layout so we can zoom in on Australia
fig.update_layout(
        width=980,
        height=720,
        margin={&quot;r&quot;:0,&quot;t&quot;:10,&quot;l&quot;:0,&quot;b&quot;:10},
        geo = dict(
            scope=&#39;world&#39;,
            projection_type=&#39;miller&#39;,
            landcolor = &quot;rgb(250, 250, 250)&quot;,
            center=dict(lat=-25.69839, lon=139.8813), # focus point
            projection_scale=6 # zoom in on
        ),
    )

fig.show()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Zga_Hp5N8orRtKU9A3zJ1-tFBdLZ-yvfImCDabpPzLNRP3xAGnlSeP3Nv9bDxR01GwAEtelBZTwhtr5cDNHLKGn_PjldzjWgzjxD_9sfRhtDzae5G4lPZzlB8nAAbhetFXODUCKgXIGoUuBhCimoSdB6kK_rufixCnu06-abizxxBhgHJBKe9P_Z/s787/newplot.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;720&quot; data-original-width=&quot;787&quot; height=&quot;366&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Zga_Hp5N8orRtKU9A3zJ1-tFBdLZ-yvfImCDabpPzLNRP3xAGnlSeP3Nv9bDxR01GwAEtelBZTwhtr5cDNHLKGn_PjldzjWgzjxD_9sfRhtDzae5G4lPZzlB8nAAbhetFXODUCKgXIGoUuBhCimoSdB6kK_rufixCnu06-abizxxBhgHJBKe9P_Z/w400-h366/newplot.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# Create empty list
S=[]

# Range of clusters to try (2 to 10)
K=range(2,11)

# Select data for clustering model
X = df_loc[[&#39;Latitude&#39;, &#39;Longitude&#39;]]

for k in K:
    # Set the model and its parameters
    model = GaussianMixture(n_components=k, n_init=20, init_params=&#39;kmeans&#39;)
    # Fit the model 
    labels = model.fit_predict(X)
    # Calculate Silhoutte Score and append to a list
    S.append(metrics.silhouette_score(X, labels, metric=&#39;euclidean&#39;))

# Plot the resulting Silhouette scores on a graph
plt.figure(figsize=(16,8), dpi=300)
plt.plot(K, S, &#39;bo-&#39;, color=&#39;black&#39;)
plt.xlabel(&#39;k&#39;)
plt.ylabel(&#39;Silhouette Score&#39;)
plt.title(&#39;Identify the number of clusters using Silhouette Score&#39;)
plt.show()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOKlbWQiHAYYznmO8k0XctDOGCz3wCwjvewp0xU9v22GS4YgqPyUz7n8KSv7WN2_Ep-C43fGkk4l4_nPBkmBlMUf4vrpNqslcXjToyosxGgmH-7SWVXgiAED7Osp1mD_VtLusl0fB0Ay64MXBUqxVQsRqnR9jME-1ugiYWwVBL1FLt-G1zc7yPSpgY/s1418/Silhouette%20Score.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;734&quot; data-original-width=&quot;1418&quot; height=&quot;208&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOKlbWQiHAYYznmO8k0XctDOGCz3wCwjvewp0xU9v22GS4YgqPyUz7n8KSv7WN2_Ep-C43fGkk4l4_nPBkmBlMUf4vrpNqslcXjToyosxGgmH-7SWVXgiAED7Osp1mD_VtLusl0fB0Ay64MXBUqxVQsRqnR9jME-1ugiYWwVBL1FLt-G1zc7yPSpgY/w400-h208/Silhouette%20Score.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# Select data for clustering model
X = df_loc[[&#39;Longitude&#39;, &#39;Latitude&#39;]]

# Set the model and its parameters - 4 clusters
model4 = GaussianMixture(n_components=4, # this is the number of clusters
                         covariance_type=&#39;full&#39;, # {‘full’, ‘tied’, ‘diag’, ‘spherical’}, default=’full’
                         max_iter=100, # the number of EM iterations to perform. default=100
                         n_init=1, # the number of initializations to perform. default = 1
                         init_params=&#39;kmeans&#39;, # the method used to initialize the weights, the means and the precisions. {&#39;random&#39; or default=&#39;k-means&#39;}
                         verbose=0, # default 0, {0,1,2}
                         random_state=1 # for reproducibility
                        )

# Fit the model and predict labels
clust4 = model4.fit(X)
labels4 = model4.predict(X)

# Generate 10,000 new samples based on the model
smpl=model4.sample(n_samples=10000)

# Print model summary
print(&#39;*************** 4 Cluster Model ***************&#39;)
#print(&#39;Weights: &#39;, clust4.weights_)
print(&#39;Means: &#39;, clust4.means_)
#print(&#39;Covariances: &#39;, clust4.covariances_)
#print(&#39;Precisions: &#39;, clust4.precisions_)
#print(&#39;Precisions Cholesky: &#39;, clust4.precisions_cholesky_)
print(&#39;Converged: &#39;, clust4.converged_)
print(&#39; No. of Iterations: &#39;, clust4.n_iter_)
#print(&#39;Lower Bound: &#39;, clust4.lower_bound_)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;pre style=&quot;background-color: white; border: none; box-sizing: unset; color: var(--jp-content-font-color1); font-family: var(--jp-code-font-family); font-size: var(--jp-code-font-size); line-height: var(--jp-code-line-height); margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; overflow: auto; padding: 0px; white-space: pre-wrap; word-break: break-all;&quot;&gt;*************** 4 Cluster Model ***************
Means:  [[117.02852927 -33.22588073]
 [150.12384738 -33.45513888]
 [142.80407729 -37.14718707]
 [136.85134074 -18.78277472]]
Converged:  True
 No. of Iterations:  10&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# Attach cluster labels to the main dataframe
df_loc[&#39;Clust4&#39;]=labels4

# Create a figure
fig = go.Figure(data=go.Scattergeo(
        lat=df_loc[&#39;Latitude&#39;],
        lon=df_loc[&#39;Longitude&#39;],
        hovertext=df_loc[[&#39;Loc&#39;, &#39;Clust4&#39;]], 
        mode = &#39;markers&#39;,
        marker=dict(colorscale=[&#39;#ae34eb&#39;, &#39;red&#39;, &#39;blue&#39;, &#39;#34eb34&#39;]),
        marker_color = df_loc[&#39;Clust4&#39;],
        ))

# Update layout so we can zoom in on Australia
fig.update_layout(
        showlegend=False,
        width=1000,
        height=760,
        margin={&quot;r&quot;:0,&quot;t&quot;:30,&quot;l&quot;:0,&quot;b&quot;:10},
        geo = dict(
            scope=&#39;world&#39;,
            projection_type=&#39;miller&#39;,
            landcolor = &quot;rgb(250, 250, 250)&quot;,
            center=dict(lat=-25.69839, lon=139.8813), # focus point
            projection_scale=6 # zoom in on
        ),
    )
fig.show()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgetEQ4bwpW67_nZmlN96zMsu0bzvtsIMIF8R_9b5mDoSur3D2eMyN3tBveIedsY9AQCJ-Q4r8JjZNhhl7c0quADyVMMAvYOTh_mY-H0qzseG_LMs7qLOwED4qV8tJwDHDVr3fs0d1QJhZ-e7-8f7gyO_0xt7LoRlvC6PAL9tTwkeUJmoO7zCrKv434/s971/newplot%20(1).png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;760&quot; data-original-width=&quot;971&quot; height=&quot;313&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgetEQ4bwpW67_nZmlN96zMsu0bzvtsIMIF8R_9b5mDoSur3D2eMyN3tBveIedsY9AQCJ-Q4r8JjZNhhl7c0quADyVMMAvYOTh_mY-H0qzseG_LMs7qLOwED4qV8tJwDHDVr3fs0d1QJhZ-e7-8f7gyO_0xt7LoRlvC6PAL9tTwkeUJmoO7zCrKv434/w400-h313/newplot%20(1).png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# Create a figure
fig = go.Figure(data=go.Scattergeo(
        lat=smpl[0][:,1],
        lon=smpl[0][:,0],
        mode = &#39;markers&#39;,
        marker=dict(colorscale=[&#39;#ae34eb&#39;, &#39;red&#39;, &#39;blue&#39;, &#39;#34eb34&#39;]),
        marker_color = smpl[1],
        marker_size=3
        ))

# Update layout so we can zoom in on Australia
fig.update_layout(
        showlegend=False,
        width=1000,
        height=760,
        margin={&quot;r&quot;:0,&quot;t&quot;:30,&quot;l&quot;:0,&quot;b&quot;:10},
        geo = dict(
            scope=&#39;world&#39;,
            projection_type=&#39;miller&#39;,
            landcolor = &quot;rgb(250, 250, 250)&quot;,
            center=dict(lat=-25.69839, lon=139.8813), # focus point
            projection_scale=6 # zoom in on
        ),
    )
fig.show()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp-JQWItDOGtmC68UmFbDLrP03BsOhGUC2og1let_W_m5p1K6kS4Vkuw-aa6rFAnAmdsGoZ_vS3XapKUAB3-Q1TyAv3O2rHB_rxScYTplhA53XRw3S_27OszF3gSjypkki8B5lJu6PUiGUzEtjFRBBRp60Lu3CLuWojvLTKAtHsC8BedS9s-Mx-ErU/s887/newplot%20(2).png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;760&quot; data-original-width=&quot;887&quot; height=&quot;343&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp-JQWItDOGtmC68UmFbDLrP03BsOhGUC2og1let_W_m5p1K6kS4Vkuw-aa6rFAnAmdsGoZ_vS3XapKUAB3-Q1TyAv3O2rHB_rxScYTplhA53XRw3S_27OszF3gSjypkki8B5lJu6PUiGUzEtjFRBBRp60Lu3CLuWojvLTKAtHsC8BedS9s-Mx-ErU/w400-h343/newplot%20(2).png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;OK, 就这样完成。&lt;/div&gt;&lt;div&gt;其实以上的 script 我是在一月份测试的，当时用着 jupyterlab，就是无法把地图搞出来，但是用 jupyternotebook 又没问题。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今天再次用 jupyterlab 来测试，地图的问题不见了。到底出了什么问题，我自己也不知道。总之，以上的码是没问题的。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://6sigmaforum.blogspot.com/2022/04/how-to-build-gaussian-mixed-model-gmm.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Zga_Hp5N8orRtKU9A3zJ1-tFBdLZ-yvfImCDabpPzLNRP3xAGnlSeP3Nv9bDxR01GwAEtelBZTwhtr5cDNHLKGn_PjldzjWgzjxD_9sfRhtDzae5G4lPZzlB8nAAbhetFXODUCKgXIGoUuBhCimoSdB6kK_rufixCnu06-abizxxBhgHJBKe9P_Z/s72-w400-h366-c/newplot.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-2550335314064075425</guid><pubDate>Sat, 25 Dec 2021 16:27:00 +0000</pubDate><atom:updated>2021-12-26T00:29:51.719+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>How To Convert Pascol VOC To Coco (xml to json)</title><description>之前在学 EfficientDet object detection model training 碰到最大的问题，就是在准备 training data 这一块。Tensorflow 有他们自己的方法，pytorch 也有他们自己的一套。因为这个问题，花了不少时间才搞清楚。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;如果要用 pytorch 来 train EfficientDet ojbect detection model，那么，我必须把 annotated 在 Pascol VOC xml 格式的 data file 转换成 Coco json 格式。今天要记录的就是这个 data file 格式的转换。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;这个方法是我在 &lt;a href=&quot;https://github.com/flmoktar/voc2coco&quot; target=&quot;_blank&quot;&gt;git hub&lt;/a&gt; 上扒回来的。 跟着步骤做就可以。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. pip install&amp;nbsp;&lt;span face=&quot;-apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;&quot; style=&quot;background-color: white; color: #24292f; font-size: 16px;&quot;&gt;lxml&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face=&quot;-apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;&quot; style=&quot;background-color: white; color: #24292f; font-size: 16px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face=&quot;-apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;&quot; style=&quot;background-color: white; color: #24292f; font-size: 16px;&quot;&gt;2. 开一个 folder 把这些 file 都放进去。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face=&quot;-apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;&quot; style=&quot;background-color: white; color: #24292f; font-size: 16px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEi2roSbUagK0fwuq4zSwkvam8aTOq2DUfvgyDKcPb4LnnR3I8FEFxvJUo-UBSPX1Mpbf89hh7t5rESnODCkRYO1j0Ac90fg3Fv3OELE92bHay8d0V0kjq5LE_ifbwAsukGdAgVf3Q5YUiDh-Qhh7CRhutJe9uxsAk_gTd1Zf_IoIPRZgpwgtrHn-TfH=s164&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;142&quot; data-original-width=&quot;164&quot; height=&quot;142&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEi2roSbUagK0fwuq4zSwkvam8aTOq2DUfvgyDKcPb4LnnR3I8FEFxvJUo-UBSPX1Mpbf89hh7t5rESnODCkRYO1j0Ac90fg3Fv3OELE92bHay8d0V0kjq5LE_ifbwAsukGdAgVf3Q5YUiDh-Qhh7CRhutJe9uxsAk_gTd1Zf_IoIPRZgpwgtrHn-TfH&quot; width=&quot;164&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;3. 把用 labelimg 弄好的 xml file 都存进&amp;nbsp; Annotations 的 folder 里&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;4. 把说有的 xml filename list 在 notepad 里然后 save as xmllist.txt。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEg1boxsh1pi-0pdTLGLTeYfSDC0uBDl8EG4pByfowwqtSRFdrAcNsUTfT1mUCVFj2aKZSU-z8ZZbaBs3XDW7b3z6kDdVuvhFUDVG-Q6RO9MNjfh8JyF05KbPnKcfMsnsE9Ce-ALWhjcFPAL5lzXsumRQ22a81xsLxRRYG7zde3s2LMRkmHrs1-oUX1I=s221&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;192&quot; data-original-width=&quot;221&quot; height=&quot;192&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEg1boxsh1pi-0pdTLGLTeYfSDC0uBDl8EG4pByfowwqtSRFdrAcNsUTfT1mUCVFj2aKZSU-z8ZZbaBs3XDW7b3z6kDdVuvhFUDVG-Q6RO9MNjfh8JyF05KbPnKcfMsnsE9Ce-ALWhjcFPAL5lzXsumRQ22a81xsLxRRYG7zde3s2LMRkmHrs1-oUX1I&quot; width=&quot;221&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;5. 上 github download voc2coco-master 下来收进 folder。然后把 voc2coco.py 的 file copy 出来，总之必须弄到和上图一样就是。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;6. 打开 anaconda terminal, change directory 去上图的那个 folder，然后 copy 以下的 command paste 在 terminal enter。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;python voc2coco.py xmllist.txt ./Annotations output.json&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;如果一切顺利，应该会看到以下结果&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiyHlwvahdcAm0m06wSXO5JQWvLSQLVY4bn-Tes6yan9fkyeupBdCNQR0HtGhk4AC-JYkXLb-BU7dfuzzPA69SKg4oJF6uDIFk86O_KAZ7QDCg7Sh6LZmzcX8zD6f9wdwxWdDcDmFV7glGadJyC3RABvwyD28TP8gx9mM7TNffpg8VRKSOuz8-0aBm0=s880&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;150&quot; data-original-width=&quot;880&quot; height=&quot;68&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiyHlwvahdcAm0m06wSXO5JQWvLSQLVY4bn-Tes6yan9fkyeupBdCNQR0HtGhk4AC-JYkXLb-BU7dfuzzPA69SKg4oJF6uDIFk86O_KAZ7QDCg7Sh6LZmzcX8zD6f9wdwxWdDcDmFV7glGadJyC3RABvwyD28TP8gx9mM7TNffpg8VRKSOuz8-0aBm0=w400-h68&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;folder 里也会多了个 output.json 的 data file 出来。用 notepad 打打开来看，应该是这样的格式的。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgtITzlTgvGZG5Ru5xoF6bMuoZUOnPyFS7JmbkmtNDKmXJlb3EnvcUx_o8XHLbgc2XtysFwq3EeqTWwecB56hd4Dr78w_-8lPI6Wbi8SRVOJOCxVilEu57_RnaiC1ccvvdnEwb0Sfl3wl5F1d-AoD3M-_y-fqVgotxB5dkSBhfiMEM-GYIy5Pec1kve=s197&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;158&quot; data-original-width=&quot;197&quot; height=&quot;158&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgtITzlTgvGZG5Ru5xoF6bMuoZUOnPyFS7JmbkmtNDKmXJlb3EnvcUx_o8XHLbgc2XtysFwq3EeqTWwecB56hd4Dr78w_-8lPI6Wbi8SRVOJOCxVilEu57_RnaiC1ccvvdnEwb0Sfl3wl5F1d-AoD3M-_y-fqVgotxB5dkSBhfiMEM-GYIy5Pec1kve&quot; width=&quot;197&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiLcP8xgl8oJrCYtPRBn0dXOvAaTsqpfnM7w4wjIcE_ZzlUPmZqtSo_WGeinCakRfK_XTqqCREDqdP1OPIkT1-vqnkDuk5LHUZtGbqR_GLMt1AE2zFFisFFAGsLehBA67e32utmPkL_qup7MHu7w0h78oDYc_CheTUihKGF3ECBYjQ_7E5bKA5Z4P-b=s960&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;429&quot; data-original-width=&quot;960&quot; height=&quot;143&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiLcP8xgl8oJrCYtPRBn0dXOvAaTsqpfnM7w4wjIcE_ZzlUPmZqtSo_WGeinCakRfK_XTqqCREDqdP1OPIkT1-vqnkDuk5LHUZtGbqR_GLMt1AE2zFFisFFAGsLehBA67e32utmPkL_qup7MHu7w0h78oDYc_CheTUihKGF3ECBYjQ_7E5bKA5Z4P-b=s320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;就这样完成了一个 data file 的转换。&lt;/div&gt;&lt;div&gt;在 EfficientDet object detection model training，我们需要准备一个 training 和 testing 的 json data file。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;好，今天就这么多，接下来就要记录 train EfficientDet 的过程了&lt;br /&gt;&lt;span face=&quot;-apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;&quot; style=&quot;background-color: white; color: #24292f; font-size: 16px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;</description><link>http://6sigmaforum.blogspot.com/2021/12/how-to-convert-pascol-voc-to-coco-xml.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEi2roSbUagK0fwuq4zSwkvam8aTOq2DUfvgyDKcPb4LnnR3I8FEFxvJUo-UBSPX1Mpbf89hh7t5rESnODCkRYO1j0Ac90fg3Fv3OELE92bHay8d0V0kjq5LE_ifbwAsukGdAgVf3Q5YUiDh-Qhh7CRhutJe9uxsAk_gTd1Zf_IoIPRZgpwgtrHn-TfH=s72-c" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-4236979646080958476</guid><pubDate>Wed, 22 Dec 2021 14:03:00 +0000</pubDate><atom:updated>2021-12-22T22:03:31.192+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Machine Learning</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>How To Visualize Feature Map of CNN With Python</title><description>&lt;p&gt;曾经看过专家示范如何把 CNN 在处理图像的时候，把图像经过每一个 layer 的 feature map 给弄出来，好让我们能够了解 CNN 在做 feature extraction 的时候，到底 pickup 了什么样的 feature。&lt;/p&gt;&lt;p&gt;今日心血来潮，再次翻转了整个 Google，终于给我在 Kaggle 里找到了一个能够让我明白的 script。 原来的 script 只是选用了 VGG16 ，后来我也尝试了用 Efficientnet，也行&lt;/p&gt;&lt;p&gt;在这个示范，我用了以下的图片，导出了 layer 2, 3, 4, 5, 6, 7 的 feature map 。&lt;/p&gt;&lt;p&gt;注：最少要选两个 layer，如果只设定一个 layer 的话，那么会出现&amp;nbsp; error ，也不知道为啥&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiqKfEONdZJstJooLVAyoJKz980IafYns8b-wDDUBjjb2S2fL6MhkUsxFCZkIXormHSQotgJbEweN2kWpDFmB94kOoPqFsdq8oJUuOEwq6i5u9YSRhnWcWDDHVKEdfuvb64QRX9yMNmLI9V7ap8-9SlAKtWj4Lt6qIEp4OnqwdnFWfq1dtQbqJgmafR=s50&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;50&quot; data-original-width=&quot;50&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiqKfEONdZJstJooLVAyoJKz980IafYns8b-wDDUBjjb2S2fL6MhkUsxFCZkIXormHSQotgJbEweN2kWpDFmB94kOoPqFsdq8oJUuOEwq6i5u9YSRhnWcWDDHVKEdfuvb64QRX9yMNmLI9V7ap8-9SlAKtWj4Lt6qIEp4OnqwdnFWfq1dtQbqJgmafR=w320-h320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;# ref : https://www.kaggle.com/loaiabdalslam/vgg16-layers-visualization-tutorial
# visualize feature maps output from each block in the vgg model
from keras.applications.vgg16 import VGG16
from keras_efficientnets import EfficientNetB0
from keras.applications.vgg16 import preprocess_input
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.models import Model
import matplotlib.pyplot as plt
from numpy import expand_dims
from matplotlib import pyplot 

# load the model (select one model)
#model = VGG16()
model = EfficientNetB0()

# redefine model to output right after the first hidden layer
ixs = [2,3,4,5,6,7]
outputs = [model.layers[i].output for i in ixs]
model = Model(inputs=model.inputs, outputs=outputs)
model.summary()

# load the image with the required shape
# convert the image to an array
img = load_img(f&#39;C:/Users/mokf/FAV_ADC/pkg_object/dso_std/unlabel_image/test.png&#39;, target_size=(224, 224))

# convert the image to an array
img = img_to_array(img)

# expand dimensions so that it represents a single &#39;sample&#39;
img = expand_dims(img, axis=0)

# prepare the image (e.g. scale pixel values for the vgg)
img = preprocess_input(img)

# get feature map for first hidden layer
feature_maps = model.predict(img)

# plot the output from each block
square = 5
for fmap in feature_maps:
    # plot all 64 maps in an 8x8 squares
    ix = 1
    for _ in range(square):
        plt.figure(figsize=(16,16))
        for _ in range(square):
           

            # specify subplot and turn of axis
            ax = pyplot.subplot(square, square, ix)
            ax.set_xticks([])
            ax.set_yticks([])

            # plot filter channel in grayscale
            plt.imshow(fmap[0, :, :, ix-1], cmap=&#39;viridis&#39;)
            ix += 1
    # show the figure    
    plt.show()
&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;结果就是这样。还可以&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjMaNBauBPwgCDca4Z0ZwIyhb0Bzkoc1oeYszi7w9kAPNDeFL5tSKETzLwzI7unc3D_wZzYXdZ3AMZneSdytUkcUGfOJ8jiKET2UF-CMAt0YGZnJzoYGxSjXnnkgIoy1krXuGNFNW6he1TUXigEYOuC9cb-gdZroV8xxKrvmaaqv0Bwemt36Uj-F33V=s1049&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;548&quot; data-original-width=&quot;1049&quot; height=&quot;334&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjMaNBauBPwgCDca4Z0ZwIyhb0Bzkoc1oeYszi7w9kAPNDeFL5tSKETzLwzI7unc3D_wZzYXdZ3AMZneSdytUkcUGfOJ8jiKET2UF-CMAt0YGZnJzoYGxSjXnnkgIoy1krXuGNFNW6he1TUXigEYOuC9cb-gdZroV8xxKrvmaaqv0Bwemt36Uj-F33V=w640-h334&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;/div&gt;
</description><link>http://6sigmaforum.blogspot.com/2021/12/how-to-visualize-feature-map-of-cnn.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEiqKfEONdZJstJooLVAyoJKz980IafYns8b-wDDUBjjb2S2fL6MhkUsxFCZkIXormHSQotgJbEweN2kWpDFmB94kOoPqFsdq8oJUuOEwq6i5u9YSRhnWcWDDHVKEdfuvb64QRX9yMNmLI9V7ap8-9SlAKtWj4Lt6qIEp4OnqwdnFWfq1dtQbqJgmafR=s72-w320-h320-c" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-4492868633231267207</guid><pubDate>Sat, 20 Nov 2021 13:51:00 +0000</pubDate><atom:updated>2021-11-20T21:51:22.798+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Machine Learning</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>How To Measure Line Straightness </title><description>&lt;p&gt;公司里有个吃盐比我吃米多的老家伙告诉我，deep learning 只能够做 classification，做不到 measurement，所以 measurement 这件事情需要动用到 classical vision 软件来做。既然人家都自认吃盐比我吃米多，又是长辈，他一开口说话，就算我不认同，也只能够藏在心里。不跟他吵，主要还是为了避免他为我自造一些不必要的工作。&lt;/p&gt;&lt;p&gt;好，今天我就来证明他讲的都是废话，以下我写的 code，也能够测量图片上的直线的弯曲度。&lt;/p&gt;&lt;p&gt;我就用以下的图片来做示范&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-BpzmK7qhsY8/YZj0WVVz74I/AAAAAAAACnQ/QJW53VQGFQcn6ju4avqTd1s-u9Q0zLsBgCLcBGAsYHQ/s101/line_img.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;101&quot; data-original-width=&quot;101&quot; height=&quot;200&quot; src=&quot;https://1.bp.blogspot.com/-BpzmK7qhsY8/YZj0WVVz74I/AAAAAAAACnQ/QJW53VQGFQcn6ju4avqTd1s-u9Q0zLsBgCLcBGAsYHQ/w200-h200/line_img.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;import cv2 as cv
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;image = cv.imread(&#39;line_img.png&#39;)
plt.imshow(image)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-aZ7IdsPvOUg/YZj11gvDJdI/AAAAAAAACnY/3HITvthJQV47AlMD88So2CZaTGVznfeAwCLcBGAsYHQ/s345/Screenshot%2B2021-11-20%2B211833.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;279&quot; data-original-width=&quot;345&quot; height=&quot;259&quot; src=&quot;https://1.bp.blogspot.com/-aZ7IdsPvOUg/YZj11gvDJdI/AAAAAAAACnY/3HITvthJQV47AlMD88So2CZaTGVznfeAwCLcBGAsYHQ/s320/Screenshot%2B2021-11-20%2B211833.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;# find black pixel coordinate
color = (0, 0,0)
indices_curve = np.where(image == color)

coordinates_curve = zip(indices_curve[1], indices_curve[0]) 
unique_coordinates_curve = list(set(list(coordinates_curve)))
df1 = pd.DataFrame(unique_coordinates_curve)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace; font-size: 12px;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace; font-size: 12px;&quot;&gt;# plot a red line at the two end
image2 = cv.line(image, pt1=min(unique_coordinates_curve), pt2 = max(unique_coordinates_curve), color = (200,100,100), thickness = 1)
plt.imshow(image2)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-wUzXk3Ix92k/YZj2SeSptFI/AAAAAAAACng/Gvcz7HowqZM1yHhqfnWpEAfvZb2Q-eXBACLcBGAsYHQ/s342/Screenshot%2B2021-11-20%2B212048.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;283&quot; data-original-width=&quot;342&quot; height=&quot;265&quot; src=&quot;https://1.bp.blogspot.com/-wUzXk3Ix92k/YZj2SeSptFI/AAAAAAAACng/Gvcz7HowqZM1yHhqfnWpEAfvZb2Q-eXBACLcBGAsYHQ/s320/Screenshot%2B2021-11-20%2B212048.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;# find red pixel coordinate
color = (200, 100,100)
indices_line = np.where(image2 == color)

coordinates_line = zip(indices_line[1], indices_line[0]) 
unique_coordinates_line = list(set(list(coordinates_line)))
df2 = pd.DataFrame(unique_coordinates_line)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;# rename header of df1 n df2
df1.columns =[&#39;x_curve&#39;, &#39;y_curve&#39;]
df2.columns =[&#39;x_line&#39;, &#39;y_line&#39;]

df1.sort_values(by=[&#39;x_curve&#39;], inplace=True)
df2.sort_values(by=[&#39;x_line&#39;], inplace=True)

# drop all repeated x coordinate
df11=df1[[&#39;x_curve&#39;,&#39;y_curve&#39;]].drop_duplicates(subset=[&#39;x_curve&#39;])
df22=df2[[&#39;x_line&#39;,&#39;y_line&#39;]].drop_duplicates(subset=[&#39;x_line&#39;])

# compbine df1 n df2 into 1 table
table_merge = pd.merge(df11, df22[[&#39;x_line&#39;, &#39;y_line&#39;]], left_on = &#39;x_curve&#39;, right_on = &#39;x_line&#39;, how = &#39;left&#39;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace; font-size: 12px;&quot;&gt;# calculate x y delta, 
table_merge[&#39;x_delta&#39;] = table_merge[&#39;x_curve&#39;] - table_merge[&#39;x_line&#39;]
table_merge[&#39;y_delta&#39;] = table_merge[&#39;y_curve&#39;] - table_merge[&#39;y_line&#39;]

table_merge
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-lBxXlNrxmHk/YZj2_MuFOXI/AAAAAAAACno/Z4Xv6tmP7dA2OSefJ_CgDSBnzhcqo3i0ACLcBGAsYHQ/s373/Screenshot%2B2021-11-20%2B212347.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;373&quot; data-original-width=&quot;363&quot; height=&quot;320&quot; src=&quot;https://1.bp.blogspot.com/-lBxXlNrxmHk/YZj2_MuFOXI/AAAAAAAACno/Z4Xv6tmP7dA2OSefJ_CgDSBnzhcqo3i0ACLcBGAsYHQ/s320/Screenshot%2B2021-11-20%2B212347.jpg&quot; width=&quot;311&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;# calculate mean square error

def mse(actual, pred): 
    actual, pred = np.array(actual), np.array(pred)
    return np.square(np.subtract(actual,pred)).mean() 

mse = mse(table_merge[&#39;y_curve&#39;], table_merge[&#39;y_line&#39;])
print(&#39;mean square error = &#39;, mse)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&amp;nbsp;&lt;span style=&quot;background-color: white; color: var(--jp-content-font-color1); font-family: var(--jp-code-font-family); font-size: var(--jp-code-font-size); white-space: pre-wrap;&quot;&gt;mean square error =  318.2432432432432&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;# calculate max deviation 
max_deviation = max(table_merge[&#39;y_delta&#39;])
print(&#39;max_deviation = &#39;, max_deviation)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&amp;nbsp;&lt;span style=&quot;background-color: white; color: var(--jp-content-font-color1); font-family: var(--jp-code-font-family); font-size: var(--jp-code-font-size); white-space: pre-wrap;&quot;&gt;max_deviation =  25&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;# histogram of y_delta distribution 
plt.hist(table_merge[&#39;y_delta&#39;], bins = 20)
plt.show()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&amp;nbsp;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-ImrFaBThf8E/YZj3sUV614I/AAAAAAAACnw/gseC4nxfmG49Ciegu0ZahtSyb9CHzdZ9gCLcBGAsYHQ/s380/Screenshot%2B2021-11-20%2B212648.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;252&quot; data-original-width=&quot;380&quot; height=&quot;212&quot; src=&quot;https://1.bp.blogspot.com/-ImrFaBThf8E/YZj3sUV614I/AAAAAAAACnw/gseC4nxfmG49Ciegu0ZahtSyb9CHzdZ9gCLcBGAsYHQ/s320/Screenshot%2B2021-11-20%2B212648.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;# scatter plot

ax1 = table_merge.plot(kind=&#39;scatter&#39;, x=&#39;x_curve&#39;, y=&#39;y_curve&#39;, color=&#39;r&#39;)    
ax2 = table_merge.plot(kind=&#39;scatter&#39;, x=&#39;x_line&#39;, y=&#39;y_line&#39;, color=&#39;b&#39;, ax=ax1)   
#print(ax1 == ax2)  # True
plt.gca().invert_yaxis()
plt.show()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&amp;nbsp;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-7bZTCSG1lVo/YZj4EiliJrI/AAAAAAAACn4/UIT5n8YujTQsqBsEzF1CN-ppimrjHHLawCLcBGAsYHQ/s393/Screenshot%2B2021-11-20%2B212825.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;258&quot; data-original-width=&quot;393&quot; height=&quot;210&quot; src=&quot;https://1.bp.blogspot.com/-7bZTCSG1lVo/YZj4EiliJrI/AAAAAAAACn4/UIT5n8YujTQsqBsEzF1CN-ppimrjHHLawCLcBGAsYHQ/s320/Screenshot%2B2021-11-20%2B212825.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;table_merge.to_csv(&#39;table_merge.csv&#39;, header=True, index=False) &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;最后，用几个不同曲线的图片来测试了我的 code，基本上都能准确的测量了曲线的弯度。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-dovoY5DRm1M/YZj8b4aSN2I/AAAAAAAACoI/ko7Vf41cJvMj688W_YIYGOQQfLhm9jkJQCLcBGAsYHQ/s1168/Screenshot%2B2021-11-20%2B214659.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;737&quot; data-original-width=&quot;1168&quot; height=&quot;253&quot; src=&quot;https://1.bp.blogspot.com/-dovoY5DRm1M/YZj8b4aSN2I/AAAAAAAACoI/ko7Vf41cJvMj688W_YIYGOQQfLhm9jkJQCLcBGAsYHQ/w400-h253/Screenshot%2B2021-11-20%2B214659.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
</description><link>http://6sigmaforum.blogspot.com/2021/11/how-to-measure-line-straightness.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-BpzmK7qhsY8/YZj0WVVz74I/AAAAAAAACnQ/QJW53VQGFQcn6ju4avqTd1s-u9Q0zLsBgCLcBGAsYHQ/s72-w200-h200-c/line_img.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-5707295267077812859</guid><pubDate>Mon, 08 Nov 2021 04:20:00 +0000</pubDate><atom:updated>2021-11-08T12:20:12.465+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Machine Learning</category><category domain="http://www.blogger.com/atom/ns#">R</category><title>XGBoost Regression Model - R</title><description>&lt;p&gt;前几天有个同事发了一些数据过来，问我是否能够用 machine learning 来处理他的数据，他是希望能够用 machine learning 的方式来自动化他经常要做的 Yield Forecast。看了看他的数据，我觉得还是有机会的。之前听了一些专家讨论了 XGBoost 这个 algro，今天我也来尝试用这组数据来弄个 model 出来。另外，我选择用 R 来做，第一个理由是很久没用了，应该要练习练习，要不，迟早会把这语言忘得一干二净。另一个理由呢，就是我还是觉得 R 比较容易上手。&lt;/p&gt;&lt;p&gt;我拿到的数据格式是这个样子的。y 是 continuous data ，x 基本上都是 categorical data。所以，x 那一部分需要做一些处理才可以使用。不用多说，肯定是 one hot encoding 了。&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-UDu1sq25YFc/YYihrrYzX-I/AAAAAAAACkk/xl7u_a8DseY0AEiCdc2018XrYijq_XGFQCLcBGAsYHQ/s1341/Screenshot%2B2021-11-08%2B120315.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;65&quot; data-original-width=&quot;1341&quot; height=&quot;32&quot; src=&quot;https://1.bp.blogspot.com/-UDu1sq25YFc/YYihrrYzX-I/AAAAAAAACkk/xl7u_a8DseY0AEiCdc2018XrYijq_XGFQCLcBGAsYHQ/w640-h32/Screenshot%2B2021-11-08%2B120315.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;在网上扒了一些参考资料回来，就跟着做，基本上没什么大问题。&lt;/p&gt;&lt;p&gt;以下就是我的 R code 。&lt;/p&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;# ref : https://www.analyticsvidhya.com/blog/2016/01/xgboost-algorithm-easy-steps/

# load required packages
library(xgboost)
library(readr)
library(stringr)
library(caret)
library(car)

# set working directory
setwd(&quot;C:/Users/mokf/Desktop/xgboost&quot;)


#load raw data
data = read_csv(&quot;data.csv&quot;)
df_all = data[, c(&#39;Yield&#39;,&#39;BNR&#39;, &#39;Package_Class&#39;,&#39;Glue&#39;, &#39;LF_Material&#39;, &#39;Basic_Type&#39;, &#39;Backend_Segment&#39;,
                  &#39;Process_Line&#39;, &#39;Technology&#39;, &#39;Moulding_Compound&#39;, &#39;Month&#39;)]

#convert input variable into categorical format
df_all$Glue = as.factor(df_all$Glue)
df_all$LF_Material = as.factor(df_all$LF_Material)
df_all$Basic_Type = as.factor(df_all$Basic_Type)
df_all$BNR = as.factor(df_all$BNR)
df_all$Package_Class = as.factor(df_all$Package_Class)
df_all$Backend_Segment = as.factor(df_all$Backend_Segment)
df_all$Technology = as.factor(df_all$Technology)
df_all$Process_Line = as.factor(df_all$Process_Line)
df_all$Moulding_Compound = as.factor(df_all$Moulding_Compound)
df_all$Month = as.factor(df_all$Month)


# one hot encoding categorical features
df_all_x = df_all
df_all_x$Yield = NULL
dummies &amp;lt;- dummyVars(~. , data = df_all_x)

df_all_ohe &amp;lt;- as.data.frame(predict(dummies, newdata = df_all_x))
df_all_ohe$Yield = data$Yield

# prepare training and testing dataset
set.seed(123)
intrain = createDataPartition(y = df_all_ohe$Yield, p = 0.9, list = FALSE)
training = df_all_ohe[intrain,]
testing = df_all_ohe[-intrain,]

x_train = training 
x_train$Yield = NULL
y_train = training$Yield

x_test = testing 
x_test$Yield = NULL

# start xgboost model training
xgb = xgboost(data = data.matrix(x_train),
              label = y_train,
              missing = NA,
              weight = NULL,
              params = list(),
              nrounds = 1000,
              verbose = 1,
              print_every_n = 1L,
              early_stopping_rounds = NULL,
              maximize = NULL,
              save_period = NULL,
              save_name = &quot;xgboost.model&quot;,
              xgb_model = NULL,
              callbacks = list(),
             
              )

# model validataion with test dataset
y_pred = predict(xgb, data.matrix(x_test))


# visualize actual vs predicted yield 
y_test = as.data.frame(testing$Yield)
y_test$pred = y_pred
y_test$id = as.integer(row.names(x_test))

library(reshape2)
df = melt(y_test, id.vars = &#39;id&#39;, variable_name = &#39;series&#39;)

ggplot(df, aes(x = id, y = value)) + 
  geom_line(aes(colour = variable))

df_all_final_rpt = df_all
df_all_final_rpt$id = row.names(df_all)
final_rpt = merge(x=y_test,y=df_all_final_rpt,by=&#39;id&#39;,all.x=TRUE)


write.csv(final_rpt, &#39;final_rpt&#39;)

#end&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;以下是用 test dataset 预测出来的结果，由于数据不是很完整，所以我只做了一个简单的测试，只是讨个感觉，没有必要花时间去优化。&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;从图表看来，感觉上还可以，准确性还蛮高的。&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-6u7hPevSOU4/YYik-Idy9UI/AAAAAAAACks/Qi99KcjqLJ8gNi9g7EqIDddVTuqBlPReACLcBGAsYHQ/s1433/Screenshot%2B2021-11-08%2B121226.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;622&quot; data-original-width=&quot;1433&quot; height=&quot;278&quot; src=&quot;https://1.bp.blogspot.com/-6u7hPevSOU4/YYik-Idy9UI/AAAAAAAACks/Qi99KcjqLJ8gNi9g7EqIDddVTuqBlPReACLcBGAsYHQ/w640-h278/Screenshot%2B2021-11-08%2B121226.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</description><link>http://6sigmaforum.blogspot.com/2021/11/xgboost-regression-model-r.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-UDu1sq25YFc/YYihrrYzX-I/AAAAAAAACkk/xl7u_a8DseY0AEiCdc2018XrYijq_XGFQCLcBGAsYHQ/s72-w640-h32-c/Screenshot%2B2021-11-08%2B120315.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-7416738809938102050</guid><pubDate>Sat, 30 Oct 2021 05:33:00 +0000</pubDate><atom:updated>2021-10-30T13:48:37.991+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>How To Train Semantic Segmentation Model With UNet</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;上个 post 提到试用了 pixellib 这个工具的一些经验，过后发现，这个工具是用 pre-trained Ade20k 的 model 来做 semantic segmentation 和&amp;nbsp; mask rcnn 来做 instant semantic segmentation 。Ade20k 是用他们自己的 data set 来做 model training 的，说实在的，我花了几个礼拜的时间，翻透了整个 google，都找不到一些能够让我这种 python 小白看得明白的文章，让我能够用自己的 dataset 来 train 一个 semantic segmentation model 出来。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;能够让我用 pixellib train 自己的 custom object image segmentation model 的，就只有那个 mask rcnn 了，严格来说，这是 instant semantic segmentation，不是 semantic segmentation。其实，根据 pixcellib 的示范，要用 mask rcnn 来 train instant semantic segmentation model 并不难。只要有图片，用 labelme 做一些&amp;nbsp; .json 的 label data 出来就可以了。而且这 model 还可以提供比 semantic segmentation 更多的功能，如 object classification, object localization。这些是一般 semantic segmentation model 无法做到的。既然如此，为啥我还需要浪费时间去研究那比较落伍的 semantic segmentation 呢？难道 mask rcnn 不香吗？&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;ok，mask rcnn 固然很好，但是唯一的问题就是这 network 比较大，不止用起来比较慢，model training 没有 GPU 的话肯定上不了，所以，如果说根据特定 AI solution 来看，如果说没那个必要，mask rcnn 不会是我的最佳选择。因此，我需要学会用自己的 dataset 来做一个 semantic segmentation model.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;从 google 里扒了不少有关&amp;nbsp; semantic segmentation 的做法回来，了解了一些基本的 concept，也大概知道是怎么做的，但是却扒不到一个适合我这 python 小白看的懂的 tutorial，而且大部分的 tutorial 都用了 oxford pet 的 dataset。而且他们的 code 都直接 link 去相关 dataset 的 depository，一条 code，所有的 data 就这样下来了，如果说我要用自己准备的 dataset，那么要怎么搞？ 哈哈。。。问题来了。。。也就这个原因，我的确花了不少的时间来解决这些问题，终于。。。。。我把问题解决，也弄了个自己的 semantic segmentation model。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;这是我付出相当大努力才完成的事情，是有必要清楚的记录下来，免得日后忘了，需要用到的时候又得从新开始。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;一下记录的是 train custom semantic segmentation 的重要过程&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;1. 准备 dataset ，这里我用的是 pixellib 用来做 custom mask rcnn instant semantic segmentation model training 的 natural&#39;s dataset，可以直接 &lt;a href=&quot;https://github.com/ayoolaolafenwa/PixelLib/releases/download/1.0.0/Nature.zip&quot;&gt;download&lt;/a&gt;&amp;nbsp;. 这 dataset 里有原图和 label 好的 json file。但没有 semantic segmentation 需要用到的 mask。没关系，labelme 里面有个&amp;nbsp;labelme_json_to_dataset 的功能能够让我把 json file 里的数据转为图片，转出来的图片包括原图，label ,label bin，还有一个 .txt file。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;用以下的 code 就能够很快的把需要用到的 mask 弄到手，由于原来的 dataset 图片数量不多，所以这里我也顺便做了一些 image augmentation 的 process。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;import os
import sys
import labelme
import cv2
import pandas
import numpy as np
import pandas as pd
from PIL import Image
&lt;/pre&gt;&lt;div&gt;# define working directory
os.chdir(&#39;C:\\Users\\mokf\\sementic_segmentation&#39;)
base_dir_path = &quot;.&quot;
json_files = os.path.join(base_dir_path, &#39;json_files&#39;)
mask_dir_path = os.path.join(base_dir_path, &#39;test_json&#39;)
mask_path = os.path.join(base_dir_path, &#39;masks_train&#39;)
img_path = os.path.join(base_dir_path, &#39;images_train&#39;)


for filename in os.listdir(json_files):

            if filename.endswith(&quot;.json&quot;):
                f = os.path.join(json_files,filename)
            
                f2 = filename.split(&#39;.&#39;)
                f2 = f2[0]

                # convert json file to image
                command = &#39;cmd /k labelme_json_to_dataset &#39; + f + &#39; -o test_json&#39;
                os.system(command)
                
                # read the converted image and rename it according to original image name
                img = cv2.imread(os.path.join(mask_dir_path, &#39;img.png&#39;),3)
                label = cv2.imread(os.path.join(mask_dir_path, &#39;label.png&#39;),3)
                label_viz = cv2.imread(os.path.join(mask_dir_path, &#39;label_viz.png&#39;),3)
                #label_names = pd.read_csv(os.path.join(mask_dir_path, &#39;label_names.txt&#39;))
            
                dim = (200,200)
                img = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)  
                label = cv2.resize(label, dim, interpolation = cv2.INTER_AREA)
                
                cv2.imwrite(os.path.join(img_path, f2 + &quot;.png&quot;), img)
                cv2.imwrite(os.path.join(mask_path, f2 + &quot;.png&quot;), label)
                
                # image augmentation 
                img_fv = cv2.flip(img, 0)
                label_fv = cv2.flip(label, 0)
                
                cv2.imwrite(os.path.join(img_path, f2 + &quot;_fv.png&quot;), img_fv)
                cv2.imwrite(os.path.join(mask_path, f2 + &quot;_fv.png&quot;), label_fv)
                
                img_fh = flipHorizontal = cv2.flip(img, 1)
                label_fh = flipHorizontal = cv2.flip(label, 1)
                
                cv2.imwrite(os.path.join(img_path, f2 + &quot;_fh.png&quot;), img_fh)
                cv2.imwrite(os.path.join(mask_path, f2 + &quot;_fh.png&quot;), label_fh)
                
                img_90 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
                label_90 = cv2.rotate(label, cv2.ROTATE_90_CLOCKWISE)
                
                cv2.imwrite(os.path.join(img_path, f2 + &quot;_90.png&quot;), img_90)
                cv2.imwrite(os.path.join(mask_path, f2 + &quot;_90.png&quot;), label_90)
&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;



&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. 把转换好的原图和 mask 存进 images_train 和 mask_train 的 folder 里, 必须注意的是， mask 和 image 的名字和格式是必须一样的。其实我上面的 code 已经符合这步骤的条件了。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. 有了 dataset，现在可以开始跑我在 &lt;a href=&quot;https://keras.io/examples/vision/oxford_pets_image_segmentation/&quot;&gt;keras&lt;/a&gt; ，弄回来的 model training script 了。这是个 train Unet 的 script。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #eeeeee; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# ref : https://keras.io/examples/vision/oxford_pets_image_segmentation/
import os

# define working directory 
base_dir = &#39;.&#39;
input_dir = os.path.join(base_dir, &quot;images_train&quot;)
target_dir = os.path.join(base_dir, &quot;masks_train&quot;)
val_img_dir = os.path.join(base_dir, &quot;images_test&quot;)
var_masks_dir = os.path.join(base_dir, &quot;masks_test&quot;)
model_lib = os.path.join(base_dir, &quot;model_lib&quot;)
img_size = (128, 128)
num_classes = 2
batch_size = 64

# put input image and mask side by side according to their file name
input_img_paths = sorted(
    [
        os.path.join(input_dir, fname)
        for fname in os.listdir(input_dir)
        if fname.endswith(&quot;.png&quot;)
    ]
)
target_img_paths = sorted(
    [
        os.path.join(target_dir, fname)
        for fname in os.listdir(target_dir)
        if fname.endswith(&quot;.png&quot;) and not fname.startswith(&quot;.&quot;)
    ]
)

print(&quot;Number of samples:&quot;, len(input_img_paths))

for input_path, target_path in zip(input_img_paths[:10], target_img_paths[:10]):
    print(input_path, &quot;|&quot;, target_path)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #eeeeee; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 667px;&quot;&gt;&lt;div style=&quot;background-color: #eeeeee; line-height: 19px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;div style=&quot;font-size: 14px; line-height: 19px;&quot;&gt;from IPython.display import Image, display
from tensorflow.keras.preprocessing.image import load_img
import PIL
from PIL import ImageOps

# Display input image #7
display(Image(filename=input_img_paths[9]))

# Display auto-contrast version of corresponding target (per-pixel categories)
img = PIL.ImageOps.autocontrast(load_img(target_img_paths[9]))
display(img)&lt;/div&gt;&lt;div style=&quot;font-size: 14px; line-height: 19px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #eeeeee; line-height: 19px;&quot;&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 667px;&quot;&gt;&lt;div style=&quot;background-color: #eeeeee; line-height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;from tensorflow import keras
import numpy as np
from tensorflow.keras.preprocessing.image import load_img


class OxfordPets(keras.utils.Sequence):
    &quot;&quot;&quot;Helper to iterate over the data (as Numpy arrays).&quot;&quot;&quot;

    def __init__(self, batch_size, img_size, input_img_paths, target_img_paths):
        self.batch_size = batch_size
        self.img_size = img_size
        self.input_img_paths = input_img_paths
        self.target_img_paths = target_img_paths

    def __len__(self):
        return len(self.target_img_paths) // self.batch_size

    def __getitem__(self, idx):
        &quot;&quot;&quot;Returns tuple (input, target) correspond to batch #idx.&quot;&quot;&quot;
        i = idx * self.batch_size
        batch_input_img_paths = self.input_img_paths[i : i + self.batch_size]
        batch_target_img_paths = self.target_img_paths[i : i + self.batch_size]
        
        # normalize x dataset by /255. Original script did not /255
        x = np.zeros((self.batch_size,) + self.img_size + (3,), dtype=&quot;float32&quot;)/255 
        for j, path in enumerate(batch_input_img_paths):
            img = load_img(path, target_size=self.img_size)
            x[j] = img
        
        # normalize x dataset by /255. Original script did not /255
        y = np.zeros((self.batch_size,) + self.img_size + (1,), dtype=&quot;uint8&quot;)/255
        for j, path in enumerate(batch_target_img_paths):
            img = load_img(path, target_size=self.img_size, color_mode=&quot;grayscale&quot;)
            y[j] = np.expand_dims(img, 2)
            # Ground truth labels are 1, 2, 3. Subtract one to make them 0, 1, 2:
            y[j] -= 1
        return x, y&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;# Unet model setup
from tensorflow.keras import layers


def get_model(img_size, num_classes):
    inputs = keras.Input(shape=img_size + (3,))

    ### [First half of the network: downsampling inputs] ###

    # Entry block
    x = layers.Conv2D(32, 3, strides=2, padding=&quot;same&quot;)(inputs)
    x = layers.BatchNormalization()(x)
    x = layers.Activation(&quot;relu&quot;)(x)

    previous_block_activation = x  # Set aside residual

    # Blocks 1, 2, 3 are identical apart from the feature depth.
    for filters in [64, 128, 256]:
        x = layers.Activation(&quot;relu&quot;)(x)
        x = layers.SeparableConv2D(filters, 3, padding=&quot;same&quot;)(x)
        x = layers.BatchNormalization()(x)

        x = layers.Activation(&quot;relu&quot;)(x)
        x = layers.SeparableConv2D(filters, 3, padding=&quot;same&quot;)(x)
        x = layers.BatchNormalization()(x)

        x = layers.MaxPooling2D(3, strides=2, padding=&quot;same&quot;)(x)

        # Project residual
        residual = layers.Conv2D(filters, 1, strides=2, padding=&quot;same&quot;)(
            previous_block_activation
        )
        x = layers.add([x, residual])  # Add back residual
        previous_block_activation = x  # Set aside next residual

    ### [Second half of the network: upsampling inputs] ###

    for filters in [256, 128, 64, 32]:
        x = layers.Activation(&quot;relu&quot;)(x)
        x = layers.Conv2DTranspose(filters, 3, padding=&quot;same&quot;)(x)
        x = layers.BatchNormalization()(x)

        x = layers.Activation(&quot;relu&quot;)(x)
        x = layers.Conv2DTranspose(filters, 3, padding=&quot;same&quot;)(x)
        x = layers.BatchNormalization()(x)

        x = layers.UpSampling2D(2)(x)

        # Project residual
        residual = layers.UpSampling2D(2)(previous_block_activation)
        residual = layers.Conv2D(filters, 1, padding=&quot;same&quot;)(residual)
        x = layers.add([x, residual])  # Add back residual
        previous_block_activation = x  # Set aside next residual

    # Add a per-pixel classification layer
    outputs = layers.Conv2D(num_classes, 3, activation=&quot;softmax&quot;, padding=&quot;same&quot;)(x)

    # Define the model
    model = keras.Model(inputs, outputs)
    return model


# Free up RAM in case the model definition cells were run multiple times
keras.backend.clear_session()

# Build model
model = get_model(img_size, num_classes)
model.summary()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #eeeeee; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;import random

# Split our img paths into a training and a validation set
# val may not work properly if sal_sample set too low
val_samples = 500
random.Random(1337).shuffle(input_img_paths)
random.Random(1337).shuffle(target_img_paths)
train_input_img_paths = input_img_paths[:-val_samples]
train_target_img_paths = target_img_paths[:-val_samples]
val_input_img_paths = input_img_paths[-val_samples:]
val_target_img_paths = target_img_paths[-val_samples:]

# Instantiate data Sequences for each split
train_gen = OxfordPets(
    batch_size, img_size, train_input_img_paths, train_target_img_paths
)

val_gen = OxfordPets(batch_size, img_size, val_input_img_paths, val_target_img_paths)&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;# this block is main for trained model update only 
# do not run this block for 1st time training
import os
from tensorflow.keras.models import load_model
model = load_model(os.path.join(model_lib, &quot;keras_unet_test.h5&quot;))&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;# Configure the model for training.
# We use the &quot;sparse&quot; version of categorical_crossentropy
# because our target data is integers.
# original loss = &quot;sparse_categorical_crossentropy&quot; from keras doesn&#39;t work, it works if set to &quot;categorical_crossentropy&quot;

import tensorflow as tf
from keras.optimizers import SGD, Adam

loss = tf.keras.losses.CategoricalCrossentropy(
    from_logits=True, label_smoothing=0.01, reduction = &quot;auto&quot;,
    name=&#39;categorical_crossentropy&#39;) 

adam = Adam(lr=1e-6, decay=1e-5)
#model.compile(loss=loss, optimizer = &#39;rmsprop&#39;, loss = loss, metrics=[&#39;categorical_crossentropy&#39;]) # solution from stackoverflow
model.compile(optimizer=adam, loss= &#39;categorical_crossentropy&#39;)

callbacks = [
    keras.callbacks.ModelCheckpoint(&quot;oxford_segmentation.h5&quot;, save_best_only=True,  save_freq = &#39;epoch&#39;)
]

# Train the model, doing validation at the end of each epoch.&lt;/div&gt;&lt;div&gt;# Use epochs 60 for first time
epochs = 10
history = model.fit(train_gen, epochs=epochs, validation_data=val_gen, callbacks= callbacks, verbose=1)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;# save the model in .h5 format&lt;/div&gt;&lt;div&gt;model.save(os.path.join(model_lib, &quot;keras_unet_test.h5&quot;))&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;# visualize training and validataion loss by epochs
import matplotlib.pyplot as plt
fig = plt.figure()
plt.plot(history.history[&#39;loss&#39;], label=&#39;loss&#39;)
plt.plot(history.history[&#39;val_loss&#39;], label = &#39;val_loss&#39;)
plt.xlabel(&#39;Epoch&#39;)
plt.ylabel(&#39;Loss&#39;)
#plt.ylim([0, 1])
plt.legend(loc=&#39;upper right&#39;)&lt;/div&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. model training 完成，现在可以开始测试了&lt;/div&gt;


&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;import os
from tensorflow.keras.models import load_model
model = load_model(os.path.join(model_lib, &quot;keras_unet_test.h5&quot;))

import cv2
import numpy as np
from tensorflow.keras.preprocessing import image


img_name = &#39;butterfly(55)_90.png&#39;

# load the image and convert image to array
img = cv2.imread(os.path.join(input_dir, img_name),3)
img = cv2.resize(img, (128, 128)) 
img1 = image.img_to_array(img)/255
img1 = np.expand_dims(img, axis=0)&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;pred_score = model.predict(img1, batch_size = 1)&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Note : 这里需要注意一下。pred_score 的 value 还需要进行进一步的处理，才能够弄出 segmentized 图片，以下有两个方法可以弄。第一个就是用 np.argmax()，这个方法不能够 set threshold value，所以搞出来的 segmentation 不是很好。另一个方法比较 manual ，但好处是可以自己 set threshold value，可以调出较好的 segmentation&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;# preprocess the predicted result
# method 1 : without threshold adjustment
mask = np.argmax(pred_score, axis = 3)
mask = ((mask==1)).astype(np.uint8)
&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;#pred_score*255
pred_bool = pred_score &amp;gt; 0.8
pred_bin = pred_bool

mask = np.argmax(pred_bin, axis = 3)
mask&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;# plot the mask and image
import matplotlib.pyplot as plt
f = plt.figure(figsize=(10,10))
f.add_subplot(1,2, 1)
plt.imshow(np.squeeze(mask[0]), cmap = &#39;gray&#39;)
f.add_subplot(1,2, 2)
plt.imshow(img, cmap = &#39;gray&#39; )
plt.show(block=True)&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;# plot image and overlay image
masked = np.ma.masked_where(mask == 1, mask)

import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
plt.subplot(1,2,1)
plt.imshow(img, &#39;gray&#39;, interpolation=&#39;none&#39;)
plt.subplot(1,2,2)
plt.imshow(img, &#39;gray&#39;, interpolation=&#39;none&#39;)
plt.imshow(masked[0], &#39;jet&#39;, interpolation=&#39;none&#39;, alpha=0.7)
plt.show()&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ok, 完事，以下是我两个星期来研究这 semantic segmentation 的结果。其实，从 mask 的 array，只要把 1 的总数加起来，就可以知道那 segment 的 pixel 数目，有了这个数据，我就可以把它转换为面积，或是用来计算物体的 dimension。 谁说 deep learning 不能做 dimension check&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-RnsKR2b6_54/YXzXGwx-j_I/AAAAAAAACkY/iyPTqmyoS3IdTqpvSzj_eBfeUUENwdtNQCLcBGAsYHQ/s845/butterfly_1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;418&quot; data-original-width=&quot;845&quot; height=&quot;198&quot; src=&quot;https://1.bp.blogspot.com/-RnsKR2b6_54/YXzXGwx-j_I/AAAAAAAACkY/iyPTqmyoS3IdTqpvSzj_eBfeUUENwdtNQCLcBGAsYHQ/w400-h198/butterfly_1.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-daakiJ7OPY4/YXzXG78WKbI/AAAAAAAACkU/lc3b7L8GCjcWgl7ukFIgGPJYCf27roClACLcBGAsYHQ/s844/butterfly_2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;410&quot; data-original-width=&quot;844&quot; height=&quot;194&quot; src=&quot;https://1.bp.blogspot.com/-daakiJ7OPY4/YXzXG78WKbI/AAAAAAAACkU/lc3b7L8GCjcWgl7ukFIgGPJYCf27roClACLcBGAsYHQ/w400-h194/butterfly_2.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://6sigmaforum.blogspot.com/2021/10/how-to-train-semantic-segmentation.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-RnsKR2b6_54/YXzXGwx-j_I/AAAAAAAACkY/iyPTqmyoS3IdTqpvSzj_eBfeUUENwdtNQCLcBGAsYHQ/s72-w400-h198-c/butterfly_1.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-4062487451900515044</guid><pubDate>Fri, 15 Oct 2021 13:03:00 +0000</pubDate><atom:updated>2021-10-15T21:03:37.529+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>Semantic Segmentation</title><description>&lt;p&gt;说起 Semantic Segmentation&amp;nbsp; 这个玩意啊，其实我早有听说，但是一直都没有吧这门技术给学上来。主要原因还是在过去一年多的时间我都在传统的 image classification 和 object detection 上打转。完了一年多的 VGG16, Resnet, EfficientNet 和 faster RCNN。如果要我解释这几个 network 的架构，基本上我是解释不出来的，但。。。我还是能够利用这些 pretrained 模型来组装出一套我想要的 image classification solution。&lt;/p&gt;&lt;p&gt;前阵子学习用 CNN 来做 time series 的时候已经告诉过自己，完成了 time series 之后，无论如何都得把&amp;nbsp; Semantic Segmentation 这门技术给学上来。因为这技术在 computer vision 和 self driving car&amp;nbsp; 扮演着重要的角色。既然我想专注在 computer vision 这一块，那么我必须把这一门技术给学好。&lt;/p&gt;&lt;p&gt;今天偷了公司一整天的时间在扒网，终于都给我找到了个好东西。一个对我来说不太难使的 Semantic Segmentation 工具。&lt;/p&gt;&lt;p&gt;&amp;nbsp;https://pixellib.readthedocs.io/en/latest/Image_instance.html&amp;nbsp;&lt;/p&gt;&lt;p&gt;至于那些 code，都可在 pixellib 的网页上找到，我这里就不再多此一举了。试玩了一下。&lt;/p&gt;&lt;p&gt;看看我今年弄出来的成品，还行&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-hbzcyouv4cs/YWl7biiwIyI/AAAAAAAACgY/X0VmKlfeheAB_Dbnqj7YtaNwVIsNrhuDgCLcBGAsYHQ/s2048/1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1536&quot; data-original-width=&quot;2048&quot; height=&quot;240&quot; src=&quot;https://1.bp.blogspot.com/-hbzcyouv4cs/YWl7biiwIyI/AAAAAAAACgY/X0VmKlfeheAB_Dbnqj7YtaNwVIsNrhuDgCLcBGAsYHQ/s320/1.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-PXovHtuhTxI/YWl7bzZW8-I/AAAAAAAACgc/Bb0wXoJMdxY-7QdoG82_fXlajLpfhKnUACLcBGAsYHQ/s2048/test.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1536&quot; data-original-width=&quot;2048&quot; height=&quot;240&quot; src=&quot;https://1.bp.blogspot.com/-PXovHtuhTxI/YWl7bzZW8-I/AAAAAAAACgc/Bb0wXoJMdxY-7QdoG82_fXlajLpfhKnUACLcBGAsYHQ/s320/test.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;好，今天算是一个开始，接下来的日子就是要好好研究这 pixellib 的工具了。&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description><link>http://6sigmaforum.blogspot.com/2021/10/semantic-segmentation.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-hbzcyouv4cs/YWl7biiwIyI/AAAAAAAACgY/X0VmKlfeheAB_Dbnqj7YtaNwVIsNrhuDgCLcBGAsYHQ/s72-c/1.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-3269343813185090880</guid><pubDate>Sat, 02 Oct 2021 03:44:00 +0000</pubDate><atom:updated>2021-10-02T11:44:46.058+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>Detect Approaching Object With Time Series Model</title><description>上一次学习了 Time Series model 之后，激发了我一个好奇心，是不是我也可以使用这个 Time Series model 的原理来开发一个车距警报系统。只要 model 侦察到前面的物体越来越大，那么 AI 就会提升司机注意前方行车距离。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;我用了之前学到的 code 做了一个小小的实验，理论上是可以的。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;一下就是我整理出来的构思，收着先，看哪天有空我才来完成整个 solution&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-_KsYEUeuo2s/YVfVXlr3QAI/AAAAAAAACgQ/A-MsrVhb6oYZTVM8Kt6Ch9fu29AKKff6gCLcBGAsYHQ/s1572/Screenshot%2B2021-09-23%2B215402.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;830&quot; data-original-width=&quot;1572&quot; height=&quot;338&quot; src=&quot;https://1.bp.blogspot.com/-_KsYEUeuo2s/YVfVXlr3QAI/AAAAAAAACgQ/A-MsrVhb6oYZTVM8Kt6Ch9fu29AKKff6gCLcBGAsYHQ/w640-h338/Screenshot%2B2021-09-23%2B215402.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://6sigmaforum.blogspot.com/2021/10/detect-approaching-object-with-time.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-_KsYEUeuo2s/YVfVXlr3QAI/AAAAAAAACgQ/A-MsrVhb6oYZTVM8Kt6Ch9fu29AKKff6gCLcBGAsYHQ/s72-w640-h338-c/Screenshot%2B2021-09-23%2B215402.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-7411830781194521897</guid><pubDate>Sun, 26 Sep 2021 02:43:00 +0000</pubDate><atom:updated>2021-10-30T11:16:10.896+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Machine Learning</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>How To Build Multivariate Multi-Step Time Series CNN Models</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;几天前把这 multivariate multi-step 1d cnn time series 的方法弄好，乘这周末的早上把资料整理好，要不，又会有一大堆借口跳出来堵住自己前进的去路。今天还是觉得有点懒，所以也不多说，就只上载我之前弄好的 code 就罢。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;# ref : https://machinelearningmastery.com/how-to-develop-convolutional-neural-network-models-for-time-series-forecasting/
&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# multivariate multi-step 1d cnn example
from numpy import array
from numpy import hstack
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.convolutional import Conv1D
from keras.layers.convolutional import MaxPooling1D
import pandas as pd&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# split a multivariate sequence into samples

def split_sequences(sequences, n_steps_in, n_steps_out):
    X, y = list(), list()
    for i in range(len(sequences)):
        # find the end of this pattern 
        end_ix = i+n_steps_in
        out_end_ix = end_ix + n_steps_out - 1
        #check if we are beyong the dataset 
        if out_end_ix &amp;gt; len(sequences):
            break 
        # gather input and output parts of the pattern
        seq_x, seq_y = sequences[i:end_ix, :-1], sequences[end_ix-1:out_end_ix, -1]
        X.append(seq_x)
        y.append(seq_y)
        
    return array(X), array(y)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 667px;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;div style=&quot;font-size: 14px; line-height: 19px;&quot;&gt;# define input sequence 
in_seq1 = array([10, 20, 30, 40, 50, 60, 70, 80, 90])
in_seq2 = array([15, 25, 35, 45, 55, 65, 75, 85, 95])
out_seq = array([in_seq1[i]+in_seq2[i] for i in range(len(in_seq1))])

# convert to [row, columns] structure
in_seq1 = in_seq1.reshape((len(in_seq1), 1))
in_seq2 = in_seq2.reshape((len(in_seq2), 1))
out_seq = out_seq.reshape((len(out_seq), 1))

# horizontally stack columns
dataset = hstack((in_seq1, in_seq2, out_seq))

# choose a number of time steps
n_steps_in, n_steps_out = 3, 3

# convert into input/output
X, y = split_sequences(dataset, n_steps_in, n_steps_out)
n_features = X.shape[2]

print(X.shape, y.shape)
# summarize the data
for i in range(len(X)):
    print(X[i], y[i])&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;设定 CNN model&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 667px;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;# define model
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=2, activation=&#39;relu&#39;, input_shape=(n_steps_in, n_features)))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(50, activation=&#39;relu&#39;))
model.add(Dense(n_steps_out))
model.compile(optimizer=&#39;adam&#39;, loss=&#39;mse&#39;)&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;# fit model
model.fit(X, y, epochs=2000, verbose=0)
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;好了，可以测试刚 train 好的 model 了&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# demonstrate prediction
x_input = array([[70, 75], [80, 85], [90, 95]])
x_input = x_input.reshape((1, n_steps_in, n_features))
yhat = model.predict(x_input, verbose=0)
print(yhat)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ok, 完事。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;这里可以总结一下，这三个星期来我学了一下三个 time series 的方法。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. How To Build A Univariate Time Series CNN Models&lt;/div&gt;&lt;div&gt;2. How To Multivariate Time Series CNN Models&lt;/div&gt;&lt;div&gt;3. Multivariate Multi-Step Time Series CNN Models&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;这三个方法对我来说还蛮实用的，接下来，就是想要如何运用这新学到的方法了。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://6sigmaforum.blogspot.com/2021/09/how-to-multivariate-multi-step-time.html</link><author>noreply@blogger.com (I Talk - You Do)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-5339309285016067450</guid><pubDate>Sun, 12 Sep 2021 13:35:00 +0000</pubDate><atom:updated>2021-10-30T11:15:58.096+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Machine Learning</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>How To Build Multivariate Time Series CNN Models</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;上个周末学会了 Univariate CNN Models，这个周末就得逼自己学会 Multivariate CNN Model 了&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;以下是从参考资料那来复制过来的码，试过了，行得通。可以留着自己用。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# ref : https://machinelearningmastery.com/how-to-develop-convolutional-neural-network-models-for-time-series-forecasting/

# multivariate data preparation 
from numpy import array
from numpy import hstack
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.convolutional import Conv1D
from keras.layers.convolutional import MaxPooling1D
import pandas as pd&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# split a multivariate sequence into samples
def split_sequences(sequences, n_steps):
    X,y = list(), list()
    for i in range(len(sequences)):
        # find the end of the pattern
        end_ix = i + n_steps
        # check if we are beyong the dataset
        if end_ix &amp;gt; len(sequences):
            break
        # gather input and output parts of the pattern 
        seq_x, seq_y = sequences[i:end_ix, :-1], sequences[end_ix - 1, -1]
        X.append(seq_x)
        y.append(seq_y)
        
    return array(X), array(y)
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 667px;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;div style=&quot;color: black; font-family: monospace; font-size: medium; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px;&quot;&gt;# if data is stored in external file in csv format&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;color: black; font-family: monospace; font-size: medium; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace; font-size: 14px;&quot;&gt;# read data file
data = pd.read_csv(&#39;data_m.csv&#39;)
data&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;color: black; font-family: monospace; font-size: medium; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;color: black; font-family: monospace; font-size: medium; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;in_seq1 = data[&#39;x1&#39;].to_numpy()
in_seq2 = data[&#39;x2&#39;].to_numpy()
out_seq = data[&#39;y&#39;].to_numpy()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;color: black; font-family: monospace; font-size: medium; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;color: black; font-family: monospace; font-size: medium; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;color: black; font-family: monospace; font-size: medium; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# convert to [row, columns] structure
in_seq1 = in_seq1.reshape((len(in_seq1),1))
in_seq2 = in_seq2.reshape((len(in_seq2),1))
out_seq = out_seq.reshape((len(out_seq),1))

# horizontally stack columns
dataset = hstack((in_seq1, in_seq2, out_seq))
dataset &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# if you don&#39;t have data stored in external file in csv format&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px;&quot;&gt;# define input sequence &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;in_seq1 = array([10, 20, 30, 40, 50, 60, 70, 80, 90])
in_seq2 = array([15, 25, 35, 45, 55, 65, 75, 85, 95])
out_seq = array([in_seq1[i]+in_seq2[i] for i in range(len(in_seq1))])

# convert to [row, columns] structure
in_seq1 = in_seq1.reshape((len(in_seq1),1))
in_seq2 = in_seq2.reshape((len(in_seq2),1))
out_seq = out_seq.reshape((len(out_seq),1))

# horizontally stack columns
dataset = hstack((in_seq1, in_seq2, out_seq))
dataset &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;设定 CNN model&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 667px;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;# define model
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=2, activation=&#39;relu&#39;, input_shape=(n_steps, n_features)))
model.add(MaxPooling1D(pool_size = 2))
model.add(Flatten())
model.add(Dense(50, activation=&#39;relu&#39;))
model.add(Dense(1))
model.compile(optimizer=&#39;adam&#39;, loss=&#39;mse&#39;)&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;# fit model
model.fit(X,y, epochs = 1000, verbose = 0)
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;好了，可以测试刚 train 好的 model 了&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# demonstrate prediction 
x_input = array([[80,85], [90,95], [100,105]])
x_input = x_input.reshape((1,n_steps, n_features))
yhat = model.predict(x_input, verbose=0)
print(yhat)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ok, 完事。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://6sigmaforum.blogspot.com/2021/09/how-to-multivariate-time-series-cnn.html</link><author>noreply@blogger.com (I Talk - You Do)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-2877514211539529439</guid><pubDate>Sun, 05 Sep 2021 14:04:00 +0000</pubDate><atom:updated>2021-09-11T11:05:51.002+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>How To Build A Univariate Time Series CNN Models</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;刚开始接触 CNN 主要是为了开发图像识别机器人，这一年来花了不少的时间研究了几个不同的 CNN，都是离不开图像识别。其实，除了图像识别，CNN 在 predictive analytic 方面还大有用途的。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;今天，我就来学习如何使用 CNN 来做 Time Series Forecasting model。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;这是我从 Google 搜回来的参考资料：&lt;a href=&quot;https://machinelearningmastery.com/how-to-develop-convolutional-neural-network-models-for-time-series-forecasting/ &quot; target=&quot;_blank&quot;&gt;How to Develop Convolutional Neural Network Models for Time Series Forecasting&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;这 tutorial 讲解了四种不同的 time series forecast 的方式&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;1. Univariate CNN Models&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;2. Multivariate CNN Models&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;3. Multi-Step CNN Models&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;4. Multivariate Multi-Step CNN Models&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;今天就学习 Univariate CNN Models 就好，其他三个就一步一步来。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;以下是从参考资料那来复制过来的码，试过了，行得通。可以留着自己用。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# ref : https://machinelearningmastery.com/how-to-develop-convolutional-neural-network-models-for-time-series-forecasting/

# univariate data preparation 
from numpy import array
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.convolutional import Conv1D
from keras.layers.convolutional import MaxPooling1D&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px;&quot;&gt;# split a univariate sequence into samples&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;def split_sequence(sequence, n_steps):
    X, y = list(), list()
    for i in range(len(sequence)):
        # find the end of this pattern 
        end_ix = i + n_steps
        # check if we are beyond the sequnce 
        if end_ix &amp;gt; len(sequence)-1:
            break
        # gather input and output parts of the pattern
        seq_x, seq_y = sequence[i:end_ix], sequence[end_ix]
        X.append(seq_x)
        y.append(seq_y)
        
    return array(X), array(y)
&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# may use this code if data is stored in an external csv file&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace; font-size: 14px;&quot;&gt;# read data file
raw_sqe = pd.read_csv(&#39;data.csv&#39;)
# convert pandas datafrom to numpy array
raw_seq = raw_sqe[&#39;data&#39;].to_numpy()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# define input sequence
raw_seq = [10,20,30,40,50,60,70,80,90]
# choose a number of time steps
n_steps = 3
# split into samples
X,y = split_sequence(raw_seq, n_steps)
# summarize the data
for i in range(len(X)):
    print(X[i], y[i])&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;接下来是设定好 CNN 的模型&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# reshape from [samples, timesteps] into [samples timesteps, features]
n_features = 1
X = X.reshape((X.shape[0], X.shape[1], n_features))

# deine model
model = Sequential()
model.add(Conv1D(filters=64, kernel_size = 2, activation=&#39;relu&#39;, input_shape = (n_steps, n_features)))
model.add(MaxPooling1D(pool_size = 2))
model.add(Flatten())
model.add(Dense(50, activation = &#39;relu&#39;))
model.add(Dense(1))

model.compile(optimizer = &#39;adam&#39;, loss = &#39;mse&#39;)&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;做 model training，如果想看 training accuracy 和 loss 的话，可以把 verbose set 去 1&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# fit model
model.fit(X,y, epochs = 1000, verbose = 0)&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;好了，可以测试刚 train 好的 model 了&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# demonstraate prediction 
x_input = array([60, 70, 80])
x_input = x_input.reshape((1, n_steps, n_features))&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace; font-size: 14px;&quot;&gt;yhat = model.predict(x_input, verbose = 1)
print(yhat)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;好了，就这样先，至少没虚度这个周末&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://6sigmaforum.blogspot.com/2021/09/how-to-build-univariate-time-series-cnn.html</link><author>noreply@blogger.com (I Talk - You Do)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-3220570912272054194</guid><pubDate>Sat, 31 Jul 2021 08:39:00 +0000</pubDate><atom:updated>2021-07-31T16:39:27.241+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>How To Build AutoEncoder For Abnormally Detection </title><description>&lt;p&gt;前阵子忙着测试 image classification model 的 solution， 忙得没日没夜，牺牲了好几个睡眠。终于，有时间停下来喘口气，然后继续出发。之前也一直提醒自己，在这竞争激励的环境，我不能只是停留在&amp;nbsp; image classification 这一块，还有很多 computer vision 的技术等着我去提升。所以，这两个星期来，花了不少的时间研究了个 abnormally detection 的方法，那就是 autoencoder。&lt;/p&gt;&lt;p&gt;其实 autoencoder 这门技术我早在一年前听伟伦提过，但由于当时专注在 image classification 这一块，所以也没有认真的去看待。今天，无论如何都要把这技术学上来。&lt;/p&gt;&lt;p&gt;Autoencoder 又是什么东东？Autoencoder 一般由三个重要的 component 组成， Encoder，Latent / Code 和 Decoder。当我们把一张图片输入进一个已经 train 好的 encoder， 图片数据经过这个 encoder 变成一个 code 的时候，当中会有一些 data loss。如果我们再把这 code decode 回去的话，那么那个&amp;nbsp; loss 就会更大，因此，我们可以利用这个 data loss 来做个预测，那输入的图片是否是个 outlier 或是 abnormality 。&lt;/p&gt;&lt;p&gt;如果输入的图片和 training data 的图片相似，那么图片进入 encoder 和 decode 出去所造成的 loss 都会比较低。只要比较一下 encoder 和 decoder 的 mse，就可以做个预测。就这样简单。&lt;/p&gt;&lt;p&gt;Auto encoder 是一个 unsupervised ai model，所以，在准备 training data set 方面和 image classification model 不一样。它只需要一个 class 的 dataset 就行了。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-nLu-3B4gjC0/YQT524_W7gI/AAAAAAAACfE/kVNgl5OJs2gdea7uDhkudUVYaJme7eS8gCLcBGAsYHQ/s1555/autoencoder.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;783&quot; data-original-width=&quot;1555&quot; height=&quot;322&quot; src=&quot;https://1.bp.blogspot.com/-nLu-3B4gjC0/YQT524_W7gI/AAAAAAAACfE/kVNgl5OJs2gdea7uDhkudUVYaJme7eS8gCLcBGAsYHQ/w640-h322/autoencoder.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;花了连个多星期在网上扒资料，说真的，我实在是找不到一个完整的 tutorial，大部分的 tutorial 都是用网上现成的 mnist 的 training data set 来做，但是如果想要用自己的 data set 来 train 的话，其实还得下点功夫才行。我也是读了好几个人的 tutorial，把他们的示范贴贴剪剪的，才完成了一个我自己想要的 auto encoder 。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;好了，一下就是我自己凑成的 auto encoder ，这里，我用的是自己的 training dataset。我的 training dataset 差不多是这一个样子的。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-3sUT5NE9Mco/YQUBpAz5M2I/AAAAAAAACfs/hpYaJFtssBkekSh0Gr5TjzSTELdk_M8YwCLcBGAsYHQ/s571/Screenshot%2B2021-07-31%2B155343.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;216&quot; data-original-width=&quot;571&quot; src=&quot;https://1.bp.blogspot.com/-3sUT5NE9Mco/YQUBpAz5M2I/AAAAAAAACfs/hpYaJFtssBkekSh0Gr5TjzSTELdk_M8YwCLcBGAsYHQ/s16000/Screenshot%2B2021-07-31%2B155343.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;过后我们可以尝试用这张图片来测试那个 auto encoder ，看看结果会是什么。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-prYoCRc2hsU/YQUCQc1XYrI/AAAAAAAACf0/Y9mbZGIZKlMSKSRPgqmTk9esa3N8dtbnACLcBGAsYHQ/s50/h_113_other.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;50&quot; data-original-width=&quot;50&quot; height=&quot;50&quot; src=&quot;https://1.bp.blogspot.com/-prYoCRc2hsU/YQUCQc1XYrI/AAAAAAAACf0/Y9mbZGIZKlMSKSRPgqmTk9esa3N8dtbnACLcBGAsYHQ/s0/h_113_other.png&quot; width=&quot;50&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;好，就来看看我的 code 吧。


&amp;nbsp;&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# https://www.pyimagesearch.com/2020/03/02/anomaly-detection-with-keras-tensorflow-and-deep-learning/
# https://python.tutorialink.com/match-dtypes-of-one-df-to-another-with-different-number-of-columns/

# import the necessary packages
from tensorflow.keras.layers import BatchNormalization
from tensorflow.keras.layers import Conv2D
from tensorflow.keras.layers import Conv2DTranspose
from tensorflow.keras.layers import LeakyReLU
from tensorflow.keras.layers import Activation
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Reshape
from tensorflow.keras.layers import Input
from tensorflow.keras.models import Model
from tensorflow.keras import backend as K

import tensorflow.keras
from tensorflow.keras.optimizers import Adam

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import argparse
import random
import pickle
import cv2&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# Set working directory

import os
base_dir_path = &quot;pkg_object\\&quot;
train_dir_path = os.path.join(base_dir_path,&#39;training&#39;)
test_dir_path = os.path.join(base_dir_path,&#39;testing&#39;)
unlabel_image_dir = os.path.join(base_dir_path,&#39;unlabel_image&#39;)
result_dir = os.path.join(base_dir_path,&#39;result&#39;)
template_dir = os.path.join(base_dir_path,&#39;template_1&#39;)
image_dir = os.path.join(base_dir_path,&#39;images&#39;)
model_lib_dir = os.path.join(base_dir_path,&#39;model_library&#39;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;



&amp;nbsp;&lt;div&gt;一下这段是从&lt;a href=&quot;https://www.pyimagesearch.com/2020/03/02/anomaly-detection-with-keras-tensorflow-and-deep-learning/&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;抄回来的&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# build the autoencoder
# 3 key parameter need to take note : filters and latenDim
# width: Width of the input images.
# height: Height of the input images.
# depth: Number of channels in the images.
# filters: Number of filters the encoder and decoder will learn, respectively
# latentDim: Dimensionality of the latent-space representation.

class ConvAutoencoder:
    @staticmethod
    def build(width, height, depth, filters=(32, 64), latentDim=16):
        # initialize the input shape to be &quot;channels last&quot; along with
        # the channels dimension itself
        # channels dimension itself
        inputShape = (height, width, depth)
        chanDim = -1
        
        # define the input to the encoder
        inputs = Input(shape=inputShape)
        x = inputs
        
        # loop over the number of filters
        for f in filters:
            # apply a CONV =&amp;gt; RELU =&amp;gt; BN operation
            x = Conv2D(f, (3, 3), strides=2, padding=&quot;same&quot;)(x)
            x = LeakyReLU(alpha=0.2)(x)
            x = BatchNormalization(axis=chanDim)(x)
            
        # flatten the network and then construct our latent vector
        volumeSize = K.int_shape(x)
        x = Flatten()(x)
        latent = Dense(latentDim)(x)
        
        # build the encoder model
        encoder = Model(inputs, latent, name=&quot;encoder&quot;)
        
        # start building the decoder model which will accept the
        # output of the encoder as its inputs
        latentInputs = Input(shape=(latentDim,))
        x = Dense(np.prod(volumeSize[1:]))(latentInputs)
        x = Reshape((volumeSize[1], volumeSize[2], volumeSize[3]))(x)
        
        # loop over our number of filters again, but this time in
        # reverse order
        for f in filters[::-1]:
            # apply a CONV_TRANSPOSE =&amp;gt; RELU =&amp;gt; BN operation
            x = Conv2DTranspose(f, (3, 3), strides=2,padding=&quot;same&quot;)(x)
            x = LeakyReLU(alpha=0.2)(x)
            x = BatchNormalization(axis=chanDim)(x)
            
        
        # apply a single CONV_TRANSPOSE layer used to recover the
        # original depth of the image
        x = Conv2DTranspose(depth, (3, 3), padding=&quot;same&quot;)(x)
        outputs = Activation(&quot;sigmoid&quot;)(x)
        
        # build the decoder model
        decoder = Model(latentInputs, outputs, name=&quot;decoder&quot;)
        
        # our autoencoder is the encoder + decoder
        autoencoder = Model(inputs, decoder(encoder(inputs)),name=&quot;autoencoder&quot;)
        
        # return a 3-tuple of the encoder, decoder, and autoencoder
        return (encoder, decoder, autoencoder)&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;




&amp;nbsp;&lt;/div&gt;&lt;div&gt;一下这段是参考 stack overflow 里面的解答，再从新修改的&lt;br /&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;SHAPE = (52,52)
EPOCHS = 30
INIT_LR = 1e-4
BS = 32

(encoder, decoder, autoencoder) = ConvAutoencoder.build(52,52,1)
opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)
autoencoder.compile(loss=&quot;mse&quot;, optimizer=opt)


from keras.preprocessing.image import ImageDataGenerator
image_generator = ImageDataGenerator(rescale=1.0/255.0) # normalize the data by deviding with 255
train_gen = image_generator.flow_from_directory(
    os.path.join(base_dir_path, &quot;train_ad&quot;), 
    class_mode=&#39;input&#39;, target_size=SHAPE, batch_size=BS,
    color_mode=&quot;grayscale&quot;,
)
val_gen = image_generator.flow_from_directory(
    os.path.join(base_dir_path, &quot;test_ad&quot;), 
    class_mode=&#39;input&#39;, target_size=SHAPE, batch_size=BS,
    color_mode=&quot;grayscale&quot;,
)&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# check autoencoder model summary
autoencoder.summary()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span color=&quot;rgba(0, 0, 0, 0.87)&quot; style=&quot;background-color: white; font-family: Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-size: 13px; white-space: pre-wrap;&quot;&gt;Model: &quot;autoencoder&quot;
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         [(None, 52, 52, 1)]       0         
_________________________________________________________________
encoder (Model)              (None, 16)                192272    
_________________________________________________________________
decoder (Model)              (None, 52, 52, 1)         239937    
=================================================================
Total params: 432,209
Trainable params: 431,825
Non-trainable params: 384
_________________________________________________________________&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# start autoencoder training

history = autoencoder.fit(train_gen, validation_data=val_gen,epochs=EPOCHS,batch_size=BS)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# plot the training &amp;amp; validation loss by epoch
fig = plt.figure()
plt.plot(history.history[&#39;loss&#39;], label=&#39;loss&#39;)
plt.plot(history.history[&#39;val_loss&#39;], label = &#39;val_loss&#39;)
plt.xlabel(&#39;Epoch&#39;)
plt.ylabel(&#39;Loss&#39;)
#plt.ylim([0, 1])
plt.legend(loc=&#39;lower right&#39;)

#plt.savefig(&#39;1st_bond_model_train_result.png&#39;)
#plt.close(fig)&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget lm-Panel p-Panel jp-Cell-outputWrapper&quot; style=&quot;background-color: white; box-sizing: border-box; cursor: default; display: flex; flex-direction: row; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; margin: 5px 0px 0px; overflow: visible; padding: 0px; position: relative; white-space: normal;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget jp-OutputArea jp-Cell-outputArea&quot; style=&quot;box-sizing: border-box; cursor: default; flex: 1 1 auto; overflow: hidden auto; position: relative;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget lm-Panel p-Panel jp-OutputArea-child jp-OutputArea-executeResult&quot; style=&quot;box-sizing: border-box; cursor: default; display: flex; flex-direction: row; overflow: hidden; position: relative;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget jp-OutputPrompt jp-OutputArea-prompt&quot; style=&quot;border: var(--jp-border-width) solid transparent; box-sizing: border-box; color: var(--jp-cell-outprompt-font-color); cursor: default; flex: 0 0 var(--jp-cell-prompt-width); font-family: var(--jp-cell-prompt-font-family); font-size: var(--jp-code-font-size); letter-spacing: var(--jp-cell-prompt-letter-spacing); line-height: var(--jp-code-line-height); opacity: var(--jp-cell-prompt-opacity); overflow: hidden; padding: var(--jp-code-padding); position: relative; text-align: right; text-overflow: ellipsis; user-select: none; white-space: nowrap;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget lm-Panel p-Panel jp-OutputArea-child jp-OutputArea-executeResult&quot; style=&quot;box-sizing: border-box; cursor: default; display: flex; flex-direction: row; overflow: hidden; position: relative; text-align: start; white-space: normal;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget jp-RenderedText jp-mod-trusted jp-OutputArea-output&quot; data-mime-type=&quot;text/plain&quot; style=&quot;border-top: var(--jp-border-width) solid transparent; box-sizing: border-box; cursor: default; flex-grow: 1; flex-shrink: 1; font-family: var(--jp-code-font-family); height: auto; line-height: var(--jp-code-line-height); overflow: auto; padding-left: var(--jp-code-padding); padding-top: var(--jp-code-padding); position: relative; user-select: text;&quot;&gt;&lt;pre style=&quot;border: none; box-sizing: unset; color: var(--jp-content-font-color1); font-family: var(--jp-code-font-family); font-size: var(--jp-code-font-size); line-height: var(--jp-code-line-height); margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; overflow: auto; padding: 0px; white-space: pre-wrap; word-break: break-all;&quot;&gt;&amp;lt;matplotlib.legend.Legend at 0x2bf62bdb780&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;lm-Widget p-Widget lm-Panel p-Panel jp-OutputArea-child&quot; style=&quot;box-sizing: border-box; cursor: default; display: flex; flex-direction: row; overflow: hidden; position: relative; text-align: start; white-space: normal;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget jp-OutputPrompt jp-OutputArea-prompt&quot; style=&quot;border: var(--jp-border-width) solid transparent; box-sizing: border-box; color: var(--jp-cell-outprompt-font-color); cursor: default; flex: 0 0 var(--jp-cell-prompt-width); font-family: var(--jp-cell-prompt-font-family); font-size: var(--jp-code-font-size); letter-spacing: var(--jp-cell-prompt-letter-spacing); line-height: var(--jp-code-line-height); opacity: var(--jp-cell-prompt-opacity); overflow: hidden; padding: var(--jp-code-padding); position: relative; text-align: right; text-overflow: ellipsis; user-select: none; white-space: nowrap;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;lm-Widget p-Widget jp-RenderedImage jp-mod-trusted jp-OutputArea-output&quot; data-mime-type=&quot;image/png&quot; style=&quot;box-sizing: border-box; cursor: default; flex-grow: 1; flex-shrink: 1; height: auto; overflow: auto; position: relative; user-select: text;&quot;&gt;&lt;img class=&quot;jp-needs-light-background&quot; src=&quot;data:image/png;base64,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&quot; style=&quot;box-sizing: unset; height: auto; max-width: 100%;&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;lm-Widget p-Widget lm-Panel p-Panel jp-OutputArea-child&quot; style=&quot;box-sizing: border-box; cursor: default; display: flex; flex-direction: row; overflow: hidden; position: relative;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget jp-OutputPrompt jp-OutputArea-prompt&quot; style=&quot;border: var(--jp-border-width) solid transparent; box-sizing: border-box; color: var(--jp-cell-outprompt-font-color); cursor: default; flex: 0 0 var(--jp-cell-prompt-width); font-family: var(--jp-cell-prompt-font-family); font-size: var(--jp-code-font-size); letter-spacing: var(--jp-cell-prompt-letter-spacing); line-height: var(--jp-code-line-height); opacity: var(--jp-cell-prompt-opacity); overflow: hidden; padding: var(--jp-code-padding); position: relative; text-align: right; text-overflow: ellipsis; user-select: none; white-space: nowrap;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;lm-Widget p-Widget jp-RenderedImage jp-mod-trusted jp-OutputArea-output&quot; data-mime-type=&quot;image/png&quot; style=&quot;box-sizing: border-box; cursor: default; flex-grow: 1; flex-shrink: 1; height: auto; overflow: auto; position: relative; user-select: text;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# save the autoencoder model
autoencoder.save(&quot;autoencoder.h5&quot;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;


&amp;nbsp;&lt;div&gt;好了，model 已经 train 好，接下来是测试的时候了。我们得先把 model 给 load 出来&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# load autoencoder model for application 

from numpy import loadtxt
from keras.models import load_model
autoencoder = load_model(&#39;autoencoder.h5&#39;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;


&amp;nbsp;&lt;/div&gt;&lt;div&gt;我先输入这张图，这张图和 training data set 得图相似，我先看看结果&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-XNxoVty10Mg/YQUIazJPTFI/AAAAAAAACf8/b5ECYxeK3Eov95BhgG_lFAhSP_z1xSAhQCLcBGAsYHQ/s50/1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;50&quot; data-original-width=&quot;50&quot; height=&quot;50&quot; src=&quot;https://1.bp.blogspot.com/-XNxoVty10Mg/YQUIazJPTFI/AAAAAAAACf8/b5ECYxeK3Eov95BhgG_lFAhSP_z1xSAhQCLcBGAsYHQ/s0/1.png&quot; width=&quot;50&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# load an image to test the auto encoder 
import cv2
import os
images = cv2.imread(os.path.join(base_dir_path, &#39;1.png&#39;),0)
img = cv2.resize(images, (52, 52))
#img = images.img_to_array(img)
img = np.expand_dims(img, axis=0)/255

# show the test sample
plt.imshow(images, cmap=&#39;gray&#39;)&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget lm-Panel p-Panel jp-OutputArea-child jp-OutputArea-executeResult&quot; style=&quot;background-color: white; box-sizing: border-box; cursor: default; display: flex; flex-direction: row; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; overflow: hidden; position: relative; white-space: normal;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget jp-RenderedText jp-mod-trusted jp-OutputArea-output&quot; data-mime-type=&quot;text/plain&quot; style=&quot;border-top: var(--jp-border-width) solid transparent; box-sizing: border-box; cursor: default; flex-grow: 1; flex-shrink: 1; font-family: var(--jp-code-font-family); height: auto; line-height: var(--jp-code-line-height); overflow: auto; padding-left: var(--jp-code-padding); padding-top: var(--jp-code-padding); position: relative; user-select: text;&quot;&gt;&lt;pre style=&quot;border: none; box-sizing: unset; color: var(--jp-content-font-color1); font-family: var(--jp-code-font-family); font-size: var(--jp-code-font-size); line-height: var(--jp-code-line-height); margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; overflow: auto; padding: 0px; white-space: pre-wrap; word-break: break-all;&quot;&gt;&amp;lt;matplotlib.image.AxesImage at 0x2bf65910c18&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;lm-Widget p-Widget lm-Panel p-Panel jp-OutputArea-child&quot; style=&quot;background-color: white; box-sizing: border-box; cursor: default; display: flex; flex-direction: row; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; overflow: hidden; position: relative; white-space: normal;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget jp-OutputPrompt jp-OutputArea-prompt&quot; style=&quot;border: var(--jp-border-width) solid transparent; box-sizing: border-box; color: var(--jp-cell-outprompt-font-color); cursor: default; flex: 0 0 var(--jp-cell-prompt-width); font-family: var(--jp-cell-prompt-font-family); font-size: var(--jp-code-font-size); letter-spacing: var(--jp-cell-prompt-letter-spacing); line-height: var(--jp-code-line-height); opacity: var(--jp-cell-prompt-opacity); overflow: hidden; padding: var(--jp-code-padding); position: relative; text-align: right; text-overflow: ellipsis; user-select: none; white-space: nowrap;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;lm-Widget p-Widget jp-RenderedImage jp-mod-trusted jp-OutputArea-output&quot; data-mime-type=&quot;image/png&quot; style=&quot;box-sizing: border-box; cursor: default; flex-grow: 1; flex-shrink: 1; height: auto; overflow: auto; position: relative; user-select: text;&quot;&gt;&lt;img class=&quot;jp-needs-light-background&quot; src=&quot;data:image/png;base64,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&quot; style=&quot;box-sizing: unset; height: auto; max-width: 100%;&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# make predictions on our image data and initialize our list of
# reconstruction errors
decoded = autoencoder.predict(img)
mse = np.mean((img - decoded) ** 2)
mse&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;pre style=&quot;background-color: white; border: none; box-sizing: unset; color: var(--jp-content-font-color1); font-family: var(--jp-code-font-family); font-size: var(--jp-code-font-size); line-height: var(--jp-code-line-height); margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; overflow: auto; padding: 0px; white-space: pre-wrap; word-break: break-all;&quot;&gt;0.01824960274209594&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;以上得答案显示， encode - decode = 0.018&amp;nbsp;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;decode 出来的 图片是这样的，失真了不少。&lt;br /&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# show the decoded image
plt.imshow(decoded[0], cmap=&#39;gray&#39;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget lm-Panel p-Panel jp-OutputArea-child jp-OutputArea-executeResult&quot; style=&quot;background-color: white; box-sizing: border-box; cursor: default; display: flex; flex-direction: row; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; overflow: hidden; position: relative; white-space: normal;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget jp-RenderedText jp-mod-trusted jp-OutputArea-output&quot; data-mime-type=&quot;text/plain&quot; style=&quot;border-top: var(--jp-border-width) solid transparent; box-sizing: border-box; cursor: default; flex-grow: 1; flex-shrink: 1; font-family: var(--jp-code-font-family); height: auto; line-height: var(--jp-code-line-height); overflow: auto; padding-left: var(--jp-code-padding); padding-top: var(--jp-code-padding); position: relative; user-select: text;&quot;&gt;&lt;pre style=&quot;border: none; box-sizing: unset; color: var(--jp-content-font-color1); font-family: var(--jp-code-font-family); font-size: var(--jp-code-font-size); line-height: var(--jp-code-line-height); margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; overflow: auto; padding: 0px; white-space: pre-wrap; word-break: break-all;&quot;&gt;&amp;lt;matplotlib.image.AxesImage at 0x2bf659717b8&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;lm-Widget p-Widget lm-Panel p-Panel jp-OutputArea-child&quot; style=&quot;background-color: white; box-sizing: border-box; cursor: default; display: flex; flex-direction: row; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; overflow: hidden; position: relative; white-space: normal;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget jp-OutputPrompt jp-OutputArea-prompt&quot; style=&quot;border: var(--jp-border-width) solid transparent; box-sizing: border-box; color: var(--jp-cell-outprompt-font-color); cursor: default; flex: 0 0 var(--jp-cell-prompt-width); font-family: var(--jp-cell-prompt-font-family); font-size: var(--jp-code-font-size); letter-spacing: var(--jp-cell-prompt-letter-spacing); line-height: var(--jp-code-line-height); opacity: var(--jp-cell-prompt-opacity); overflow: hidden; padding: var(--jp-code-padding); position: relative; text-align: right; text-overflow: ellipsis; user-select: none; white-space: nowrap;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;lm-Widget p-Widget jp-RenderedImage jp-mod-trusted jp-OutputArea-output&quot; data-mime-type=&quot;image/png&quot; style=&quot;box-sizing: border-box; cursor: default; flex-grow: 1; flex-shrink: 1; height: auto; overflow: auto; position: relative; user-select: text;&quot;&gt;&lt;img class=&quot;jp-needs-light-background&quot; src=&quot;data:image/png;base64,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&quot; style=&quot;box-sizing: unset; height: auto; max-width: 100%;&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;


&amp;nbsp;&lt;/div&gt;&lt;div&gt;好，现在我换上之前说好的测试图片，看看结果怎么样&lt;br /&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# load an image to test the auto encoder 
import cv2
import os
images = cv2.imread(os.path.join(base_dir_path, &#39;h_113_other.png&#39;),0)
img = cv2.resize(images, (52, 52))
#img = images.img_to_array(img)
img = np.expand_dims(img, axis=0)/255

# show the test sample
plt.imshow(images, cmap=&#39;gray&#39;)&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget lm-Panel p-Panel jp-OutputArea-child jp-OutputArea-executeResult&quot; style=&quot;background-color: white; box-sizing: border-box; cursor: default; display: flex; flex-direction: row; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; overflow: hidden; position: relative; white-space: normal;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget jp-RenderedText jp-mod-trusted jp-OutputArea-output&quot; data-mime-type=&quot;text/plain&quot; style=&quot;border-top: var(--jp-border-width) solid transparent; box-sizing: border-box; cursor: default; flex-grow: 1; flex-shrink: 1; font-family: var(--jp-code-font-family); height: auto; line-height: var(--jp-code-line-height); overflow: auto; padding-left: var(--jp-code-padding); padding-top: var(--jp-code-padding); position: relative; user-select: text;&quot;&gt;&lt;pre style=&quot;border: none; box-sizing: unset; color: var(--jp-content-font-color1); font-family: var(--jp-code-font-family); font-size: var(--jp-code-font-size); line-height: var(--jp-code-line-height); margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; overflow: auto; padding: 0px; white-space: pre-wrap; word-break: break-all;&quot;&gt;&amp;lt;matplotlib.image.AxesImage at 0x2bf659be208&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;lm-Widget p-Widget lm-Panel p-Panel jp-OutputArea-child&quot; style=&quot;background-color: white; box-sizing: border-box; cursor: default; display: flex; flex-direction: row; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; overflow: hidden; position: relative; white-space: normal;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget jp-OutputPrompt jp-OutputArea-prompt&quot; style=&quot;border: var(--jp-border-width) solid transparent; box-sizing: border-box; color: var(--jp-cell-outprompt-font-color); cursor: default; flex: 0 0 var(--jp-cell-prompt-width); font-family: var(--jp-cell-prompt-font-family); font-size: var(--jp-code-font-size); letter-spacing: var(--jp-cell-prompt-letter-spacing); line-height: var(--jp-code-line-height); opacity: var(--jp-cell-prompt-opacity); overflow: hidden; padding: var(--jp-code-padding); position: relative; text-align: right; text-overflow: ellipsis; user-select: none; white-space: nowrap;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;lm-Widget p-Widget jp-RenderedImage jp-mod-trusted jp-OutputArea-output&quot; data-mime-type=&quot;image/png&quot; style=&quot;box-sizing: border-box; cursor: default; flex-grow: 1; flex-shrink: 1; height: auto; overflow: auto; position: relative; user-select: text;&quot;&gt;&lt;img class=&quot;jp-needs-light-background&quot; src=&quot;data:image/png;base64,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&quot; style=&quot;box-sizing: unset; height: auto; max-width: 100%;&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# make predictions on our image data and initialize our list of
# reconstruction errors
decoded = autoencoder.predict(img)
mse = np.mean((img - decoded) ** 2)
mse&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;pre style=&quot;background-color: white; border: none; box-sizing: unset; color: var(--jp-content-font-color1); font-family: var(--jp-code-font-family); font-size: var(--jp-code-font-size); line-height: var(--jp-code-line-height); margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; overflow: auto; padding: 0px; white-space: pre-wrap; word-break: break-all;&quot;&gt;0.09731018653693392&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&amp;nbsp;这一次，encode - decode = 0.097，这个 MSE 比之前的大很多，所以我们可以凭这个 MSE 来预测这是个 abnormality 或是 outlier&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;这是 decode 出来的结果&lt;br /&gt;

&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# show the decoded image
plt.imshow(decoded[0], cmap=&#39;gray&#39;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget lm-Panel p-Panel jp-OutputArea-child jp-OutputArea-executeResult&quot; style=&quot;background-color: white; box-sizing: border-box; cursor: default; display: flex; flex-direction: row; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; overflow: hidden; position: relative; white-space: normal;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget jp-RenderedText jp-mod-trusted jp-OutputArea-output&quot; data-mime-type=&quot;text/plain&quot; style=&quot;border-top: var(--jp-border-width) solid transparent; box-sizing: border-box; cursor: default; flex-grow: 1; flex-shrink: 1; font-family: var(--jp-code-font-family); height: auto; line-height: var(--jp-code-line-height); overflow: auto; padding-left: var(--jp-code-padding); padding-top: var(--jp-code-padding); position: relative; user-select: text;&quot;&gt;&lt;pre style=&quot;border: none; box-sizing: unset; color: var(--jp-content-font-color1); font-family: var(--jp-code-font-family); font-size: var(--jp-code-font-size); line-height: var(--jp-code-line-height); margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; overflow: auto; padding: 0px; white-space: pre-wrap; word-break: break-all;&quot;&gt;&amp;lt;matplotlib.image.AxesImage at 0x2bf65a30400&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;lm-Widget p-Widget lm-Panel p-Panel jp-OutputArea-child&quot; style=&quot;background-color: white; box-sizing: border-box; cursor: default; display: flex; flex-direction: row; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 14px; overflow: hidden; position: relative; white-space: normal;&quot;&gt;&lt;div class=&quot;lm-Widget p-Widget jp-OutputPrompt jp-OutputArea-prompt&quot; style=&quot;border: var(--jp-border-width) solid transparent; box-sizing: border-box; color: var(--jp-cell-outprompt-font-color); cursor: default; flex: 0 0 var(--jp-cell-prompt-width); font-family: var(--jp-cell-prompt-font-family); font-size: var(--jp-code-font-size); letter-spacing: var(--jp-cell-prompt-letter-spacing); line-height: var(--jp-code-line-height); opacity: var(--jp-cell-prompt-opacity); overflow: hidden; padding: var(--jp-code-padding); position: relative; text-align: right; text-overflow: ellipsis; user-select: none; white-space: nowrap;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;lm-Widget p-Widget jp-RenderedImage jp-mod-trusted jp-OutputArea-output&quot; data-mime-type=&quot;image/png&quot; style=&quot;box-sizing: border-box; cursor: default; flex-grow: 1; flex-shrink: 1; height: auto; overflow: auto; position: relative; user-select: text;&quot;&gt;&lt;img class=&quot;jp-needs-light-background&quot; src=&quot;data:image/png;base64,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&quot; style=&quot;box-sizing: unset; height: auto; max-width: 100%;&quot; /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;lm-Widget p-Widget jp-RenderedImage jp-mod-trusted jp-OutputArea-output&quot; data-mime-type=&quot;image/png&quot; style=&quot;box-sizing: border-box; cursor: default; flex-grow: 1; flex-shrink: 1; height: auto; overflow: auto; position: relative; user-select: text;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;ok, 今天为自己上了一课，又长知识了。</description><link>http://6sigmaforum.blogspot.com/2021/07/how-to-use-autoencoder-for-abnormally.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-nLu-3B4gjC0/YQT524_W7gI/AAAAAAAACfE/kVNgl5OJs2gdea7uDhkudUVYaJme7eS8gCLcBGAsYHQ/s72-w640-h322-c/autoencoder.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-3259269973946351692</guid><pubDate>Sun, 18 Jul 2021 04:40:00 +0000</pubDate><atom:updated>2021-07-18T12:40:43.848+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">General</category><title>Sunday</title><description>已经三个月没有在这里趴格子了。今天，总算有时间上来 update 一下差点被我遗弃的 部落格。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;这三个月来，花了大部分时间在测试第一个自己开发 visual inspection AI system。三个月的不眠不休，经过无数次的测试和优化，终于对自己的成品有了一定的信心，放心的停下来喘口气，好好的休息休息再出发。&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;这个 AI 系统，我足足花了两年多的时间把它给搞出来，是我人生中第一个自己搞出来的 AI 系统。两年的时间对那些专业数据科学家来说或许太长了，但对我这个初学者来说，可是花了很大的努力才得到的成果。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;记得两年前的一窍不通，就这样开始了 computer vision 的这个艰难路程。就这样开始在 Google 上搜索阅相关资料。&lt;a href=&quot;https://shirinsplayground.netlify.app/2018/06/keras_fruits/&quot; target=&quot;_blank&quot;&gt;It&#39;s that easy! Image classification with keras in roughly 100 lines of code. （Shirin&#39;s playgRound)&lt;/a&gt; 是我在学习 computer vision 技术的第一课，也是最重要的一课。上面提过的 AI 系统其实就是根据她的示范演变而成。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;这两年来的亲历亲为，让我掌握了 image classification， object detection 和 image pre processing 的窍门，总结起来，这两年来也收获不少。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;当然，AI 是个万变的领域，我无法停留在现阶段。接下来的日子应该会有较多的空挡，也是时候弥补自己在这方面的不足。比如说&amp;nbsp;Semantic Image Segmentation，Yolo 还有一些更加深奥的数据运算技术。这些都需要大大的提升。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;加油吧。。。&lt;/div&gt;</description><link>http://6sigmaforum.blogspot.com/2021/07/sunday.html</link><author>noreply@blogger.com (I Talk - You Do)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-5030265564651042290</guid><pubDate>Sat, 24 Apr 2021 13:40:00 +0000</pubDate><atom:updated>2021-07-18T12:48:33.745+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">General</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>How to intall LabelImg in Anaconda Virtual Environment</title><description>&lt;p&gt;&amp;nbsp;两个礼拜前工作用的电脑因为一个 windows update, file explore 出现了一些小问题。昨天屁股痒打电话去 IT 部门求解，结果被 IT 技师那么一弄，弄出了一个更大的问题。Webex 进不了，没有了 Webex，就是说公司上上下下的同事都联络不上，会议也开不了。&lt;/p&gt;&lt;p&gt;技师说，没办法了，需要 format hard disk，这才是灾难啊。。。。&lt;/p&gt;&lt;p&gt;真不敢想象，下个星期拿回电脑后，需要从新安装那些 AI model training 必备 package，之前写的那些 model training script 能不能够顺利的在新电脑上跑，还是个未知数。&lt;/p&gt;&lt;p&gt;既然从新开始是免不了了，另一方面，之前在不熟悉 Python 和 Anaconda 的情况下，胡乱了安装了不少的 package，这一次的从新安装，给了我一个机会整理整理我的 conda environment。&lt;/p&gt;&lt;p&gt;因此，今天下午闲来无事，就拿起家里一台新电脑，尝试安装了 Anaconda 和 labelimg。试看是否能够顺利安装。记得之前安装 labelimg 的时候并不是那么顺利的。其实今天安装 labelimg 的时候也不是那么的顺利，幸好最终还是成功完成。&lt;/p&gt;&lt;p&gt;看来，我需要把这些安装过程记录好来，好让我日后有个参考。&lt;/p&gt;&lt;p&gt;拿到新电脑第一件事就是要安装 Anaconda。这个安装不难，上 Anaconda 的网站 download 就行了，基本上不会面对什么大问题。&lt;/p&gt;&lt;p&gt;接下来就是安装 labelimg 了。记得第一安装这个应用软件的时候碰了好多的钉子，所以我觉得应该要把安装过程给记录下来，以备往后需要用到。&lt;/p&gt;&lt;p&gt;以下是我安装 label image 的过程 （这个方法成功在其他同事电脑上安装了 labelimg)&lt;/p&gt;&lt;p&gt;1. 打开 Anaconda。去 Environment &amp;gt;&amp;gt; Create 开一个新的 virtual environment 叫 labelimg&lt;/p&gt;&lt;p&gt;2. 按 labelimg 右边的箭头，选 open terminal。一个新的 virual environment 就会跳出来。&lt;/p&gt;&lt;p&gt;3. 按次序安装一下的 package，在这新电脑里能够顺利的完成&lt;/p&gt;&lt;pre style=&quot;background-color: #f9f9f9; border: 1px solid rgb(211, 211, 211); box-sizing: inherit; color: #6c6c6c; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace; font-size: 0.85rem; margin-bottom: 0px; margin-top: 30px; overflow: auto; padding: 15px;&quot;&gt;pip3 install labelimg

labelimg&lt;/pre&gt;&lt;p&gt;好，希望下星期安装这 package 在新电脑也能够顺利。&lt;/p&gt;</description><link>http://6sigmaforum.blogspot.com/2021/04/how-to-intall-labelimg-in-anaconda.html</link><author>noreply@blogger.com (I Talk - You Do)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-4422469880319566718</guid><pubDate>Sat, 17 Apr 2021 10:49:00 +0000</pubDate><atom:updated>2021-04-17T18:49:05.456+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>How To  Build An Custom Object Detection Model With Open CV &amp; EfficientNet</title><description>&lt;p&gt;之前分享过如何用 Detecto 这个 package 来弄 &lt;a href=&quot;http://6sigmaforum.blogspot.com/2021/03/how-to-train-object-detection-model.html&quot;&gt;custom object detection model&lt;/a&gt;。原来这 Detecto 后面使用的是 Faster RCNN 的架构，可以说是个相当大的 neural network，所以在 model training 方面会相当吃力。需要动用到 Colab。而且也不容易处理。&lt;/p&gt;&lt;p&gt;由于近来再用 Detecto 来 optimized 之前那个案子，结果，怎么弄，都弄不回像 model rev 1 那么准确。白白浪费了不少的时间，最终决定放弃，Detecto 这个方法，从新设计另外一个 object detection 的 方法。&lt;/p&gt;&lt;p&gt;这一，我选择了简单的方法，&lt;/p&gt;&lt;p&gt;1. 先用 open cv 做些图像处理，把原来图片转换成 binary&lt;/p&gt;&lt;p&gt;2. 再用 open cv find contour 功能把 contour 挑出来&lt;/p&gt;&lt;p&gt;3. 把 contour 从图片里 crop 出来，然后传给一个 image classification model 来做进一步的分类。&lt;/p&gt;&lt;p&gt;4. 最后，根须 prediction 的 softmax value 来找出所要的 custom object。&lt;/p&gt;&lt;p&gt;这个方法比较简单，而且不需要动用到 GPU。&lt;/p&gt;&lt;p&gt;好，接下来我就来谈谈创造这个 object detection 的过程&lt;/p&gt;&lt;p&gt;第一个步骤&lt;/p&gt;&lt;p&gt;就是准备 training 和 testing data set。不相之前用 Detecto 那样，用 labelimg 画 bounding box&amp;nbsp; 画到半死，这里我用了 open cv 的 find contour，两下半就把需要的 training &amp;amp; testing dataset 给弄出来。过后把那些 contour 分类成两个 class 就可以了。&lt;/p&gt;&lt;p&gt;一下是把 contour crop 出来的 code&amp;nbsp;&lt;/p&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# load required library
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import os
import cv2
import pandas as pd&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;2. set working directory&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# set working directory&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;base_dir_path = &quot;.&quot;
image_dir = os.path.join(base_dir_path,&#39;img_dir&#39;)
unlabeled_img = os.path.join(base_dir_path,&#39;unlabeled_img&#39;)
results_dir = os.path.join(base_dir_path,&#39;results&#39;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;3. 先把图像 load 出来，然后转换成 binary format&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# read all image from image directory &amp;amp; convert the image to binary format
img_rgb = cv2.imread(os.path.join(image_dir,&quot;sample_img.jpg&quot;),0)
img_blur = cv2.blur(img_rgb, (2, 2))
ret, img_thr = cv2.threshold(img_blur, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

plt.figure(figsize = (14,8))
plt.imshow(img_thr,cmap=&#39;gray&#39;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;4. 最后就是用这个 script 把 contour 的 coordinate 找出来，然后利用这些 data 把所有 contour crop 出来，save 再 unlabeled image folder 里面。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# find the contour
contours, hierarchy = cv2.findContours(img_thr,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2:]

# store all bounding box data into a data frame name df
image = img_rgb
i = 1
for c in contours:
    x, y, w, h = cv2.boundingRect(c)
            
# Make sure contour area is large enough
                #if (cv2.contourArea(c)) &amp;lt; 500 and (cv2.contourArea(c)) &amp;gt; 9:
    contour_img = img_rgb[(int((y+h/2)-25)):(int((y+h/2)+25)), (int((x+w/2)-25)):(int((x+w/2)+25))]
    
    cv2.imwrite(os.path.join(unlabeled_img, str(i)+&quot;contour_img.jpg&quot;), contour_img)
    i = i + 1&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;这就是刚 crop 出来的 sample image。接下来需要一些 manual sorting 来把“是”或是 “不是”星星图像分类出来存进 training 和 testing data set 里面的 sub folder 里。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-sPVpOr7rqf4/YHmh80P8hXI/AAAAAAAACTs/thz3BNzVaIUkFiEJMj6ms6BD8k8XvkfXQCLcBGAsYHQ/s682/Capture.JPG&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;599&quot; data-original-width=&quot;682&quot; height=&quot;351&quot; src=&quot;https://1.bp.blogspot.com/-sPVpOr7rqf4/YHmh80P8hXI/AAAAAAAACTs/thz3BNzVaIUkFiEJMj6ms6BD8k8XvkfXQCLcBGAsYHQ/w400-h351/Capture.JPG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-JYTFbGnaQys/YHotfgXOw3I/AAAAAAAACT0/BekvCYVUClkjZ6qOkhpo1zSXwI8qhjYoQCLcBGAsYHQ/s148/Capture_2.JPG&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;148&quot; data-original-width=&quot;107&quot; src=&quot;https://1.bp.blogspot.com/-JYTFbGnaQys/YHotfgXOw3I/AAAAAAAACT0/BekvCYVUClkjZ6qOkhpo1zSXwI8qhjYoQCLcBGAsYHQ/s0/Capture_2.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;第二个步骤就是做 model training 了。由于 find contour 只能够帮我们挑出类似物体的形状，但是我们好不能够确定那个物体到底是不是我们像要找的物体。所以，我们需要用从 binarized image 所得到的 coordinate，然后回去原来的图像，把同样的点给 crop 出来，再传给一个 image classifier 来做进一步的分析。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;因此，我需要用步骤一所 得到的图像来 train 一个 image classifier 出来。这里我选用了 EfficientNetB0 来 train 我的 image classification model。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;以下是 image classification model training 的 code&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. 把需要用到的 library 给 load 出来&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;#ref : https://analyticsindiamag.com/implementing-efficientnet-a-powerful-convolutional-neural-network/

import os
import cv2
import traceback
import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from PIL import Image&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace; font-size: 14px;&quot;&gt;from keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import SGD, Adam
from keras.callbacks import ReduceLROnPlateau
from keras.layers import Flatten, Dense, BatchNormalization, Activation, Dropout
from keras.utils import to_categorical

from keras import Sequential
import keras_efficientnets
from keras_efficientnets import EfficientNetB0
from keras_efficientnets import custom_objects


import tensorflow as tf
from tensorflow.keras.losses import CategoricalCrossentropy
from tensorflow.keras.preprocessing import image

from keras import layers
from keras.layers import MaxPooling2D&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. Define working directory&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;# Set working directory
base_dir_path = &quot;.&quot;
train_dir_path = os.path.join(base_dir_path,&#39;training&#39;)
test_dir_path = os.path.join(base_dir_path,&#39;testing&#39;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;



&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. Define 那些需要用到的 function （其实这些 function 我也不太懂，都是网上抄回来的）&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: #38761d; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;def getAllClassNames(dir_path):
    return os.listdir(dir_path)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: #38761d; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: #38761d; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: #38761d; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# get a list of all class. use the def function above
AllClassNames = getAllClassNames(train_dir_path)

# check number of class in the training directory
num_of_classes = len(AllClassNames)

# build dict of class_id and classname
DictOfClasses = {i : AllClassNames[i] for i in range(0, len(AllClassNames))}

print(AllClassNames)
print(num_of_classes)
print(DictOfClasses)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;


&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;Output&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;pre style=&quot;background-color: white; border-radius: 0px; border: 0px; box-sizing: border-box; font-size: 14px; line-height: inherit; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; overflow: auto; padding: 1px 0px; vertical-align: baseline; white-space: pre-wrap; word-break: break-all;&quot;&gt;[&#39;dust&#39;, &#39;others&#39;]
2
{0: &#39;dust&#39;, 1: &#39;others&#39;}&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. 设定 EfficientNetB0 的 model，一般我们都是用 softmax value&amp;nbsp;&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;# setup the EfficientNetB0 pretrained model
conv_base = EfficientNetB0(include_top = False, weights = &quot;imagenet&quot;, input_shape = (50,50,3))
conv_base.trainable = True

model = Sequential()
model.add(conv_base)
model.add(layers.GlobalMaxPooling2D())
model.add(layers.Dropout(0.5))  
model.add(Dense(num_of_classes,activation=&#39;softmax&#39;))

#Checking the final model summary
model.summary()
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;


&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;Output&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;pre style=&quot;background-color: white; border-radius: 0px; border: 0px; box-sizing: border-box; font-size: 14px; line-height: inherit; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; overflow: auto; padding: 1px 0px; vertical-align: baseline; white-space: pre-wrap; word-break: break-all;&quot;&gt;Model: &quot;sequential&quot;
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
model (Model)                (None, 2, 2, 1280)        4049564   
_________________________________________________________________
global_max_pooling2d (Global (None, 1280)              0         
_________________________________________________________________
dropout (Dropout)            (None, 1280)              0         
_________________________________________________________________
dense (Dense)                (None, 2)                 2562      
=================================================================
Total params: 4,052,126
Trainable params: 4,010,110
Non-trainable params: 42,016&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5. 做 model compilation，这里可以做一些 hyperparameter 的 setting， 比如 learning rate, decay&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;# compile the model
optimizer = Adam(lr=1e-4, decay=1e-6)

loss = tf.keras.losses.CategoricalCrossentropy(
    from_logits=False, label_smoothing=0.066, reduction = &quot;auto&quot;,
    name=&#39;categorical_crossentropy&#39;) &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #38761d; font-family: monospace, Consolas, Courier New, monospace; font-size: 14px;&quot;&gt;model.compile(optimizer=optimizer,
               loss=loss,
               metrics=[&#39;accuracy&#39;])&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;


&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. Setup data generator&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;# setup the data generator&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;# data augmentation 
datagen = ImageDataGenerator(rescale=False,
                             shear_range=0.4,
                             zoom_range=0.2,
                             rotation_range=30,
                             width_shift_range=0.2,
                             height_shift_range=0.2,
                             horizontal_flip=True,
                             #fill_mode=&#39;nearest&#39;
                            )

batch_size = 120&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;# instruct the program to flow through all sub folder in train data set&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #38761d; font-family: monospace, Consolas, Courier New, monospace; font-size: 14px;&quot;&gt;train_generator = datagen.flow_from_directory(
        train_dir_path,  # this is the target directory
        target_size=(50, 50),  # all images will be resized to 50x50
        batch_size=batch_size,
        seed = 1, 
        class_mode=&#39;categorical&#39;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #38761d; font-family: monospace, Consolas, Courier New, monospace; font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #38761d; font-family: monospace, Consolas, Courier New, monospace; font-size: 14px;&quot;&gt;# instruct the program to flow through all sub folder in test data set&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #38761d; font-family: monospace, Consolas, Courier New, monospace; font-size: 14px;&quot;&gt;test_generator = datagen.flow_from_directory(
        test_dir_path,  # this is the target directory
        target_size=(50, 50),  # all images will be resized to 50x50
        batch_size=batch_size,
        seed = 1,
        class_mode=&#39;categorical&#39;)  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #38761d; font-family: monospace, Consolas, Courier New, monospace; font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;6. 可以开始做 model training 了。正常情况下需要用到大约一个小时的时间才能完成这个步骤。时间长短需要看 data set 的情况，和 epochs 的设定。如果 Output 那里继续有新的 data 出来，就证明 model training process 正常操作。最后的 accuracy 和 val_accuracy 都必须再 0.95左右，而且两者都必须要相当接近。如果两者之间有一个很大的差异，也就是说这个 model 有 over fitting 或是 under fitting 的问题。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;根据我的经验，不建议把 model accuracy fit 得太过接近 1。太过 over fit 反而会制造另外一个问题。刚刚好就 ok 。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;刚从伟伦大师那里学到，如果没有输入 verbose=1，那么下面的 output 就不会显示出来。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;# make sure no over fitting
history = model.fit_generator(train_generator,
                          epochs=50,
                          validation_data = test_generator,
                          verbose=1)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;


&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;pre style=&quot;background-color: white; border-radius: 0px; border: 0px; box-sizing: border-box; color: black; line-height: inherit; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; overflow: auto; padding: 1px 0px; vertical-align: baseline; white-space: pre-wrap; word-break: break-all;&quot;&gt;Epoch 1/50
9/9 [==============================] - 26s 3s/step - loss: 0.8418 - accuracy: 0.7009 - val_loss: 0.9897 - val_accuracy: 0.6185
Epoch 2/50
9/9 [==============================] - 23s 3s/step - loss: 0.5739 - accuracy: 0.8103 - val_loss: 0.9142 - val_accuracy: 0.5636
Epoch 3/50
9/9 [==============================] - 24s 3s/step - loss: 0.5079 - accuracy: 0.8683 - val_loss: 0.7216 - val_accuracy: 0.5549&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;7. OK，一个 model training 就这样完成 （如果一切顺利的话）。好接下来可以把 accuracy 和 validation accuracy data 给弄出来做个分析。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;# convert history data into a data frame&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #38761d; font-family: monospace, Consolas, Courier New, monospace; font-size: 14px;&quot;&gt;pd.DataFrame(history.history)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;# Plot accuracy vs epochs and save the chart in  local &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: #38761d; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;fig = plt.figure()
plt.plot(history.history[&#39;accuracy&#39;], label=&#39;accuracy&#39;)
plt.plot(history.history[&#39;val_accuracy&#39;], label = &#39;val_accuracy&#39;)
plt.xlabel(&#39;Epoch&#39;)
plt.ylabel(&#39;Accuracy&#39;)
plt.ylim([0.5, 1])
plt.legend(loc=&#39;lower right&#39;)

plt.savefig(&#39;test_123.png&#39;)
plt.close(fig)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;


&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;图下可以看到 model accuracy vs epochs 的过程。从这张图看来，这个 image classification model training 的发展还属于正常的。开始的时候是有一些 under fitting 的问题，但是问题在 epochs = 50 的时候有些改善。其实可以把 epochs 加大到 60，从新 train 多一次，看看那两条线是否继续走到很近。还是会再某个 epochs 又开始分叉。我们可以用这样得方法来决定最 optimize 的 epochs。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-PaCepb3zVZA/YHpBAiOhzEI/AAAAAAAACT8/bzrT9o3YtsAS2ynal87680OTe9VxetkSwCLcBGAsYHQ/s432/test_123.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;288&quot; data-original-width=&quot;432&quot; height=&quot;266&quot; src=&quot;https://1.bp.blogspot.com/-PaCepb3zVZA/YHpBAiOhzEI/AAAAAAAACT8/bzrT9o3YtsAS2ynal87680OTe9VxetkSwCLcBGAsYHQ/w400-h266/test_123.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;8. 最后，把 train 好的 model 存起来。接下来的 deployment 需要用到。(需要事先在 base_dir_path 那里开一个 model_library 的 folder)&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;model.save(&#39;C:/Users/xxx/Desktop/char_finding/model_library/dust_effnetB0_rev1.h5&#39;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;


&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;现在要做最后一个步骤了。这里要做的就是整合整个 object detection 的流程。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. 在 base_dir_path 那里开两个新的 folder&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-JYJs4zxDs8Q/YHqwPGo9WaI/AAAAAAAACUE/E6ZtbUk3WSc8DVA_J-3AHDAweY4uRYF1wCLcBGAsYHQ/s192/Capture.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;192&quot; data-original-width=&quot;177&quot; src=&quot;https://1.bp.blogspot.com/-JYJs4zxDs8Q/YHqwPGo9WaI/AAAAAAAACUE/E6ZtbUk3WSc8DVA_J-3AHDAweY4uRYF1wCLcBGAsYHQ/s0/Capture.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. 把需要用到的 library 给 load 出来&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;# load required library
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import os
import cv2
import traceback
import itertools
import pandas as pd
import tensorflow as tf
from keras_efficientnets import EfficientNetB0&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;


&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. Define working directory&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;# set working directory
base_dir_path = &quot;.&quot;
image_dir = os.path.join(base_dir_path,&#39;img_dir&#39;)
unlabeled_img = os.path.join(base_dir_path,&#39;unlabeled_img&#39;)
results_dir = os.path.join(base_dir_path,&#39;results&#39;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;


&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;3. 把之前 train 好的 image classification model load 出来&lt;/span&gt;&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;from tensorflow.keras.models import load_model
model = load_model(&#39;C:/Users/xxx/Desktop/char_finding/model_library/dust_effnetB0_rev1.h5&#39;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;4. 以下的 code 会自动去读取在 img_dir folder 的图像，然后进行分析。分析后的图像会存在 results folder 里。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;color: #38761d; font-size: 14px;&quot;&gt;datalist = []

try:
# read image from image_dir
    for filename in os.listdir(image_dir):
        if filename.endswith(&quot;.jpg&quot;) :
            img_rgb = cv2.imread(os.path.join(image_dir, filename),0)
        
# image processing start        
            img_blur = cv2.blur(img_rgb, (2, 2))
            ret, img_thr = cv2.threshold(img_blur, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
        
# define structuring element
            #rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (50, 50))
    
# use contours to detect the character
            contours, hierarchy = cv2.findContours(img_thr,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2:]
        
# Dust classification 
# store all bounding box data into a data frame name df
            image = img_rgb
            for c in contours:
                x, y, w, h = cv2.boundingRect(c)
            
# Make sure contour area is large enough
                #if (cv2.contourArea(c)) &amp;lt; 500 and (cv2.contourArea(c)) &amp;gt; 9:
                contour_img = img_rgb[(int((y+h/2)-25)):(int((y+h/2)+25)), (int((x+w/2)-25)):(int((x+w/2)+25))]
                #cv2.imwrite(os.path.join(unlabeled_img, &quot;contour_img.png&quot;), contour_img)
 
                #img = cv2.imread(os.path.join(unlabeled_img, &quot;contour_img.png&quot;))
                if contour_img.size &amp;gt; 0:
                    img = cv2.resize(contour_img, (50, 50))
                    img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
                    img = np.array(img)
                    img = np.expand_dims(img, axis=0)
                    pred_score = model.predict(img, batch_size=1)

            
                    if pred_score[(0,0)] &amp;gt; 0.8:
                        cv2.rectangle(image,((int((x+w/2)-20)),(int((y+h/2)-20))), ((int((x+w/2)+20)),(int((y+h/2)+20))), (255,0,0), 1)
                        datalist.append([filename,x,y,w,h, pred_score[(0,0)], pred_score[(0,1)]])
        cv2.imwrite(os.path.join(results_dir,filename), image)          

#    df = pd.DataFrame(datalist,columns = [&#39;filename&#39;,&#39;x&#39;, &#39;y&#39;, &#39;w&#39;, &#39;h&#39;, &#39;dust&#39;, &#39;others&#39;]) 
        
except:
    traceback.print_exc()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;


&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;在 results folder 里面的结果应该会是这样，感觉是用这个方法比我之前用 detecto 弄出来的结果好很多，而且很容易做 tuning 和控制。最重要的是，不需要动用到 colab，方便很多。&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-i2zVl6jwgis/YHq7j6FIc9I/AAAAAAAACUM/uYA6zjl7KQ8kSlx8n4OjZHn8bho7gLSpwCLcBGAsYHQ/s3404/b16img.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;900&quot; data-original-width=&quot;3404&quot; height=&quot;170&quot; src=&quot;https://1.bp.blogspot.com/-i2zVl6jwgis/YHq7j6FIc9I/AAAAAAAACUM/uYA6zjl7KQ8kSlx8n4OjZHn8bho7gLSpwCLcBGAsYHQ/w640-h170/b16img.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;就这样，我用另外一个方式来建立 object detection model。&lt;/div&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;又这样渡过一个星期六。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://6sigmaforum.blogspot.com/2021/04/how-to-build-custom-object-detection.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-sPVpOr7rqf4/YHmh80P8hXI/AAAAAAAACTs/thz3BNzVaIUkFiEJMj6ms6BD8k8XvkfXQCLcBGAsYHQ/s72-w400-h351-c/Capture.JPG" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-1084517683771013466</guid><pubDate>Sat, 03 Apr 2021 14:58:00 +0000</pubDate><atom:updated>2021-04-03T22:58:42.663+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Lean</category><category domain="http://www.blogger.com/atom/ns#">My Black Belt Experience</category><category domain="http://www.blogger.com/atom/ns#">Six Sigma</category><title>Journey Toward Automation With Machine Learning &amp; AI Technologies</title><description>&lt;p&gt;这个周末我来研究一些比较 concept 的问题。乘周末的空挡，赶快把我收在脑海已久的 concept 给画出来，做个记录。&lt;/p&gt;&lt;p&gt;Industrial 4.0, machine learning, AI, big data, data science, advanced data analytic 都是当今热门的话题，很多人（尤其是老板阶级人士）都相信，或是都希望，能够通过人工智慧科技来解决未来的问题。是不是说，只要所有的 process 都让人工智慧机器人来处理，就万无一失，没有问题？真的是这样吗？&lt;/p&gt;&lt;p&gt;在人工智慧这一块打转了三年，时间不长，但撞得墙可不少。从跌跌撞撞中走过来，也吸取了不少的宝贵经验，其实人工智慧机器人，只能够有效的在一个 stable and predictable 的 process 情况下正常的操作。&lt;/p&gt;&lt;p&gt;所以，如果你也想为你的公司将来注入 AI 科技，我的建议是，在你做任何投资之前 （AI 装置是个很大的投资 ok )，先去看看你当今的 process capability, stability 是否符合人工智慧科技的条件。如果是的话，那么先恭喜你。&lt;/p&gt;&lt;p&gt;万一你发现你当今 process capability, stability 还是一团糟，那该怎么办？&lt;/p&gt;&lt;p&gt;答案很简单，先把你 AI 的念头放一边，先解决你 process performance 的问题吧。需要动用到什么方法来提升 process performance 呢? 那就得看你当时 process 的情况了。一般都是 8D 或是 Lean Six Sigma 这个策略。&lt;/p&gt;&lt;p&gt;先把你的 process 搞好，彻底了解 process parameter 和 output 的相关性。还有理清在整个作业流程里的 non value added process。把这些基本的事情搞好后，再来谈 AI 。&lt;/p&gt;&lt;p&gt;如果连一个 domain expert 都无法解释 process parameter 和 output 的相关性，那么你就甭想教会一个机器人来帮你解决问题。&lt;/p&gt;&lt;p&gt;Remark : 人工智慧发展会为 Lean Six Sigma 专才带来更多的工作机会。&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-uyDQkrvTdjM/YGhzD6vIxsI/AAAAAAAACNk/tmSFT0p1upQCNgptRN5l1gfAvTsGpFjYgCLcBGAsYHQ/s816/Journey%2BToward%2BProcess%2BAutomation.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;816&quot; data-original-width=&quot;752&quot; height=&quot;640&quot; src=&quot;https://1.bp.blogspot.com/-uyDQkrvTdjM/YGhzD6vIxsI/AAAAAAAACNk/tmSFT0p1upQCNgptRN5l1gfAvTsGpFjYgCLcBGAsYHQ/w590-h640/Journey%2BToward%2BProcess%2BAutomation.png&quot; width=&quot;590&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description><link>http://6sigmaforum.blogspot.com/2021/04/journey-toward-automation-with-machine.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-uyDQkrvTdjM/YGhzD6vIxsI/AAAAAAAACNk/tmSFT0p1upQCNgptRN5l1gfAvTsGpFjYgCLcBGAsYHQ/s72-w590-h640-c/Journey%2BToward%2BProcess%2BAutomation.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-8082017859677439175</guid><pubDate>Wed, 31 Mar 2021 09:45:00 +0000</pubDate><atom:updated>2021-03-31T17:45:24.613+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>Text or Character Detection With Open CV</title><description>&lt;p&gt;几天前同事发来了张产品照片过来，问我是j有办法用 computer vision 技术来自动化 text marking 位置检测。根据他的解说，今天的检测是通过 production operator 以目检的方式来执行，效果不是很好，基本上就是慢，误判也多。所以他希望能够借用 AI 来取代这个目检的工作。&lt;/p&gt;&lt;p&gt;今天我就来记录一下因为这个单子而学到的新知识。当然，我不会公开我实际 solution 是如何使用（商业机密）。我只能够借用以下图片来解释如何使用 Open CV 来从一个图片中找出每一个字体的 coordinate。有了这些 coordiante 的数据，接下来的要做的就是加减乘除来找出所要的答案。&lt;/p&gt;&lt;p&gt;OK，今天要分享的 code，就是要找出以下图片里每个字体的 coordiante，然后把所有的数据列再一个表上。&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-kSQhMaK01Zg/YGQ4AjLcYfI/AAAAAAAACMI/cKJGMI2SaecTtW95QwgsGcsvYoUZ9SlZACLcBGAsYHQ/s350/sample_img_1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;350&quot; data-original-width=&quot;271&quot; height=&quot;400&quot; src=&quot;https://1.bp.blogspot.com/-kSQhMaK01Zg/YGQ4AjLcYfI/AAAAAAAACMI/cKJGMI2SaecTtW95QwgsGcsvYoUZ9SlZACLcBGAsYHQ/w310-h400/sample_img_1.jpg&quot; width=&quot;310&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;ok，废话少说，直接进入主题，coding&lt;/p&gt;&lt;p&gt;1. 先把需要的 package 给 load 出来&lt;/p&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# load required library
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import os
import cv2
import pandas as pd&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;2. set working directory&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# set working directory
base_dir_path = &quot;.&quot;
image_dir = os.path.join(base_dir_path,&#39;img_dir&#39;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/pre&gt;&lt;div&gt;3. load image 出来，顺便转换成 gray scale&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# read all image from image directory
img_rgb = cv2.imread(os.path.join(&quot;sample_img_1.jpg&quot;),0)
plt.imshow(img_rgb,cmap=&#39;gray&#39;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;


&lt;p&gt;4. 一般做这类型的 object detection，我们需要把 图片弄蒙一些，主要是把字体(feature) 弄得粗一些，好让这些 feature 在转换成 contour 的时候会比较明显。 然后再把图片转换成 binary 格式。&amp;nbsp;&lt;span style=&quot;background-color: #fffffe; color: green; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;&quot;&gt;cv2.blur(img_rgb, (2, 2)) &lt;/span&gt;这条 code 里面的 (2，2）其实蒙度 (in x &amp;amp; y direction)，数目越大，图片就越蒙。要用什么数字才对？看情况。。。&lt;/p&gt;&lt;p&gt;第二条 code 基本上就是把图片转换成&amp;nbsp; binary format，就这么简单。&lt;/p&gt;&lt;p&gt;可以把 binarized 的图片 print 出来看，字体是不是便粗了 ? 如果还不够好，那么可以从新调整一下 blur 的参数，看看是否能够改善。&lt;/p&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# image preprocessing for charactor detection

img_blur = cv2.blur(img_rgb, (2, 2)) 

ret, img_thr = cv2.threshold(img_blur, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

plt.figure(figsize = (14,8))
plt.imshow(img_thr, cmap=&#39;gray&#39;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/pre&gt;&lt;div&gt;5. 用 open cv 的&amp;nbsp; contour detection 功能来把每个字体的 contour 给找出来&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# use contours to detect the character
contours, hierarchy = cv2.findContours(img_thr,
  cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2:]

print(&#39;Total number of contours detected: &#39; + str(len(contours)))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;6. 现在可以用 contour detection 找到的数据，把每个字体框出来。同时列出每个字体的 coordinate。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: green; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;# Draw a bounding box around all contours
# store all bounding box data into a data frame name df
datalist = []
image = img_rgb
for c in contours:
      x, y, w, h = cv2.boundingRect(c)
 
    # Make sure contour area is large enough
      if (cv2.contourArea(c)) &amp;lt; 500 and (cv2.contourArea(c)) &amp;gt; 1:
        cv2.rectangle(image,(x,y), (x+w,y+h), (0,0,255), 1)

        datalist.append([x,y,w,h])
        
df = pd.DataFrame(datalist,columns = [&#39;x&#39;, &#39;y&#39;, &#39;w&#39;, &#39;h&#39;])
df = df.sort_values(by = &#39;y&#39;)
df = df.reset_index(drop=True)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;一下就是我想要的结果，其实 detection 还蛮准的。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-93vUCbAN86A/YGRDgnd6f2I/AAAAAAAACMQ/dLbf9QB2xbEychU_A2GwHx4EeBgg9KPRQCLcBGAsYHQ/s350/sample_img_result.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;350&quot; data-original-width=&quot;271&quot; height=&quot;400&quot; src=&quot;https://1.bp.blogspot.com/-93vUCbAN86A/YGRDgnd6f2I/AAAAAAAACMQ/dLbf9QB2xbEychU_A2GwHx4EeBgg9KPRQCLcBGAsYHQ/w310-h400/sample_img_result.png&quot; width=&quot;310&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;7. OK，最后一个步骤，把 image 和 dataframe expert 出去。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; line-height: 19px;&quot;&gt;&lt;span style=&quot;color: #af00db; font-family: monospace, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;cv2.imwrite(os.path.join(&quot;sample_img_result.png&quot;), image)
df.to_csv(&#39;txt_coordinate.csv&#39;,index = True, sep = &#39;,&#39;)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;          &lt;/span&gt;&lt;span style=&quot;font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;



&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今天到此为止。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://6sigmaforum.blogspot.com/2021/03/text-or-character-detection-with-open-cv.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-kSQhMaK01Zg/YGQ4AjLcYfI/AAAAAAAACMI/cKJGMI2SaecTtW95QwgsGcsvYoUZ9SlZACLcBGAsYHQ/s72-w310-h400-c/sample_img_1.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-6612689368916487179</guid><pubDate>Mon, 08 Mar 2021 16:31:00 +0000</pubDate><atom:updated>2021-03-09T00:31:51.919+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>How To Train An Object Detection Model with Detecto</title><description>&lt;p&gt;偷懒了一个多月，是时候让这个 blog 重新活动活动了。一个多月，我到底忙了什么？说实在的，我自己也不知道。不过，我的确做了两个多礼拜的夜猫子，就是为了从新&amp;nbsp; optimize 一个之前用 detecto train 出来的 object detection model。&lt;/p&gt;&lt;p&gt;想知道 detecto 到底是什么东东，可以参考这大师的 &lt;a href=&quot;https://medium.com/pytorch/detecto-build-and-train-object-detection-models-with-pytorch-5f31b68a8109&quot;&gt;blog&lt;/a&gt;&amp;nbsp;。&lt;/p&gt;&lt;p&gt;今天要在这里记录我如何使用 detecto 来 train 出一个能够帮数星星的 object detection model。&lt;/p&gt;&lt;p&gt;以下 sample 就是我忙了几个礼拜的通宵所得到的结果。&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-aaiGc_AOT9U/YEY1AE9gtWI/AAAAAAAACKo/JsDiR3egrDcdahs70pH26827Ta_Zg-J_wCLcBGAsYHQ/s3267/2.jpg.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;963&quot; data-original-width=&quot;3267&quot; height=&quot;118&quot; src=&quot;https://1.bp.blogspot.com/-aaiGc_AOT9U/YEY1AE9gtWI/AAAAAAAACKo/JsDiR3egrDcdahs70pH26827Ta_Zg-J_wCLcBGAsYHQ/w400-h118/2.jpg.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;要做这样的 object detection model，除了 detector，还需要动用到 image annotation tool 和 google colab。&lt;/p&gt;&lt;p&gt;我是用 labelimg 这个工具来做我的 image annotation，为什么选 labelimg 呢？理由很简单，因为我学会用一个工具之后，就懒得去学另外一个工具了。&lt;/p&gt;&lt;p&gt;当然，事先必须要安装好 labelimg 这个工具。怎么安装呢？可以参考这个&amp;nbsp;&lt;a href=&quot;https://medium.com/@sanghuynh_73086/how-to-install-labelimg-in-windows-with-anaconda-c659b27f0f&quot;&gt;link&lt;/a&gt;&amp;nbsp;。能否顺利安装，真的需要一点运气。记得去年安装这个 package 的时候，真的碰了不少的挑战，花了几个小时的 google，结果是怎样被我搞定，说真的我自己也不知道。&lt;/p&gt;&lt;p&gt;这里我不谈 labelimg 的用法，改天 “有空” 再补上。&lt;/p&gt;&lt;p&gt;好，废话少说，直接进入主题。做这类型的 image classifier，training testing data set 的准备工作就是要做 image annotation。用 labelimg 这个工具，把图片里的 targeted object 给框出来，然后把资料 save 成 xml format。就是这样。一张图可以有超过一个同样或是不一样的 object。&lt;/p&gt;&lt;p&gt;在这个 case，我主要的目的是要数星星，不管是什么星星，大的也好，小的也好，我都把它归类于一种 category，所以这里我只有 d1一个 class。如果想要用 detecto train 一个可以同时做 classification 的 object detection model，那么我们可以 annotate 超过一个 classification。&lt;/p&gt;&lt;p&gt;开始的时候我是有尝试弄三个 classification，结果。。。。我放弃了，所以才会有只有一个 class 的 object detection model。&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-uVmcOLhqWzI/YEY58CpbVoI/AAAAAAAACKw/AMza0h5vkI0l82nZ1Wq9fllpz9BbG1jnwCLcBGAsYHQ/s792/labelimg.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;421&quot; data-original-width=&quot;792&quot; height=&quot;213&quot; src=&quot;https://1.bp.blogspot.com/-uVmcOLhqWzI/YEY58CpbVoI/AAAAAAAACKw/AMza0h5vkI0l82nZ1Wq9fllpz9BbG1jnwCLcBGAsYHQ/w400-h213/labelimg.JPG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;以下是一些已经 annotate 的样本（当然，两三张 image 是不够的，至少也要准备五十张以上才可以看到一些效果）。就是这样，每一张 image file 跟一个同样名字的 xml file。必须注意的是，当 xml file 弄好了之后，就不要再去 rename 图片的名字。要不然，再 model training 的时候会出现 error。&lt;/p&gt;&lt;p&gt;training data set 弄好了之后，就下来就是把 training data set upload 上 google drive。一般我会设定这样的 file structure 方便我做 coding。我会把 training data set 收在 train folder 里。testing data set 就收在 valid 的 folder。&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-bSlECKNkpvw/YEZArFrlFBI/AAAAAAAACK4/BJgsHhiVPDQltuVjG1_IMyiOp4-5sUFpQCLcBGAsYHQ/s530/file_structure.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;530&quot; data-original-width=&quot;312&quot; height=&quot;400&quot; src=&quot;https://1.bp.blogspot.com/-bSlECKNkpvw/YEZArFrlFBI/AAAAAAAACK4/BJgsHhiVPDQltuVjG1_IMyiOp4-5sUFpQCLcBGAsYHQ/w235-h400/file_structure.JPG&quot; width=&quot;235&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;由于这 detecto 背后是使用了 fast rcnn 的 架构，是一个相当大的 CNN，一般的电脑是无法处理这样大的 CNN 的，除非你有自己的 GPU，另一个免费的方法就是 google colab 了。&lt;/p&gt;&lt;p&gt;Google colab 提供大家一天12个小时的免费 GPU resource。但是，有个问题就是，如果我们的 web browser idle 超过 45 分钟，那么你或许会被 google 踢出局，结果全功尽弃，所以再 model training 操作的时刻，最好是每半个小时用 mouse click 一下web broswer。&lt;/p&gt;&lt;p&gt;OK，该准备的都准备好了， 是做 coding 的时候了。这些 code 我是直接写在 colab 里面的，要怎么用 colab ？很简单，问 google 就行。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;1. 基本的 Python&amp;nbsp; 设定，和把需要用的 library load 出来。&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; link colab 去 google drive，和 set up training testing image directory&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 安装 detecto。这里我指定安装 detecto version 1.1.6。如果没有这样的指示，colab 就会把最新&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;版本的 detecto 给安装近来。&lt;/span&gt;&amp;nbsp; &amp;nbsp;之前试过 1.1.6 之后的版本，很多问题。所以才会有这样的 设&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;定。&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 一点需要注意的是，在跑以下 code 之前，记得在 colab 的 Edit &amp;gt;&amp;gt; Notebook Setting &amp;gt;&amp;gt; 选择 GPU，然后 save。要不然的话，hmmm..... 真的是要等上一个天长地久才能够把一个 model 弄出来。&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;set&amp;nbsp;up&amp;nbsp;the&amp;nbsp;training&amp;nbsp;and&amp;nbsp;testing&amp;nbsp;image&amp;nbsp;directory&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;here&amp;nbsp;google&amp;nbsp;will&amp;nbsp;give&amp;nbsp;you&amp;nbsp;a&amp;nbsp;password,&amp;nbsp;you&amp;nbsp;need&amp;nbsp;to&amp;nbsp;copy&amp;nbsp;the&amp;nbsp;password&amp;nbsp;and&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;paste&amp;nbsp;it&amp;nbsp;to&amp;nbsp;a&amp;nbsp;field.&amp;nbsp;Read&amp;nbsp;and&amp;nbsp;follow&amp;nbsp;the&amp;nbsp;instruction&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;os&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;from&lt;/span&gt;&amp;nbsp;google.colab&amp;nbsp;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;drive&lt;/div&gt;&lt;br /&gt;&lt;div&gt;drive.mount(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;/content/drive&#39;&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;os.chdir(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;/content/drive/My&amp;nbsp;Drive/detecto_tutorial&#39;&lt;/span&gt;)&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;tested&amp;nbsp;detector&amp;nbsp;version&amp;nbsp;1.2.0&amp;nbsp;this&amp;nbsp;version&amp;nbsp;generate&amp;nbsp;large&amp;nbsp;error&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;!&lt;/span&gt;pip&amp;nbsp;install&amp;nbsp;detecto==&lt;span style=&quot;color: #098658;&quot;&gt;1.1.6&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#!pip&amp;nbsp;install&amp;nbsp;detecto&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;2. image augmentation，简单来说，就是用这个方法来加大 training data set 的数量&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;image&amp;nbsp;augmentations&amp;nbsp;model&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;it&amp;nbsp;should&amp;nbsp;be&amp;nbsp;place&amp;nbsp;before&amp;nbsp;the&amp;nbsp;model&amp;nbsp;training&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;from&lt;/span&gt;&amp;nbsp;detecto&amp;nbsp;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;core,&amp;nbsp;utils,&amp;nbsp;visualize&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;from&lt;/span&gt;&amp;nbsp;torchvision&amp;nbsp;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;transforms&lt;/div&gt;&lt;br /&gt;&lt;div&gt;augmentations&amp;nbsp;=&amp;nbsp;transforms.&amp;nbsp;Compose([&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transforms.ToPILImage(),&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transforms.RandomHorizontalFlip(&lt;span style=&quot;color: #09885a;&quot;&gt;0.5&lt;/span&gt;),&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: green;&quot;&gt;#transforms.ColorJitter(saturation&amp;nbsp;=&amp;nbsp;0.5),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transforms.ToTensor(),&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;utils.normalize_transform(),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;])&lt;/div&gt;&lt;br /&gt;&lt;div&gt;dataset&amp;nbsp;=&amp;nbsp;core.Dataset(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;dust_count_train/&#39;&lt;/span&gt;,&amp;nbsp;transform&amp;nbsp;=&amp;nbsp;augmentations)&lt;/div&gt;&lt;br /&gt;&lt;div&gt;loader&amp;nbsp;=&amp;nbsp;core.DataLoader(dataset,&amp;nbsp;batch_size&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #09885a;&quot;&gt;5&lt;/span&gt;,&amp;nbsp;shuffle&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;True&lt;/span&gt;)&lt;/div&gt;&lt;/div&gt;
&lt;/pre&gt;&lt;div&gt;3. Ok，可以开始做 model training 了，这里我引用了detecto 的 auto train code，直接 run 就可&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;以，没有 parameter 可以玩。Anyway，train 出来的 model 还可以。这个步骤一般需要一两个小时才可以完成，所以需要一些耐心，同时也需要确保你的 web browser 没有 idle 太久而被 google 踢出场。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;this&amp;nbsp;is&amp;nbsp;the&amp;nbsp;auto&amp;nbsp;train&amp;nbsp;the&amp;nbsp;model&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;from&lt;/span&gt;&amp;nbsp;detecto&amp;nbsp;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;core,&amp;nbsp;utils,&amp;nbsp;visualize&lt;/div&gt;&lt;br /&gt;&lt;div&gt;dataset&amp;nbsp;=&amp;nbsp;core.Dataset(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;dust_count_train/&#39;&lt;/span&gt;,&amp;nbsp;&amp;nbsp;transform&amp;nbsp;=&amp;nbsp;augmentations)&lt;/div&gt;&lt;div&gt;model&amp;nbsp;=&amp;nbsp;core.Model([&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;d1&#39;&lt;/span&gt;])&lt;/div&gt;&lt;br /&gt;&lt;div&gt;model.fit(dataset)&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;


&lt;p&gt;4. 之后就可以把 train 好的 model save 起来。.pth 是一个 pythoch 的 format&lt;/p&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;save&amp;nbsp;the&amp;nbsp;model&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;Rev2&amp;nbsp;include&amp;nbsp;image&amp;nbsp;from&amp;nbsp;PoB&lt;/span&gt;&lt;/div&gt;&lt;div&gt;model.save(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;dust_count_Rev8.pth&#39;&lt;/span&gt;)&lt;/div&gt;&lt;/div&gt;
&lt;/pre&gt;&lt;div&gt;5. OK，可以做 validation 了。先把 model load 出来&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;load&amp;nbsp;the&amp;nbsp;model&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#loader&amp;nbsp;=&amp;nbsp;core.DataLoader(dataset,&amp;nbsp;batch_size&amp;nbsp;=&amp;nbsp;2,&amp;nbsp;shuffle&amp;nbsp;=&amp;nbsp;True)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;model&amp;nbsp;=&amp;nbsp;core.Model.load(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;dust_count_Rev1.pth&#39;&lt;/span&gt;,&amp;nbsp;[&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;d1&#39;&lt;/span&gt;])&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;6. 随便从 validation 的 folder 挑一张图片来做测试，看看效果如何&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;Specify&amp;nbsp;the&amp;nbsp;path&amp;nbsp;to&amp;nbsp;your&amp;nbsp;image&lt;/span&gt;&lt;/div&gt;&lt;div&gt;image&amp;nbsp;=&amp;nbsp;utils.read_image(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;dust_cout_valid/3img.jpg&#39;&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;predictions&amp;nbsp;=&amp;nbsp;model.predict(image)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;labels,&amp;nbsp;boxes,&amp;nbsp;scores&amp;nbsp;=&amp;nbsp;predictions&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;print&lt;/span&gt;(labels)&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;print&lt;/span&gt;(boxes)&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;print&lt;/span&gt;(scores)&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;visualize&amp;nbsp;the&amp;nbsp;test&amp;nbsp;result&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;from&lt;/span&gt;&amp;nbsp;detecto&amp;nbsp;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;core,&amp;nbsp;utils,&amp;nbsp;visualize&lt;/div&gt;&lt;/div&gt;&lt;span style=&quot;background-color: #fffffe; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px;&quot;&gt;visualize.show_labeled_image(image,&amp;nbsp;boxes,&amp;nbsp;labels)&lt;/span&gt;     &lt;/pre&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;以下就是得到的结果。虽然有了结果，但是想要知道图片里到底有多少颗星星，每颗星星的 coordinate，这样的结果其实帮助不大，没关系，接下来我可以把所有星星的数据都列出来，这样会更好。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-sKaqFj_yQT4/YEZNCCwXCuI/AAAAAAAACLA/idsO0J2TdfkBP9dg2ahNb6pbZtB2FGbAgCLcBGAsYHQ/s384/result1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;134&quot; data-original-width=&quot;384&quot; height=&quot;140&quot; src=&quot;https://1.bp.blogspot.com/-sKaqFj_yQT4/YEZNCCwXCuI/AAAAAAAACLA/idsO0J2TdfkBP9dg2ahNb6pbZtB2FGbAgCLcBGAsYHQ/w400-h140/result1.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;8. OK，以下的步骤就是把 object detection 的数据弄出来，然后在原来的图片上把找到的星星标出来，save 成一张 .jpg file。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;pandas&amp;nbsp;&lt;span style=&quot;color: #af00db;&quot;&gt;as&lt;/span&gt;&amp;nbsp;pd&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;convert&amp;nbsp;array&amp;nbsp;to&amp;nbsp;dataframe&lt;/span&gt;&lt;/div&gt;&lt;div&gt;boxes_coordinate&amp;nbsp;=&amp;nbsp;pd.DataFrame(boxes)&lt;/div&gt;&lt;div&gt;labels&amp;nbsp;=&amp;nbsp;pd.DataFrame(labels)&lt;/div&gt;&lt;div&gt;scores&amp;nbsp;=&amp;nbsp;pd.DataFrame(scores)&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;print&lt;/span&gt;(boxes_coordinate,&amp;nbsp;scores)&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;rearrange&amp;nbsp;the&amp;nbsp;dataframe&amp;nbsp;and&amp;nbsp;save&amp;nbsp;box&amp;nbsp;coordinate&amp;nbsp;in&amp;nbsp;a&amp;nbsp;csv&amp;nbsp;file&lt;/span&gt;&lt;/div&gt;&lt;div&gt;boxes_coordinate_2&amp;nbsp;=&amp;nbsp;pd.concat([labels,&amp;nbsp;boxes_coordinate,&amp;nbsp;scores&amp;nbsp;],&amp;nbsp;axis&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #09885a;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;sort&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;False&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;boxes_coordinate_2.to_csv(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;boxes_coordinate_2.csv&#39;&lt;/span&gt;,&amp;nbsp;header=&lt;span style=&quot;color: blue;&quot;&gt;True&lt;/span&gt;,&amp;nbsp;index=&lt;span style=&quot;color: blue;&quot;&gt;False&lt;/span&gt;)&lt;/div&gt;&lt;/div&gt;&lt;span style=&quot;background-color: #fffffe; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px;&quot;&gt;boxes_coordinate_2&lt;/span&gt;        &lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;rename&amp;nbsp;the&amp;nbsp;header&lt;/span&gt;&lt;/div&gt;&lt;div&gt;df&amp;nbsp;=&amp;nbsp;boxes_coordinate_2&lt;/div&gt;&lt;div&gt;df.columns=[&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;id&#39;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;x&#39;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;y&#39;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;x_width&#39;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;y_height&#39;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;pred&#39;&lt;/span&gt;]&lt;/div&gt;&lt;div&gt;df.to_csv(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;boxes_coordinate_2.csv&#39;&lt;/span&gt;,&amp;nbsp;header=&lt;span style=&quot;color: blue;&quot;&gt;True&lt;/span&gt;,&amp;nbsp;index=&lt;span style=&quot;color: blue;&quot;&gt;False&lt;/span&gt;)&lt;/div&gt;&lt;br /&gt;&lt;div&gt;df&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;background-color: #fffffe; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px;&quot;&gt;img_temp&amp;nbsp;=&amp;nbsp;image&lt;/span&gt;            &lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;draw&amp;nbsp;the&amp;nbsp;box&amp;nbsp;into&amp;nbsp;the&amp;nbsp;original&amp;nbsp;image&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;cv2&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;for&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;in&lt;/span&gt;&amp;nbsp;range&amp;nbsp;(&lt;span style=&quot;color: #795e26;&quot;&gt;len&lt;/span&gt;(df)):&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&amp;nbsp;df.loc[i,&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;pred&#39;&lt;/span&gt;]&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style=&quot;color: #09885a;&quot;&gt;0.05&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x&amp;nbsp;=&amp;nbsp;df.loc[i,&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;x&#39;&lt;/span&gt;]&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y&amp;nbsp;=&amp;nbsp;df.loc[i,&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;y&#39;&lt;/span&gt;]&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x1&amp;nbsp;=&amp;nbsp;df.loc[i,&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;x_width&#39;&lt;/span&gt;]&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y1&amp;nbsp;=&amp;nbsp;df.loc[i,&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;y_height&#39;&lt;/span&gt;]&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x&amp;nbsp;=&amp;nbsp;int(float(x))&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y&amp;nbsp;=&amp;nbsp;int(float(y))&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x1&amp;nbsp;=&amp;nbsp;int(float(x1))&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y1&amp;nbsp;=&amp;nbsp;int(float(y1))&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x_width&amp;nbsp;=&amp;nbsp;x1&amp;nbsp;-&amp;nbsp;x&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y_height&amp;nbsp;=&amp;nbsp;y1&amp;nbsp;-&amp;nbsp;y&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;top_left&amp;nbsp;=&amp;nbsp;(x,y)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bottom_right&amp;nbsp;=&amp;nbsp;(x&amp;nbsp;+&amp;nbsp;x_width,&amp;nbsp;y&amp;nbsp;+&amp;nbsp;y_height)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cv2.rectangle(img_temp,&amp;nbsp;top_left,&amp;nbsp;bottom_right,&amp;nbsp;&lt;span style=&quot;color: #09885a;&quot;&gt;255&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #09885a;&quot;&gt;2&lt;/span&gt;)&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;div style=&quot;background-color: #fffffe; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;#&amp;nbsp;save&amp;nbsp;the&amp;nbsp;image&amp;nbsp;in&amp;nbsp;png&amp;nbsp;format&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;matplotlib.pyplot&amp;nbsp;&lt;span style=&quot;color: #af00db;&quot;&gt;as&lt;/span&gt;&amp;nbsp;plt&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;from&lt;/span&gt;&amp;nbsp;matplotlib&amp;nbsp;&lt;span style=&quot;color: #af00db;&quot;&gt;import&lt;/span&gt;&amp;nbsp;pyplot&amp;nbsp;&lt;span style=&quot;color: #af00db;&quot;&gt;as&lt;/span&gt;&amp;nbsp;plt&lt;/div&gt;&lt;br /&gt;&lt;div&gt;plt.figure(figsize&amp;nbsp;=&amp;nbsp;(&lt;span style=&quot;color: #09885a;&quot;&gt;40&lt;/span&gt;,&lt;span style=&quot;color: #09885a;&quot;&gt;4&lt;/span&gt;))&lt;/div&gt;&lt;div&gt;plt.imshow(img_temp,&amp;nbsp;interpolation=&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;nearest&#39;&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;plt.imsave(&lt;span style=&quot;color: #a31515;&quot;&gt;&#39;img_temp.png&#39;&lt;/span&gt;,&amp;nbsp;img_temp)&lt;/div&gt;&lt;/div&gt;&lt;span style=&quot;background-color: #fffffe; color: green; font-family: monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px;&quot;&gt;#plt.figure(figsize&amp;nbsp;=&amp;nbsp;(14,8))&lt;/span&gt; &lt;/pre&gt;



&lt;div&gt;Ok, object detection model training 就这样完成。&lt;/div&gt;&lt;div&gt;下一次 “有空”，我会示范如何用 manual 的方法来 train 一个 object detection model。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;好了，今天到此为止，12:30 am，今天又做了夜猫子。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://6sigmaforum.blogspot.com/2021/03/how-to-train-object-detection-model.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-aaiGc_AOT9U/YEY1AE9gtWI/AAAAAAAACKo/JsDiR3egrDcdahs70pH26827Ta_Zg-J_wCLcBGAsYHQ/s72-w400-h118-c/2.jpg.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-1038090423036232899</guid><pubDate>Sun, 24 Jan 2021 15:15:00 +0000</pubDate><atom:updated>2021-11-08T11:35:48.491+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">R</category><title>XGBoost Classification Model - R</title><description>&lt;p&gt;昨天用 XGBoost 做了 Regression analysis, 今天继续来完成 Classification 的那一部分&lt;/p&gt;&lt;p&gt;这一次， 用的是 &lt;a href=&quot;http://6sigmaforum.blogspot.com/2020/12/logistic-regression-r.html&quot;&gt;Logistic Regression - R&lt;/a&gt; 的数据。我们来看看 XGBoost 是否比 Logistic Regression, Decision Tree 和 Random Forest 厉害。或是容易使用。&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #fcff01; color: #2b00fe;&quot;&gt;如果你觉得我的 post 对你有帮助，希望你能够帮忙 click click 一下我部落格里面的广告鼓励鼓励&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. 基本的 R 设定，和把需要用的 library load 出来。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace; font-size: 12px;&quot;&gt;setwd(&quot;C:/Users/mokf/Desktop/Temp&quot;)
pacman::p_load(corrplot, broom, ggpubr, ggplot2,tidyverse, forecast, caret, 
               MASS, relaimpo, car, GGally, ggbiplot, xgboost)

raw_data = read.csv(&#39;Framingham_Heart_study_dataset.csv&#39;, header = TRUE)

head(raw_data)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace; font-size: 12px;&quot;&gt;&amp;gt; head(raw_data)
  ID male age education currentSmoker cigsPerDay BPMeds prevalentStroke prevalentHyp
1  1    1  39         4             0          0      0               0            0
2  2    0  46         2             0          0      0               0            0
3  3    1  48         1             1         20      0               0            0
4  4    0  61         3             1         30      0               0            1
5  5    0  46         3             1         23      0               0            0
6  6    0  43         2             0          0      0               0            1
  diabetes totChol sysBP diaBP   BMI heartRate glucose TenYearCHD
1        0     195 106.0    70 26.97        80      77          0
2        0     250 121.0    81 28.73        95      76          0
3        0     245 127.5    80 25.34        75      70          0
4        0     225 150.0    95 28.58        65     103          1
5        0     285 130.0    84 23.10        85      85          0
6        0     228 180.0   110 30.30        77      99          0&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;2. 做个数据处理，把 education 删除，也顺便看看有没有 na value&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;anyNA(raw_data)
sum(apply(raw_data, 1, anyNA))
colSums(is.na(raw_data))

df = na.omit(raw_data)
df$education = NULL&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. 准备 training 和 testing dataset，今天用的方法和 python 的方式相似。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;set.seed(123)    
intrain = createDataPartition(y = df$TenYearCHD, p = 0.7, list = FALSE)
training = df[intrain,]
testing = df[-intrain,] 

x_train = training 
x_train$TenYearCHD = NULL
y_train = training$TenYearCHD

x_test = testing
x_test$TenYearCHD = NULL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;4. 设定 XGBoost&amp;nbsp; model。这里有几个 parameter 可以玩。由于这组数据是 Classification 的数据，所以需要把 gbtree 功能打开。&lt;/p&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;xgb = xgboost(data = data.matrix(x_train), 
              label = y_train, 
              nrounds = 30,
              eta = 0.8, 
              max_dept = 15,
              subsample = 0.5,
              colsample_bytree = 0.5, 
              objective = &#39;multi:softprob&#39;, 
              num_class = 2, 
              nthread = 3,
              booster = &#39;gbtree&#39;,
              #booster = &#39;gblinear&#39;,
              set.seed(123)
              
              )&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5. model training 出来的 report 就像这样，default setting 是用 rmse 来量，如果不喜欢的话也可以换，要怎么换呢？就得去 help 那里参考了。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;[22:37:26] WARNING: amalgamation/../src/learner.cc:516: 
Parameters: { max_dept } might not be used.

  This may not be accurate due to some parameters are only used in language bindings but
  passed down to XGBoost core.  Or some parameters are not used but slip through this
  verification. Please open an issue if you find above cases.


[1]	train-merror:0.135494 
[2]	train-merror:0.126513 
[3]	train-merror:0.125732 
[4]	train-merror:0.122218 
[5]	train-merror:0.117532 
[6]	train-merror:0.114799 
[7]	train-merror:0.097228 
[8]	train-merror:0.101132 
[9]	train-merror:0.087075 
[10]	train-merror:0.079266 
[11]	train-merror:0.076142 
[12]	train-merror:0.075752 
[13]	train-merror:0.069504 
[14]	train-merror:0.065599 
[15]	train-merror:0.056619 
[16]	train-merror:0.048028 
[17]	train-merror:0.045685 
[18]	train-merror:0.041390 
[19]	train-merror:0.037876 
[20]	train-merror:0.035143 
[21]	train-merror:0.033581 
[22]	train-merror:0.029285 
[23]	train-merror:0.024209 &lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;6. 用 testing dataset 来做一个 validation&amp;nbsp;&lt;/div&gt;&lt;div&gt;由于 predicted 出来的是一个 probability value，麻烦的是所有的 classification probability value 都在同一个 column 里面，所以这里需要做一些处理， 我只把 class 0 的 probability 挑出来。同时设定一个 threshhold value = 0.5。接下来才来慢慢玩&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Confusion Matrix 的结果显示，基本上和 decision tree 还有 random forest 的结果相似。其实我还以为 XGBoost 可以解决之前的问题。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;y_pred = predict(xgb, data.matrix(x_test))
y_pred = as.data.frame(y_pred)

test = as.data.frame(y_pred[ c(TRUE,FALSE), ])    # rows

y_pred_class = ifelse(test$`y_pred[c(TRUE, FALSE), ]` &amp;gt; 0.5, 0, 1)
y_pred_class = as.factor(y_pred_class)
y_pred_class = as.data.frame(y_pred_class)
y_pred_class$y_test = testing$TenYearCHD
y_pred_class$y_test = as.factor(y_pred_class$y_test)


prediction = y_pred_class$y_pred_class
reference = y_pred_class$y_test
confusionMatrix(prediction, reference)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 871 148
         1  54  24
                                          
               Accuracy : 0.8159          
                 95% CI : (0.7916, 0.8384)
    No Information Rate : 0.8432          
    P-Value [Acc &amp;gt; NIR] : 0.9935          
                                          
                  Kappa : 0.1044          
                                          
 Mcnemar&#39;s Test P-Value : 6.011e-11       
                                          
            Sensitivity : 0.9416          
            Specificity : 0.1395          
         Pos Pred Value : 0.8548          
         Neg Pred Value : 0.3077          
             Prevalence : 0.8432          
         Detection Rate : 0.7940          
   Detection Prevalence : 0.9289          
      Balanced Accuracy : 0.5406          
                                          
       &#39;Positive&#39; Class : 0       &lt;/pre&gt;&lt;div&gt;8. 换个 threshold value 来看看能否改善 specificity 的问题&lt;/div&gt;&lt;div&gt;OK, specificity 是有一些改善。但是还不太理想。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;y_pred = predict(xgb, data.matrix(x_test))
y_pred = as.data.frame(y_pred)

test = as.data.frame(y_pred[ c(TRUE,FALSE), ])    # rows

y_pred_class = ifelse(test$`y_pred[c(TRUE, FALSE), ]` &amp;gt; 0.9, 0, 1)
y_pred_class = as.factor(y_pred_class)
y_pred_class = as.data.frame(y_pred_class)
y_pred_class$y_test = testing$TenYearCHD
y_pred_class$y_test = as.factor(y_pred_class$y_test)
&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 601  83
         1 324  89
                                          
               Accuracy : 0.629           
                 95% CI : (0.5996, 0.6577)
    No Information Rate : 0.8432          
    P-Value [Acc &amp;gt; NIR] : 1               
                                          
                  Kappa : 0.1065          
                                          
 Mcnemar&#39;s Test P-Value : &amp;lt;2e-16          
                                          
            Sensitivity : 0.6497          
            Specificity : 0.5174          
         Pos Pred Value : 0.8787          
         Neg Pred Value : 0.2155          
             Prevalence : 0.8432          
         Detection Rate : 0.5479          
   Detection Prevalence : 0.6235          
      Balanced Accuracy : 0.5836          
                                          
       &#39;Positive&#39; Class : 0               &lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;OK，今天总算有点成绩。下一个 post 要来看看 XGBoost 怎样来处理我之前那个有 bias 的心脏病的 dataset。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #fcff01; color: #2b00fe;&quot;&gt;如果你觉得我的 post 对你有帮助，希望你能够帮忙 click click 一下我部落格里面的广告鼓励鼓励&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;



&lt;div&gt;8. 换个 threshold value 来看看能否改善 specificity 的问题&lt;/div&gt;&lt;div&gt;OK, specificity 是有一些改善。但是还不太理想。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;y_pred = predict(xgb, data.matrix(x_test))
y_pred = as.data.frame(y_pred)

test = as.data.frame(y_pred[ c(TRUE,FALSE), ])    # rows

y_pred_class = ifelse(test$`y_pred[c(TRUE, FALSE), ]` &amp;gt; 0.9, 0, 1)
y_pred_class = as.factor(y_pred_class)
y_pred_class = as.data.frame(y_pred_class)
y_pred_class$y_test = testing$TenYearCHD
y_pred_class$y_test = as.factor(y_pred_class$y_test)
&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 601  83
         1 324  89
                                          
               Accuracy : 0.629           
                 95% CI : (0.5996, 0.6577)
    No Information Rate : 0.8432          
    P-Value [Acc &amp;gt; NIR] : 1               
                                          
                  Kappa : 0.1065          
                                          
 Mcnemar&#39;s Test P-Value : &amp;lt;2e-16          
                                          
            Sensitivity : 0.6497          
            Specificity : 0.5174          
         Pos Pred Value : 0.8787          
         Neg Pred Value : 0.2155          
             Prevalence : 0.8432          
         Detection Rate : 0.5479          
   Detection Prevalence : 0.6235          
      Balanced Accuracy : 0.5836          
                                          
       &#39;Positive&#39; Class : 0               &lt;/pre&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;



&lt;div&gt;8. 换个 threshold value 来看看能否改善 specificity 的问题&lt;/div&gt;&lt;div&gt;OK, specificity 是有一些改善。但是还不太理想。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;y_pred = predict(xgb, data.matrix(x_test))
y_pred = as.data.frame(y_pred)

test = as.data.frame(y_pred[ c(TRUE,FALSE), ])    # rows

y_pred_class = ifelse(test$`y_pred[c(TRUE, FALSE), ]` &amp;gt; 0.9, 0, 1)
y_pred_class = as.factor(y_pred_class)
y_pred_class = as.data.frame(y_pred_class)
y_pred_class$y_test = testing$TenYearCHD
y_pred_class$y_test = as.factor(y_pred_class$y_test)
&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 601  83
         1 324  89
                                          
               Accuracy : 0.629           
                 95% CI : (0.5996, 0.6577)
    No Information Rate : 0.8432          
    P-Value [Acc &amp;gt; NIR] : 1               
                                          
                  Kappa : 0.1065          
                                          
 Mcnemar&#39;s Test P-Value : &amp;lt;2e-16          
                                          
            Sensitivity : 0.6497          
            Specificity : 0.5174          
         Pos Pred Value : 0.8787          
         Neg Pred Value : 0.2155          
             Prevalence : 0.8432          
         Detection Rate : 0.5479          
   Detection Prevalence : 0.6235          
      Balanced Accuracy : 0.5836          
                                          
       &#39;Positive&#39; Class : 0               &lt;/pre&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;



&lt;div&gt;8. 可以 plot 个 bar chart 出来看看每个 factor 的重要性&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;model &amp;lt;- xgb.dump(xgb, with_stats = T)
model[1:14] #This statement prints top 10 nodes of the model

names &amp;lt;- dimnames(data.matrix(x_train))[[2]]

# Compute feature importance matrix
importance_matrix &amp;lt;- xgb.importance(names, model = xgb)
# Nice graph
xgb.plot.importance(importance_matrix[1:15,])&lt;/span&gt;&lt;/span&gt;          &lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-_McNxqq8EwU/YA2Nxmpkg2I/AAAAAAAACHA/RYzhTawiHkgoHacxI-kBE-vzAlFOBDY5QCLcBGAsYHQ/s1200/xgboost_class_important.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;693&quot; data-original-width=&quot;1200&quot; height=&quot;231&quot; src=&quot;https://1.bp.blogspot.com/-_McNxqq8EwU/YA2Nxmpkg2I/AAAAAAAACHA/RYzhTawiHkgoHacxI-kBE-vzAlFOBDY5QCLcBGAsYHQ/w400-h231/xgboost_class_important.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Ok, 总算是弄好一个 working 的 script 了。不过这 script 看起来怪怪的，总觉得那里有点做错。&lt;/div&gt;&lt;div&gt;有些地方还需要一些 trouble shooting，比方说 xgboost 里面的 objective 那个 parameter，我该去 binary:logistic 它就出 error 了，这个问题等我有机会看回，再来做 trouble shoot。今天迟了， 再弄下去恐怕三点都没得睡。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://6sigmaforum.blogspot.com/2021/01/xgboost-classification-model-r.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-_McNxqq8EwU/YA2Nxmpkg2I/AAAAAAAACHA/RYzhTawiHkgoHacxI-kBE-vzAlFOBDY5QCLcBGAsYHQ/s72-w400-h231-c/xgboost_class_important.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-7860129353857608632</guid><pubDate>Sat, 23 Jan 2021 08:49:00 +0000</pubDate><atom:updated>2021-01-23T16:59:10.286+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">R</category><title>XGBoost Linear Model - R</title><description>&lt;p&gt;这个周末我来学 XGBoost （Extreme Gradient Boosting)。也是 Supervised machine learning 的一种。之前有同事提起这个 algorithm，传说中是很厉害的。&lt;/p&gt;&lt;p&gt;今天抽空看看这个大师的&lt;a href=&quot;https://www.analyticsvidhya.com/blog/2016/01/xgboost-algorithm-easy-steps/&quot;&gt;贴&lt;/a&gt;，看起来真的很厉害。&lt;/p&gt;&lt;div&gt;这个 algorithm 可以做 Regression 和 Classification，重点是比 Random Forest 快十倍以上，而且还有特别的 parameter 可以控制 overfitting 的问题，也可以 handle na value。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;好，今天我就用之前 &lt;a href=&quot;http://6sigmaforum.blogspot.com/2020/12/multiple-linear-regression.html&quot;&gt;Multiple Linear Regression&lt;/a&gt; 的 dataset 来跑一个 demo，至于 classification 的 demo，我就留在下一个 post。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #fcff01; color: #2b00fe;&quot;&gt;如果你觉得我的 post 对你有帮助，希望你能够帮忙 click click 一下我部落格里面的广告鼓励鼓励&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. 基本的 R 设定，和把需要用的 library load 出来。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace; font-size: 12px;&quot;&gt;setwd(&quot;C:/Users/mokf/Desktop/Temp&quot;)
pacman::p_load(corrplot, broom, ggpubr, ggplot2,tidyverse, forecast, caret, 
               MASS, relaimpo, car, GGally, ggbiplot, xgboost)

raw_data = read.csv(&#39;Admission_Predict_Ver1.1.csv&#39;, header = TRUE)

head(raw_data)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace; font-size: 12px;&quot;&gt;&amp;gt; head(raw_data)
  Serial.No. GRE.Score TOEFL.Score University.Rating SOP LOR CGPA Research
1          1       337         118                 4 4.5 4.5 9.65        1
2          2       324         107                 4 4.0 4.5 8.87        1
3          3       316         104                 3 3.0 3.5 8.00        1
4          4       322         110                 3 3.5 2.5 8.67        1
5          5       314         103                 2 2.0 3.0 8.21        0
6          6       330         115                 5 4.5 3.0 9.34        1
  Chance.of.Admit
1            0.92
2            0.76
3            0.72
4            0.80
5            0.65
6            0.90&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;2. 做个数据处理，把 Serial.No 删除，再把 Research 转为 factor。也顺便看看有没有 na value&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;raw_data$Serial.No. = NULL
raw_data$Research = as.factor(raw_data$Research)
anyNA(raw_data)
df = na.omit(raw_data)
df  = raw_data&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;3. 准备 training 和 testing dataset，今天用的方法和 python 的方式相似。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;set.seed(123)    
intrain = createDataPartition(y = df$Chance.of.Admit, p = 0.7, list = FALSE)
training = df[intrain,]
testing = df[-intrain,] 

x_train = training 
x_train$Chance.of.Admit = NULL
y_train = training$Chance.of.Admit

x_test = testing
x_test$Chance.of.Admit = NULL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;4. 设定 XGBoost&amp;nbsp; model。这里有几个 parameter 可以玩。由于这组数据是 Linear Regression 的数据，所以我需要把 gbtree 的功能关掉 xgboost default setting 是 booster = ‘gbtree&#39;。anyway，入股我不指定要用什么 booster，xgbooster 就会直接用 gbtree，还是有答案出来的。但是 gblinear 和 gbtree 的 parameter 设定有些不同，所以还是分开来比较好。&lt;/p&gt;&lt;p&gt;nrounds 就好像 epoch 那样，eta 就好像 learning rate。其他的都可以先锁定在&amp;nbsp; default value。&lt;/p&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace; font-size: 12px;&quot;&gt;xgb = xgboost(data = data.matrix(x_train), 
              label = y_train, 
              nrounds = 200,
              eta = 0.3, 
              #booster = &#39;gbtree&#39;,
              booster = &#39;gblinear&#39;,
              lambda = 1,
              alpha = 0,
              lambda_bias = 0, 
              set.seed(123)
              
              )&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;5. model training 出来的 report 就像这样，default setting 是用 rmse 来量，如果不喜欢的话也可以换，要怎么换呢？就得去 help 那里参考了。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;[16:01:50] WARNING: amalgamation/../src/learner.cc:516: 
Parameters: { lambda_bias } might not be used.

  This may not be accurate due to some parameters are only used in language bindings but
  passed down to XGBoost core.  Or some parameters are not used but slip through this
  verification. Please open an issue if you find above cases.


[1]	train-rmse:0.124964 
[2]	train-rmse:0.122675 
[3]	train-rmse:0.121094 
[4]	train-rmse:0.119648 
[5]	train-rmse:0.118252 
[6]	train-rmse:0.116952 
[7]	train-rmse:0.115716 
[8]	train-rmse:0.114568 
[9]	train-rmse:0.113517 
[10]	train-rmse:0.112497 
[11]	train-rmse:0.111662 
[12]	train-rmse:0.110821 
[13]	train-rmse:0.109986 
[14]	train-rmse:0.109208 
[15]	train-rmse:0.108486 
[16]	train-rmse:0.107740 
[17]	train-rmse:0.107102 
[18]	train-rmse:0.106515 
[19]	train-rmse:0.105911 
[20]	train-rmse:0.105372 
[21]	train-rmse:0.104824 
[22]	train-rmse:0.104342 
[23]	train-rmse:0.103842 
[24]	train-rmse:0.103410 
[25]	train-rmse:0.103004 
[26]	train-rmse:0.102578 &lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;6. 用 testing dataset 来做一个 validation&amp;nbsp;&lt;/div&gt;&lt;div&gt;可以尝试改变一下 model training 得 parameter，包括把 booster 转成 booster = ’gbtree‘。看看有什么反应。这里我就不 demo 了。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;y_pred = predict(xgb, data.matrix(x_test))
y_test = testing$Chance.of.Admit
scatterplot(y_test, y_pred)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;




&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-3O6rlCORLR8/YAva3FFK-RI/AAAAAAAACGc/wSa_umsVTwIb23s4Dzizdpfnns6PAE2VwCLcBGAsYHQ/s1200/scatterplot_xg.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;758&quot; data-original-width=&quot;1200&quot; height=&quot;253&quot; src=&quot;https://1.bp.blogspot.com/-3O6rlCORLR8/YAva3FFK-RI/AAAAAAAACGc/wSa_umsVTwIb23s4Dzizdpfnns6PAE2VwCLcBGAsYHQ/w400-h253/scatterplot_xg.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;7. 可以弄个 residual plot 来看看，和 multiple linear regression model 比较，那个比较好？&lt;/p&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;y_test_res = y_test - y_pred

model_stats = as.data.frame(y_test_res)

binwidth = (max(model_stats) - min(model_stats))/15

Histogram &amp;lt;- ggplot(data = model_stats, aes(y_test_res)) +
              geom_histogram(colour=&quot;darkgray&quot;, fill=&quot;blue&quot;, binwidth = binwidth) + 
              labs(x=&quot;Residual&quot;, y=&quot;Count&quot;, title=&quot;Histogram&quot;)

Observation_Order = as.integer(row.names(model_stats))

Residual_vs_Order = ggplot(model_stats, aes(x=Observation_Order, y=y_test_res)) +   
  geom_line(color=&quot;blue&quot;) +  geom_point(color=&quot;blue&quot;, size=2) + 
  geom_hline(yintercept = 0,color=&quot;red&quot;)+ 
  labs(x=&quot;Observation Order&quot;, y=&quot;Residual&quot;, title=&quot;Residual_vs_Order&quot;)

Residual_vs_Fitted = ggplot(model_stats, aes(x=y_pred, y=y_test_res)) +   
  geom_point(color=&quot;blue&quot;, size=2) +
  geom_hline(yintercept = 0,color=&quot;red&quot;)+                     
  labs(x=&quot;Fitted&quot;, y=&quot;Residual&quot;, title=&quot;Residual vs Fitted&quot;)


QQ_Normal = ggplot(model_stats, aes(sample = y_test_res)) + 
  stat_qq() + stat_qq_line() +
  labs(x=&quot;Theoretical&quot;, y=&quot;Sample&quot;, title=&quot;QQ Nornal&quot;)

ggarrange(Histogram, Residual_vs_Fitted, Residual_vs_Order, QQ_Normal )    &lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-MWq1cd3Re4o/YAve0f-YzUI/AAAAAAAACGo/54noOEOQ_zQ284LF6cIhYqtZOFskQMH8wCLcBGAsYHQ/s1200/residual_plot_xg.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;758&quot; data-original-width=&quot;1200&quot; height=&quot;253&quot; src=&quot;https://1.bp.blogspot.com/-MWq1cd3Re4o/YAve0f-YzUI/AAAAAAAACGo/54noOEOQ_zQ284LF6cIhYqtZOFskQMH8wCLcBGAsYHQ/w400-h253/residual_plot_xg.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;8. 也可以把 important feature 弄出来看，看看那个 feature 对整个 model 的 contribution&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;important_matrix = xgb.importance(xgb$feature_names, model = xgb)

# this code is to avoid R perform auto sort of x-axis
important_matrix$Feature = factor(important_matrix$Feature, levels = important_matrix$Feature)

ggplot(data=important_matrix, aes(x=important_matrix$Feature, y=important_matrix$Weight)) +
  geom_bar(stat=&quot;identity&quot;, fill = &#39;blue&#39;)
&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-m-hVtkfLSDg/YAvibXkTOaI/AAAAAAAACG0/FBDdnN6XwG0vHN7SGKderoFkvB9YIgG_ACLcBGAsYHQ/s1200/important.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;758&quot; data-original-width=&quot;1200&quot; height=&quot;253&quot; src=&quot;https://1.bp.blogspot.com/-m-hVtkfLSDg/YAvibXkTOaI/AAAAAAAACG0/FBDdnN6XwG0vHN7SGKderoFkvB9YIgG_ACLcBGAsYHQ/w400-h253/important.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;OK，今天总算有点成绩。下一个 post 要来看看 XGBoost 怎样来处理我之前那个有 bias 的心脏病的 dataset。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #fcff01; color: #2b00fe;&quot;&gt;如果你觉得我的 post 对你有帮助，希望你能够帮忙 click click 一下我部落格里面的广告鼓励鼓励&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://6sigmaforum.blogspot.com/2021/01/xgboost-linear-model-r.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-3O6rlCORLR8/YAva3FFK-RI/AAAAAAAACGc/wSa_umsVTwIb23s4Dzizdpfnns6PAE2VwCLcBGAsYHQ/s72-w400-h253-c/scatterplot_xg.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1927580253011932483.post-7618856786553474943</guid><pubDate>Wed, 20 Jan 2021 05:24:00 +0000</pubDate><atom:updated>2021-01-23T16:59:33.768+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Pyhton</category><title>Displaying Multiple Image In One Page With Python</title><description>&lt;p&gt;今天来学习如何用 python code 来从新排列 crop 出来的图片。经过两个小时的 Google，终于找到一个至少让我看得懂的贴来做&lt;a href=&quot;https://pythonmatplotlibtips.blogspot.com/2017/12/arrange-multiple-images-in-one-large-image.html&quot;&gt;参考&lt;/a&gt;。OK 就来看看我一半抄来，一半自己弄出来的 code&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. 把需要用到的 Library load 出来。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace; font-size: 12px;&quot;&gt;# import required library
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import os
import cv2&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;2. 设定 working directory&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;# set working directory
base_dir_path = &quot;.&quot;
image_dir = os.path.join(base_dir_path,&#39;img_dir&#39;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;3. 把 image directory 里面的 file name list 出来&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;# list the image file from the image directory
files = os.listdir(image_dir)
files&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;&lt;pre style=&quot;background-color: white; border-radius: 0px; border: 0px; box-sizing: border-box; font-size: 14px; line-height: inherit; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; overflow: auto; padding: 1px 0px; vertical-align: baseline; white-space: pre-wrap; word-break: break-all;&quot;&gt;[&#39;0_100.jpg&#39;,
 &#39;10_100.jpg&#39;,
 &#39;11_100.jpg&#39;,
 &#39;12_100.jpg&#39;,
 &#39;13_100.jpg&#39;,
 &#39;14_100.jpg&#39;,
 &#39;15_100.jpg&#39;,
 &#39;16_100.jpg&#39;,
 &#39;17_100.jpg&#39;,
 &#39;18_100.jpg&#39;,
 &#39;19_100.jpg&#39;,
 &#39;1_100.jpg&#39;,
 &#39;20_100.jpg&#39;,
 &#39;21_100.jpg&#39;,
 &#39;22_100.jpg&#39;,
 &#39;23_100.jpg&#39;,
 &#39;24_100.jpg&#39;,
 &#39;25_100.jpg&#39;,
 &#39;26_100.jpg&#39;,
 &#39;2_100.jpg&#39;]&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;4. 把图片 load 上来。把所有的 image array stack 进一个大 array&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #fcff01; color: #2b00fe;&quot;&gt;如果你觉得我的 post 对你有帮助，希望你能够帮忙 click click 一下我部落格里面的广告鼓励鼓励&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace; font-size: 12px;&quot;&gt;im_qty = len(files)
fs = []
for i in range (0,im_qty):
    filename = os.path.join(image_dir,files[i])
    im = Image.open(filename)
    im = im.resize((50, 50), Image.ANTIALIAS)

    fs.append(im)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;5. 把图片的 image size 找出来&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;# get the image size 
x,y = fs[0].size&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;6. 根据我们想设定的 column 和 row，弄一张大张的图片 template。这里我做了一个小小的 automation，我只需要在 ncol 设定我要把图片排列为多少个 column，system 就会自己计算需要多少的 row 来把所有的图片 fit 进去。&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;ncol = 5
nrow = int(round(im_qty/ncol, 0))
cvs = Image.new( &#39;RGB&#39;,size = (x*ncol, y*nrow))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;




&lt;p&gt;7. 一下的 code 会把图片直线排列&lt;/p&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;for i in range(len(fs)):
    px, py = x*int(i/nrow), y*(i%nrow)
    cvs.paste(fs[i],(px,py))

cvs.save(&#39;arranged_img_1.png&#39;,format=&#39;png&#39;)
cvs &lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-ix2A32pu8w4/YAe9k2RT5DI/AAAAAAAACGI/TR3n-ATW49MwHlJFsoyQ78BCwZsgvc7HACLcBGAsYHQ/s259/apple_1.JPG&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;204&quot; data-original-width=&quot;259&quot; src=&quot;https://1.bp.blogspot.com/-ix2A32pu8w4/YAe9k2RT5DI/AAAAAAAACGI/TR3n-ATW49MwHlJFsoyQ78BCwZsgvc7HACLcBGAsYHQ/s0/apple_1.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;8. 一下的 code 会把图片横线排列&amp;nbsp;&lt;/div&gt;&lt;pre style=&quot;background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;span style=&quot;font-family: andale mono, lucida console, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;for i in range(len(fs)):
    px,py = x*(i%ncol), y*int(i/ncol)
    cvs.paste(fs[i], (px,py))

cvs.save(&#39;arranged_img_2.png&#39;,format=&#39;png&#39;)
cvs&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-6B0_40bS00A/YAe9s2hcNdI/AAAAAAAACGM/SNLMNTDzEDUrdU1IqFiFmq6WtpNq5ucwwCLcBGAsYHQ/s259/apple_2.JPG&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;206&quot; data-original-width=&quot;259&quot; src=&quot;https://1.bp.blogspot.com/-6B0_40bS00A/YAe9s2hcNdI/AAAAAAAACGM/SNLMNTDzEDUrdU1IqFiFmq6WtpNq5ucwwCLcBGAsYHQ/s0/apple_2.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;OK，完成。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #fcff01; color: #2b00fe;&quot;&gt;如果你觉得我的 post 对你有帮助，希望你能够帮忙 click click 一下我部落格里面的广告鼓励鼓励&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://6sigmaforum.blogspot.com/2021/01/displaying-multiple-image-in-one-page.html</link><author>noreply@blogger.com (I Talk - You Do)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-ix2A32pu8w4/YAe9k2RT5DI/AAAAAAAACGI/TR3n-ATW49MwHlJFsoyQ78BCwZsgvc7HACLcBGAsYHQ/s72-c/apple_1.JPG" height="72" width="72"/><thr:total>0</thr:total></item></channel></rss>