Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2度もゼロから書き直して、やっとブラウザでぬるぬる動くAIに辿り着いた話

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 2度もゼロから書き直して、やっとブラウザでぬるぬる動くAIに辿り着いた話

Avatar for Tomohiro Inoue

Tomohiro Inoue

June 05, 2025

Other Decks in Programming

Transcript

  1. AI࣮૷2ճ໨ in TypeScript TypeScript ͰΞϓϦʹ௚઀࣮૷ OpenCV.js ͱ͍͏ը૾ॲཧϥΠϒϥϦΛ࢖༻ <script src="opencv.js" type="text/javascript"></script>

    // cv.Mat ͱ͍͏ܗࣜͰը૾Λѻ͏ function processImage(image: cv.Mat): cv.Mat { // RGB -> നࠇը૾ʹม׵ let grayImage = new cv.Mat(); cv.cvtColor(image, grayImage, cv.COLOR_RGBA2GRAY); // 2ഒʹ֦େ let largeImage = new cv.Mat(); const largeImageSize = new cv.Size(grayImage.cols * 2, grayImage.rows * 2); cv.resize(grayImage, largeImage, largeImageSize, 0, 0, cv.INTER_LINEAR); return largeImage; }
  2. OpenCV.js Ͳ͏ͩͬͨʁ ΊͪΌͪ͘ΌϝϞϦϦʔΫͨ͠ OpenCV.js ͸ϝϞϦΛखಈͰղ์͠ͳ͍ͱ͍͚ͳ͍... // cv.Mat ͱ͍͏ܗࣜͰը૾Λѻ͏ function processImage(image:

    cv.Mat): cv.Mat { // RGB -> നࠇը૾ʹม׵ let grayImage = new cv.Mat(); cv.cvtColor(image, grayImage, cv.COLOR_RGBA2GRAY); // 2ഒʹ֦େ let largeImage = new cv.Mat(); const largeImageSize = new cv.Size(grayImage.cols * 2, grayImage.rows * 2); cv.resize(grayImage, largeImage, largeImageSize, 0, 0, cv.INTER_LINEAR); grayImage.delete(); return largeImage; } Delete Λ๨ΕΔͱϝϞϦʹ࢒Γଓ͚Δ
  3. OpenCV.jsɺͳΜͰͦΜͳ࢓༷ͳͷ...ʁʢ2/3ʣ OpenCV.js ͕ WebAssembly (Wasm) Λ࢖͍ͬͯΔ͔Β Wasm Ͱ֬อ͞ΕͨϝϞϦ͸ TS ͷ

    GC ͷର৅֎ let image = new cv.Mat(); cv::Mat* image = new cv::Mat(); TypeScript ଆͷॲཧ Wasm ଆͷॲཧ TypeScript ͷϝϞϦ Wasm ͷϝϞϦ image ͷϙΠϯλ image σʔλ delete Λݺͼ๨Εͨ৔߹
  4. OpenCV.jsɺͳΜͰͦΜͳ࢓༷ͳͷ...ʁʢ3/3ʣ OpenCV.js ͕ WebAssembly (Wasm) Λ࢖͍ͬͯΔ͔Β Wasm Ͱ֬อ͞ΕͨϝϞϦ͸ TS ͷ

    GC ͷର৅֎ let image = new cv.Mat(); image.delete(); cv::Mat* image = new cv::Mat(); delete image; TypeScript ଆͷॲཧ Wasm ଆͷॲཧ TypeScript ͷϝϞϦ Wasm ͷϝϞϦ image ͷϙΠϯλ image σʔλ delete ΛݺΜͩ৔߹
  5. AI࣮૷3ճ໨ in C++ ͷ݁຤ Wasm ࡞ͬͯΈͯͲ͏ͩͬͨʁ • ϝϞϦϦʔΫ͕ى͜Γʹ͘͘ͳͬͨ
 
 


    • େن໛σʔλͰϝτϦΫεऔΕΔΑ͏ʹͳͬͨͷͰAIਫ਼౓վળ΋ޮ཰Խͨ͠ const labelChecker = new LabelChecker(); const result = labelChecker.check(image); result.delete(); labelChecker.delete();
  6. ͍͞͝ʹ ·ͱΊ • Wasm Λ࢖͏࣌͸ delete ͕ඞཁ͔Ͳ͏͔͔֬ΊΑ͏ • ϒϥ΢βͰಈ͘ AI

    Λࣗࣾ։ൃ͢ΔͳΒ Wasm ʹ͢Δͷ͸݁ߏΞϦͳબ୒ࢶ ແࣄ׬੒ͯ͠νʔϜͰϩϒελʔΛ৯΂ͨ࣌ͷҰຕ