3 คะแนน โดย GN⁺ 2024-11-17 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เป็นเครื่องมือบนเว็บที่ช่วยลดงานการคัดข้อความจากภาพเอกสารแล้วนำมาจัดระเบียบใหม่ ด้วยการ แปลงเป็น Markdown แบบมีโครงสร้าง
  • ปัจจุบันการป้อนข้อมูลผ่านเว็บเน้น อัปโหลดรูปภาพ เป็นหลัก และมีการระบุว่าจะรองรับ PDF ในเร็ว ๆ นี้
  • บริการนี้ทำงานบนพื้นฐานของแพ็กเกจ npm llama-ocr และ Together AI
  • ใน JavaScript สามารถส่ง filePath และ TOGETHER_API_KEY ให้ฟังก์ชัน ocr เพื่อรับผลลัพธ์เป็น Markdown ได้
  • รองรับทั้งการอัปโหลดผ่านเว็บและการเรียกใช้ผ่านโค้ด จึงสามารถทดลองแปลงภาพเอกสารให้เข้ากับงานแบบแมนนวลหรือเวิร์กโฟลว์การพัฒนาได้

แปลงเอกสารภาพเป็น Markdown

  • LlamaOCR.com เป็นเครื่องมือสำหรับแปลงเอกสารที่อัปโหลดให้เป็น Markdown
  • หน้าเว็บระบุว่า “Upload an image to turn it into structured markdown” และสร้าง Markdown แบบมีโครงสร้าง จากการอัปโหลดรูปภาพ
  • การรองรับ PDF แสดงเป็น “soon” จึงหมายความว่าขอบเขตการให้บริการในตอนนี้ยังเน้นที่รูปภาพเป็นหลัก

วิธีใช้งานในโค้ด

  • หากใช้แพ็กเกจ npm llama-ocr ก็สามารถรัน OCR จากโค้ด JavaScript ได้
import { ocr } from 'llama-ocr';

const markdown = await ocr({
  filePath: './trader-receipt.jpg',
  apiKey: process.env.TOGETHER_API_KEY
});
  • ตัวอย่างนี้ใส่พาธไฟล์รูปภาพไว้ใน filePath และส่งตัวแปรสภาพแวดล้อม TOGETHER_API_KEY ให้กับ apiKey
  • บริการนี้ทำงานบนพื้นฐานของ llama-ocr และ Together AI

