๐Ÿ“Œ TensorFlow Lite ๊ธฐ๋ฐ˜ ์Œ์‹ ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜๊ธฐ ํ•™์Šต ๋ฐ ๋ณ€ํ™˜ ๊ธฐ๋ก

โœ… ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

๋ชฉํ‘œ:
ํ•œ๊ธ€ ํด๋”๋ช…์œผ๋กœ ์ •๋ฆฌ๋œ ๋‹ค์ค‘ ์Œ์‹ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์…‹์„ ํ™œ์šฉํ•ด, TensorFlow ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ ๋ชจ๋ธ์„ ํ•™์Šตํ•˜๊ณ , ์ด๋ฅผ Android์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ .tflite ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜.

ํ™˜๊ฒฝ:

  • GPU: NVIDIA H100 (80GB)
  • Python 3.12 (venv)
  • TensorFlow 2.x (GPU ๋ฒ„์ „ ์„ค์น˜)
  • ์ด ์ด๋ฏธ์ง€ ์ˆ˜: ์•ฝ 145,000์žฅ
  • ํด๋ž˜์Šค ์ˆ˜: 38๊ฐœ (์˜ˆ: ์–ด๋ฌต๊ตญ, ์–‘ํŒŒ์ƒ๋Ÿฌ๋“œ ๋“ฑ)

๐Ÿ—‚ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ์ „์ฒ˜๋ฆฌ

  • ๋ฐ์ดํ„ฐ ํด๋” ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Œ:
bashCopyEdit/everything/
    โ”œโ”€โ”€ ์–ด๋ฌต๊ตญ/
    โ”‚   โ”œโ”€โ”€ img1.jpg
    โ”‚   โ”œโ”€โ”€ img2.jpg
    โ”œโ”€โ”€ ์–‘๋ฐฐ์ถ”/
    โ”‚   โ””โ”€โ”€ ...
  • TensorFlow์˜ image_dataset_from_directory() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ class ์ด๋ฆ„์„ ํด๋”๋ช… ๊ธฐ์ค€์œผ๋กœ ์ธ์‹.
pythonCopyEdittrain_ds = tf.keras.preprocessing.image_dataset_from_directory(
    directory=dataset_path,
    image_size=(300, 300),
    batch_size=32,
    validation_split=0.2,
    subset="training",
    seed=123
)

๐Ÿง  ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํ•™์Šต

  • EfficientNetB3 + GlobalAveragePooling + Dense ๊ตฌ์กฐ
  • Data Augmentation ํฌํ•จ
  • ์ด Epoch: 50 / Batch Size: 32
  • GPU ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ๋ฐ ๊ณผ์ ํ•ฉ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด EarlyStopping ์‚ฌ์šฉ ๊ณ ๋ ค ๊ฐ€๋Šฅ
pythonCopyEditbase_model = EfficientNetB3(include_top=False, input_shape=(300, 300, 3), weights='imagenet')
base_model.trainable = False
...
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
  • ํ•™์Šต ๊ฒฐ๊ณผ:
    • train_accuracy โ‰’ 91.2%
    • val_accuracy โ‰’ 93.1%

๐Ÿ›  ๋ชจ๋ธ ์ €์žฅ ๋ฐ ๋ณ€ํ™˜

  • .keras ํ˜•์‹์œผ๋กœ ์ €์žฅ ํ›„ .tflite ๋ณ€ํ™˜
  • tf.lite.TFLiteConverter.from_keras_model() ์‚ฌ์šฉ
pythonCopyEditmodel.save("my_food_classifier.keras")

converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

with open("my_food_classifier.tflite", "wb") as f:
    f.write(tflite_model)

๐Ÿ“ฑ ํ–ฅํ›„ Android ์—ฐ๋™ ์‹œ ํ•ด์•ผ ํ•  ์ผ

  1. TFLite ๋ชจ๋ธ์„ Android Studio ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€
  2. labels.txt ํŒŒ์ผ ์ƒ์„ฑ (class ์ด๋ฆ„ ์ˆœ์„œ๋Œ€๋กœ)
  3. TensorImage, Interpreter, TensorBuffer๋ฅผ ํ™œ์šฉํ•œ Inference ์ฝ”๋“œ ์ž‘์„ฑ
  4. ์ž…๋ ฅ ํฌ๊ธฐ (300, 300, 3) ๊ณ ์ • ํ™•์ธ
  5. ๊ฒฐ๊ณผ๊ฐ’์€ softmax ๊ธฐ๋ฐ˜ ํ™•๋ฅ  ๋ฒกํ„ฐ๋กœ ์ถœ๋ ฅ๋จ

๐Ÿ“š ํ–ฅํ›„ ๋ณต์Šต/์‹ฌํ™” ํ•™์Šตํ•  ์ฃผ์ œ

์ฃผ์ œ์„ค๋ช…
TFLite ๋ชจ๋ธ ์ตœ์ ํ™”Quantization (int8, float16) ์‚ฌ์šฉํ•ด ๋ชจ๋ธ ์šฉ๋Ÿ‰ ๋ฐ ์ถ”๋ก  ์†๋„ ํ–ฅ์ƒ
์ •ํ™•๋„ ๊ฐœ์„  ์ „๋žตFine-tuning, Mixup, Label Smoothing, SAM Optimizer
๋‹ค๊ตญ์–ด ํด๋ž˜์Šค ๋Œ€์‘ํด๋ž˜์Šค ์ด๋ฆ„์ด ํ•œ๊ธ€์ด๋ฏ€๋กœ Android ๋‚ด ๋‹ค๊ตญ์–ด ์ง€์› ์ฒ˜๋ฆฌ ํ•„์š”
YOLO โ†’ TFLite ์ „ํ™˜Object Detection ๋ชจ๋ธ(YOLOv8) โ†’ TFLite ๋ณ€ํ™˜ ๊ฒฝ๋กœ๋„ ๋ณ‘ํ–‰ ๊ณ ๋ ค
Custom Android UI์‚ฌ์šฉ์ž์—๊ฒŒ top-3 class ์˜ˆ์ธก๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ธฐ ์ข‹๊ฒŒ ์‹œ๊ฐํ™”ํ•˜๋Š” UI ๊ตฌ์„ฑ

โœ… ๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ ์ž‘์—…์€ ๊ณ ์„ฑ๋Šฅ H100 ํ™˜๊ฒฝ์—์„œ ๋Œ€๋Ÿ‰ ํ•œ๊ธ€ ๋ฐ์ดํ„ฐ์…‹์„ ํ•™์Šตํ•˜๊ณ , Android ์•ฑ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์šฉ์ ์ธ .tflite ๋ชจ๋ธ๊นŒ์ง€ ์™„์„ฑํ•œ ๋งค์šฐ ์ค‘์š”ํ•œ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋กœ๋Š” ์‹ค์ œ Android ๊ธฐ๊ธฐ ํ…Œ์ŠคํŠธ ๋ฐ ์‹ค์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฐ˜์˜์ด ์ด์–ด์งˆ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์ฝ”๋ฉ˜ํŠธ

๋‹ต๊ธ€ ๋‚จ๊ธฐ๊ธฐ

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค