<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>技術分享 &#8211; 台灣人工智慧學校</title>
	<atom:link href="/category/hot-issues/tech-article/feed/" rel="self" type="application/rss+xml" />
	<link>https://aiacademy.tw</link>
	<description>aiacademy.tw</description>
	<lastBuildDate>Sat, 12 Jun 2021 09:20:44 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>AI 紙本資料辨識之經驗分享 &#8211; Shu-Yu Huang</title>
		<link>/ai-optical-character-recognition/</link>
		
		<dc:creator><![CDATA[aiacademy]]></dc:creator>
		<pubDate>Sat, 12 Jun 2021 05:14:33 +0000</pubDate>
				<category><![CDATA[技術分享]]></category>
		<category><![CDATA[熱門話題]]></category>
		<guid isPermaLink="false">/?p=15111</guid>

					<description><![CDATA[<p>制式的紙本資料常常被用來傳遞、儲存資訊，像是履歷中會有個人的姓名、學歷等等資料，會被人資部...</p>
<p>The post <a rel="nofollow" href="/ai-optical-character-recognition/">AI 紙本資料辨識之經驗分享 &#8211; Shu-Yu Huang</a> appeared first on <a rel="nofollow" href="https://aiacademy.tw">台灣人工智慧學校</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class=lngpost><br />
<img decoding="async" src="/wp-content/uploads/2021/06/y0.jpg" /></p>
<p>制式的紙本資料常常被用來傳遞、儲存資訊，像是履歷中會有個人的姓名、學歷等等資料，會被人資部門收集起來建檔。雖然在電腦上可以直接從資料文檔擷取資訊建檔，但有些場合還是有匯入紙本資料的需求，大致可以分為文本和標籤這兩種。文本資料擷取的情景(如圖1左)可能是印刷物需要紙本認證像是營業登記證等等文本，不能只看電腦上的資料，還要印下來籤核；或者是對印刷、手寫文本的資訊收集，像是將抄寫的水電瓦斯錶建檔。標籤資料擷取的情景可能是是文檔會被印下來貼在東西上面(如圖1右)，會有從物品標籤擷取資料的需求，像是貨物的籤條會跟著貨物走，收貨方透過籤條才能認證對的貨品再建檔。要匯入實體紙本資料常常需要人工將紙本內容理解後輸入進系統，如果可以自動辨識拍下來的內容可以省去很多不必要的人力。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y1.png" alt="圖1、文本和標籤範例" />圖1、文本和標籤範例</figure>
<h2>紙本資料圖片格式</h2>
<p>對電腦而言，圖片就是一格格的像素，除此之外一般沒有既定的格式，例如拍合照，並沒有限制男生一定要站在女生左邊。而紙本資料圖片一般來講對文數字的編排會有既定格式，會將圖片分為各個區塊。因此紙本資料辨識大致分為兩種階段：文字區辨識、連續文字辨識。其中文字區辨識也可能分數個階段做，例如第一階段辨識文字區，第二階段辨識行，而最後再對分出的行中的文數字做辨識。以下會就兩個階段做說明。</p>
<h2>A. 文字區辨識</h2>
<p>不論是文本還是標籤的紙本資料圖片，大致上都可以分為無框線和有框線兩種情況。無框線的情況下會由相對位置來區分區塊，像是履歷上最上面是姓名、照片，下面是學歷、經歷等等，也可能左邊是經歷、右邊是證照，總之區塊間有明顯的區隔，如圖2所示。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y2.png" alt="圖2、無框線紙本資料圖片範例" />圖2、無框線紙本資料圖片範例</figure>
<p>另外還有一種是有框線的情況，直接以隔線區分不同意義的區塊，例如簽到表(圖3左)上會有欄跟列，欄表示不同項目、列表示不同序列；也可能是不規則的表格，例如貨物標籤(圖3右)，每個格子會有不同意義。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y3.png" alt="圖3、 有框線紙本資料圖片範例" />圖3、 有框線紙本資料圖片範例</figure>
<p>若已經知道以上的格式則可以安排不同種類、不同布局的模型做相應的機器學習，這兩種格式區會有不同的文字區辨識方式可以用。通常會做一些資料增強來加強訓練效果，除了常見的旋轉、平移、亮度改變、色調改變之外過往也有試過將每個文字區剪下直接貼到別的地方做為增強資料，但卻得到反效果，不建議使用。應是剪下貼上的銳利邊干擾學習，且後來改成四周加上白邊後再位移則有較好的效果。</p>
<h3>A.1. 無框線文字區辨識</h3>
<p>例如為方便審核廠商資料建檔，會將對方附檔的證書key成文字，但這個建檔步驟繁雜又容易出錯，不過有固定想看的的項目，所以適合用AI做自動辨識。如圖4：第一階段會先判別文字區、第二階段辨識行、第三階段再來判別行中的連續文數字。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y4.png" alt="圖4、無框線紙本資料辨識流程範例" />圖4、無框線紙本資料辨識流程範例</figure>
<p>若沒有框線，則文字區辨識一般都會定界為物件偵測問題，會用最小矩形框從圖片中框出各個類別物件(在這邊就是文字區)的位置、長寬、類別。以下介紹RCNN系列和YOLO系列的物件偵測。</p>
<h4>A.1.1. <a target=_blank rel=nofollow href=https://github.com/broadinstitute/keras-rcnn>RCNN系列</a></h4>
<p>Regions with CNN features系列是標準2 stage network，會先生出很多預測框，在訓練時以最大化預測框及目標框的交集/聯集(IOU)為目標，若兩者有差距則IOU小(如圖5所示)接下來對這些目標框做類別預測。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y5.png" alt="圖5、IOU示意圖" />圖5、IOU示意圖</figure>
<p>初版會使用CNN生出無數個預測框，使用SVM對這些預測框進行fine tune，所以很慢。生出這個類型的loss後來還有許多改進，如Fast RCNN、Faster RCNN等等。後來的Faster RCNN使用Region Proposal Network以CNN抓出的feature map生出無數個預測框(proposals)拿來做感興趣區域(ROI)的pooling(不論是區域內平均還是最大值都算pooling)後的值做預測，大幅加快整體運作速度，如圖6所示。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y6.png" alt="圖6、Faster RCNN中ROI pooling，來源為Girshick, R. (2015). Fast r-cnn. In Proceedings of the IEEE international conference on computer vision (pp. 1440–1448)." />圖6、Faster RCNN中ROI pooling，來源為Girshick, R. (2015). Fast r-cnn. In Proceedings of the IEEE international conference on computer vision (pp. 1440–1448).</figure>
<h4>A.1.2. <a target=_blank rel=nofollow href=https://github.com/alexeyab/darknet>YOLO系列</a></h4>
<p>You Only Look Once系列希望使用CNN就能給出預測框的長寬、位置、類別。以 <a target=_blank rel=nofollow href=https://arxiv.org/abs/1506.02640>YOLOv1</a> 為例，經過多層CNN還有pooling讓feature長寬成為7&#215;7的大小，feature深度中每個維度有不同含義。它的想法是想將預測框的範圍侷限在7&#215;7個格狀附近(如圖7左所示)，然後去預測每個框離這個格子左上角的x,y距離(如圖7右所示)，還有框的長寬、種類、可信程度。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y7.jpeg" alt="圖7、TOLOv1預測框改念圖" />圖7、TOLOv1預測框改念圖</figure>
<p>後續又推出了<a target=_blank rel=nofollow href=https://arxiv.org/abs/1612.08242>YOLOv2</a>、<a target=_blank rel=nofollow href=https://arxiv.org/abs/1804.02767>YOLOv3</a>、<a target=_blank rel=nofollow href=https://github.com/alexeyab/darknet>YOLOv4</a>等等在速度和準確度上有更多進展，如圖8所示，不過通常同一種YOLO速度快時準確度就會比較低。比較標準AP()是為框線IOU在某個基準(例如5%,50%,90%等等)之上時的預測準度，詳細可以參考<a target=_blank rel=nofollow href=https://chih-sheng-huang821.medium.com/%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92%E7%B3%BB%E5%88%97-%E4%BB%80%E9%BA%BC%E6%98%AFap-map-aaf089920848>外部連結</a>。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y8.png" alt="圖8、COCO Object detection AP大小比較，來源: https://github.com/alexeyab/darknet" />圖8、COCO Object detection AP大小比較，來源: https://github.com/alexeyab/darknet</figure>
<p>目前最常用的YOLOv4在real time的執行速度下可以在 <a target=_blank rel=nofollow href=>COCO dataset</a> 達到44% mAP的準確度。而有時會將物件偵測重點放在速度上，那就有<a target=_blank rel=nofollow href=>Fast YOLO</a>系列可以用，如圖9所示。後來有<a target=_blank rel=nofollow href=>Fastest YOLO</a>將back bone CNN model改成Efficient net後讓速度還能再更上一層。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y9.png" alt="圖9，比較各代yolo準度及速度，來源: https://github.com/dog-qiuqiu/Yolo-Fastest" />圖9，比較各代yolo準度及速度，來源: https://github.com/dog-qiuqiu/Yolo-Fastest</figure>
<h3>A.2. 依框線辨識文字區</h3>
<p>例如倉儲人員需要將貨物標籤資訊建檔、或比對資訊，提供給客戶及貨運公司，那很多貨物的標籤上就有用框線分割文字區，可以透過辨識框線來區分文字區。如圖10：第一階段會先判別標籤、區塊或特定代碼，第二階段再來判別區塊中的連續文字、數字。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y10.png" alt="圖10、有框線紙本資料辨識流程範例" />圖10、有框線紙本資料辨識流程範例</figure>
<p>若紙本中有框線，除了可以定界為物件偵測問題外亦可以定界為影像分割問題。</p>
<h4>A.2.1. 物件偵測</h4>
<p>與前面無框線圖片的文字區辨識一樣，可以使用RCNN系列或者YOLO系列來偵測，都可以得到不錯的結果，如圖11所示。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y11.png" alt="圖11、使用物件偵測方法辨識有框線圖片的文字區" />圖11、使用物件偵測方法辨識有框線圖片的文字區</figure>
<h4>A.2.2. Table-OCR影像分割</h4>
<p>基於框線的特性，透過影像分割演算法將原本的標籤中有框線的部分一條一條偵測出來，接著透過預先的定義查找該項目的位置。例如我要找下列標籤中右下代碼的部分，就是介於X_line6到X_line7之間，還有Y_line3到Y_line4之間，見圖12。Table-OCR使用Unet網路去切出圖片中的直線和橫線，再混合使用opencv的erode,dilate將直線橫線精化，參考chineseocr/table-ocr。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y12.png" alt="圖12、影像分割找出框線示意圖" />圖12、影像分割找出框線示意圖</figure>
<p>為確保line的位置有對到還要做圖片歪斜的校正，簡單的方法是根據偵測出來的最左邊和最上面的線的邊緣找到三個角落來校正，範例是使用X_line0,Y_line0找出三個點，接著對左上到右上連線的傾斜角度做校正，如圖13所示。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y13.png" alt="圖13、校正圖片歪斜" />圖13、校正圖片歪斜</figure>
<h2>B. 文數字辨識</h2>
<p>當利用文字區辨識模型找出文字區塊後，就可以開始接著做文數字辨識。文數字辨識的作法比較多樣，可以用sequence to sequence的方式來解，亦或者當成物件偵測問題，甚至如果可能結果的範圍不大(例如判別數字串)，則可以當成影像分類問題。為訓練文數字，首先會將前步驟文字區判別出的最終結果存起來，然後做影像標註，值得一提的是，使用遞迴式的標註可以增快標註速度：第一次標註200張，訓練過文數字判別後使用訓練好的模型自動標註200張，修正200張的偏差後，使用400張辨識…，依此類推直到標註完全部照片，可以節省90%的時間。也可以嘗試加入使用常見的數據集例如<a target=_blank rel=nofollow href=https://www.tensorflow.org/datasets/catalog/mnist>MNIST手寫數字資料集</a>合成圖片增加訓練資料量，像是在空間中任意塞放大縮小過的MNIST數字，以期提供更多樣的數字組合來強化訓練效果，如圖14所示。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y14.png" alt="圖14、MNIST組合的影像" />圖14、MNIST組合的影像</figure>
<p>若文數字其實不是MNIST那種手寫文字而是印刷文字，則需自製印刷字體資料集，可以使用簡單的Excel把所有可能文字打出來存成圖檔。在資料上需做多種的資料增強，包含加上雜訊、銳利化、調整亮度、色調等等，都是為了適應不同的紙質以及拍攝情況，如圖15所示。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y15.png" alt="圖15、對文字做各種影像增強" />圖15、對文字做各種影像增強</figure>
<p>那以下就介紹幾種文數字判別的方案。</p>
<h3>B.1. Sequence to Sequence Model</h3>
<p>文字辨識可以透過sequence to sequence的模型來做，會從某橫向掃過圖片，對圖片單向或雙向的做解析，有點像人類辨識文字的方式。這邊介紹方便的套件<a target=_blank rel=nofollow href=https://github.com/tesseract-ocr/tesseract/wiki/4.0-with-LSTM>Tesseract 4.0</a>，它是一套<a target=_blank rel=nofollow href=https://github.com/tesseract-ocr/docs/blob/master/das_tutorial2016/6ModernizationEfforts.pdf>LSTM-based</a>的開源光學文字辨識引擎支援30種以上的語言，能分析整頁文件資料、 支援垂直書寫辨識。主要結構是將input圖片以sliding window方式由左至右(forward)還有由右至左(backword)輸入進兩個不同的LSTM中，如圖16上半所示。再來將輸出concatenate起來(也就是bi-directional LSTM)，再丟入1&#215;1 convolution壓縮channel最後使用sigmoid做output activation，如圖16中間模型圖。最後輸出會是window中偵測到某個文字與否，所以常常偵測到空字元，可以藉由空字元數量判斷是否真的是空字元(e.g. 大於2個)，如圖16下半部。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y16.png" alt="圖16、Tesseract運作模型" />圖16、Tesseract運作模型</figure>
<p>輸入資料為未經壓縮的標籤圖像文件格式(TIFF)並且背景為淡色或白色，所以需要前處理轉成灰階，如圖17所示。簡體中文能直接在上面訓練，若為繁體中文則需繁簡轉換。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y17.png" alt="圖17、將圖片灰階處裡" />圖17、將圖片灰階處裡</figure>
<p>目前大部分印刷字體都使用Tesseract來做辨識。</p>
<h3>B.2. 物件偵測</h3>
<p>文字判別問題也可以化為數個單文字或數字的物件偵測問題，如圖18所示。可使用YOLO或RCNN系列做判別，他們的各個版本這邊就不再贅述。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y18.png" alt="圖18、單文字、數字物件偵測" />圖18、單文字、數字物件偵測</figure>
<p>這邊以手寫數字辨識為例，可以使用使用<a target=_blank rel=nofollow href=https://github.com/tzutalin/labelImg>labelimg</a>標籤，如圖19所示。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y19.png" alt="圖19、使用lableimg做標籤文字的物件框" />圖19、使用lableimg做標籤文字的物件框</figure>
<p>使用結果大致如下，在一個範圍中框出所有的數字，並算出對該數字的信心指數。例如圖20所示每個數字都很有信心，數字排列應是1103。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y20.png" alt="圖20、使用物件偵測辨識文數字結果" />圖20、使用物件偵測辨識文數字結果</figure>
<h3>B.3. 影像分類</h3>
<p>出現的文數字排列組合較少時可以考慮直接做影像分類。若可能的種類有多少種就分多少類，適用於固定文數字數量的情況，例如上例手機末三碼為3個字，則可能的分類就是000~999共1000種可能。而模型的話則可以參考<a target=_blank rel=nofollow href=https://paperswithcode.com/task/image-classification>paper with code image-classification排行榜</a>，如圖21所示。</p>
<p>裡面會持續更新時下最有能力的模型，且每個資料集有分開排名，建議從樣貌和目標接近的資料集的排行榜來選要使用的模型。<br />
其中過往專題最熱門的是<a target=_blank rel=nofollow href=https://arxiv.org/abs/1905.11946>Efficient Net</a>系列，其中Efficient Net B4通常能達到速度和準確度的最佳平衡，如圖22所示。</p>
<p><figure><img decoding="async" src="/wp-content/uploads/2021/06/y21.png" alt="圖21、image classification排行榜" />圖21、image classification排行榜</figure><br />
<figure><img decoding="async" src="/wp-content/uploads/2021/06/y22.png" alt="圖22、各種classification網路做Image net的top-1 accuracy。Y軸為accuracy、X軸為速度。Tan, M., &amp; Le, Q. (2019, May). Efficientnet: Rethinking model scaling for convolutional neural networks. In International Conference on Machine Learning (pp. 6105–6114). PMLR." />圖22、各種classification網路做Image net的top-1 accuracy。Y軸為accuracy、X軸為速度。Tan, M., &amp; Le, Q. (2019, May). Efficientnet: Rethinking model scaling for convolutional neural networks. In International Conference on Machine Learning (pp. 6105–6114). PMLR.</figure></p>
<h2>小結</h2>
<p>以機器學習實作紙本資料辨識大致上是為了實體的標籤、文本建檔和認證。其中模型大致上會先做多階段的文字區辨識再做文數字辨識。視資料中有無框線，文字區辨識可能可以用物件偵測或者影像分割的方式做各階段的文字區辨識。依照紙本常常是均質的特性，比較特別的是常常可以使用剪下區塊貼上的方式做資料擴增。另外，紙本辨識依case會有不同的階段，但一定包含文數字辨識，方法多元，可能可以用sequence to sequence、物件偵測或者影像分類方式去做。紙本的文數字辨識要考慮使用的是手寫還是印刷文字，若是手寫英數字可以使用MNIST合成資料擴充訓練資料；若是印刷文字則可以把文字存成圖檔再合成資料擴充訓練資料。最後在模型選擇上，不論是物件偵測、影像分割還是影像分類，都可以從paper with code上面尋找該議題中最新最好的模型來用。</p>
<p>希望本文對想做機器學習，紙本辨識的同好有幫助!</p>
<h2>References</h2>
<ol>
<li>(RCNN)Girshick, R., Donahue, J., Darrell, T., &amp; Malik, J. (2014). Rich feature hierarchies for accurate object detection and semantic segmentation. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 580–587).</li>
<li>(Fast RCNN)Girshick, R. (2015). Fast r-cnn. In Proceedings of the IEEE international conference on computer vision (pp. 1440–1448).</li>
<li>(Faster RCNN)Ren, S., He, K., Girshick, R., &amp; Sun, J. (2015). Faster r-cnn: Towards real-time object detection with region proposal networks. arXiv preprint arXiv:1506.01497.</li>
<li>(YOLOv1)Redmon, J., Divvala, S., Girshick, R., &amp; Farhadi, A. (2016). You only look once: Unified, real-time object detection. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 779–788).</li>
<li>(YOLOv2)Redmon, J., &amp; Farhadi, A. (2017). YOLO9000: better, faster, stronger. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 7263–7271).</li>
<li>(Fast YOLO)Shafiee, M. J., Chywl, B., Li, F., &amp; Wong, A. (2017). Fast YOLO: A fast you only look once system for real-time embedded object detection in video. arXiv preprint arXiv:1709.05943.</li>
<li>(YOLOv3)Redmon, J., &amp; Farhadi, A. (2018). Yolov3: An incremental improvement. arXiv preprint arXiv:1804.02767.</li>
<li>(YOLOv4)Bochkovskiy, A., Wang, C. Y., &amp; Liao, H. Y. M. (2020). Yolov4: Optimal speed and accuracy of object detection. arXiv preprint arXiv:2004.10934.</li>
<li>(Tesseract)Smith, R. (2007, September). An overview of the Tesseract OCR engine. In Ninth international conference on document analysis and recognition (ICDAR 2007) (Vol. 2, pp. 629–633). IEEE.</li>
<li>(U-net)Ronneberger, O., Fischer, P., &amp; Brox, T. (2015, October). U-net: Convolutional networks for biomedical image segmentation. In International Conference on Medical image computing and computer-assisted intervention (pp. 234–241). Springer, Cham.</li>
<li>(Efficientnet)Tan, M., &amp; Le, Q. (2019, May). Efficientnet: Rethinking model scaling for convolutional neural networks. In International Conference on Machine Learning (pp. 6105–6114). PMLR.</li>
</ol>
</div>
<p>The post <a rel="nofollow" href="/ai-optical-character-recognition/">AI 紙本資料辨識之經驗分享 &#8211; Shu-Yu Huang</a> appeared first on <a rel="nofollow" href="https://aiacademy.tw">台灣人工智慧學校</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>YOLOv4 產業應用心得整理 &#8211; 張家銘</title>
		<link>/yolo-v4-intro/</link>
		
		<dc:creator><![CDATA[aiacademy]]></dc:creator>
		<pubDate>Sat, 05 Jun 2021 04:35:56 +0000</pubDate>
				<category><![CDATA[技術分享]]></category>
		<category><![CDATA[熱門話題]]></category>
		<guid isPermaLink="false">/?p=15079</guid>

					<description><![CDATA[<p>2020 年在 AI 領域中有不少令人振奮的技術創新，像是在電腦視覺領域的 YOLO v4...</p>
<p>The post <a rel="nofollow" href="/yolo-v4-intro/">YOLOv4 產業應用心得整理 &#8211; 張家銘</a> appeared first on <a rel="nofollow" href="https://aiacademy.tw">台灣人工智慧學校</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class=lngpost><br />
<figure><img decoding="async" src="/wp-content/uploads/2021/06/yolo1.png" alt="YOLO: Real-Time Object Detection" />YOLO: Real-Time Object Detection</figure></p>
<p>2020 年在 AI 領域中有不少令人振奮的技術創新，像是在電腦視覺領域的 YOLO v4 以及自然語言領域的 GPT-3，而 YOLO (You Only Look Once) 為物件偵測 (Object Detection) 的重要技術。</p>
<p>YOLO 首次於 2015 年 6 月由 Joseph Redmon 提出，隨著時間推進又推出了 YOLOv2 (2016.12)和 YOLOv3 (2018.04)，而在 2020.02.21 時 YOLO 之父 Joseph Redmon 宣布退出電腦視覺領域，但是這並不影響 YOLO 的進化，在 2020 年 4 月時就推出了 YOLOv4，總共有三位作者，第一個是來自俄羅斯的 Alexey Bochkovskiy，他曾經參與 YOLO github 的項目維護，而另外兩位則來自台灣，分別是中央研究院資訊所的廖弘源所長與王建堯博士，YOLOv4 在 AI Rewind 2020: A Year of Amazing Papers 榮獲 2020 年度最驚艷的論文之一，簡直是 AI 界的台灣之光。</p>
<p>那麼紅的 YOLOv4 想必大家都在使用，在我們台灣人工智慧學校技術領袖班的結業專題中，使用的組別也是大有人在。在本篇文章中，將整理一些使用 YOLOv4 的心得 : (關於技術細節方面並不會深入探討)</p>
<ol>
<li>物件偵測能應用在哪裡</li>
<li>YOLOv3 和 YOLOv4 差異</li>
<li>CFG 說明 (超參數)</li>
<li>人臉偵測的 YOLO 模型</li>
<li>模型部屬</li>
<li>使用 YOLOv4 時常見的狀況</li>
<li>結語</li>
</ol>
<h2>物件偵測能應用在哪裡</h2>
<p>物件偵測在現實生活中可以解決許多問題，例如</p>
<ol>
<li>瑕疵偵測：製造業常用的瑕疵檢測</li>
<li>社交距離+口罩偵測：目前疫情下的口罩偵測以及維持社交距離</li>
<li>人臉偵測：進一步可以發展為人臉辨識，進而實現人臉打卡、罪犯追蹤</li>
<li>交通路況偵測：促進智慧交通的發展，像是車流或是人流偵測</li>
</ol>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/yolo2.png" alt="來源：立達軟體科技股份有限公司、長庚大學、中研院" />來源：立達軟體科技股份有限公司、長庚大學、中研院</figure>
<p>YOLOv4 展示影片如 影片一 所示：</p>
<p style=text-align:center><iframe style=margin:auto;display:block width="560" height="315" src="https://www.youtube.com/embed/1_SiUOYUoOI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><span style=display:block>影片一，YOLOv4 展示影片</span></p>
<h2>YOLOv3 和 YOLOv4 差異</h2>
<p>YOLOv3 發表於 2018 年 4 月，讓我們來看看經過兩年後 YOLO 進化成怎樣吧！</p>
<p>在 圖一 和 圖二 中，分別畫出了 YOLOv3 和 YOLOv4 的網路架構圖，方便比較兩者的不同
</p>
<p><figure><img decoding="async" src="/wp-content/uploads/2021/06/yolo3.png" alt="圖一，YOLOv3 網路架構圖" />圖一，YOLOv3 網路架構圖</figure><br />
<figure><img decoding="async" src="/wp-content/uploads/2021/06/yolo3b.png" alt="圖二，YOLOv4 網路架構圖" />圖二，YOLOv4 網路架構圖</figure></p>
<p>我們可以從圖中清楚的看到兩者的區別，另外我將它們的差異整理在 <em>表格一</em> 中</p>
<style>.dataTables_scroll table,
.dataTables_scroll th,
.dataTables_scroll td{border:1px solid #ddd}
.dataTables_scroll th,
  .dataTables_scroll td{padding:4px}</style>
<p>表格一，YOLOv3 和 YOLOv4 差異</p>
<div class="dataTables_scroll">
<div class="dataTables_scrollBody" style="position: relative; overflow: auto; xwidth: 100%; max-height: 250px;">
<table cellspacing="0" class="table table base-style no-footer column-border row-border stripe dataTable text-center" xwidth="100%" id="DataTables_Table_0" role="grid" style="xwidth: 100%;">
<thead>
<tr role="row" style="height: 0px;">
<th class="sorting_disabled" rowspan="1" colspan="1" style="xwidth: 205px; padding-top: 0px; padding-bottom: 0px; border-top-width: 0px; border-bottom-width: 0px; height: 0px;">
<div class="dataTables_sizing" style="height:0;overflow:hidden;"></div>
</th>
<th class="sorting_disabled" rowspan="1" colspan="1" style="xwidth: 176px; padding-top: 0px; padding-bottom: 0px; border-top-width: 0px; border-bottom-width: 0px; height: 0px;">
<div class="dataTables_sizing">YOLOv3</div>
</th>
<th class="sorting_disabled" rowspan="1" colspan="1" style="xwidth: 263px; padding-top: 0px; padding-bottom: 0px; border-top-width: 0px; border-bottom-width: 0px; height: 0px;">
<div class="dataTables_sizing" >YOLOv4</div>
</th>
<th class="sorting_disabled" rowspan="1" colspan="1" style="xwidth: 635px; padding-top: 0px; padding-bottom: 0px; border-top-width: 0px; border-bottom-width: 0px; height: 0px;">
<div class="dataTables_sizing" >為什麼要這樣改進</div>
</th>
</tr>
</thead>
<tbody>
<tr role="row" class="odd">
<td>Backbone</td>
<td>Darknet53</td>
<td>CSPDarknet53</td>
<td>參數量減少，進而減少運算量，甚至能提高準確率</td>
</tr>
<tr role="row" class="even">
<td>Neck</td>
<td>FPN</td>
<td>PANet + SPP</td>
<td>提升局部特徵和全局特徵的融合，進而豐富最終特徵圖的表達能力</td>
</tr>
<tr role="row" class="odd">
<td>Head</td>
<td>YOLO</td>
<td>YOLO</td>
<td>None</td>
</tr>
<tr role="row" class="even">
<td>Activations</td>
<td>leaky-ReLU</td>
<td>leaky-ReLU + Mish</td>
<td>Mish 的梯度更平滑，可以穩定網路梯度流，具有更好的泛化能力</td>
</tr>
<tr role="row" class="odd">
<td>Bounding box regression loss</td>
<td>MSE loss</td>
<td>CIoU-loss</td>
<td>使得訓練和推論時用的驗證標準一致，並且能更好的學習 Bounding box</td>
</tr>
<tr role="row" class="even">
<td>Data Augmentation</td>
<td>Pixel-wise adjustments</td>
<td>Mosaic</td>
<td>由 4 張影像拼成 1 張影像，增加了許多小目標，且 Mini-batch 減少 4 倍，進而減少 GPU 的計算 </td>
</tr>
<tr role="row" class="odd">
<td>Regularization</td>
<td>Dropout</td>
<td>DropBlock</td>
<td>由於圖片是連續的，所以選擇隨機 dropout 掉一整個區域</td>
</tr>
<tr role="row" class="even">
<td>Normalization</td>
<td>Batch Normalization (BN)</td>
<td>Cross mini-Batch Normalization (CmBN)</td>
<td>可以更好的適用於小的 batch size 上</td>
</tr>
<tr role="row" class="odd">
<td>Attention Module</td>
<td>None</td>
<td>Spatial Attention Module (SAM)</td>
<td>增加注意力機制，使得不會因為網路的加深而忘記前面的訊息</td>
</tr>
<tr role="row" class="even">
<td>Loss function trick</td>
<td>None</td>
<td>Class label smoothing, Grid Sensitivity</td>
<td>解決在 Grid 邊緣時較難偵測到的問題</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>假如讀者想要了解細節，可以參考以下的文章連結，這邊就不多加撰述了：</p>
<ul>
<li>YOLOv3: <a rel="nofollow noopener" href="https://medium.com/ching-i/yolo%E6%BC%94%E9%80%B2-2-85ee99d114a1" =_blank target="_blank">YOLO演進 — 2 — YOLOv3詳細介紹</a></li>
<li>YOLOv4: <a rel="nofollow noopener" href="https://medium.com/ching-i/yolo%E6%BC%94%E9%80%B2-3-yolov4%E8%A9%B3%E7%B4%B0%E4%BB%8B%E7%B4%B9-5ab2490754ef" =_blank target="_blank">YOLO演進 — 3 — YOLOv4詳細介紹</a></li>
</ul>
<h2>CFG 說明 (超參數)</h2>
<p>常見的深度學習框架是 TensorFlow 和 PyTorch，而 YOLO 作者基於 C 和 CUDA 寫了一個相對小眾的深度學習框架 — Darknet，優點是易於安裝，以下提供了一些 source code 可以訓練 YOLO 模型，詳細訓練說明可以查看 github。</p>
<ol>
<li>Darknet — <a href="https://github.com/AlexeyAB/darknet" =_blank =nofollow target="_blank" rel="noopener">https://github.com/AlexeyAB/darknet</a></li>
<li>TensorFlow — <a href="https://github.com/hunglc007/tensorflow-yolov4-tflite" =_blank =nofollow target="_blank" rel="noopener">https://github.com/hunglc007/tensorflow-yolov4-tflite</a></li>
<li>PyTorch — <a href="https://github.com/WongKinYiu/PyTorch_YOLOv4" =_blank =nofollow target="_blank" rel="noopener">https://github.com/WongKinYiu/PyTorch_YOLOv4</a></li>
</ol>
<p>在使用 darknet 訓練時可以根據更改 CFG，來調整自己的需求，有關 CFG 的說明可以參考下列說明</p>
<ol>
<li>CFG Parameters in the [net] section</li>
<li>CFG Parameters in the different layers</li>
</ol>
<p>在這邊我會列幾個比較重要的超參數，並解說一下它的重要性</p>
<h3>Inputs:</h3>
<ul>
<li>batch: 就是常見的 batch size，一次丟 batch size 筆的資料給模型訓練</li>
<li>subdivisions: 若 GPU 記憶體不夠的話可以調整這個參數，mini_batch = batch/subdivisions，而 mini_batch 才是實際送進去訓練的 batch</li>
<li>width: 影像的寬</li>
<li>height: 影像的高</li>
</ul>
<h3>Data augmentation:</h3>
<ul>
<li>angle, saturation, exposure, hue, blur: 基本的資料擴增方法</li>
<li>mosaic: 在 YOLOv4 提出的方法，可以將四張影像拼成一張，進而減少運算量和增加小物體目標</li>
<li>letter_box: 保持長寬比，通常我們希望物體不要有變形，因此都會讓它保持長寬比</li>
</ul>
<h3>Optimizer:</h3>
<ul>
<li>policy: 學習率的動態調整策略包含: constant, sgdr, steps, step, sig, exp, poly, random，詳細如何使用請參考上面的連結，預設的話是使用 steps 這個策略：<em>steps 和 scales 是綁在一起的，steps=400000,450000、scales=.1,.1 的意思是在第 400000 和 450000 時各將學習率乘以 0.1</em></li>
<li>label_smooth_eps: 使用 label smoothing 的參數</li>
</ul>
<h3>yolo layer:</h3>
<ul>
<li>mask: anchors 的 index，每層 yolo layer 會選擇 3 個 anchors</li>
<li>anchors: YOLO 算法中一個很重要的東西，anchor-based 的物件偵測方法都會使用到，在 darknet 中可以使用 calc_anchors 透過 k-means 來根據訓練資料聚合出指定類別數的 anchors，值得一提的是每層 yolo layer 需要 3 個 anchor，而 YOLOv4 有三層 yolo layer 因此需要聚合出 9 個 anchor，另外 YOLOv4-tiny 比較輕量，所以只有兩層 yolo layer 因此只需聚合出 6 個 anchor，作者也有提供 YOLOv4-tiny 三層 yolo layer 的版本。</li>
<li>ignore_thresh: 若預測的 Bounding box 和 Ground truth 的 IoU 大於此參數，則納入 loss 的計算，通常用 0.5~0.7</li>
<li>scale_x_y: 用來防止 Eliminate grid sensitivity 的問題</li>
<li>iou_loss: 有 mse, giou, diou, ciou 可以選擇，YOLOv4 使用了 ciou 取代了 mse 來當作計算 BBOX 的 loss</li>
<li>random: 代表每 10 次迭代輸入影像會隨機縮放到 x/1.4~1.4x，這樣在推論時才可以適應各種影像的尺寸。</li>
</ul>
<h2>人臉偵測的 YOLO 模型</h2>
<p>在這邊我使用了官方提供的 darknet 來訓練一個人臉偵測模型，人臉資料集選用 <a href="http://shuoyang1213.me/WIDERFACE/" =_blank =nofollow target="_blank" rel="noopener">WIDER FACE Dataset</a> 共有 32203 張圖像其中包含 393703 個人臉目標，分別在尺度、姿勢、標準、表情、裝扮和光照有不同的表現，如 圖三 所示，其中 40% 為訓練集、10% 為驗證集、50% 為測試集。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/yolo5.png" alt="圖三，wider face dataset" />圖三，wider face dataset</figure>
<p>而我分別使用 YOLOv3 和 YOLOv4 去訓練，各用兩顆 GPU 的訓練時間分別是 14.5 小時和 17 小時， YOLOv4 的訓練時間雖然比較長，但是比起 YOLOv3 偵測人臉的效果好很多 (在 圖四 中可以看到在 mAP 這個評估指標下 YOLOv3 最高的 mAP 是 61%，而 YOLOv4 比 YOLOv3 高了 7.5% 來到了68%)，這個關鍵在於說 YOLOv4 在訓練時增加了很多 YOLOv3 沒有使用到的技巧。</p>
<p><em>mAP介紹：<a href="https://chih-sheng-huang821.medium.com/%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92%E7%B3%BB%E5%88%97-%E4%BB%80%E9%BA%BC%E6%98%AFap-map-aaf089920848" =_blank =nofollow target="_blank" rel="noopener"></a>深度學習系列: 什麼是AP/mAP?</em><br />
<figure><img decoding="async" src="/wp-content/uploads/2021/06/yolo6.png" alt="圖四，YOLOv3 和 YOLOv4 的 training history 之 1" />圖四，YOLOv3 和 YOLOv4 的 training history 之 1</figure><br />
<figure><img decoding="async" src="/wp-content/uploads/2021/06/yolo6b.png" alt="圖四，YOLOv3 和 YOLOv4 的 training history 之 2" />圖四，YOLOv3 和 YOLOv4 的 training history 之 2</figure></p>
<p>另外我實際推論了一個在菜市場邊走邊錄影的影片，如 影片二 所示。可以觀察到他們兩個模型的效果其實都很好，但如果仔細觀看的話可以發現 YOLOv4 連特別小的人臉都可以偵測出來，很仔細的話&#8230;</p>
<p style=text-align:center><iframe style=margin:auto;display:block width="560" height="315" src="https://www.youtube.com/embed/EtcrMvwgb3g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><span style=display:block>影片二，YOLOv3 和 YOLOv4 在影片的推論比較</span></p>
<p>在 圖五 這張照片的比較中，乍看之下好像沒什麼區別，但是如果認真看的話在小目標上 YOLOv4 會把臉框的更精準，看不清楚沒關係，我們放大左上方的位置來比較看看，結果如 圖六 中所示，可以看到 YOLOv4 會把人臉包覆的更好</p>
<p><figure><img decoding="async" src="/wp-content/uploads/2021/06/yolo7.png" alt="圖五，YOLOv3 和 YOLOv4 在照片的推論比較" />圖五，YOLOv3 和 YOLOv4 在照片的推論比較</figure><br />
<figure><img decoding="async" src="/wp-content/uploads/2021/06/yolo8.png" alt="圖六，放大 圖五 左上方的畫面" />圖六，放大 圖五 左上方的畫面</figure></p>
<h2>模型部屬</h2>
<p>近幾年來的 AI 落地最火紅的應該就是 Edge AI，在 圖七 中我們可以看到 Edge AI 在最頂端的地方</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/06/yolo9.png" alt="圖七，Hype Cycle for AI in 2020" />圖七，Hype Cycle for AI in 2020</figure>
<p>我們在訓練模型通常是在 Cloud 端上訓練，人們想著模型架構越大準確率越高越好，而想在 Edge 端上運行 AI 模型並實現 real time 就會受運算資源影響，因此需要模型架構小且推論速度快的模型，因此在 2020 年 11 月又推出了 Scaled-YOLOv4，他能讓你選擇要準確率還是要推論速度。</p>
<ul>
<li>
<p>若要求準確率可以選擇在 Cloud 端上運行 YOLOv4-large 模型: YOLOv4-P5, YOLOv4-P6, YOLOv4-P7，在 圖八 中可以觀察到 YOLOv4-large 的 AP (綠色的線) 都比 YOLOv4 (灰色的線) 要好<br />
    <figure><img decoding="async" src="/wp-content/uploads/2021/06/yolo10.png" alt="圖八，YOLOv4-large performence" />圖八，YOLOv4-large performence</figure>
    </p>
</li>
<li>
<p>若要求速度可以選擇在 Edge 端上運行 YOLOv4-tiny 模型，作者在不同 Nvidia GPU 設備中測試 YOLOv4-tiny 的速度，包括 Xavier AGX, Xavier NX, Jetson TX2, Jetson NANO，在 表格二 中比較了 FP32 的精度和 FP16 的精度的推論速度，在 NANO 中 FP32 的 FPS 為 16，而 FP16 的 FPS 可以達到 39，可以看到速度大概差了兩倍多<br />
    <figure><img decoding="async" src="/wp-content/uploads/2021/06/yolo11.png" alt="表格二，" />表格二，</figure></p>
<p>影片三 是我實際使用 Jetson Nano 並用 FP16 的精度經由 TensorRT 加速後的結果，可以看到在預測單個人時可以高達 39 FPS，並且 YOLOv3-tiny 和 YOLOv4-tiny 的推論速度沒有太大的差異</p>
<p><a href="/wp-content/uploads/2021/06/yolo12.gif" target=_blank>影片三，YOLOv4-tiny on Jetson nano</a></p>
<p>除了官方提供的 tiny 系列，有些非官方的甚至提出了可以在 CPU 上達到 Real time 速度的 YOLO 模型，在這邊列給各位參考，當然在準度方面就不能太要求，在準度和速度方面需要自己取捨：</p>
</li>
<li>Yolo-Fastest: <a href="https://github.com/dog-qiuqiu/Yolo-Fastest" =_blank =nofollow target="_blank" rel="noopener">https://github.com/dog-qiuqiu/Yolo-Fastest</a></li>
</ul>
<h2>使用 YOLOv4 時常見的狀況</h2>
<ul>
<li>由於預設 cfg 的 anchors 是使用 coco datasets 計算出來的 anchors，在訓練自己的資料集時不一定適用，因此需要使用 calc_anchors 來計算出適合自己 datasets 的 anchors。</li>
<li>如果是在類似 colab 這種不能有彈出式視窗的環境下訓練時，後面記得要加 -dont_show，不然會報錯，例如：
<pre>$ darknet detector train data/coco.data data/yolov4-coco.cfg data/yolov4-csp.conv.142 -dont_show</pre>
</li>
<li>當發生類別不均衡時可以使用 GAN 的方法來自己生成數量較少的資料，例如在瑕疵檢測中，一定有一些瑕疵是很少出現的，這時候可以使用 segmentation 的方法將瑕疵切出來再貼到想要貼上去的背景影像，若想要將其更無違和的貼上去可以使用 GP-GAN 的方法，如 圖九 所示。<br />
<figure><img decoding="async" src="/wp-content/uploads/2021/06/yolo13.png" alt="圖九，GP-GAN 達成無違和合成" />圖九，GP-GAN 達成無違和合成</figure>
    </li>
<li>當你開始訓練了，結果只訓練一下就斷掉有 segmentation fault (core dumped) 的情形發生，這時會生成出 bad.list ，裡面會記錄一些不正常的訓練檔案，例如你的 x, y, w, h 有 ≤ 0 的狀況，更正後就可以訓練了。</li>
<li>若訓練完模型，想在 Python 中做進一步的應用，可以使用 opencv 來 load YOLOv4 的 weights 和 cfg 檔，範例 code 如下：
<pre>import cv2
CONFIDENCE_THRESHOLD=0.2
NMS_THRESHOLD=0.4
net = cv2.dnn.readNet("yolov4.weights", "yolov4.cfg")
model = cv2.dnn_DetectionModel(net)
model.setInputParams(size=(416, 416), scale=1/255, swapRB=True)
classes, scores, boxes = model.detect(img, CONFIDENCE_THRESHOLD, NMS_THRESHOLD)</pre>
<p><a href="https://gist.github.com/YashasSamaga/e2b19a6807a13046e399f4bc3cca3a49" =_blank =nofollow target="_blank" rel="noopener">YOLOv4 inference using OpenCV DNN</a></li>
<li>在 edge 端上用 yolov4-tiny-3l.cfg 的 mAP 比 yolov4-tiny.cfg 高，可以觀察到 3 層 yolo layer 在偵測小物體上還是很有用的。令人驚訝的是推論的速度居然沒有差多少，讀者可以考慮使用 yolov4-tiny-3l.cfg 來應用在 edge 端上。而再進一步的使用四層 yolo layer 時效果並沒有比三層的好，看來在這個人臉偵測的任務中三層 yolo layer 就足夠了。
</li>
</ul>
<h2>結語</h2>
<p>YOLOv4 是個簡易上手又效果很好的工具，在很多產業應用上都可以使用它來解決問題，例如在製造業上可以偵測出有異常的產品、在農業上可以偵測出水稻的位置，進而估算出收穫量、在當今疫情下可以偵測出人臉，並搭配熱影像溫度偵測來判斷進出人員有無發燒、在智慧交通上可以偵測出車輛或行人的流量，進而控制紅綠燈的秒數，讓交通更有效率！看了那麼多案例，心動不如馬上行動，還沒用過的快來試試看吧！</p>
<p>而近年來不同於 anchor-based 的物件偵測方法也開始雨後春筍般地冒出，例如 anchor-free 的方法、基於 Transformer 的方法，若對其他實現物件偵測的方法有興趣的話也可以去查看看哦</p>
<h2>Reference</h2>
<ol>
<li><a href="https://arxiv.org/abs/2004.10934" =nofollow =_blank target="_blank" rel="noopener">YOLOv4: Optimal Speed and Accuracy of Object Detection</a></li>
<li><a href="https://arxiv.org/abs/2011.08036" =nofollow =_blank target="_blank" rel="noopener">Scaled-YOLOv4: Scaling Cross Stage Partial Network</a></li>
</ol>
</div>
<p>The post <a rel="nofollow" href="/yolo-v4-intro/">YOLOv4 產業應用心得整理 &#8211; 張家銘</a> appeared first on <a rel="nofollow" href="https://aiacademy.tw">台灣人工智慧學校</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Finance AI 人工智慧在金融保險業中的應用 &#8211; 林愛哲 Tom Lin</title>
		<link>/finance-ai-application/</link>
		
		<dc:creator><![CDATA[aiacademy]]></dc:creator>
		<pubDate>Sat, 22 May 2021 03:32:07 +0000</pubDate>
				<category><![CDATA[技術分享]]></category>
		<category><![CDATA[熱門話題]]></category>
		<guid isPermaLink="false">/?p=15014</guid>

					<description><![CDATA[<p>引言 在本篇文章中，將整理過往我在台灣人工智慧學校中所帶過的金融與保險專題與個人研究，略略...</p>
<p>The post <a rel="nofollow" href="/finance-ai-application/">Finance AI 人工智慧在金融保險業中的應用 &#8211; 林愛哲 Tom Lin</a> appeared first on <a rel="nofollow" href="https://aiacademy.tw">台灣人工智慧學校</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class=lngpost>
<h2>引言</h2>
<p>在本篇文章中，將整理過往我在台灣人工智慧學校中所帶過的金融與保險專題與個人研究，略略分享作為金融從業人員，如果妥善掌握AI，優化自身業務，與在AI導入過程中，如何克服常見的困難。分享實例包含：
</p>
<ul>
<li>如何掌握機器學習模型，處理連續性數值的預測。</li>
<li>如何應用自然語言處理模型，從法律文件中，粹取出有用的資訊。</li>
</ul>
<h2>Technique General Overview</h2>
<p>在人工智慧領域中，我們可依照應用的「資料結構」與「技術」約略區分為三大分支：</p>
<ul>
<li>結構型資料：依統計理論為背景建置的模型，或是強調在擬合資料分佈狀況的機器學習(ML)。</li>
<li>圖片型資料：不論是圖片、影片，都可使用深度學習中的電腦視覺(CV)模型，進行圖片資訊的粹取與預測。</li>
<li>文字或時序型資料：最後在人類語言訊息的粹取，或是與時間序列資料有關的資料，都可以使用自然語言處理(NLP)的模型進行預測。</li>
</ul>
<p>因此，落地到金融業中，我們可以如何妥善應用人工智慧，優化金融業者的既有業務，並且深化其在同業中的競爭優勢呢？</p>
<p>下表是倫敦Fintech研究機構Autonomous Research在2019年，針對銀行業，以前中後台三個階段，分析AI所能夠帶來的價值提升。</p>
<p>從圖中，我們可看到Conversational Banking，這就是應用了NLP的技術；而Anti-fraud and Risk的模型，常常是建置在ML技術上；最後我們看到的AI Bio-metrics Technology，就會是使用CV的模型處理。</p>
<figure><img decoding="async" src="/wp-content/uploads/2021/05/figb0.png" alt="資料來源：https://www.businessinsider.com/ai-in-banking-report" />資料來源：https://www.businessinsider.com/ai-in-banking-report</figure>
<p>因此，回到本篇的主旨，就讓我們事不宜遲，來看看有哪些具體AI應用在金融服務，特別是保險業當中，並且我們又該如何克服模型建立中所會遇到的問題吧！
</p>
<h2>案例分享一：保費預測</h2>
<h3>背景說明</h3>
<p>對於一份保險來說，保險業者與客戶雙方應該最重視的是保險費用。在某些特殊的保險，保費的估計會因為種種外在的條件而有很大的差異，保險公司因而需要花人力與時間來報價。是否有更好的方法來輔助保險公司，是我們這個案例想分享的重點。</p>
<h3>專案目標</h3>
<p>— 透過Machine Learning的技巧，學習過往保費估價人員進行估價的hidden Know-how，透過此方式，自動化後續保險案件的估價流程。</p>
<p>在處理此問題時，我們可以羅列出模型建置中，最常出現的幾大問題，這些問題不限於專案，其實在許多其它使用結構化資料進行建模時，也會常常碰到的困難。</p>
<ul>
<li>難題一：缺失值的處理</li>
<li>難題二：離群值/偏態的處理</li>
<li>難題三：類別欄位的值特別多 (High Cardinality)</li>
<li>難題四：如何進行特徵解釋</li>
</ul>
<p>接下來讓我們一一來探討，面對這些問題，可以如何處理。</p>
<h3>缺失值的處理</h3>
<figure><img decoding="async" src="/wp-content/uploads/2021/05/figb1.png" alt="為保護資料源，在此使用公開之Boston House Price資料集，作為示範" />為保護資料源，在此使用公開之Boston House Price資料集，作為示範</figure>
<p>在處理缺失值上，我們可以先使用horizontal bar chart來進行觀察，也可以繪製輔助線，如上圖中的紅色直線，作為是否要將該欄位刪除的依據。</p>
<p>更完整的EDA，其實也可以使用一些既成開源的套件，例如 <a href="https://github.com/ResidentMario/missingno" =_blank target="_blank" rel="noopener">missingno</a> 或是 <a href="https://github.com/pandas-profiling/pandas-profiling" =_blank target="_blank" rel="noopener">pandas-profiling</a>，這些都可以幫助我們更了解資料。重要的是，透過視覺化的方式，來察看missing value是否有一個固定的pattern，這樣方便我們判別是否資料在收集來源處，就出了問題，需要深入了解。
</p>
<p>一般在面對數值欄位的缺失補值，都會以平均數，或是中位數替代，比較sophisticated的作法，則會使用 <a href="https://github.com/scikit-learn-contrib/imbalanced-learn" =_blank target="_blank" rel="noopener">SMOTE</a>，相關的介紹，可以查看所附連結。</p>
<p>面對類別值欄位，我們最直觀的作法是使用眾數進行補值，但是這有個盲點，我們需要看類別值的出現頻率，是否是近似uniform distribution，還是主要集中在幾個類別值上。眾數補值的作法，通常僅適用在有高頻的類別值上，才比較適合，否則將缺失值歸類到其它，或是直接discard整筆資料，也是一個作法。</p>
<h3>離群值/偏態的處理</h3>
<figure><img decoding="async" src="/wp-content/uploads/2021/05/figb2.png" alt="針對目標變數的分佈，繪製PP Plot與Density Histogram" />針對目標變數的分佈，繪製PP Plot與Density Histogram</figure>
<p>針對離群值/偏態，可以直接先觀察目標變數的分佈情況，如果其呈現高度的偏態，如上圖所示，或許我們可以猜測這個群體，其實是由多個分佈組合而成，比較好的作法，特別是在有雙峰的情況下，是直接將資料集依照目標變數的分佈，進行切割，再各自建模。</p>
<h3>類別欄位的值特別多(High Cardinality)</h3>
<p>High Cardinality — 指的是類別欄位中，類別的種類太多了，最極端的狀況，就是User ID，當將這類的欄位，使用一般的One-Hot-Encode，放入Feature Set當中進行建模，模型往往不容易進行收斂，並且運算量會變得非常大，因此比較適當的作法，一是可以使用簡易的Label-Encode，之後再使用Tree-based的非線性模型，進行擬合。比較advanced的作法，可以使用embedding的方式(當然前提是資料筆數夠多)，將類別值，壓縮到一個小維度的space上頭，使用該方式也能夠讓對target variable的impact相似的類別值，會有比較相同的vector。</p>
<p>另外一個模式，是透過特徵篩選後，只選定幾個比較重要的類別欄位，與該問題的domain expert一同討論，一個個欄位，來重新分類裡面的類別值，截取出最重要的幾個類別值，而將不重要的值，統一歸納到其它值，透過這樣對資料仔細的調整，最後建置出來的模型，一般來說準確度會非常高。
</p>
<h3>如何進行特徵解釋</h3>
<p>導入AI模型中，往往我們不單只希望產出一個可進行預測的模型，我們也會希望能夠透過模型，告訴我們哪一些最重要的因子，如何來影響我們在意的target variable，例如此例的保費。</p>
<p>過去我們可以透過觀察迴歸模型的係數，來了解特徵對於目標變數的影響，但是隨著我們可以使用的模型越來越複雜，像非線性的tree-based model甚至是DNN模型，如何從這些模型中，取得特徵對於target variable的影響，就很重要。</p>
<p>在這邊我們使用了兩種方法，一種是常見的feature importance，另外一個則是SHAP value。</p>
<p><figure><img decoding="async" src="/wp-content/uploads/2021/05/figb3.png" alt="[資料來源] Feature Importance的效果呈現示意圖" />[資料來源] Feature Importance的效果呈現示意圖</figure><br />
<figure><img decoding="async" src="/wp-content/uploads/2021/05/figb4.png" alt="[資料來源] SHAP values典型的成效圖" />[資料來源] SHAP values典型的成效圖</figure></p>
<p>Feature Importance這個在tree-based model下很好的工具，有一個致命的缺陷，那就是我們僅得知這個特徵很重要，但無法得知它對target variable是正向或是負向的影響。因此SHAP values就因應這個需求而誕生。</p>
<p>使用SHAP values，我們不但可以知道哪些特徵是最重要的，同時它對於target variable是正向或是負向的影響，都可以透過視覺化的方式呈現。如同上方的示意圖，紅色值代表特徵值越大，如果它對應的SHAP value越大，就表示它對target variable的正相關越明顯。</p>
<p>如果對於SHAP value的計算原理，想更進一步地了解，可以閱讀本校Evans助教曾寫過的兩篇深入淺出的SHAP介紹，與另外一篇發表在towards data science上的文章：
</p>
<ul>
<li><a rel="nofollow noopener" href="https://medium.com/ai-academy-taiwan/explain-your-machine-learning-model-by-shap-part-1-228fb2a57119" target="_blank">Explain Your Machine Learning Model by SHAP. (Part 1)</a></li>
<li><a rel="nofollow noopener" href="https://medium.com/ai-academy-taiwan/explain-your-machine-learning-model-by-shap-part-2-df1afd9fa06f" target="_blank">Explain Your Machine Learning Model by SHAP. (Part 2)</a></li>
<li><a href="https://towardsdatascience.com/explain-your-model-with-the-shap-values-bc36aac4de3d" rel="nofollow noopener" target="_blank">Explain Your Model with the SHAP Values</a></li>
</ul>
<h3>最後成果</h3>
<p>透過上述一系列的作法，在處理保費自動報價上，模型可以達到R²分數0.9以上的準確度，並且在使用連續三個季度的資料，進行驗證，其R²分數，都非常穩定，表示模型的表現非常robust。
</p>
<p>許多人對於建模，往往會認為使用複雜的Ensemble modeling，才可以建構出最佳的模型，但是使用Ensemble，一方面會消耗大量的運算資源，並且容易有over-fitting的狀況，在本案中，可以佐證透過適合的資料前處理，使用一般的模型(簡易的Random Forest Model)，就能夠on par with ensemble model的精準度。</p>
<p>本案例仍然以結構型資料並素材，進行模型建置，但目前在國外，已開始有保險理賠業者利用非結構化的影像，進行模型訓練，從而透過模型的自動判斷，簡化理賠流程。詳細內容，可參考此此連結：“<a href="https://technews.tw/2021/04/15/car-insurance-use-ai-to-settlement-of-claims/" =_blank target="_blank" rel="noopener">AI 計算汽車理賠，汽車維修業大敵來了</a>”
</p>
<h2>案例分享二：金融法律文件的重要元素粹取</h2>
<h3>背景說明</h3>
<p>在保險業務中，保費估算是一個重點，另一個重點是保險合約。對於保險公司而言，合約的條款一旦有錯誤，會影響成千上萬的保戶，並且造成保險公司巨大的損失。因此保險公司需要花大量的人力進行保單文件的校對，是否有更好的方法來輔助保險公司，是我們這個案例想分享的重點。</p>
<h3>專案目標</h3>
<p>— 透過NLP當中的BERT模型，依特定情境需要而客製訓練Named Entity Recognition模型。透過該模型，highlight出最法律文件當中最需要再次校訂的部份，方便文件審核人員偵錯與對照。</p>
<p>處理NLP問題時，有兩大方式，可以處理，一是較為傳統的rule-based text parsing，像是正則表達法(regular expression)；另一個則是新近常見的Deep Learning(DL) transformer model，以下是我們在處理NLP問題時，常需要預先思考的面向。</p>
<ul>
<li>難題一：Rule-based V.S. Model-based</li>
<li>難題二：如何定義好的元素類別</li>
<li>難題三：訓練資料的處理技巧</li>
<li>難題四：如何提升少數樣本的類別準確度</li>
</ul>
<p>接下來，我會一一藉著對這些問題的探討，來分享如何建構一個高品質的NLP模型。</p>
<h3>Rule-based V.S. Model-based</h3>
<p>針對NLP的問題，許多人一開始會跳下去直接使用最複雜，當然也是最先進的DL模型。但其實有許多問題，或許直接透過rule-based的regular expression，就可以達到非常好的成效。依照sapCy套件作者的意見，如果我們手頭上要parsing的text，使用regular expression就可以達到九成以上的準確度，那麼或許我們就不一定要直接跳到使用DL NLP model。</p>
<p style=font-style:italic>那麼，何時我們需要轉向使用model-based的NER模型呢？</p>
<p>最直觀的判斷，就是使用regular expression的方式，有沒有辨法有效identify出我們想關注的字詞。例如，如果字詞在文本context中會有多義的狀況出現，那麼這個字詞可能就會被mis-labeled。</p>
<p>另外一個狀況是想關注的詞彙類別，會有變型出現，那使用rule-based的方法，就會漏標註這些資料，例如，針對存款產品，會出現：活期存款、定期存款、證券存款、甚至是現在衍申的員工存款、綠存款等。
</p>
<p>如果是為了要因應辨別未來變型的詞彙，使用model-based的方式，往往會比rule-based的方式來得好，因為model-based的方式，是透過辨識詞彙在句子中的相對關係，來判斷詞彙的類別，這讓模型更為flexible，可以處理新衍生的詞彙。</p>
<h3>如何定義好的元素類別</h3>
<p>在建立一個NER模型時，最常出現不知道該如何將想關注的詞彙，分成幾大類的狀況。這通常是需要一個不斷修正的過程，建議的方式，是先將類別區隔的比較細，這樣即便後來想要使用比較大類的類別進行訓練時，也不需要重新label資料，將其中幾項類別合併成「中類」或是「大類」即可。</p>
<p>另一個在設定label類別過程中，需要確認是否這個類別定義是非常清楚，也就是self-explanatory，實務上，可以讓兩位以上的資料標注人員label同一份文件，如果大家對於要將哪些詞彙歸納在哪個類別上，都沒有什麼歧異，那就表示這個label的類別定義應該是清楚好判斷的。</p>
<p>這個步驟很重要，因為這樣才能確保訓練資料的label品質。</p>
<h3>訓練資料的處理技巧</h3>
<p>針對訓練資料，在放入Bert模型訓練前，還有一個地方要注意，就是Bert最常只能夠接收512個字，當作一筆文本的input。但是大多時候，我們的文章，往往都超過512個字。最簡單地作法，就是直接將文章進行truncate，取前面512個字，但是這樣文章的後面，就沒辨法讓模型學習，所以有另外一個比較好的作法，是將一篇文章，切割成一段一段。例如以一個句點作為切割點。有一些為了增加文句的變化性，也可以用sliding window的方式，將一整段文句，透過slide的方式，生成頭尾和前後段文句都會over-lapping的input。</p>
<p>另外一個常見需要處理的問題，就是整段句子中，都沒有需要被highlight的類別，針對這類句子，就是常見的負樣本，這種樣本通常會比正樣本數量多出非常多，因此在訓練中，可以剔除部份的負樣本，這樣可以減輕在訓練中imbalanced data的狀況，讓模型可以學的更好。
</p>
<h3>如何提升少數樣本的類別準確度</h3>
<p>在分類文本中，一定會有一些類別，因為它的樣本特別少，導致它的分類準確度會下降很多，這時，可以透過confusion matrix的方式，觀察模型到底是在哪幾類別上的分類效果特別差，因此需要針對這些類別的樣本，再進行加工，不論是直接重複製該類別樣本，增加訓練集數量，或是人工製作假的該類別樣本，來讓模型更多機率接觸這類的類別，可以真正地學習到如何正確分類少樣本的類別。</p>
<h3>最後成果</h3>
<p>原本這個專題在使用Bert為主的NER模型訓練時，會發現模型對於負樣本的分類正確度非常高(因為imbalanced data的狀況)，但正樣本的正確度不夠高。因此在這過程中，就經歷了重新整理類別的數量，並且針對訓練的樣本，進行正樣本的over-sampling，還有將文章樣本，改以句子的方式(將句子截短)，作為一個個input，最後讓整體的模型預測達到了97%的正確率，並且也能夠正確辨別出稀少類別。
</p>
<h2>心得小結</h2>
<p>在這兩個案例中，我們探討了幾個建置AI模型的重要觀念，針對結構型資料本身，如何妥善清理與整併資料；針對非結構型的文字訓練資料，如何透過適當的段落切割，就可以強化預訓練模型Bert適應新文本的能力。遇到不平衡資料時，如何透過手動over-sampling的方法，減輕不平衡資料對模型學習效果的影響。當完成模型訓練時，可以使用哪些工具，來解釋模型，找尋真正影響產出的關鍵因子。最後當然還是再一次強調，人工智慧科學家也需要和該問題領域的domain expert合作，一起來建構模型，這樣所產出的模型，往往會比直接一股地使用複雜的模型，丟入大量未經整理的資料，準確度來得高，該模型也會比較精簡，容易解釋與使用。</p>
</div>
<p>The post <a rel="nofollow" href="/finance-ai-application/">Finance AI 人工智慧在金融保險業中的應用 &#8211; 林愛哲 Tom Lin</a> appeared first on <a rel="nofollow" href="https://aiacademy.tw">台灣人工智慧學校</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>真．智慧檯燈 Prototype</title>
		<link>/article-make-ai-table-lamp/</link>
		
		<dc:creator><![CDATA[betty]]></dc:creator>
		<pubDate>Fri, 24 Jul 2020 17:01:43 +0000</pubDate>
				<category><![CDATA[技術分享]]></category>
		<category><![CDATA[熱門話題]]></category>
		<guid isPermaLink="false">/?p=13559</guid>

					<description><![CDATA[<p>文/台灣人工智慧學校技術發展處處長 這個專案結合了深度學習，edge AI 邊緣計算裝置，...</p>
<p>The post <a rel="nofollow" href="/article-make-ai-table-lamp/">真．智慧檯燈 Prototype</a> appeared first on <a rel="nofollow" href="https://aiacademy.tw">台灣人工智慧學校</a>.</p>
]]></description>
										<content:encoded><![CDATA[<style>
.source{
color: gray;
font-size: 13px;
}
</style>
<p>文/台灣人工智慧學校技術發展處處長</p>
<p>這個專案結合了深度學習，edge AI 邊緣計算裝置，與機器手臂的控制</p>
<p>以下是爸爸的碎念…</p>
<blockquote>
<p>市面上的檯燈大多僅注重亮度，少數會多注意到光線柔和不反光。但如果家裡有小小學生就會知道，更多的狀況是小朋友根本沒開燈，或寫字區域根本不在燈的照射範圍內，另外更需要有人時時提醒小朋友的寫字坐姿，請他頭抬起來，腰挺直…</p>
</blockquote>
<p><img fetchpriority="high" decoding="async" src="/wp-content/uploads/2020/07/1.png" alt="" width="700" height="450" class="alignnone size-full wp-image-13614" srcset="/wp-content/uploads/2020/07/1.png 700w, /wp-content/uploads/2020/07/1-300x193.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<p>檯燈能不能更聰明，幫家長解決以上問題？</p>
<p>
<strong>產品主要功能</strong></p>
<ul>
<li>是個檯燈</li>
<li>追蹤小朋友的寫字區域</li>
<li>提醒小朋友的坐姿</li>
<p><strong>產品結構分析</strong></p>
<p>檯燈本身的樣子就跟機器手臂有 87% 像，因此我用機器手臂來取代檯燈的支架，讓檯燈能夠藉由馬達控制來改變照射的區域與角度，另外也能縮短開發時間。</p>
<p>怎麼知道該照射哪個區域呢？這就是該使用 AI 的地方。由 webcam 擷取影像，<a href="https://up-board.org/upsquared/specifications/" target="_blank" rel="noopener">Intel Up Squared </a>開發板做運算，使用 posenet pre-trained model 來找到身體各個主要關節在影像中的位置，然後將右手腕關節位置換算成馬達控制的座標，傳送到 Arduino 控制機器手臂的馬達，便可以讓燈光照射在適當的位置；另外計算各關節的相對位置來判斷坐姿是否正確；同時也以 Arduino 輸出 PWM 訊號控制 LED 燈的亮度。概念圖如下：</p>
<p><img loading="lazy" decoding="async" src="/wp-content/uploads/2020/07/1_0tA5m9uXpe3FNv6E4k3LvA.png" alt="" width="700" height="408" class="alignnone size-full wp-image-13616" srcset="/wp-content/uploads/2020/07/1_0tA5m9uXpe3FNv6E4k3LvA.png 700w, /wp-content/uploads/2020/07/1_0tA5m9uXpe3FNv6E4k3LvA-300x175.png 300w" sizes="auto, (max-width: 700px) 100vw, 700px" /></p>
<p><strong>Intel Up Squared 開發板</strong></p>
<p>或許大家對於這個開發板較為陌生，但如果提到 Intel NCS 神經計算棒，應該滿多人有聽過，Up squared 開發板就是使用 Intel 的 CPU 再加上與 NCS 同系列晶片的 VPU，專做 AI model 的 inference 工作；使用起來就跟一般電腦沒兩樣，可以安裝 Windows 10 或 Ubuntu 等作業系統，另外還提供與 Raspberry Pi 相同的 40 pin GPIO 腳位，方便外加其他裝置使用。</p>
<p>近期 Intel 的 CPU 裡都有內建 GPU，因此這塊開發板可以同時使用 GPU 和 VPU 來跑兩個不同的 AI model，需要的話還可以在 USB 插上神經計算棒來跑更多 model。當然要使用這些功能是需要安裝<a href="https://software.intel.com/content/www/us/en/develop/tools/openvino-toolkit/get-started.html" target="_blank" rel="noopener"> Openvino toolkit </a>的，安裝方式在官網中有 step by step 的步驟說明。</p>
<p><img loading="lazy" decoding="async" src="/wp-content/uploads/2020/07/1_yEksq8ETTUJW1-nib5VWeA.png" alt="" width="1000" height="305" class="alignnone size-full wp-image-13618" srcset="/wp-content/uploads/2020/07/1_yEksq8ETTUJW1-nib5VWeA.png 1000w, /wp-content/uploads/2020/07/1_yEksq8ETTUJW1-nib5VWeA-300x92.png 300w, /wp-content/uploads/2020/07/1_yEksq8ETTUJW1-nib5VWeA-768x234.png 768w, /wp-content/uploads/2020/07/1_yEksq8ETTUJW1-nib5VWeA-700x214.png 700w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></p>
<p><strong>Openvino</strong></p>
<p><a href="https://software.intel.com/content/www/us/en/develop/tools/openvino-toolkit/get-started.html" target="_blank" rel="noopener">Openvino toolkit </a>是 Intel 提供的一個深度學習工具包，為了能在 Intel 平台上快速的做 inference，需要使用這個工具包把已經在其他平台訓練好的模型縮減並轉化成 Openvino 的中繼表示 (IR) 檔們。</p>
<p>以下指令將 tensorflow 的 pb 檔轉成 Openvino 的 IR 檔，並且指定輸入大小、輸出層與精度，執行後會產生一個 .xml 檔與一個 .bin 檔。</p>
<p><img loading="lazy" decoding="async" src="/wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.39.13.png" alt="" width="688" height="224" class="alignnone size-full wp-image-13619" srcset="/wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.39.13.png 688w, /wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.39.13-300x98.png 300w" sizes="auto, (max-width: 688px) 100vw, 688px" /></p>
<p>簡化後的程式主要執行步驟如下：</p>
<p><img loading="lazy" decoding="async" src="/wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.40.26.png" alt="" width="681" height="311" class="alignnone size-full wp-image-13620" srcset="/wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.40.26.png 681w, /wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.40.26-300x137.png 300w" sizes="auto, (max-width: 681px) 100vw, 681px" /></p>
<p><strong>PoseNet</strong></p>
<p>Openvino 提供了很多 pre-trained model 可以使用，也試過裡面提供的 single-human-pose-estimation-0001 來標出各關節的位置，雖然準確度較高，但 frame rate 只剩不到 2fps，用來控制機器手臂比較不順暢。</p>
<p>因此使用了 PoseNet，本來就開發給 mobile devices 和瀏覽器使用，因此硬體需求較低，雖然準確度也較低，但已足敷使用。Google 只有提供 Tensorflow lite 的 PoseNet pre-trained model，因此需要轉成 Tensorflow 的 pb 檔（這裡有詳細流程），再轉成 Openvino 的 IR 檔（指令如上）。</p>
<p><strong>程式流程</strong></p>
<p>程式流程如下圖，左邊是在 Intel Up squared 開發板上執行的流程，起始時先將 PoseNet 與物件偵測（使用 mobilenet_ssd，只做人物偵測) model 分別載入 GPU 與 HDDL，接下來針對攝影機擷取的每一張影像做身體關節偵測與人物偵測，使用這些資訊來判斷右手的位置與坐姿正確與否，並輸出座標給 Arduino Uno 開發板。</p>
<p>由於目標是快速做出樣品，因此坐姿的判斷是以傳統 rule-based 的方式來做，但缺陷其實很多，這部分應該也要改以 AI 的方式來做判斷較為準確。</p>
<p>右邊的 Arduino 開發板經由 UART 收到右手座標後轉換成每個馬達的轉動角度與方向資訊，用以控制機器手臂。（如下圖，當物體由 X 移動到 Y，底座馬達與第三節馬達分別要轉動的角度為 ?1 與 ?2），但因為沒有距離資訊 d，所以無法以三角函數直接算出最終角度，只能計算方向（正轉或反轉）與相對的大小，所以就以每次轉動小角度慢慢逼近的方式處理。</p>
<p><img loading="lazy" decoding="async" src="/wp-content/uploads/2020/07/1_9MurAsnEdTfgQ7LVwXRMuA.png" alt="" width="700" height="390" class="alignnone size-full wp-image-13621" srcset="/wp-content/uploads/2020/07/1_9MurAsnEdTfgQ7LVwXRMuA.png 700w, /wp-content/uploads/2020/07/1_9MurAsnEdTfgQ7LVwXRMuA-300x167.png 300w" sizes="auto, (max-width: 700px) 100vw, 700px" /></p>
<p><strong>Up Squared 與 Arduino 的溝通</strong></p>
<p>前面說到 Up Squared 會計算出右手在影像中的座標，接下來我們使用 UART 這種序列式傳輸技術把座標傳送到 Arduino。</p>
<ul>
<li>在 Arduino 端，可以使用 Serial 這個函式庫</li>
<li>在 Intel Up Squared 端，則使用 pySerial 這個函式庫</li>
</ul>
<p><img loading="lazy" decoding="async" src="/wp-content/uploads/2020/07/1_ZdapGuFKZ8acftfJa6_xhA.png" alt="" width="700" height="468" class="alignnone size-full wp-image-13622" srcset="/wp-content/uploads/2020/07/1_ZdapGuFKZ8acftfJa6_xhA.png 700w, /wp-content/uploads/2020/07/1_ZdapGuFKZ8acftfJa6_xhA-300x201.png 300w" sizes="auto, (max-width: 700px) 100vw, 700px" /></p>
<p><strong>執行畫面</strong></p>
<p>淺藍色圈圈是關節位置，深藍色框框是物件偵測的結果。右邊模擬姿勢不正的狀態，在左上角有顯示提醒，並且也發出警示音效。</p>
<p><img loading="lazy" decoding="async" src="/wp-content/uploads/2020/07/1_ra_mfYR2D8Pg6uUyNCy8gA.png" alt="" width="1000" height="400" class="alignnone size-full wp-image-13623" srcset="/wp-content/uploads/2020/07/1_ra_mfYR2D8Pg6uUyNCy8gA.png 1000w, /wp-content/uploads/2020/07/1_ra_mfYR2D8Pg6uUyNCy8gA-300x120.png 300w, /wp-content/uploads/2020/07/1_ra_mfYR2D8Pg6uUyNCy8gA-768x307.png 768w, /wp-content/uploads/2020/07/1_ra_mfYR2D8Pg6uUyNCy8gA-700x280.png 700w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></p>
<p><strong>Tinkerkit Braccio 機器手臂</strong></p>
<p><a href="https://store.arduino.cc/usa/tinkerkit-braccio" target="_blank" rel="noopener">Tinkerkit Braccio </a>是支六軸機器手臂，也就是有六顆伺服馬達，每個馬達的工作範圍都是180度，分別控制底座旋轉角度、三節手臂的角度、與末端夾具的開合角度，我們以<a href="https://github.com/kk6axq/BraccioV2" target="_blank" rel="noopener"> BraccioV2 函式庫</a>控制手臂各個馬達。</p>
<p><img loading="lazy" decoding="async" src="/wp-content/uploads/2020/07/1_rmaX7EI9ROHrdNs7Myhfdg.png" alt="" width="1000" height="413" class="alignnone size-full wp-image-13624" srcset="/wp-content/uploads/2020/07/1_rmaX7EI9ROHrdNs7Myhfdg.png 1000w, /wp-content/uploads/2020/07/1_rmaX7EI9ROHrdNs7Myhfdg-300x124.png 300w, /wp-content/uploads/2020/07/1_rmaX7EI9ROHrdNs7Myhfdg-768x317.png 768w, /wp-content/uploads/2020/07/1_rmaX7EI9ROHrdNs7Myhfdg-700x289.png 700w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></p>
<p>由於不需要抓握東西，因此拆除夾具轉接上燈罩，轉接器與燈罩內的 LED 固定支架則是由 3D 列印製成。</p>
</p>
<p><img loading="lazy" decoding="async" src="/wp-content/uploads/2020/07/1_OQBh93beuCgXUAmdpCkarQ.jpeg" alt="" width="700" height="933" class="alignnone size-full wp-image-13625" srcset="/wp-content/uploads/2020/07/1_OQBh93beuCgXUAmdpCkarQ.jpeg 700w, /wp-content/uploads/2020/07/1_OQBh93beuCgXUAmdpCkarQ-225x300.jpeg 225w, /wp-content/uploads/2020/07/1_OQBh93beuCgXUAmdpCkarQ-600x800.jpeg 600w" sizes="auto, (max-width: 700px) 100vw, 700px" /></p>
<p><strong>References</strong></p>
<p><a href="https://www.tensorflow.org/lite/models/pose_estimation/overview" target="_blank" rel="noopener"><img loading="lazy" decoding="async" src="/wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.54.24.png" alt="" width="682" height="179" class="alignnone size-full wp-image-13626" srcset="/wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.54.24.png 682w, /wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.54.24-300x79.png 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></a></p>
<p><a href="https://medium.com/@oviyum/real-time-human-pose-estimation-on-the-edge-with-movidius-ncs-and-openvino-ac3b13536" target="_blank" rel="noopener"><img loading="lazy" decoding="async" src="/wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.55.25.png" alt="" width="680" height="171" class="alignnone size-full wp-image-13627" srcset="/wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.55.25.png 680w, /wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.55.25-300x75.png 300w" sizes="auto, (max-width: 680px) 100vw, 680px" /></a></p>
<p><a href="https://www.arxiv-vanity.com/papers/1812.08008/" target="_blank" rel="noopener"><img loading="lazy" decoding="async" src="/wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.56.46.png" alt="" width="684" height="173" class="alignnone size-full wp-image-13628" srcset="/wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.56.46.png 684w, /wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.56.46-300x76.png 300w" sizes="auto, (max-width: 684px) 100vw, 684px" /></a></p>
<p><a href="https://github.com/rwightman/posenet-python" target="_blank" rel="noopener"><img loading="lazy" decoding="async" src="/wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.57.54.png" alt="" width="680" height="167" class="alignnone size-full wp-image-13629" srcset="/wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.57.54.png 680w, /wp-content/uploads/2020/07/螢幕快照-2020-07-25-上午12.57.54-300x74.png 300w" sizes="auto, (max-width: 680px) 100vw, 680px" /></a></p>
<p>原文<a href="https://medium.com/ai-academy-taiwan/%E7%9C%9F%E6%99%BA%E6%85%A7%E6%AA%AF%E7%87%88-prototype-a731b638bad6" target="_blank" rel="noopener">請點</a></p>
<p><code>本文引自<a href="https://medium.com/ai-academy-taiwan" target="_blank" rel="noopener">台灣人工智慧學校medium專欄</a>，medium專欄是由台灣人工智慧學校所經營，學校AI工程師們將定期於medium上分享近期技術研究及AI相關知識</code></p>
<p>The post <a rel="nofollow" href="/article-make-ai-table-lamp/">真．智慧檯燈 Prototype</a> appeared first on <a rel="nofollow" href="https://aiacademy.tw">台灣人工智慧學校</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>從資料中挖寶 好工具不可少</title>
		<link>/article-to-use-data/</link>
		
		<dc:creator><![CDATA[betty]]></dc:creator>
		<pubDate>Fri, 10 Jul 2020 08:23:21 +0000</pubDate>
				<category><![CDATA[技術分享]]></category>
		<category><![CDATA[熱門話題]]></category>
		<guid isPermaLink="false">/?p=13251</guid>

					<description><![CDATA[<p>數據、流量當道，各行各業用各種方式收集到最完整的數據，不論是製造業在工廠機台上的感測器，或...</p>
<p>The post <a rel="nofollow" href="/article-to-use-data/">從資料中挖寶 好工具不可少</a> appeared first on <a rel="nofollow" href="https://aiacademy.tw">台灣人工智慧學校</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" src="/wp-content/uploads/2020/07/shutterstock_1120548476-1.jpg" alt="" width="1200" height="627" class="alignnone size-full wp-image-13267" srcset="/wp-content/uploads/2020/07/shutterstock_1120548476-1.jpg 1200w, /wp-content/uploads/2020/07/shutterstock_1120548476-1-300x157.jpg 300w, /wp-content/uploads/2020/07/shutterstock_1120548476-1-768x401.jpg 768w, /wp-content/uploads/2020/07/shutterstock_1120548476-1-1024x535.jpg 1024w, /wp-content/uploads/2020/07/shutterstock_1120548476-1-700x366.jpg 700w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></p>
<p>數據、流量當道，各行各業用各種方式收集到最完整的數據，不論是製造業在工廠機台上的感測器，或零售業用來分析人流、消費者行為的智慧監測系統，最終的目的就是希望透過這些資料，改善製造流程，優化客戶體驗，甚至提供更精準的預測，降低成本，創造價值。</p>
<p>資料的重要性不可否認，但許多企業在開始擬定資料策略的時候，往往會遇到沒有足夠的資料，或是沒有建立資料庫的窘境；有的雖然有資料庫，但是沒有系統有效串連，或者兩者都有，卻不知道拿到資料之後要做什麼。</p>
<p>很明確地，企業都希望將資料創造價值，但是，該如何做？</p>
<p><strong>客戶只需要鑽好一個洞，並不是一把華麗的電鑽</strong></p>
<p>談到資料應用，任何一種方法都需要回到最根本的基礎——客戶需求。許多商學院談到「顧客需求」都會用一個著名的比喻：「顧客要的不是1/4吋的鑽頭，而是1/4吋的洞」，他們要的其實很簡單，就是滿足他需求的服務，能夠做到這點，對顧客而言，這就是有價值的。</p>
<p>同樣地，對企業來說，收集資料的目的是什麼？直白一點，企業收集資料並不是為了資料本身，而是資料產生出來的知識與對於客戶行為的了解，唯有這些知識才能為企業、為客戶創造價值。因此企業在思考如何收集與處裡資料前，需要回到初衷，思考「我的企業要從哪些資料獲取什麼知識才能為客戶創造價值？」</p>
<p><strong>善用工具，從資料庫挖掘寶藏</strong></p>
<p>建置資料庫是第一步，但要如何從中萃取出可以轉化成知識的寶藏，就需要善用好的工具來進行。資料庫知識探索（Knowledge Discovery in Database, KDD）就是一個將資料探索為知識的經典程序，可以參考以下步驟：</p>
<ol>
<li>制定目標：從客戶的角度確定執行KDD流程的目標，同時了解在該領域應先俱備的相關知識</li>
<li>選擇目標資料庫：基於目標，選擇有興趣的資料庫來執行運算與分析。</li>
<li>資料清理：對所選定的資料庫做資料清理，刪除資料中的雜訊，以及重複的變數簡化資料庫。接著根據任務或目標，分析出可用於代表資料的有用功能。</li>
<li>資料轉換：透過降維技術，來減少變數的有效數目，提升資料使用效率。</li>
<li>資料探勘：根據執行KDD的目標，選擇資料探勘的方法與演算法，並且選定資料模式，即最終資料呈現的方式，如決策樹、迴歸分析圖等。</li>
<li>解釋探勘模式：針對資料探勘模式解釋潛在知識</li>
<li>運用所發現的知識：運用KDD所發現的相關知識，並且採取相關行動，重複驗證知識結果是否與目標相符。</li>
</ol>
<p>值得注意的是，以往企業在執行KDD時，每個步驟都需要不同的工具來執行。今天，最為人所知的Python可以應用在KDD的每個步驟，也就是說不需要跨平台、跨語言來做，具有高度一致性，這也是為什麼Python相較於其他程式語言更熱門的原因。</p>
<p>The post <a rel="nofollow" href="/article-to-use-data/">從資料中挖寶 好工具不可少</a> appeared first on <a rel="nofollow" href="https://aiacademy.tw">台灣人工智慧學校</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
