โปรเจกต์ Java OOP — AI Object Identification System
TuaRai (ตัวอะไร) คือเว็บแอปพลิเคชัน AI ที่ถ่ายรูปแล้วบอกว่า "ตัวอะไร?" — ระบุชื่อ หมวดหมู่ ระดับอันตราย พร้อมดึงข้อมูลละเอียดเป็นภาษาไทยจาก Wikipedia โดยอัตโนมัติ
รองรับสัตว์ แมลง พืช อาหาร ยานพาหนะ อาคาร เทคโนโลยี และสิ่งของทั่วไป — ทุกอย่างที่มีบทความใน Wikipedia
ผู้ใช้เปิดกล้องผ่านหน้า Scanner หรืออัปโหลดรูปจากหน้า Upload
JavaScript ใช้ MediaDevices API เข้าถึงกล้อง แล้ว encode ภาพเป็น Base64
ก่อนส่งไปยัง Server ด้วย HTTP POST
DetectionController รับ request จาก 3 endpoint:
POST /scan (form upload), POST /api/detect (REST API),
POST /api/detect/camera (base64 JSON)
→ ส่งต่อให้ AIService → ส่งภาพเป็น Base64 ไปยัง Google Cloud Vision API
ไม่บันทึกภาพลงดิสก์ — ภาพถูกแปลงเป็น data:image/jpeg;base64,...
และเก็บใน database พร้อม JSON ผลลัพธ์เต็ม เพื่อลดการใช้พื้นที่และเพิ่มความปลอดภัย
GoogleVisionApiClient ส่งภาพไปยัง Vision API พร้อมเปิดใช้ 3 Feature พร้อมกัน:
Vision API ส่งกลับ JSON ที่มี labels, objects, bestGuessLabels, webEntities, logos
DetectionService รับ JSON จาก Vision แล้วเลือกชื่อที่ดีที่สุด:
isScientificName()
— ตรวจสอบรูปแบบ [A-Z][a-z]{3,} [a-z]{4,} เช่น "Chrysopelea ornata"
และกรองคำสามัญออก เช่น "Green snake" ที่ไม่ใช่ชื่อวิทยาศาสตร์WikipediaService ค้นหาข้อมูลด้วยลำดับการค้นหาอัจฉริยะ:
containsThai() guard — ไม่ค้น EN ด้วยคำภาษาไทย)isStubWiki()) จะลองชื่อวิทยาศาสตร์ถัดไปใน sciCandidates อัตโนมัติ(Thai: ...) ในบทความอังกฤษ (extractThaiNameFromEnglish())[A-Z][a-z]{3,}\s[a-z]{4,} จากเนื้อหา เช่น "(Gallus gallus)"wikiEncode() แปลงเว้นวรรคเป็น _ (ไม่ใช่ +) ตาม Wikipedia REST API
ถ้าหา Wikipedia ภาษาไทยไม่เจอ prepareForTranslation()
จะลบอักษรไทยและ script อื่นออกก่อน แล้วส่งไปแปล — ใช้ 3 API เรียงลำดับ:
translate.googleapis.com/translate_a/single?client=gtx
ไม่ต้องใช้ API key, ไม่มี rate limit รายวัน — ใช้เป็นหลักUriComponentsBuilder encode ตัวคั่นภาษา en|th
→ en%7Cth เพื่อหลีกเลี่ยง URI exceptiontranslateInChunks())
HistoryService บันทึกข้อมูลการสแกนลงตาราง scan_history ใน SQLite
ผ่าน Spring Data JPA และ Hibernate ORM
— จัดเก็บชื่อสิ่ง, category, confidence, URL รูปภาพ, และ timestamp
Thymeleaf Template Engine render หน้า result.html
แสดง: ชื่อไทย/อังกฤษ, emoji, หมวดหมู่, ระดับอันตราย, คำอธิบาย Wikipedia พร้อม thumbnail,
ชื่อวิทยาศาสตร์, AI labels chart, และคำแนะนำ
| Language | Java 17 LTS |
| Framework | Spring Boot 3.2 |
| MVC | Spring MVC |
| ORM | Spring Data JPA |
| Database | SQLite |
| Build | Apache Maven |
| Template | Thymeleaf |
| HTTP Client | RestTemplate |
| JSON | Jackson |
| Markup | HTML5 |
| Styles | CSS3 |
| Framework | Bootstrap 5 |
| Scripts | Vanilla JS ES6+ |
| Camera | MediaDevices API |
| Icons | Font Awesome 6 |
| Fonts | Orbitron + Rajdhani |
| Design | Cyberpunk Dark |
| Responsive | Mobile-First |
| Vision AI | Google Cloud Vision |
| Features | Label, Object, Web |
| Knowledge | Wikipedia REST API |
| Wiki Query | MediaWiki Action API |
| Translate 1 | GTX (Unofficial) |
| Translate 2 | Google Translate v2 |
| Translate 3 | MyMemory API |
| Proxy | IIS (port 80→8080) |
| Deploy | Windows Server 2025 |
| Language | Kotlin |
| UI | WebView |
| Camera | CameraX API |
| Network | OkHttp |
| Min SDK | Android 7.0 |
| Target | Android 14 |
| Update | Auto Check/Update |
จัดการ HTTP GET requests สำหรับทุกหน้า HTML (/, /scanner, /upload, /about, /download) และ APK version endpoint
3 endpoints: POST /scan (form upload → result.html), POST /api/detect (REST API ไฟล์), POST /api/detect/camera (REST API base64 JSON) — แปลงภาพเป็น base64 data URL ไม่บันทึกลงดิสก์
ประสานงานหลัก: รับภาพ → เรียก GoogleVisionApiClient → ส่งผลให้ DetectionService → จัดการ StorageService และ HistoryService
แปลง JSON จาก Vision API → เลือกชื่อที่ดีที่สุด → สกัด sciCandidates (ชื่อวิทยาศาสตร์) ด้วย isScientificName() → เรียก WikipediaService พร้อม stub fallback (isStubWiki()) → infer dangerLevel → สร้าง DetectionResult
ดึงข้อมูลจาก Wikipedia API (Thai/English) — มี containsThai() guard, wikiEncode() แปลง space→underscore, extractThaiNameFromEnglish() ดึงชื่อไทยจากบทความอังกฤษ, prepareForTranslation() ลบ script ต่างชาติก่อนแปล, แปลด้วย GTX → Google Translate → MyMemory
บันทึกและดึงประวัติการสแกนจากฐานข้อมูล ใช้ ScanHistoryRepository ผ่าน Spring Data JPA
ให้บริการ utility สำหรับจัดการ path และ URL — ปัจจุบัน scan results ใช้ base64 data URL แทนการบันทึกไฟล์จริง เพื่อความปลอดภัยและประหยัดพื้นที่
ส่ง HTTP POST ไปยัง Google Cloud Vision API v1 พร้อม features ที่ต้องการ แปลง response JSON กลับมาเป็น Map
JPA Entity class แมปตาราง scan_history ใน SQLite เก็บข้อมูล: prediction, category, confidence, imageUrl (base64 data URL), scanTime, และ fullResultJson (JSON เต็มของ DetectionResult เพื่อ restore ผลลัพธ์ได้ครบถ้วน)
Data Transfer Object ที่ส่งข้อมูลจาก Service ไป View — มี fields: nameEn, nameTh, category, dangerLevel, wikiSummaryTh, wikiSummaryEn, allLabels ฯลฯ
Spring Data JPA Repository Interface — auto-generate SQL สำหรับ CRUD operations บนตาราง scan_history
AppConfig: Spring Beans (RestTemplate, ObjectMapper) • WebConfig: Static resource mapping • ImageUtil: ประมวลผลรูปภาพ
ทุก class มี private fields เข้าถึงผ่าน getter/setter
เช่น DetectionResult ซ่อน fields ทั้งหมด
และ WikiInfo inner class ใน WikipediaService
Spring Component Hierarchy —
@Controller, @Service, @Repository
สืบทอด annotation behavior
ScanHistoryRepository extends JpaRepository
DetectionResult.success() และ DetectionResult.unknown()
เป็น static factory methods ที่คืน object หลายรูปแบบ
RestTemplate รองรับหลาย response type
Service Layer ซ่อนความซับซ้อนของ API — Controller ไม่ต้องรู้ว่า
Vision API ทำงานยังไง, Wikipedia ค้นยังไง
รู้แค่เรียก aiService.analyzeImage()
พัฒนาระบบ TuaRai.AI เพื่อสาธิตหลักการ Object Oriented Programming โดยผสาน Google Vision AI, Wikipedia API, และ Spring Boot สร้างแอปพลิเคชันที่ใช้งานได้จริงบนมือถือและเว็บ