Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
2度もゼロから書き直して、やっとブラウザでぬるぬる動くAIに辿り着いた話
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Tomohiro Inoue
June 05, 2025
Programming
360
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
2度もゼロから書き直して、やっとブラウザでぬるぬる動くAIに辿り着いた話
Tomohiro Inoue
June 05, 2025
Other Decks in Programming
See All in Programming
New "Type" system on PicoRuby
pocke
1
960
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
150
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.3k
Lessons from Spec-Driven Development
simas
PRO
0
210
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
710
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
140
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
11
5.8k
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
5.4k
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
120
Claspは野良GASの夢をみるか
takter00
0
200
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
270
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
210
Featured
See All Featured
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
Speed Design
sergeychernyshev
33
1.9k
Six Lessons from altMBA
skipperchong
29
4.3k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
1
200
Become a Pro
speakerdeck
PRO
31
6k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
Color Theory Basics | Prateek | Gurzu
gurzu
0
370
Design in an AI World
tapps
1
240
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
30 Presentation Tips
portentint
PRO
1
330
Amusing Abliteration
ianozsvald
1
210
Transcript
2θϩ͔Βॻ͖ͯ͠ɺ ͬͱϒϥβͰ͵Δ͵Δಈ͘AIʹḷΓண͍ͨ Χϛφγ StatHackΧϯύχʔ Ҫ্ஐ༟ TechBowl x Χϛφγ ߹ಉษڧձ @20250530
ΧϛφγͰࣗࣾͰAI։ൃΛߦ͍ͬͯ·͢ɻ ࠓAIʹΑΔϦΞϧλΠϜը૾ॲཧΛ ϒϥβͰಈ͔͢ํ๏ʹ͍ͭͯ ࣦഊஊΛަ͓͑ͭͭ͠·͢ɻ
ԿΛ࡞͔ͬͨʁ ৯ϥϕϧͷϦΞϧλΠϜݕࠪΞϓϦ
ۤ࿑ 2θϩ͔ΒίʔυΛॻ͖͢Ίʹ 1ճҙਤత͕ͩͬͨɺ2ճఆ͍ͯ͠ͳ͔ͬͨ 12݄ AI Ҏ֎ͷ Frontend & Backend AI
ʢPythonʣ AI ʢTypeScriptʣ AI ʢC++ʣ 1݄
AI࣮1ճ in Python Python ͰϓϩτλΠϓ࡞ ਫ਼ݕূͷతͰ։ൃɻϥΠϒϥϦ͕ॆ࣮͍ͯ͠ΔͷͰߴʹݕূՄೳɻ ։ൃظؒɿ2िؒ
ͳͥɺPython ίʔυΛࣺ͔ͯͨʁ Server ଆͰͳ͘ɺClient ଆͰॲཧ͔ͨͬͨ͠ ϦΞϧλΠϜͰॲཧ͔ͨͬͨ͠ʢUX໘Ͱਫ਼໘Ͱʣ ௨৴ʹ͕͔͔࣌ؒΔʂ ɹॲཧ͕ߴͳͷͰ ܁Γฦ͠ݕࠪͰ͖Δ Server
ʹ AI ͕͋Δ߹ Client ʹ AI ͕͋Δ߹
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; }
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 ΛΕΔͱϝϞϦʹΓଓ͚Δ
OpenCV.jsɺͳΜͰͦΜͳ༷ͳͷ...ʁʢ1/3ʣ OpenCV.js ͕ WebAssembly (Wasm) Λ͍ͬͯΔ͔Β Wasm: C++RustͷίʔυΛίϯύΠϧͨ͠όΠτίʔυɻ ϒϥβ্ͰωΠςΟϒʹ͍ۙߴͳॲཧ͕࣮ݱՄೳɻ
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 ΛݺͼΕͨ߹
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 ΛݺΜͩ߹
AI࣮3ճɺͲ͏͢Δ͔ʁ Wasm ʹશ෦ͷॲཧΛด͡ࠐΊͪΌ͓͏ C++ ͰAIݕࠪϞδϡʔϧؙ͝ͱ Wasm ʹ͢Δ͜ͱʹ • Wasm ʹΑΔߴͳॲཧΛҡ࣋
• खಈ delete ΛۃྗݮΒ͢
AI࣮3ճ in C++ ͷ݁ Wasm ࡞ͬͯΈͯͲ͏ͩͬͨʁ • ϝϞϦϦʔΫ͕ى͜Γʹ͘͘ͳͬͨ
• େنσʔλͰϝτϦΫεऔΕΔΑ͏ʹͳͬͨͷͰAIਫ਼վળޮԽͨ͠ const labelChecker = new LabelChecker(); const result = labelChecker.check(image); result.delete(); labelChecker.delete();
͍͞͝ʹ ·ͱΊ • Wasm Λ͏࣌ delete ͕ඞཁ͔Ͳ͏͔͔֬ΊΑ͏ • ϒϥβͰಈ͘ AI
Λࣗࣾ։ൃ͢ΔͳΒ Wasm ʹ͢Δͷ݁ߏΞϦͳબࢶ ແࣄͯ͠νʔϜͰϩϒελʔΛ৯ͨ࣌ͷҰຕ
Appendix: ·ͩΕ͍ͯͳ͍͜ͱ ϚϧνεϨουʹΑΔߴԽ wasm ଆͰϚϧνεϨουͷରԠ͕ൺֱత؆୯͕ͩͬͨɺ ΞϓϦଆΛ Cross-origin isolated ͱ͍͏ঢ়ଶʹ͢Δඞཁ͕͋Γɺݱঢ়Ͱ͖͍ͯͳ͍ JSɿϝΠϯεϨου
wasm SharedArrayBuffer JSɿWeb Worker wasm JSɿWeb Worker wasm worker ݺͼग़͠