
- TOP
- ã¿ã°äžèЧ
- TensorFlow
TensorFlow
ã€ãã³ã
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
ãã¬ãžã³
æè¡ããã°
UC Berkeley ã§éå¬ããã Agentic AI Summit 2026 ã®åå ã¬ããŒããçŸå°çŽ 5,000 人ã»ç»å£è
150 åè¶
ã®ã«ã³ãã¡ã¬ã³ã¹ãããharnessã»è©äŸ¡åºç€ã»ã»ãã¥ãªãã£ã»coding agent ãªã© Agentic AI ã®æåç·ã玹ä»ããŸãã
ã¯ããã« ã¯ãããŸããŠã KINTO ãã¯ãããžãŒãºã§ KINTO Unlimited Android ã¢ããªãéçºããŠãã JR.Liang ã§ãã æ¬èšäºã§ã¯ãKINTO Unlimited ã¢ããªã«ãŠæäŸããããããªã«ã¬ã€ããã¹ãã£ã³æ©èœã® AR ãšãã§ã¯ãã«ã€ããŠãAndroid ã«ãããæè¡çãªæ€èšŒã玹ä»ããŸãã ç¹ã« MediaPipe ã®ãœãªã¥ãŒã·ã§ã³ãçšããŠå¹
åºã Android ããã€ã¹ã§ AR ãšãã§ã¯ããå®çŸããå®è£
ã«ãã©ãŒã«ã¹ããŸãã ãããªã«ã¬ã€ããšã¯ ããããªã«ã¬ã€ãã㯠ARïŒæ¡åŒµçŸå®ïŒã掻çšããŠãè»å
ã¹ã€ããã®çšéãäœ¿ãæ¹ãããã¹ããšåç»ã§æ¡å
ããæ©èœã§ãã玹ä»åç»ãã芧ãã ããã https://youtube.com/watch?v=E8zfNzuHr7g&embeds_referring_euri=https%3A%2F%2Fcorp.kinto-jp.com%2F&source_ve_path=MjM4NTE äžèšã®ç޹ä»åç»ã¯ iOS ã¢ããªã§ã®åäœã瀺ããŠããŸããã¹ã€ããäžã«è¡šç€ºãããé»è²ã®äžž ð¡ ããAR æè¡ã§å®çŸããä»®æ³ã³ã³ãã³ãã§ãã æ©èœå
šäœã®ä»çµã¿ã¯ä»¥äžã®æµãã§ããæ¬èšäºã§ã¯ 3 çªç®ïŒæç»ïŒã«é¢ããå
å®¹ãæ±ããŸãã 1. ã¢ããªã®ã«ã¡ã©ãèµ·åãã«ã¡ã©ç»åãååŸ 2. æ©æ¢°åŠç¿ã«ãããç©äœèªèãçšããŠãè»å
ã®ã¹ã€ãããæ€åº 3. æ€åºãã座æšãå
ã«ããã¿ã³ãšããã¹ãããã¬ãŒã äžã«æç» 4. ãã¿ã³ãã¿ããããŠãåœè©²ã¹ã€ããã®ããã¹ããšåç»ã衚瀺 Android AR æè¡æ€èšŒã®çµç·¯ åœåã® Android çããããªã«ã¬ã€ããã®ã¹ãã£ã³æ©èœã§ã¯ãCanvas ãå©çšããŠæ¯ãã¬ãŒã æ€åºããã座æšã«æç»ããå®è£
ã§ããããã®ããæ€åºã®æéå·®ã«ãããã¹ããïŒã«ã¡ã©ïŒãåãããšæç»ã®ãºã¬ãçããŠããŸããã 2D Canvas 幞ããMediaPipe ã®ãœãªã¥ãŒã·ã§ã³ã§ãã Instant Motion Tracking ã¢ãžã¥ãŒã«ã§ çŽ æ©ããã€å®å®ãã AR ãšãã§ã¯ããå®çŸã§ããããšãããããAndroid ãžã®å°å
¥ãæ€èšŒããŸããã 3D OpenGL MediaPipe Instant Motion Tracking MediaPipe 㯠Google ãéçºãããªãŒãã³ãœãŒã¹ã® ML ãã¬ãŒã ã¯ãŒã¯ã§ã顿€åºã»æã®ãã©ããã³ã°ã»å§¿å¢æšå®ãªã©ãªã¢ã«ã¿ã€ã æ ååŠçã®ãœãªã¥ãŒã·ã§ã³ãæäŸããŸãã ãã®äžã® Instant Motion Tracking ã¯ãçŸå®äžçã®ã·ãŒã³äžã« 3D ä»®æ³ã³ã³ãã³ãããªã¢ã«ã¿ã€ã ã§æ£ç¢ºã«é
眮ã§ãã AR ãã©ããã³ã°æ©èœã§ããåæåãå³å¯ãªãã£ãªãã¬ãŒã·ã§ã³ãäžèŠã§ã鿢é¢ãåããŠããé¢ã®äžã«ã³ã³ãã³ãã眮ãããšãå¯èœã§ãã @ card Android + MediaPipe AR ã¢ãŒããã¯ã㣠graph TB A(Android CameraX) --> |Camera Frame| B(Instant Motion Tracking) B --> |Camera Image| C(TensorFlow Object Detection) C --> |Detections Information| B(Instant Motion Tracking) B --> |Output Stream| D(Android Surface Rendering) CameraX ã§ååŸãããã¬ãŒã ã Instant Motion Tracking ã«æž¡ããTensorFlow Lite ã§ç©äœæ€åºããæ
å ±ãå
ã« AR ã³ã³ãã³ããæç»ã»è¿œåŸããããã€ãã©ã€ã³ã§ãã MediaPipe ã©ã€ãã©ãªã®äœæ MediaPipe ã§ã¯ Bazel ã䜿çšããŠããã±ãŒãžããã«ãããŸããAndroid ã«é©åãã AAR ãšããŠæžãåºããŠã¢ããªã«çµã¿èŸŒã¿ãŸãã https://chuoling.github.io/mediapipe/getting_started/android_archive_library.html AAR ããã«ããã BUILD ãã¡ã€ã«ãäœæãã instant_motion_tracking ãåºç€ãšããå®çŸ©ãèšè¿°ããŸãã load("//mediapipe/java/com/google/mediapipe:mediapipe_aar.bzl", "mediapipe_aar") mediapipe_aar( name = "mediapipe_ar", calculators = ["//mediapipe/graphs/instant_motion_tracking:instant_motion_tracking_deps"] ) MediaPipe 㯠C++ ãäžæ žã®ãããC++ ã©ã³ã¿ã€ã ã§ãã libc++_shared.so ã AAR ã«å梱ããå¿
èŠããããŸãã https://github.com/google-ai-edge/mediapipe/blob/v0.10.32/third_party/BUILD#L399-L403 ãŸã Instant Motion Tracking ã§ã¯ç»ååŠçã©ã€ãã©ãª OpenCV ãå©çšããAR ãã©ããã³ã°ãè¡ããŸãã https://github.com/google-ai-edge/mediapipe/blob/v0.10.32/WORKSPACE#L649-L655 äžèšãµãŒãããŒãã£ã®ã©ã€ãã©ãªãå«ããŠã以äžã®ã³ãã³ãã§ AAR ããã«ãããŸãã bazel build -c opt --strip=ALWAYS \ --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \ --fat_apk_cpu=arm64-v8a \ --linkopt=-Wl,-z,max-page-size=16384 \ //path/to/the/aar/build/mediapipe_ar:mediapipe_ar.aar åžå Žã«æµéããŠãã Android ããã€ã¹ã¯äž»ã« arm64-v8a ã¢ãŒããã¯ãã£ã®ãããAAR ã®ãµã€ãºãæããç®çã§ fat_apk_cpu=arm64-v8a ã«ããŸãã C++ ã©ã€ãã©ãªã® 16KB page-size ã«å¯Ÿå¿ããããã max-page-size=16384 ã远å ããŸãã ãŸã AAR ãå©çšããã«ã¯ã°ã©ãæ§é ãå®çŸ©ãããã¡ã€ã«ïŒ binarypb ïŒãå¿
èŠã§ãã bazel build -c opt mediapipe/graphs/instant_motion_tracking:instant_motion_tracking.binarypb Instant Motion Tracking ã®å°å
¥ AAR ãã¢ããªã«çµã¿èŸŒãã§ãAndroid åŽã®å®è£
ã解説ããŠãããŸãã äžèšã¯ AAR ã«çµã¿èŸŒãã instant_motion_tracking ã®å
šäœæ§é ã§ãã instant_motion_tracking.pbtxt ã®æ§æ ã°ã©ãå®çŸ©ãã¡ã€ã« instant_motion_tracking.pbtxt ã¯ãCalculatorïŒåŠçããŒãïŒã»å
¥åºåã¹ããªãŒã ã»ãµã€ããã±ããã® 3 èŠçŽ ã§æ§æãããŸãã Calculator å Calculator ããã€ãã©ã€ã³äžã§ã©ã®åŠçãæ
ããã瀺ããŸãã Calculator åœ¹å² ImageTransformationCalculator ã«ã¡ã©ãã¬ãŒã ã 320Ã320ïŒFITïŒã«ãªãµã€ãºãç©äœæ€åºã¢ãã«ã®å
¥åãµã€ãºã«åããã GpuBufferToImageFrameCalculator GPU ãã¯ã¹ãã£ã CPU ã® ImageFrame ã«å€æãTensorFlow Lite æšè«ã«äœ¿çš StickerManagerCalculator Sticker Proto ãããŒã¹ããåæã¢ã³ã«ãŒã®åº§æšã»å転ã»ã¹ã±ãŒã«ã»ã¬ã³ããªã³ã°çš®å¥ã«åè§£ RegionTrackingSubgraph ããã¯ã¹ãã©ããã³ã°ã§ã¢ã³ã«ãŒäœçœ®ã远åŸãå
éšã« TrackedAnchorManagerCalculator ïŒã¢ã³ã«ãŒç®¡çïŒãš BoxTrackingSubgraphGpu ïŒGPU ãã©ããã³ã°ïŒãæã€ MatricesManagerCalculator ãã©ããã³ã°çµæã»å転ã»ã¹ã±ãŒã«ã»FOVã»ã¢ã¹ãã¯ãæ¯ãã OpenGL çš 4Ã4 ã¢ãã«è¡åãçæ GlAnimationOverlayCalculator ã¢ãã«è¡åãšãã¯ã¹ãã£ãçšããŠãå
ã®ã«ã¡ã©ãã¬ãŒã äžã« AR ã³ã³ãã³ãã OpenGL ã§æç»ã output_video ãšããŠåºå input_stream / output_stream input_stream ã¯ãã¬ãŒã ããšã« Android åŽããéä¿¡ããããŒã¿ã output_stream ã¯ã°ã©ãã®åŠççµæã§ãã ã¹ããªãŒã å C++ å æ¹å çšé input_video GpuBuffer Input ã«ã¡ã©ãã¬ãŒã sticker_proto_string String(Serialized Proto) Input ã¹ããã«ãŒã®åº§æšã»ã¹ã±ãŒã«çïŒSticker ProtoïŒ sticker_sentinels vector Input 座æšããªã»ããããã¹ããã«ãŒ ID ã®é
å gif_textures vector Input AR ã³ã³ãã³ãã® Bitmap ãã¯ã¹ãã£é
å gif_aspect_ratios vector Input åãã¯ã¹ãã£ã®ã¢ã¹ãã¯ãæ¯ output_video GpuBuffer Output AR æç»æžã¿ãã¬ãŒã input_side_packet input_side_packet ã¯åæåæã«äžåºŠã ãæž¡ã宿°ã§ãã°ã©ãå®è¡äžã¯å€åããŸããã ãã±ããå çšé vertical_fov_radians ã«ã¡ã©ã®åçŽ FOVïŒã©ãžã¢ã³ïŒ aspect_ratio ã«ã¡ã©ã®ã¢ã¹ãã¯ãæ¯ width / height ã«ã¡ã©è§£å床 gif_texture ããã©ã«ããã¯ã¹ãã£ïŒ1x1 ãã¬ãŒã¹ãã«ãïŒ gif_asset_name AR ãã¯ã¹ãã£æç»çšã®ããªãŽã³ã¡ãã·ã¥ïŒ .obj ïŒãã¡ã€ã«å Android ãžã®å°å
¥ã«åœãã£ãŠãå
¬åŒãµã³ãã«ã®ã³ãŒããåèã«ããŸãã https://github.com/google-ai-edge/mediapipe/tree/master/mediapipe/examples/android/src/java/com/google/mediapipe/apps/instantmotiontracking 1. åæå MediaPipe ã䜿çšããåã«ããã€ãã£ãã©ã€ãã©ãªã®èªã¿èŸŒã¿ãšã¢ã»ãããããŒãžã£ãŒã®åæåãå¿
èŠã§ãã companion object { init { System.loadLibrary("mediapipe_jni") System.loadLibrary("opencv_java4") } } // onCreate çžåœã®åŠç AndroidAssetUtil.initializeNativeAssetManager(context) mediapipe_jni : MediaPipe ã®ã³ã¢åŠçãè¡ã JNI ã©ã€ãã©ãª opencv_java4 : AR ãã©ããã³ã°ã«äœ¿çšãã OpenCV ã©ã€ãã©ãª initializeNativeAssetManager : ãã€ãã£ãã³ãŒãããã¢ã»ããïŒbinarypb çïŒã«ã¢ã¯ã»ã¹ããããã«å¿
èŠ 2. ã«ã¡ã©ãèµ·åãã å
¬åŒãµã³ãã«ãåèã«ã以äžã®é åºã§ãã€ãã©ã€ã³ãæ§ç¯ããŸãã ããŒã¿ãããŒïŒ CameraX â ExternalTextureConverter â FrameProcessor â SurfaceView 2.1 EGL ç°å¢ãš FrameProcessor ã®åæå val eglManager = EglManager(null) val frameProcessor = FrameProcessor( context, eglManager.nativeContext, "instant_motion_tracking.binarypb", "input_video", "output_video" ).apply { videoSurfaceOutput.setFlipY(true) setInputSidePackets( mapOf( "gif_asset_name" to packetCreator.createString("gif.obj.uuu"), "vertical_fov_radians" to packetCreator.createFloat32(fovRadians), "aspect_ratio" to packetCreator.createFloat32(resolution.width.toFloat() / resolution.height.toFloat()), "width" to packetCreator.createInt32(resolution.width), "height" to packetCreator.createInt32(resolution.height), "gif_texture" to packetCreator.createRgbaImageFrame(createBitmap(1, 1)) ) ) } EglManager : OpenGL ES ã® EGL ã³ã³ããã¹ããäœæã»ç®¡çãMediaPipe ã®ã°ã©ãå
GPU CalculatorïŒ GlAnimationOverlayCalculator çïŒã OpenGL ã§æç»ããããã«å¿
èŠ FrameProcessor : EGL ã³ã³ããã¹ããåãåããã°ã©ãã®èªã¿èŸŒã¿ã»å
¥åºåã¹ããªãŒã ã®ç®¡çã»ãã¬ãŒã ããšã®ã°ã©ãå®è¡ãè¡ã instant_motion_tracking.binarypb : .pbtxt ã Bazel ã§ã³ã³ãã€ã«ããã°ã©ãå®çŸ©ãã€ã㪠input_video : MediaPipe ã°ã©ããžã«ã¡ã©ãã¬ãŒã ãå
¥å output_video : ã°ã©ãã§åŠçïŒAR æç»ãªã©ïŒãããæ åãåºå videoSurfaceOutput.setFlipY(true) : OpenGL ãšã«ã¡ã©ã® Y 軞æ¹åãéã®ãããåºåæ åãäžäžå転ããŠæ£ããåãã«ãã setInputSidePackets : ã°ã©ãã® input_side_packet ã«å¯Ÿå¿ãã宿°ããŸãšããŠèšå®ãã«ã¡ã©ã® FOVã»ã¢ã¹ãã¯ãæ¯ã»è§£å床ãªã©ãã°ã©ãå®è¡äžã«å€åããªãå€ãåæåæã«äžåºŠã ãæž¡ã gif_asset_name 㯠AR ãã¯ã¹ãã£ãæç»ããããã® ããªãŽã³ã¡ãã·ã¥ïŒé ç¹ããŒã¿ïŒ ãããã§ã¯å
¬åŒãµã³ãã«ã® gif.obj.uuu ãå©çš 2.2 ã«ã¡ã©æ åã®å€æãã€ãã©ã€ã³æ§ç¯ val externalTextureConverter = ExternalTextureConverter(eglManager.context, 2).apply { setFlipY(true) setConsumer(frameProcessor) setDestinationSize(resolution.width, resolution.height) } val cameraHelper = object : CameraXPreviewHelper() { override fun getCameraCharacteristics(context: Context?, lensFacing: Int?) = cameraCharacteristics }.apply { setOnCameraStartedListener(onCameraStartedListener) startCamera( context, lifecycleOwner, CameraHelper.CameraFacing.BACK, externalTextureConverter.surfaceTexture, Size(resolution.height, resolution.width) ) } ExternalTextureConverter : ã«ã¡ã©ã® GL_EXTERNAL_OES ãã¯ã¹ãã£ã MediaPipe ãåŠçã§ããæšæºãã¯ã¹ãã£ã«å€æ setFlipY(true) : ã«ã¡ã©æ åã®äžäžå転ãè£æ£ setDestinationSize(resolution.width, resolution.height) : ãã€ãã©ã€ã³ã®åŠçãµã€ãºã¯ããŒãã¬ãŒã座æšïŒäŸ: 960Ã1280 ïŒã§æå® CameraXPreviewHelper : CameraX ã§ããã¯ã«ã¡ã©ãèµ·åããConverter ã® SurfaceTexture ã«åºå startCamera(targetSize = Size(resolution.height, resolution.width)) : CameraX ã¯ã»ã³ãµãŒåº§æšïŒã©ã³ãã¹ã±ãŒãïŒãæåŸ
ãããããwidth ãš height ãå
¥ãæ¿ããŠæž¡ã å
¬åŒãµã³ãã«ã§ã¯ CameraXPreviewHelper ããã®ãŸãŸäœ¿çšããå
éšã§ CameraManager ããã«ã¡ã©ç¹æ§ãååŸããŸãã https://github.com/google-ai-edge/mediapipe/blob/v0.10.32/mediapipe/java/com/google/mediapipe/components/CameraXPreviewHelper.java#L558-L560 æ¬å®è£
ã§ã¯ getCameraCharacteristics ããªãŒããŒã©ã€ãããäºåã«ååŸæžã¿ã® CameraCharacteristics ãçŽæ¥æž¡ããŸããããã«ãã FOV ãã¢ã¹ãã¯ãæ¯ã®ç®åºã«äœ¿ãã«ã¡ã©æ
å ±ããã¢ããªåŽã§äžå
管çã§ããŸãã 2.3 åºåå
SurfaceViewã®èšå® SurfaceView(context).apply { holder.addCallback(object : SurfaceHolder.Callback { override fun surfaceCreated(holder: SurfaceHolder) { frameProcessor.videoSurfaceOutput.setSurface(holder.surface) } override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) { val displaySize = cameraHelper.computeDisplaySizeFromViewSize(Size(width, height)) val (displayWidth, displayHeight) = if (cameraHelper.isCameraRotated) { displaySize.height to displaySize.width } else { displaySize.width to displaySize.height } externalTextureConverter.setDestinationSize(displayWidth, displayHeight) } override fun surfaceDestroyed(holder: SurfaceHolder) { frameProcessor.videoSurfaceOutput.setSurface(null) } }) } SurfaceHolder.Callback : SurfaceView ã®ã©ã€ããµã€ã¯ã«ã«å¿ã㊠FrameProcessor ã®åºåå
ã管ç surfaceCreated : FrameProcessor ã®åºåå
ãšã㊠Surface ãèšå® surfaceChanged : ç»é¢å転ã»ãµã€ãºå€æŽæã«åºåè§£å床ãèª¿æŽ surfaceDestroyed : ãªãœãŒã¹è§£æŸ 3. æ€åºåº§æšãã°ã©ãã«æž¡ã ç©äœæ€åºïŒTensorFlow Lite çïŒã§åŸããã座æšã MediaPipe ã°ã©ãã«æž¡ããAR ã³ã³ãã³ããé
眮ããŸãã 3.1 ã°ã©ããã倿æžã¿ç»åãååŸ MediaPipe ã°ã©ãå
ã§ ImageTransformationCalculator ãš GpuBufferToImageFrameCalculator ã«ãã£ãŠå€æãããç»åã addPacketCallback ã§åãåããç©äœæ€åºã«äœ¿çšããŸãã frameProcessor.addPacketCallback("transformed_input_video_cpu") { packet -> packet ?: return@addPacketCallback // 倿æžã¿ç»åãç©äœæ€åºïŒTensorFlow LiteïŒã«æž¡ã val bitmap = PacketGetter.getBitmapFromRgba(packet) objectDetector.detect(bitmap) { detections -> // æ€åºçµæãåŠç } } transformed_input_video_cpu : 倿åŸã®ç»åãåºåããã¹ããªãŒã å 3.2 座æšã®æ£èŠå ç©äœæ€åºçµæã®ãã¯ã»ã«åº§æšããMediaPipe ãæåŸ
ããæ£èŠå座æšã«å€æããŸãã // ãã¯ã»ã«åº§æš â æ£èŠååº§æš (0.0ã1.0) val normalizedX = pixelX / imageWidth.toFloat() val normalizedY = pixelY / imageHeight.toFloat() 3.3 Sticker Proto ã®æ§é Instant Motion Tracking ã§ã¯ãAR ãªããžã§ã¯ãã®äœçœ®æ
å ±ã Protocol Buffers 圢åŒã§å®çŸ©ããŸãã message Sticker { int32 id = 1; // ãŠããŒã¯ID float x = 2; // æ£èŠåXåº§æš (0.0ã1.0) float y = 3; // æ£èŠåYåº§æš (0.0ã1.0) float rotation = 4; // å転è§åºŠ float scale = 5; // ã¹ã±ãŒã« int32 render_id = 6; // ã¬ã³ããªã³ã°ID } message StickerRoll { repeated Sticker sticker = 1; } 3.4 ãã¬ãŒã ããšã«ãã±ãããéä¿¡ setOnWillAddFrameListener ã䜿çšããŠãåãã¬ãŒã åŠçåã«æ€åºåº§æšãã°ã©ããžéä¿¡ããŸãã frameProcessor.setOnWillAddFrameListener { timestamp -> with(frameProcessor.graph) { // æ€åºãããç©äœã®åº§æšæ
å ±ããã±ãããšããŠéä¿¡ val stickerRoll = StickerRoll.newBuilder() .addAllSticker(detectedObjects.map { detection -> Sticker.newBuilder() .setId(detection.id) .setX(detection.normalizedX) // 0.0ã1.0 .setY(detection.normalizedY) // 0.0ã1.0 .setScale(detection.scale) .build() }) .build() val stickersPacket = packetCreator.createSerializedProto(stickerRoll) addPacketToInputStream("sticker_proto_string", stickersPacket, timestamp) } } FrameProcessor.setOnWillAddFrameListener : åãã¬ãŒã ãã°ã©ãã«éãããçŽåã«åŒã°ããã³ãŒã«ãã㯠FrameProcessor.graph.addPacketToInputStream : å
¥åã¹ããªãŒã ã«ãã±ããã远å sticker_proto_string : ã°ã©ãå®çŸ©ã§æå®ãããå
¥åã¹ããªãŒã å 4. ãã¯ã¹ãã£ïŒBitmapïŒã®æç»ãšéä¿¡ äœçœ®æ
å ±ãšåæã«ãAR ã³ã³ãã³ããšããŠæç»ãã Bitmap ãã¯ã¹ãã£ãã°ã©ãã«æž¡ããŸãã 4.1 Bitmap ãã¯ã¹ãã£ã®çæ æ€åºãããåã¹ã€ããã«å¯ŸããŠãäžžã¢ã€ã³ã³ãšã©ãã«ããã¹ããå«ã Bitmap ãçæããŸãã val bitmap = createBitmap(width.toInt(), height.toInt()).apply { with(Canvas(this)) { concat(Matrix().apply { preScale(-1.0f, 1.0f, width / 2f, height / 2f) // X軞ãå転ããŠæç» }) drawCircle(circleX, circleY, CIRCLE_RADIUS, circlePaint) drawRect(rectLeft, rectTop, rectRight, rectBottom, backgroundPaint) } } Matrix().preScale(-1.0f, 1.0f) ã§ Bitmap ãå·Šå³å転ããŠããŸãã以äžã® IMU è¡åã«åãããããã§ãã float imu_matrix[9] = { -1.0f, 0.0f, 0.0f, // X軞 â å転(-X) 0.0f, 0.0f, 1.0f, // Y軞 â Z軞㞠0.0f, 1.0f, 0.0f // Z軞 â Y軞㞠}; ãã®è¡å㯠OpenGL ã¢ãã«è¡åïŒ4x4ïŒã®å転æåãšããŠäœ¿ãããY/Z 軞ã®å
¥ãæ¿ããš X 軞å転ã§ãã¯ã¹ãã£ãã«ã¡ã©å¹³é¢ã«å¹³è¡ã«åºå®ããŸãã æ¬æ¥ã¯ããã€ã¹ã® IMU ã»ã³ãµãŒããå転è¡åãåãåãã端æ«ã®åŸãã«è¿œåŸãããŸãã https://github.com/google-ai-edge/mediapipe/blob/0.10.32/mediapipe/examples/android/src/java/com/google/mediapipe/apps/instantmotiontracking/MainActivity.java#L218-L220 æ¬å®è£
ã§ã¯åºå®å€ã«ããããšã§ åžžã«ã«ã¡ã©æ£é¢ãåã ïŒãã«ããŒã广ïŒããã«ãã (0,0) ã® -1.0 ã«ãã X 軞å転ã Bitmap åŽã® preScale(-1.0f, 1.0f) ã§æã¡æ¶ããŸãã 4.2 ãã¯ã¹ãã£ã®éä¿¡ // ãã¯ã¹ãã£ç»åïŒBitmapé
åïŒ val texturesPacket = packetCreator.createRgbaImageFrameVector( renderStickers.map { it.bitmap }.toTypedArray() ) addPacketToInputStream("gif_textures", texturesPacket, timestamp) // ã¢ã¹ãã¯ãæ¯ïŒãã¯ã¹ãã£ã®çžŠæšªæ¯ïŒ val aspectRatiosPacket = packetCreator.createFloat32Vector( renderStickers.map { it.aspectRatio }.toFloatArray() ) addPacketToInputStream("gif_aspect_ratios", aspectRatiosPacket, timestamp) PacketCreator.createRgbaImageFrameVector : è€æ°ã® Bitmap ã RGBA 圢åŒã®ãã±ããã«å€æ gif_textures : ãã¯ã¹ãã£ç»åã®å
¥åã¹ããªãŒã gif_aspect_ratios : åãã¯ã¹ãã£ã®ã¢ã¹ãã¯ãæ¯ïŒæ£ããã¹ã±ãŒãªã³ã°ã«å¿
èŠïŒ å
¬åŒãµã³ãã«ã§ã¯ createRgbaImageFrame ã䜿çšã㊠åäžã®ãã¯ã¹ã㣠ãã°ã©ãã«æž¡ããŸãã https://github.com/google-ai-edge/mediapipe/blob/0.10.32/mediapipe/examples/android/src/java/com/google/mediapipe/apps/instantmotiontracking/MainActivity.java#L608-L610 æ¬å®è£
ã§ã¯ãè€æ°ã®æ€åºãªããžã§ã¯ãã«å¯Ÿå¿ãããã createRgbaImageFrameVector ã§ è€æ°ãã¯ã¹ãã£ãåæã«éä¿¡ ãã gif_aspect_ratios ã createFloat32Vector ã§ åãã¯ã¹ãã£ã«å¯Ÿå¿ããã¢ã¹ãã¯ãæ¯ã®é
å ãæž¡ãããæ¡åŒµããŸããããã«ãããæ€åºãããåã¹ã€ããã«ç°ãªãã©ãã«ïŒããã¹ãä»ãBitmapïŒãæ£ãã瞊暪æ¯ã§è¡šç€ºã§ããŸãã ãããŸã§ã§ AR ã³ã³ãã³ããã«ã¡ã©äžã«è¡šç€ºã§ããŸããã 5. 座æšã®æŽæ° ãã©ããã³ã°äžã®ã¹ããã«ãŒåº§æšãæŽæ°ããã«ã¯ãæ°ãã座æšãæã€ sticker_proto_string ãšããªã»ãã察象㮠ID ãå«ã sticker_sentinels ãåäž timestamp ã§éä¿¡ããŸãã TrackedAnchorManagerCalculator ãè©²åœ ID ã®ãã©ããã³ã°ããã¯ã¹ãç Žæ£ããæ°ãã座æšã§ãã©ããã³ã°ãåéããŸãã // æŽæ°ãã座æšã§ Sticker Proto ãåæ§ç¯ val stickersPacket = packetCreator.createSerializedProto(stickerRoll) addPacketToInputStream("sticker_proto_string", stickersPacket, timestamp) // ãªã»ãã察象ã®ã¹ããã«ãŒ ID ãéä¿¡ val stickerSentinels = packetCreator.createInt32Vector(updateIds) addPacketToInputStream("sticker_sentinels", stickerSentinels, timestamp) å
¬åŒãµã³ãã«ã§ã¯ sticker_sentinel ã§ åäžã®ã¹ããã«ãŒ ID ãéä¿¡ããŸãã https://github.com/google-ai-edge/mediapipe/blob/0.10.32/mediapipe/examples/android/src/java/com/google/mediapipe/apps/instantmotiontracking/MainActivity.java#L342-L344 æ¬å®è£
ã§ã¯ sticker_sentinels ãšã㊠createInt32Vector ã§ è€æ°ã®ã¹ããã«ãŒ ID ãé
å ã§æž¡ãããæ¡åŒµããç©äœæ€åºã§åº§æšãæŽæ°ãããè€æ°ã®ã¹ããã«ãŒãåæã«ãªã»ããã§ããããã«ããŸãã æåŸã« 以äžã MediaPipe Instant Motion Tracking ãçšããæè¡çãªå®è£
解説ã§ãããæ±ºããŠå®¹æã«å°å
¥ã§ããææ³ã§ã¯ãããŸããããæ¬æ©èœã®èŠä»¶ã«å¯Ÿã㊠Android ã«æãé©ãã解決çã ãšèããŠããŸãã 以åã« ARCore ã®æ€èšŒãè¡ããŸããããARCore 㯠SLAM æè¡ã«ããäºåã® 3D ãããã³ã°ã«æéãèŠãã çŽ æ©ããã€å®å®ãã AR ãšãã§ã¯ãã®å®çŸã«ã¯é©ããªãã£ããããæ€èšŒãæå¿µããŸããã äž¡ãã¬ãŒã ã¯ãŒã¯ã®éãã以äžã«ãŸãšããŸããAR æè¡ã®æ€èšã§åèã«ãªãã°å¹žãã§ãã é
ç® Instant Motion Tracking ARCore ä»çµã¿ 2D ããã¯ã¹ãã©ããã³ã° + OpenGL æç» ç°å¢ãããã³ã° + 平颿€åºïŒSLAMïŒ ããã€ã¹èŠä»¶ OpenGL ES 察å¿ã§ããã°åäœ ARCore 察å¿ããã€ã¹ã®ã¿ïŒGoogle èªå®å¿
é ïŒ å®å®æ§ æ€åºåº§æšã«äŸåããããè£æ£ãå¿
èŠ ç©ºéèªèãé«ç²ŸåºŠã§å®å® å°å
¥ã³ã¹ã Bazel ãã«ãã»C++ Calculator ã®ã«ã¹ã¿ãã€ãºãå¿
èŠ SDK å°å
¥ã®ã¿ã§æ¯èŒç容æ ãªãŒãã³ãœãŒã¹ ããïŒApache 2.0ïŒ ãªãïŒãããã©ã€ãšã¿ãªïŒ ã«ã¹ã¿ãã€ãºæ§ Calculator ã®è¿œå ã»å€æŽã§æè»ã«æ¡åŒµå¯èœ SDK ã® API ç¯å²å
ã«éå® ããã©ãŒãã³ã¹ 軜éïŒ2D ãã©ããã³ã°ããŒã¹ã®ãã CPU/GPU è² è·ãäœãïŒ é«è² è·ïŒç°å¢ã® 3D 空éãããã³ã°ãåžžæå®è¡ïŒ åŠç¿ã³ã¹ã é«ãïŒBazelã»C++ã»OpenGLã»Protocol Buffers ã®ç¥èãå¿
èŠïŒ äœãïŒAndroid SDK ã®ç¥èŠã§å°å
¥å¯èœïŒ
G-gen ã®ç岩ã§ããåœèšäºã§ã¯ Vertex AI Custom Training ã«ãã㊠ã«ã¹ã¿ã ã³ã³ãã ã䜿çšããæšæºã§ã¯æäŸãããŠããªã LightGBM ã¢ãã«ã®åŠç¿ãã å¯äžåºŠïŒSHAPïŒã®åºå ãŸã§å®è¡ããæ¹æ³ã玹ä»ããŸãã ã¯ããã« ãã«ãæžã¿ã³ã³ãããšã«ã¹ã¿ã ã³ã³ããã®äœ¿ãåã ã«ã¹ã¿ã ã³ã³ããã®å©ç¹ æ§æå³ åæèšå® ããŒã¿ã®æºåãšåå² ã«ã¹ã¿ã ã³ã³ããã®æºå ãã£ã¬ã¯ããªãšãªããžããªã®æºå åŠç¿ã¹ã¯ãªããã®äœæ Dockerfile ã®äœæ ã³ã³ããã®ãã«ããšããã·ã¥ åŠç¿ãžã§ãã®å®è¡ æšè«ãšè©äŸ¡ææšã®ç¢ºèª åæã¬ããŒãã®è§£é ã¯ããã« ãã«ãæžã¿ã³ã³ãããšã«ã¹ã¿ã ã³ã³ããã®äœ¿ãåã Vertex AI Custom Training ã«ã¯åŠç¿ãžã§ããå®è¡ããããã®ã³ã³ããã€ã¡ãŒãžãšããŠã倧ãã 2 ã€ã®éžæè¢ããããŸãã ã³ã³ããã®çš®é¡ ç¹åŸŽ åããŠããã±ãŒã¹ ãã«ãæžã¿ã³ã³ãã Google Cloud ãçšæããã€ã¡ãŒãž XGBoost ã TensorFlow ãªã©ãæšæºçãªãã¬ãŒã ã¯ãŒã¯ãããã«äœ¿ãããæ ã«ã¹ã¿ã ã³ã³ãã èªåã§ Dockerfile ãæžããŠäœæããã€ã¡ãŒãž LightGBM ãªã©æªæäŸã®ã©ã€ãã©ãªã䜿ãããæããç¬èªã®åŠçãçµã¿èŸŒã¿ããæ ã«ã¹ã¿ã ã³ã³ããã®å©ç¹ ãã«ãæžã¿ã³ã³ããã§ããžã§ãå®è¡æã®åŒæ°ã« requirements=["lightgbm", "shap"] ã®ããã«æå®ããããšã§ã©ã€ãã©ãªã远å ã§ããŸãããã«ãæžã¿ã³ã³ããã«ã€ããŠã¯ä»¥äžã®èšäºãåç
§ããŠãã ããã blog.g-gen.co.jp ãããå®åã®æ¬çªéçšã«ãããŠãå®è¡æã«ã©ã€ãã©ãªãåçã«ã€ã³ã¹ããŒã«ããããšã¯ã以äžã®ãã¡ãªããããããŸãã 1 ç¹ç®ã¯ã ç°å¢ã®åçŸæ§ãäœäžãã ããšã§ãã ãžã§ããå®è¡ãããã³ã«ã€ã³ã¿ãŒãããããææ°ã®ããã±ãŒãžãååŸãããããäŸåã©ã€ãã©ãªã®ããŒãžã§ã³ãäžãã£ãããã«çªç¶ãžã§ããèœã¡ãããåŠç¿çµæãå€ãã£ãŠããŸããšãã£ããæ¬çªéçšã§é¿ããããªã¹ã¯ãæããŸãã 2 ç¹ç®ã¯ã å®è¡ã®ãã³ã«ãªãŒããŒããããçºçãã ããšã§ãã æ¯åã©ã€ãã©ãªãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããåŠçãèµ°ããããäœèšãªåŸ
ã¡æéãçºçããŸãã ã«ã¹ã¿ã ã³ã³ãããå©çšããããšã«ãããäžèšã®ãã¡ãªãããåé¿ã§ããŸãã åè : ã«ã¹ã¿ã ã³ã³ããã®æŠèŠ æ§æå³ åœèšäºã§ç޹ä»ããæé ã«é¢ããæ§æå³ã¯ä»¥äžã®ãšããã§ããç°å¢æ§ç¯ã®è² è·ã軜æžããããããœãŒã¹ã³ãŒãã®äœæã Python å®è¡ç°å¢ã« Colab Enterprise ã䜿çšããŸãã åæèšå® ã¯ããã«ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã«ãšç°å¢å€æ°ã®èšå®ãè¡ããŸããä»åã¯å¯èŠåãè§£éã®ããã®ã©ã€ãã©ãªïŒ seaborn ã shap ïŒã远å ããŸãã # å¿
èŠãªã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« !pip install google-cloud-aiplatform lightgbm shap scikit-learn pandas seaborn matplotlib -q # ãããžã§ã¯ããšãªãŒãžã§ã³ã®èšå® # â» ãèªèº«ã®ç°å¢ã«åãããŠæžãæããŠãã ãã PROJECT_ID = "your-project-id" LOCATION = "asia-northeast1" # ãã±ãããšãã©ã«ãã®å®çŸ© ROOT_BUCKET = "gs://your-bucket" EXPERIMENT_NAME = "diamonds-lgbm-v1" WORK_DIR = f "{ROOT_BUCKET}/{EXPERIMENT_NAME}" # Vertex AI SDK ã®åæå from google.cloud import aiplatform aiplatform.init(project=PROJECT_ID, location=LOCATION, staging_bucket=WORK_DIR) # ãã±ãããååšããªãå Žåã®ã¿äœæ !gsutil mb -l {LOCATION} {ROOT_BUCKET} ããŒã¿ã®æºåãšåå² ããŒã¿ã¯æ©æ¢°åŠç¿ãã¢ã§äœ¿çšããããã€ã€ã¢ã³ãã®äŸ¡æ ŒããŒã¿ã䜿çšããŸãããã®ããŒã¿ã¯ã«ã©ãããªã©ã®æ°å€ããŒã¿ããã«ãããè²ãšãã£ãã«ããŽãªå€æ°ãå«ã¿ãŸãã åŠç¿ããŒã¿ãšæšè«ããŒã¿ã«åå²ã㊠Cloud Storage ã«ä¿åããŸãã import seaborn as sns from sklearn.model_selection import train_test_split import pandas as pd # ããŒã¿ã®ããŒã (~54,000è¡) df = sns.load_dataset( 'diamonds' ) # æååã«ã©ã ã 'category' åã«å€æ cat_cols = [ 'cut' , 'color' , 'clarity' ] for col in cat_cols: df[col] = df[col].astype( 'category' ) # åŠç¿ããŒã¿ãšæšè«ããŒã¿ã« 90:10 ã®å²åã§åå² train_full_df, test_df = train_test_split(df, test_size= 0.1 , random_state= 42 ) # ããŒã¿ã®ä¿å train_filename = "train.csv" train_full_df.to_csv(train_filename, index= False ) test_filename = "test.csv" test_df.to_csv(test_filename, index= False ) # GCS ãžã¢ããããŒã !gsutil cp {train_filename} {WORK_DIR}/data/{train_filename} !gsutil cp {test_filename} {WORK_DIR}/data/{test_filename} print (f "åŠç¿ããŒã¿: {WORK_DIR}/data/{train_filename}" ) print (f "æšè«ããŒã¿: {WORK_DIR}/data/{test_filename}" ) ã«ã¹ã¿ã ã³ã³ããã®æºå ãã£ã¬ã¯ããªãšãªããžããªã®æºå Colab Enterprise äžã«äœæ¥ãã£ã¬ã¯ããªãçšæããGoogle Cloud äžã«å®æããã³ã³ããã®ä¿åå
ãšãªã Artifact Registry ã®ãªããžããªãäœæããŸãã # äœæ¥çšãã£ã¬ã¯ããªã®äœæ !mkdir -p custom_container # Artifact Registry ã«ãªããžããªãäœæ (ååã®ã¿) !gcloud artifacts repositories create custom-training-repo \ --repository- format =docker \ --location={LOCATION} \ --description= "Custom Training Repository" || true åŠç¿ã¹ã¯ãªããã®äœæ ã³ã³ããå
ã§å®è¡ããã task.py ãäœæããŸãã ä»åã¯ã¢ãã«ã®åŠç¿ã ãã§ãªããéåŠç¿ã確èªããããã®åŠç¿æ²ç·ãšãäºæž¬ã®æ ¹æ ã説æããããã®å¯äžåºŠã®ç»åãçæããã¢ãã«ãšäžç·ã« Cloud Storage ãžã¢ããããŒãããåŠçãçµã¿èŸŒã¿ãŸãã %%writefile custom_container/task.py import argparse import os import pandas as pd import lightgbm as lgb import shap import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from google.cloud import storage from urllib.parse import urlparse import warnings warnings.filterwarnings( 'ignore' ) parser = argparse.ArgumentParser() parser.add_argument( '--train-data-uri' , dest= 'train_data_uri' , type = str , required= True ) args = parser.parse_args() # --- GCS ããŠã³ããŒã / ã¢ããããŒãçšã®é¢æ° --- def download_from_gcs (gcs_uri, local_file): parsed_url = urlparse(gcs_uri) client = storage.Client() bucket = client.bucket(parsed_url.netloc) blob = bucket.blob(parsed_url.path.lstrip( "/" )) blob.download_to_filename(local_file) def upload_to_gcs (local_file, gcs_dir): parsed_url = urlparse(gcs_dir) client = storage.Client() bucket = client.bucket(parsed_url.netloc) blob_path = f "{parsed_url.path.lstrip('/').rstrip('/')}/{local_file}" bucket.blob(blob_path).upload_from_filename(local_file) # --- 1. ããŒã¿ã®æºå --- print (f "Downloading data from {args.train_data_uri}..." , flush= True ) local_train_file = "train.csv" download_from_gcs(args.train_data_uri, local_train_file) df = pd.read_csv(local_train_file) cat_cols = [ 'cut' , 'color' , 'clarity' ] for col in cat_cols: df[col] = df[col].astype( 'category' ) X = df.drop(columns=[ "price" ]) y = df[ "price" ] # ã¹ã¯ãªããå
ã§åŠç¿çšãšæ€èšŒçšã«åå² (ããŒã¿ãªãŒã¯é²æ¢) X_train, X_val, y_train, y_val = train_test_split(X, y, test_size= 0.1 , random_state= 42 ) # --- 2. ã¢ãã«ã®åŠç¿ --- print ( "Training LightGBM model..." , flush= True ) model = lgb.LGBMRegressor(n_estimators= 100 , random_state= 42 ) # åŠç¿éçšãèšé²ããããã« eval_set ãæž¡ã model.fit( X_train, y_train, eval_set=[(X_train, y_train), (X_val, y_val)], eval_names=[ 'train' , 'valid' ] ) # --- 3. åæç»åã®çæãšä¿å --- # â åŠç¿æ²ç·ã®æç» lgb.plot_metric(model, metric= 'l2' ) plt.title( 'Learning Curve (MSE)' ) plt.tight_layout() plt.savefig( "learning_curve.png" ) plt.close() # â¡ SHAPå€ïŒå¯äžåºŠïŒã®æç» print ( "Calculating SHAP values..." , flush= True ) explainer = shap.TreeExplainer(model) shap_values = explainer(X_val.sample( min ( 1000 , len (X_val)), random_state= 42 )) plt.figure() shap.plots.beeswarm(shap_values, show= False ) plt.title( "SHAP Feature Importance" ) plt.tight_layout() plt.savefig( "shap_importance.png" ) plt.close() # --- 4. ææç©ã®ã¢ããããŒã --- aip_model_dir = os.getenv( "AIP_MODEL_DIR" ) if aip_model_dir: print (f "Uploading artifacts to: {aip_model_dir}" , flush= True ) model.booster_.save_model( "model.txt" ) upload_to_gcs( "model.txt" , aip_model_dir) upload_to_gcs( "learning_curve.png" , aip_model_dir) upload_to_gcs( "shap_importance.png" , aip_model_dir) print ( "Upload completed." , flush= True ) Dockerfile ã®äœæ Dockerfile ãèšè¿°ããŸããããŒã¹ã€ã¡ãŒãžã«ã¯ Python 3.12 ãæå®ããLightGBM ã«å¿
èŠãª libgomp1 ãã€ã³ã¹ããŒã«ããŸãã %%writefile custom_container/Dockerfile FROM python: 3.12 -slim # LightGBM ã«å¿
é ã® OS ã©ã€ãã©ãªãã€ã³ã¹ããŒã« RUN apt-get update && apt-get install -y --no-install-recommends \ libgomp1 \ && rm -rf /var/lib/apt/lists/* # å¿
èŠãª Python ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« RUN pip install --no-cache- dir \ pandas scikit-learn lightgbm shap matplotlib google-cloud-storage WORKDIR /app COPY task.py /app/task.py ENTRYPOINT [ "python" , "task.py" ] ã³ã³ããã®ãã«ããšããã·ã¥ Cloud Build ã䜿çšããŠã³ã³ããããã«ãããããã·ã¥ããŸãã # Cloud Build ã§ãã«ããšããã·ã¥ãå®è¡ REPO_NAME = "custom-training-repo" IMAGE_URI = f "{LOCATION}-docker.pkg.dev/{PROJECT_ID}/{REPO_NAME}/lgbm-shap-trainer:latest" !gcloud builds submit --tag {IMAGE_URI} ./custom_container åŠç¿ãžã§ãã®å®è¡ äœæããèªäœã³ã³ãã ( IMAGE_URI ) ãæå®ããŠãåŠç¿ãžã§ããéä¿¡ããŸããåŒæ° base_output_dir ãæå®ããããšã§ãæå®ãã Cloud Storage ã®ãã¹é
äžã«ã¢ãã«ãç»åãä¿åã§ããŸãã # ãžã§ãã®å®çŸ© job = aiplatform.CustomContainerTrainingJob( display_name= "diamonds-lgbm-shap-job" , container_uri=IMAGE_URI, ) # ãžã§ãã®å®è¡ print ( "ãžã§ããéä¿¡ããŸãããå®äºãŸã§ãåŸ
ã¡ãã ãã..." ) job.run( machine_type= "n1-standard-4" , replica_count= 1 , args=[ f "--train-data-uri={WORK_DIR}/data/train.csv" ], # ææç©ã®ä¿åå
ãã©ã«ããæå® base_output_dir=f "{WORK_DIR}/model_output" ) æšè«ãšè©äŸ¡ææšã®ç¢ºèª ãžã§ãå®äºåŸãCloud Storage ããåŠç¿æžã¿ã¢ãã«ãããŠã³ããŒãããColab Enterprise äžã§ãã¹ãããŒã¿ã«å¯Ÿãã粟床è©äŸ¡ãè¡ããŸãã import numpy as np import lightgbm as lgb from sklearn.metrics import r2_score, mean_squared_error import pandas as pd # 1. åŠç¿ã®ææç©ã®ããŠã³ããŒã MODEL_DIR = f "{WORK_DIR}/model_output/model" print ( "åŠç¿æžã¿ã¢ãã«ãšåæç»åãããŠã³ããŒãããŸã..." ) !gsutil cp {MODEL_DIR}/model.txt . !gsutil cp {MODEL_DIR}/learning_curve.png . !gsutil cp {MODEL_DIR}/shap_importance.png . # 2. ãã¹ãããŒã¿ã®èªã¿èŸŒã¿ df_test = pd.read_csv(f "{WORK_DIR}/data/test.csv" ) cat_cols = [ 'cut' , 'color' , 'clarity' ] for col in cat_cols: df_test[col] = df_test[col].astype( 'category' ) X_test = df_test.drop(columns=[ "price" ]) y_true = df_test[ "price" ] # 3. ããŒã«ã«æšè«ã®å®è¡ local_model = lgb.Booster(model_file= "model.txt" ) predictions = local_model.predict(X_test) # 4. è©äŸ¡ææšã®èšç®ãšè¡šç€º r2 = r2_score(y_true, predictions) rmse = np.sqrt(mean_squared_error(y_true, predictions)) print ( "-" * 30 ) print (f "è©äŸ¡çµæ (ããŒã¿æ°: {len(y_true)}ä»¶)" ) print (f "R2 Score (決å®ä¿æ°): {r2:.4f}" ) print (f "RMSE (誀差ã®å€§ãã): {rmse:.4f}" ) print ( "-" * 30 ) 以äžã¯çè
ã®ç°å¢ã«ãããå®è¡çµæã§ããR2ã¹ã³ã¢ã 0.98 ãè¶
ãã粟床ã®é«ãã¢ãã«ãäœæã§ããŸããã ------------------------------ è©äŸ¡çµæ (ããŒã¿æ°: 5394ä»¶) R2 Score (決å®ä¿æ°): 0.9817 RMSE (誀差ã®å€§ãã): 543.6218 ------------------------------ åæã¬ããŒãã®è§£é åã«äºæž¬ç²ŸåºŠãåºãã ãã§ãªããAI ã ãªããã®äºæž¬ãããã®ã ãè§£éããããšã¯å®åã«ãããŠéèŠã§ããã³ã³ããå
ã§çæããåŠç¿æ²ç·ã®ç»åãš SHAP ãçšããåå¥ããŒã¿ã®åæçµæã確èªããŸãã import shap from IPython.display import Image, display print ( "=== åŠç¿æ²ç· (éåŠç¿ã®ç¢ºèª) ===" ) display(Image( "learning_curve.png" )) print ( " \n === å
šäœã®å¯äžåºŠ (SHAP Beeswarm) ===" ) display(Image( "shap_importance.png" )) # --- åå¥ããŒã¿ã«å¯ŸããSHAPïŒè¡šåœ¢åŒïŒ--- print ( " \n === ç¹å®ã®ããŒã¿ïŒ1ä»¶ç®ïŒã®äºæž¬ã®æ ¹æ ===" ) explainer = shap.TreeExplainer(local_model) single_instance = X_test.iloc[[ 0 ]] shap_values_single = explainer(single_instance) shap_df = pd.DataFrame({ "ç¹åŸŽé (Feature)" : single_instance.columns, "å®éã®å€ (Value)" : single_instance.values[ 0 ], "äŸ¡æ Œãžã®åœ±é¿ (SHAPå€)" : shap_values_single.values[ 0 ] }) shap_df = shap_df.reindex(shap_df[ "äŸ¡æ Œãžã®åœ±é¿ (SHAPå€)" ].abs().sort_values(ascending= False ).index) base_value = explainer.expected_value predicted_price = predictions[ 0 ] print (f "ãããŒã¹ã©ã€ã³äŸ¡æ Œ (å¹³å)ã: {base_value:.2f}" ) display(shap_df.style.format({ "äŸ¡æ Œãžã®åœ±é¿ (SHAPå€)" : "{:+.2f}" }).hide(axis= "index" )) print (f "ãæçµäºæž¬äŸ¡æ Œã: {predicted_price:.2f}" ) åŠç¿æ²ç·ïŒLearning CurveïŒ ã確èªãããšãåŠç¿ããŒã¿ãšæ€èšŒããŒã¿ã®èª€å·®ïŒMSEïŒãå
±ã«å³è©äžããã§åæããŠããŸãã ããã¯ãæªç¥ã®ããŒã¿ã§ããæ€èšŒããŒã¿ã«å¯ŸããŠãéåŠç¿ãèµ·ããããšãªãåŠç¿ãã§ããŠãã蚌æ ã§ãã å
šäœã®å¯äžåºŠ ã§ã¯ãäžã«ããç¹åŸŽéã»ã©äºæž¬ãžã®åœ±é¿åã倧ããããšã瀺ããŠããŸããæšªè»žã® 0 ãåºæºã«ãå³åŽã äŸ¡æ ŒãäžããèŠå ãå·ŠåŽã äŸ¡æ ŒãäžããèŠå ã§ãã ããããã®èµ€è²ã¯æ°å€ã倧ããããŒã¿ã§ãããéè²ã¯æ°å€ã®å°ããããŒã¿ã衚ããŠããŸããäŸãã° carat ã¯å³åŽã«èµ€è²ã§ãããããããŠããããã carat ã倧ããã»ã©é«äŸ¡ã«ãªã ããšãåãããŸãã æåŸã« ç¹å®ã®1ä»¶ã«å¯Ÿããäºæž¬ã®æ ¹æ ã衚圢åŒã§åºåããŸããã å
šäœã®å¹³åäŸ¡æ ŒïŒããŒã¹ã©ã€ã³ïŒãåºæºãšããŠããéãã0.24ã«ã©ãããšå°ãããããã€ãã¹è©äŸ¡ããéæåºŠïŒclarityïŒãVVS1ãšé«å質ã§ãããããã©ã¹è©äŸ¡ããšãã£ãããã«ãæçµçãªäºæž¬äŸ¡æ Œã«è³ããŸã§ã®å
éšã®èšç®ããžãã¯ãããžãã¹éšéã«èª¬æã§ããŸãã ç岩 è£è²Ž (èšäºäžèЧ) ã¯ã©ãŠããœãªã¥ãŒã·ã§ã³éš ã¯ã©ãŠããã£ãããããŒèª² åæå±±çåšäœã®ãšã³ãžãã¢ãèå³åéã¯AI/MLãGoogle Cloud Partner Top Engineer ã«éžåºïŒ2025 / 2026ïŒã
åç»
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã












