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
Tomohiro Inoue
June 05, 2025
Programming
380
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
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
190
yield再入門 #phpcon
o0h
PRO
0
700
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
140
自作OSでスライド発表する
uyuki234
1
3.9k
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
240
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
8
3k
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
630
What's New in Android 2026
veronikapj
0
130
継続モナドとリアクティブプログラミング
yukikurage
3
620
Claude Team Plan導入・ガイド
tk3fftk
0
220
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
530
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
140
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Done Done
chrislema
186
16k
RailsConf 2023
tenderlove
30
1.5k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
Technical Leadership for Architectural Decision Making
baasie
3
440
The Spectacular Lies of Maps
axbom
PRO
1
870
The Curse of the Amulet
leimatthew05
2
13k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
420
Abbi's Birthday
coloredviolet
3
8.8k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1k
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 ݺͼग़͠