๐Ÿ™ˆTensorFlow Lite๋กœ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋Š”๐Ÿ™‰??

k-sanaยท2021๋…„ 6์›” 22์ผ
4

AI and Android

๋ชฉ๋ก ๋ณด๊ธฐ
2/2
post-thumbnail

๊ทธ ์ดํ›„ ๐Ÿ™

TensorFlow Lite๋ฅผ ์•Œ๊ฒŒ ๋œ ์ดํ›„๋กœ Android์—์„œ model์„ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜๋Š”์ง€๋Š” ์•Œ์•˜์œผ๋‚˜...๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ผ ์ด์—ˆ๋˜ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ ํ…์„œ ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋งŽ์€ ๊ณ ๋‡Œ์™€ ๊ตฌ๊ธ€๋ง์ด ์žˆ์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋‚œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์„ ๊นŒ๋จน๊ณ  ์žˆ์—ˆ๋‹ค!! TensorFlow Lite๋ฅผ ์•Œ์•˜์œผ๋ฉด์„œ๋„ ๋ฐ”๋ณด๊ฐ™์ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์žˆ์—ˆ๋‹ค. TensorFlow Lite์— ๋‹น์—ฐํžˆ ๊ทธ๋Ÿฐ ๋„๊ตฌ๋“ค์ด ์žˆ๊ฒ ์ง€!! ์ด ์‚ฌ์‹ค์„ ์กฐ๊ธˆ๋งŒ ๋” ๋นจ๋ฆฌ ๊นจ๋‹ฌ์•˜์—ˆ์œผ๋ฉด ์ข‹์•˜์„ํ…๋ฐ...๐Ÿ˜ซ

TensorFlow Lite์—์„œ์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๐Ÿ“ฒ

๐Ÿ“Œ ์•„๋ž˜ ๋‚˜์˜ฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ Android์—์„œ๋งŒ ์ง€์›ํ•œ๋‹ค!!

Android studio์— model ์ถ”๊ฐ€

์ผ๋‹จ Android Studio์— ๋นˆ ํ”„๋กœ์ ํŠธ ํ•˜๋‚˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

File > New > Folder > Assets Folder๋ฅผ ๋ˆŒ๋Ÿฌ app ํด๋”์— assets ํด๋”๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์— ๋ณด์ด๋Š” ๊ฒƒ ๊ฐ™์ด ํด๋” ์ด๋ฏธ์ง€์— ์ฃผํ™ฉ์ƒ‰ ๋„ค๋ชจ๊ฐ™์€ ํ‘œ์‹œ๊ฐ€ ์žˆ์–ด์•ผ ์ž˜ ๋งŒ๋“ค์–ด ์ง„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ .tfliteํŒŒ์ผ๋กœ ์ €์žฅํ•œ ๋ชจ๋ธ์„ Android studio์˜ assets ํด๋”์— ๋ณต์‚ฌํ•œ๋‹ค.
์ด ์ž‘์—…์œผ๋กœ ์šฐ๋ฆฌ๋Š” Android studio์— model์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

gradle ์„ค์ •ํ•˜๊ธฐ

๋‹ค์Œ์œผ๋กœ๋Š” ๋ชจ๋ธ ํŒŒ์ผ์ด ์••์ถ•๋˜์ง€ ์•Š๋„๋ก gradleํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์ค˜์•ผํ•œ๋‹ค. Gradle Scripts๋ฅผ ๋ณด๋ฉด build.gradle ํŒŒ์ผ์ด ๋‘๊ฐœ๊ฐ€ ์žˆ๋Š”๋ฐ build.gradle(Module: app)ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค!!!

android {
    // ๋‹ค๋ฅธ settings

    // ์••์ถ•๋˜์ง€ ์•Š๋„๋ก ์„ค์ •
    aaptOptions {
        noCompress "tflite"
    }

}

dependencies {
    // ๋‹ค๋ฅธ ์ฝ”๋“œ๋“ค~

    // Import tflite ์ข…์†์„ฑ
    
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    // GPU ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ...์ด๊ฒƒ์€ ์„ ํƒ์‚ฌํ•ญ
    implementation 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly-SNAPSHOT'
    implementation 'org.tensorflow:tensorflow-lite-support:0.0.0-nightly-SNAPSHOT'
}

๋‹ค ์ž…๋ ฅํ–ˆ์œผ๋ฉด ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์— [Sync Now]๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ์–ด ๋™๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

์ด๋ฏธ์ง€ ์กฐ์ž‘๊ณผ ๋ณ€ํ™˜

๋‚ด๊ฐ€ ๊ฐ€์žฅ ๊ณ ๋ฏผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐ”๋กœ ์ด๊ฒƒ์ด์—ˆ๋‹ค. ์ด๋ฏธ์ง€์˜ resize์™€ ์ด๋ฏธ์ง€๋ฅผ ํ…์„œ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ๊ต‰์žฅํžˆ ๊ณ ๋ฏผ์„ ํ–ˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์•Œ๊ณ ๋ณด๋‹ˆ๊นŒ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค. ๊ฐ™์ด ํ•ด๋ณด์ž!!

import org.tensorflow.lite.support.image.ImageProcessor;
import org.tensorflow.lite.support.image.TensorImage;
import org.tensorflow.lite.support.image.ops.ResizeOp;
// ImageProcessor๋ฅผ ์ •์˜ํ•œ๋‹ค.
ImageProcessor imageProcessor =
    new ImageProcessor.Builder()
        .add(new ResizeOp(224, 224, ResizeOp.ResizeMethod.BILINEAR))
        .build();
// ์ด๋ฏธ์ง€๋ฅผ Tensor Image๋กœ ๋ฐ”๊พผ๋‹ค.
TensorImage tImage = new TensorImage(DataType.๋ฐ์ดํ„ฐํƒ€์ž…);

// Processing
tImage.load(bitmap);
tImage = imageProcessor.process(tImage);

์œ„์˜ ์ฝ”๋“œ๋กœ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ ํ…์„œ ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ •๋ฆฌ ๐Ÿ˜‰

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Android studio์—์„œ ์–ด๋–ป๊ฒŒ ๋ชจ๋ธ์„ ์—ฐ๋™ํ•˜๋Š”์ง€์™€ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ Tensor Image๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์•˜๋‹ค. ๋‹ค์Œ ๊ธ€์—์„œ๋Š” Android studio์—์„œ predict๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฆฌ๋ทฐํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. ๊ทธ๋Ÿผ ๋ชจ๋‘ Bamboo๐ŸŽ!!

profile
I'm bamboo.

0๊ฐœ์˜ ๋Œ“๊ธ€