Detect photo label by using Amazon Rekognition - part 1
Tags: aws, awsthai, rekognition, elasticsearch
Published: 2021-09-14 10:43:28

ปัจจุบัน e-conmmerce เฟื่องฟูมาก และผู้ที่ให้บริการจำหน่ายสินค้าผ่านช่องทาง online ต่างต้องการพัฒนา และปรับปรุงช่องทางของตนเองให้ตอบโจท์ลูกค้ามากขึ้น 
อย่างเช่น ในหน้าค้นหาสินค้าเป็นต้น ถ้าลูกค้าต้องการจะค้นหาสินค้าโดยการ upload รูปสินค้าขึ้นไปที่หน้าเวปผู้ให้บริการ เราจะตอบโจทย์ตรงนี้อย่างไร

AWS ได้ให้บริการ AI service ชื่อ Amazon Rekognition ที่สามารถจะให้บริการการ detect object หรือ ใบหน้าของคน แล้วระบุว่า เป็นสินค้าอะไร, ใบหน้าของคนๆ เป็นชายหรือหญิง และมีความมั่นใจกี่ % ซึ่งตรงนี้เอง เราสามารถนำ service นี้มาใช้ในงานลักษณะแบบนี้ได้

การพัฒนา solution นี้ สามารถแบ่งออกเป็น 2 เฟส ได้แก่
1. การนำเข้ารูปภาพสินค้าทั้งหมดเข้าระบบ เพื่อให้ Amazon Rekognition detect ข้อมูลต่างๆในรูป และทำการจัดเก็บข้อมูลดังกล่าวในฐานข้อมูล
2. การนำรูปตัวอย่าง มาทำการค้นหาข้อมูลจากฐานข้อมูล และแสดงผลการค้นหาสินค้าที่คล้ายกัน หรือตรงกัน

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/48injphnf1et05hpyo6a.png)

สำหรับเนื้อหาในโพสนี้ จะมาทำเฟสแรกให้ดูกัน ไปกันเลยยยย...

<b>Host machine</b> : Mac BigSur 11.5.2
<b>eclipse</b> : Eclipse IDE for Enterprise Java and Web Developers Version: 2021-06 (4.20.0)
<b>eclipse plugin</b> : Amazon developer toolkit [optional]
<b>AWS service</b> : S3, Lambda, Rekognition and Elasticsearch

หมายเหตุ AWS developer toolkit จะ compatible อย่างสมบูรณ์ กับ eclipse ที่ใช้ java runtime 1.8

<h2>ขั้นตอนการทำ</h2>

<h3>Provision Amazon elasticsearch service</h3>
AWS Console -> Elasticsearch (ES)
ใส่ชื่อ cluster และเลือก dev mode จากนั้นเลือก internet access และเลือกโหมด authen ให้ใส่ username และ password
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cm2fae0pqwj6n3ebdow8.png)

หลังจาก provision เสร็จเรียบร้อยแล้ว ให้ copy ES endpoint เพื่อไปแปะที่ source code
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s3rp1oii8jzx1rxt57ky.png)

ทดสอบการใช้งานเบื้องต้นโดย browse ไปยัง endpoint ที่เรา copy มา จากนั้นใส่ username และ password ตอนที่เรา provision cluster
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ba97oor6aeco329rbaxm.png)

<h3>Create lambda function</h3>
ไปที่ฝั่ง lambda บ้าง เราต้องไปสร้าง lambda function ขึ้นมา แล้วเอา java far file ไป deploy

AWS Console -> Lambda -> create function

ใส่ชื่อ function lambda และ เลือก runtime เป็น Java 8

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r9ieti8j01h50ecnrdez.png)

เพิ่มตัว trigger lambda คือ s3 ไว้ข้างหน้า function และเพิ่ม SNS alert ด้านหลัง function เราจะได้ไปดู error message ที่ email ได้ หรือเราไปดู error ผ่าน Cloudwatch log ก็ได้นะ
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xhi56v8ym6p2142ym09a.png)

Configure lambda role ให้เรียบร้อย โดย role ต้องสามารถเข้าถึง S3 และ elasticsearch ได้