1 ความคิดเห็น

 
GN⁺ 2024-11-17
ความคิดเห็นบน Hacker News
  • ผมเป็นคนทำ llama-ocr เอง ขอบคุณที่แชร์และกระแสตอบรับดี ๆ ผมต้องการ OCR API แบบง่าย ๆ เลยทำขึ้นเมื่อต้นสัปดาห์นี้ โดยใช้ Llama 3.2 Vision ที่โฮสต์บน Together.ai เพื่อพาร์สรูปภาพให้เป็น Markdown ที่มีโครงสร้าง
    ตอนนี้มีให้ใช้เป็นแพ็กเกจ npm ด้วย มีแผนจะเพิ่มฟีเจอร์อย่างการพาร์ส PDF และการตอบกลับเป็น JSON ถ้ามีคำถามก็จะพยายามตอบครับ

    • ผมลองใส่ใบแจ้งหนี้ที่มีรายการเหมือนกัน 3 รายการเข้าไป แทนที่จะส่งออกมาเป็น bullet 3 ข้อตามปกติ มันกลับสร้างตารางที่มี คอลัมน์ quantity ซึ่งไม่มีอยู่บนกระดาษต้นฉบับ
      เลยสงสัยว่าการแปลงขนาดใหญ่ระดับนี้เป็นพฤติกรรมที่คาดหวังหรือพึงประสงค์หรือไม่ เอาต์พุตบางครั้งเป็นรายการ bullet บางครั้งเป็นตาราง ทำให้การประมวลผลอัตโนมัติภายหลังยากขึ้นเล็กน้อย
    • เคยมีปัญหาในการดึงเนื้อหาวิทยาศาสตร์ออกจาก PDF โปสเตอร์ เช่น Nougat มักจะพังเมื่อเลย์เอาต์เปลี่ยนไป
      อยากทราบว่าได้พิจารณา use case แบบนี้ไว้ด้วยหรือเปล่า
    • “Need an example image? Try ours.” เป็นไอเดียที่ดี อยากให้บริการอื่น ๆ มีฟีเจอร์คล้าย ๆ กันมากขึ้น
    • อยากรู้ว่าความแม่นยำอยู่ระดับไหน
      อยากรู้ว่าเมื่อเทียบกับระบบ OCR เดิม ๆ แล้ว มันทำพลาดแบบไหนบ้าง
    • อยากทราบว่าจะมีตัวเลือกให้ใช้ LLM แบบรันในเครื่อง ได้ไหม
  • นี่ก็แค่ส่งรูปไปให้ Llama 3.2 Vision แล้วบอกให้อ่านข้อความเท่านั้นเอง
    เหมือนเอาต์พุตจาก LLM อื่น ๆ คือเสี่ยงต่อการหลอนข้อมูล ไม่ได้อ่านรูปทรงตัวอักษรจากพิกเซลโดยตรง แต่ตัดสินข้อความจากการอธิบายภาพโดยอาศัยรูปภาพและคำบรรยายที่เรียนรู้มา โดยเฉพาะถ้าอ่านยาก มันอาจแต่งคำขึ้นมาเองทั้งคำได้

    • ระบบ OCR อื่น ๆ ก็เป็นแบบเดียวกัน เพียงแต่ในบริบทนั้นเราไม่ได้เรียกข้อผิดพลาดแบบนี้ว่า การหลอนข้อมูล เท่านั้นเอง
  • ดูเจ๋งดี ช่วงนี้ผมทำ OCR เยอะ เลยดีใจที่มีเครื่องมือใหม่ในสายนี้เกิดขึ้น ผู้เล่นตัวท็อปปัจจุบันในด้าน PDF→Markdown น่าจะเป็น Nougat[1] ของ Facebook และอยากลองเชื่อมมันกับ DSPy เพื่อเทียบกันว่ากับหนังสือปรัชญาแล้วตัวไหนดีกว่า
    โปรเจกต์ Zerox[2] ของสตาร์ทอัปที่ repo นี้ลิงก์ไว้ก็ดูดี อย่างน้อยการนำเสนอก็ลื่นไหลกว่า Nougat มาก ถ้ามีผู้เชี่ยวชาญตัวจริงผ่านมาแถวนี้ก็อยากฟังคำแก้ไขหรือคำแนะนำ
    มีสองเรื่องที่สงสัย 1) Together.ai คืออะไร และโมเดลนี้เป็นโอเพนซอร์สหรือไม่ เว็บไซต์ดูเหมือนบริการโฮสติ้ง และหน้า “Custom Models”[3] ดูใกล้เคียงกับการ fine-tune แบบกำหนดเองมากกว่าการฝึกโมเดล proprietary ของตัวเอง เหมือนจะมีโปรไฟล์บน HuggingFace แต่ก็ไม่ชัดว่าเป็นของพวกเขาจริงหรือไม่ https://huggingface.co/TogetherAI
    2) บน GitHub เขียนว่า “hosted demo” แต่ส่วนที่โฮสต์ดูเหมือนจะมีแค่ WebGUI เล็ก ๆ สะอาด ๆ เลยสงสัยว่าหมายความว่าฟีเจอร์นี้ตอนนี้และในอนาคตจะใช้ได้เฉพาะผ่านการเรียก API เท่านั้นหรือเปล่า
    ป.ล. ในเบราว์เซอร์เดสก์ท็อป ลิงก์ส่วนหัวเสีย และ onClick ไม่ถูกทริกเกอร์
    [1] https://facebookresearch.github.io/nougat/
    [2] https://github.com/getomni-ai/zerox
    [3] https://www.together.ai/products#custom-models

    • ผู้เขียนโปรเจกต์เป็น DevRel ของ Together.ai ถึงอย่างนั้น ในแง่วิธีโปรโมตเครื่องมือสำหรับนักพัฒนาก็ถือว่ายอดเยี่ยม
    • together.ai น่าจะสนับสนุนเดโมอย่างน้อยบางส่วน
    • ด้วยเหตุผลเรื่องความเป็นส่วนตัวและค่าใช้จ่าย ผมหวังว่าจะมีอะไรที่ โฮสต์เอง ได้
    • together.ai ให้บริการ โมเดลโอเพนซอร์สมากกว่า 100 ตัว รวมถึง Llama 3.2 แบบมัลติโมดัล ผ่าน API ที่เข้ากันได้กับ OpenAI
  • มีจุดแปลก ๆ อยู่ ผมอัปโหลดเว็บคอมิกเป็นตัวอย่าง บทพูดทั้งหมดเป็นตัวพิมพ์ใหญ่ แต่เอาต์พุตกลับผสมตัวพิมพ์แบบ sentence case กับ title case ไม่สม่ำเสมอในแต่ละช่องภาพ
    ผมยังลองทดสอบปัญหาที่อยากใช้ OCR จริง ๆ ด้วย คือมีสไลด์เก่า ๆ ที่ต้องแปลงเป็นดิจิทัล ส่วนใหญ่มีป้ายกำกับอยู่ พออัปโหลดไปหนึ่งภาพ มันอธิบายว่าดูเหมือนภาพถ่ายสไลด์หรือเฟรมฟิล์ม เก่าและเหลือง มีช่องสี่เหลี่ยมสีเข้มตรงกลาง และข้อความคือ “Once Upon a Time” ตัวเลขคือ “1069”
    คำอธิบายสไลด์ที่ซ้ำซากเกินจำเป็นก็เป็นปัญหาอยู่แล้ว แต่ตัวอักษรจริงไม่ได้เป็นลายมือด้วยซ้ำ และคือ “Once Uniquitous.” ส่วนตัวเลขคือ 106g ตัวนั้นเป็น ‘g’ ชัดมาก ไม่ใช่ ‘9’
    ที่น่าสนใจคืออาจเป็นตัวอย่างของอคติของโมเดล มันมองสไลด์ว่าโบราณเกินไปจนหลอนชื่อเรื่องที่เชยสุด ๆ ขึ้นมา และสี่เหลี่ยมดำจริง ๆ เกิดจากการส่องไฟจากด้านหน้าเพื่อไม่ให้เห็นส่วนโปร่งใส แต่มันพลาดจุดนั้นไป
    นอกจากนี้ ดูเหมือน API เองจะมีข้อจำกัดเรื่องขนาดไฟล์หรือความละเอียดที่ไม่ได้ระบุในเอกสาร

  • เมื่อเร็ว ๆ นี้ผมลองใช้ llama3.2-vision ประมวลผลแผ่นประมูลกระดาษสำหรับงานประมูลการกุศล และมันอ่านลายมือที่ค่อนข้างแย่ได้แม่นยำพอสมควร อยากใช้ในงานปีหน้าด้วย
    แต่เรื่องที่ทำให้น่าหงุดหงิดพอสมควรคือทำให้มันส่งออก CSV อย่างสม่ำเสมอได้ยาก ChatGPT กับ Gemini ดูจะทำส่วนนั้นได้ดีกว่า แต่ผมยังไม่ได้ลองทำอัตโนมัติเต็มรูปแบบ
    ขนาดงานคือแผ่นประมูลประมาณ 100 หน้า ดังนั้นการเก็บงานด้วยมือบ้างก็ยังพอรับได้ ดีกว่าใช้เวลาของอาสาสมัครแน่นอน
    https://github.com/philips/paper-bidsheets

    • อยากฟังว่า Handwriting OCR(https://www.handwritingocr.com) เทียบกับงานนี้ได้ระดับไหน
      ไม่ฟรี แต่ความแม่นยำกับเอกสารลายมืออยู่ระดับแนวหน้า ผมเป็นผู้ก่อตั้งเลยอาจมีอคติ แต่ระดับความแม่นยำตอนนี้น่าตื่นเต้นจริง ๆ สำหรับโปรเจกต์ 100 หน้า จะเสียแค่ 12 ดอลลาร์เท่านั้นและช่วยประหยัดเวลาได้
    • ผมคิดว่าให้ส่วน OCR เป็นหน้าที่ของ llama3.2-vision แล้วโยน การแปลงเป็น CSV ให้ ChatGPT น่าจะเป็นอย่างไร
  • ช่วงนี้ทำ OCR เยอะ โดยหลักคือการแปลงข้อความในภาพถ่ายครอบครัวให้เป็นดิจิทัล โมเดล OCR ทั่วไปแย่มาก ส่วน LLM ทำได้ดีกว่ามาก ในบรรดาโมเดลที่ทดสอบ Gemini Flash ดีแบบทิ้งห่าง แต่ก็ยังมีความล้มเหลวและการหลอนมากพอจนพิมพ์เองยังเร็วกว่า
    มันน่าหงุดหงิดตรงที่รู้สึกเหมือนเกือบจะทำได้ แต่ก็ทำไม่ได้ เครื่องมือนี้ดูแย่กว่านั้นอีก บางครั้งตอบมาแค่ข้อความ บางครั้งก็ให้คำอธิบายทั้งหมดอย่าง “The image is a scanned document with handwritten text...” ออกมา หวังว่าจะมีอะไรอย่างการ fine-tuning ที่ทำให้ชนะ Gemini Flash ได้ ซึ่งน่าจะช่วยประหยัดเวลาได้มาก เลยน่าเสียดาย

    • สงสัยว่าได้ลอง downscale รูปภาพหรือยัง ผมเริ่มได้ผลลัพธ์ที่ดีกว่าจากรูปความละเอียดต่ำ ใช้สแกนที่ถ่ายด้วยกล้องมือถือ
      convert -density 76 input.pdf output-%d.png
      https://github.com/philips/paper-bidsheets
    • ถ้าวัดจากโมเดลทั่วไป สถานะของ OCR แบบโอเพนซอร์ส ค่อนข้างแย่ น่าเสียดายที่ตัวเลือกแบบปิดของ Microsoft, Google อะไรแบบนั้นดีกว่ามาก สงสัยว่าได้ลองพวกนั้นด้วยไหม
      Flash น่าสนใจ และก็สงสัยด้วยว่าทดสอบ LLM ตัวไหนไปบ้าง
    • ช่วงนี้ใช้ gpt-4o ทำ OCR กับคลังรูปภาพแล้วได้ผลลัพธ์ค่อนข้างดี สิ่งสำคัญที่สุดที่ได้เรียนรู้คือ ต่อให้ใช้ LLM หรูแค่ไหน การเตรียมข้อมูลแบบธรรมดา ๆ ก็ยังสำคัญอยู่ดี
      การครอปรูปให้เหลือเฉพาะส่วนข้อความ ตัดขอบออก แล้วเพิ่มคอนทราสต์ช่วยได้อย่างมหาศาล เป็นบทความที่เขียนไว้ในปี 2015 แต่ยังใช้ได้ดีกับ GPT: https://www.danvk.org/2015/01/07/finding-blocks-of-text-in-a...
      สำหรับ GPT การป้อนทีละไม่กี่ย่อหน้าหรือน้อยกว่านั้นดีกว่าป้อนทั้งหน้าในครั้งเดียว ยิ่งข้อความสั้น โอกาสหลอนก็ยิ่งลดลง
    • ผมก็เสียดายเหมือนกัน เพราะตอนนี้กำลังพยายามทำสิ่งเดียวกันเป๊ะ กำลังแปลงภาพครอบครัวเป็นดิจิทัล และบางรูปมีภาษาเยอรมันอยู่ด้านหลัง
      OCR ที่เป็นกระแสเมื่อเร็ว ๆ นี้แย่มาก เลยหวังว่าอันนี้จะดีกว่า ตอนวางรูปทีละรูปในแชต ChatGPT 4o ทำได้ดี แต่ยังไม่ได้ลอง API ไม่รู้ว่าถ้าประมวลผลรูป 6,500 ใบจะเสียค่าใช้จ่ายเท่าไร และในนั้นก็มีรูปเปล่าเยอะ แต่ก็ไม่มีวิธีคัดออกง่าย ๆ
    • สงสัยว่าได้ลอง Claude หรือยัง
      การคืนตำแหน่งข้อความยังไม่ดีนัก แต่จากเท่าที่ผมทดสอบ ประสิทธิภาพ OCR น่าทึ่งมาก
  • สงสัยว่านี่ควรเป็นโพสต์ “Show HN” หรือเปล่า ดูเหมือนเป็นแค่ฟรอนต์เอนด์ และก็ไม่เห็นส่วนที่เชื่อมโยงโดยตรงกับคำว่า Llama ในชื่อด้วย together.ai อาจเป็นผู้ให้พื้นที่คลาวด์ก็ได้

  • ผมใช้ genetic algorithm วางวงกลม 500 วงเพื่อสร้างประโยค แล้วลองใส่ประโยคที่วาดด้วยวงกลมจริง ๆ เข้าไป
    https://www.instagram.com/marekgibney/p/BiFNyYBhvGr/
    ที่น่าสนใจคือมันรู้จำวงกลมได้ดี แต่ไม่เห็นประโยค มันตอบประมาณว่า “ในภาพไม่มีข้อความหรือองค์ประกอบที่สามารถแสดงเป็น Markdown ได้ เป็นเพียงการจัดวางเชิงภาพของวงกลม และไม่มีข้อมูลให้แปลเป็น Markdown”

    • จากแนวคิดที่ว่าถ้าหรี่ตาจะอ่านออก พอผมใช้ Gaussian blur กับภาพ ก็ได้คำตอบว่าข้อความเบลออ่านได้ว่า “STOP THINKING IN CIRCLES.”
      คำตอบไม่แน่นอน ผมจึงลองกับภาพต้นฉบับหลายครั้ง แต่ไม่สำเร็จเลยสักครั้ง ในทางกลับกัน เอฟเฟกต์ low-pass filter ทุกแบบที่ใช้กลับได้ผลด้วยอัตราความสำเร็จสูง
      https://imgur.com/q7Zd7fa
    • ผมก็อ่านอันนี้ไม่ออกเหมือนกัน
      ถ้ามองจากไกล ๆ จะอ่านง่ายขึ้น
    • สงสัยว่าเดิมที LLM เคยถูกฝึกด้วย วัสดุต้นฉบับ แบบนี้หรือเปล่า
      วิธีใช้ genetic algorithm ค่อนข้างเจ๋ง อยากดูโค้ด หรืออย่างน้อยก็ฟังก์ชันรางวัล
    • ก่อนดูเฉลย ผมก็อ่านไม่ออกเลยนอกจากคำว่า “stop”
    • ไม่เข้าใจว่ามันน่าสนใจตรงไหน ภาพดูไม่เหมือนอะไรเลย และถ้าจะเห็นตัวอักษรก็ต้องมองเอียง ๆ ถึงจะพอเห็น
  • ตลกดี ผมใส่สกรีนช็อตของเอกสารยาว 3 ภาพเข้าไป มันประมวลผลได้ค่อนข้างดี แต่พอตรวจแก้ก็เห็นว่า AI สร้างย่อหน้าที่ไม่มีอยู่ในต้นฉบับขึ้นมา
    น่าจะเป็นเพราะธรรมชาติของสกรีนช็อตทำให้บางประโยคหรือบางย่อหน้าถูกตัดกลางคัน และสิ่งนั้นไปกระตุ้นแนวโน้มการ เติมช่องว่าง ของ LLM มันปล่อยย่อหน้าที่ยังไม่จบไว้อย่างนั้นไม่ได้ และยังใส่ย่อหน้าสรุปสั้น ๆ ที่ไม่มีอยู่ในเอกสารต้นฉบับเลยด้วย

    • ผมไม่เข้าใจว่าเทคโนโลยีที่มี ความเป็นไปได้ที่จะแต่งเรื่องขึ้นมา แม้เพียงเล็กน้อย จะถูกพิจารณาให้นำไปใช้ในโลกจริงได้อย่างไร
  • ลองใส่สแกนเก่าของผังวงจรเมนบอร์ด Asus P3B-F ปี 1997 เข้าไป
    มันดึงข้อความได้แค่บางส่วนใน title block เช่นชื่อโปรเจกต์กับวันที่ และแม้ฟอนต์จะชัดเจนก็ยังสับสนทั้ง 8/B และ 1/I ปนกันไปหมด
    ข้อมูลที่มีประโยชน์จริง ๆ กลายเป็นประมาณ “Tables / Table 1: [Insert table 1 here] / Other Elements / [Insert other elements here]”