<h3>Develop Lambda function by using eclipse</h3>

เรามาเข้าสู่โหมด dev กัน ขั้นแรกเราต้องมีเครื่องมือในการเขียน lambda ก่อน  lambda ที่เราจะเขียนนี้ จะถูกเรียกให้ทำงานโดยการถูก trigger โดย S3 กรณีที่มีการ upload รูปภาพขึ้นไป S3
lambda รองรับหลากหลายภาษา และหนึ่งในนั้นคือ java เพราะฉะนั้นเลยเลือกที่จะใช้ eclipse เป็น IDE tool
 
<b>Download eclipse tool</b> : https://www.eclipse.org/downloads/packages/

[Optional]จากนั้นลง Amazon developer toolkit plugin เข้าไปเพิ่มที่ eclipse วิธีลงตาม link ที่แปะให้เลย
https://aws.amazon.com/eclipse/

เมื่อลง aws plugin เรียบร้อยจะได้ ui จาก AWS ตามรูป
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/74ha0c9ygw41nl07goh9.png)

<b>Download Source Code จาก Github</b>
Download ตัวอย่าง source code จาก github แล้ว import Maven project ลงไปที่ eclipse
https://github.com/aomjk/rekognition-demo-orawanj

เปิด file LambdaFunctionHandler.java ให้แก้ ค่า value ของ aesEndpoint ให้ชี้ไปที่ ES endpoint ของเรา จากนั้นให้ save file
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/izgd220t9vnq10llprdg.png)


Build และ pack compile code เป็น jar fomat โดยไปที่ eclipse กด click ขวาที่ project -> เลือก Run As -> Maven build 
Maven build configuration
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bj2ij3uilgvfap8vd3sd.png)

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mobi3cqhl2zd774g8pez.png)

หลังจากกด build โดยใช้ Maven tool แล้ว เราจะได้ jar file ออกมา 
jar file ตัวนี้จะถูกนำไป deploy ลงบน lambda

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fwrq2xqm8pgq5h7xi6et.png)

Deploy java jar file ไปที่ function จะด้วยวิธีการ upload ตรงขึ้นไป หรือ ไปฝากไว้ที่ s3 ขึ้นอยู่ขนาดความใหญ่ของ file

[Optional]หรือสามารถใช้การ click ขวาที่ file folder แล้วเลือก Amazon Web Services และ Upload Function to lambda
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8pz0gfu3wzh2skmcv7xy.png)

<h3>Let's testing our solution</h3>

ตัวอย่างรูปภาพ
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b2kmb37l28esbxaqpw5m.png)

<i>แหล่งที่มา Amazon.com</i>

ต่อไปเรา upload รูปภาพนี้ลงไปที่ S3
และเราสามารถดู debugging เบื้องต้นได้จาก CloudWatch Log
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uxh4uytgj5fpbhgockg5.png)

จะเห็นได้ว่า Amazon Rekognition สามารถจำแนกรูปภาพได้ว่า เป็นเก้าอี้ เฟอร์นิเจอร์ และเป็นเก้าอี้ที่มีที่พักแขน และความมั่นใจกี่เปอร์ในแต่ละหัวข้อ

สุดท้ายเราสามารถไปดูข้อมูลที่ถูก insert เข้าไปที่ ES ได้ตามรูปข้างล่างเลย
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cl9tkifbf0ptuqyc0gla.png)

ในบทสรุปของการทำ solution นี้คือ ความสามารถในการบันทึกข้อมูลที่ได้จากการใช้ Amazon Rekognition detecting label มาวิเคราะห์รูปภาพ  โดยที่ข้อมูลที่ได้เป็นลักษณะ label ต่างๆ เช่น เก้าอี้ เฟอร์นิเจอร์ และความมั่นใจเป็นเปอร์เซ็นต์ที่คิดว่าเป็น เก้าอี้ และเฟอร์นิเจอร์กี่เปอร์เซ็นต์ ลงบันทึกลงใน Amazon Elasticsearch เพื่อใช้ในการค้นหาต่อไปได้

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1njrhiax92g8i4rj9xza.jpg)