Skip to content

Latest commit

ย 

History

History
180 lines (112 loc) ยท 10.3 KB

ONNXLive.rst

File metadata and controls

180 lines (112 loc) ยท 10.3 KB

ONNX Live ํŠœํ† ๋ฆฌ์–ผ

์ด ํŠœํ† ๋ฆฌ์–ผ์€ PyTorch์—์„œ ๋‚˜์˜จ neural style transfer ๋ชจ๋ธ์„ Apple CoreML ํ˜•์‹์œผ๋กœ ONNX์„ ์ด์šฉํ•˜์—ฌ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์–ด๋–ป๊ฒŒ Apple ์žฅ์น˜๋“ค์— ๋”ฅ ๋Ÿฌ๋‹ ๋ชจ๋ธ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ๊ณ  ํŠนํžˆ๋‚˜ ์ด๋ฒˆ ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ์นด๋ฉ”๋ผ๋กœ๋ถ€ํ„ฐ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆผ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

ONNX๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

ONNX (Open Neural Network Exchange) ๋Š” ๋”ฅ ๋Ÿฌ๋‹ ๋ชจ๋ธ๋“ค์„ ๋Œ€ํ‘œํ•˜๋Š” ๊ณต๊ฐœ๋˜์–ด์žˆ๋Š” ํ˜•์‹์ž…๋‹ˆ๋‹ค. ONNX๋Š” AI ๊ฐœ๋ฐœ์ž๋“ค์ด ์ตœ์ฒจ๋‹จ์˜ ๋„๊ตฌ๋“ค๊ณผ ๋ชจ๋ธ๋“ค์˜ ์กฐํ•ฉ์„ ๊ทธ๋“ค์—๊ฒŒ ๊ฐ€์žฅ ์ž˜ ๋งž๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ์„ ํƒํ•˜๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ONNX๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ํŒŒํŠธ๋„ˆ๋“ค์ด ๊ฐœ๋ฐœํ•˜๋ฉฐ ๋˜ํ•œ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ONNX์™€ ์–ด๋–ค ๋„๊ตฌ๋“ค์ด ์ง€์›๋˜๋Š”์ง€๋Š” onnx.ai ๋ฅผ ๋ฐฉ๋ฌธํ•˜์—ฌ ๋” ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠœํ† ๋ฆฌ์–ผ ๊ฐœ์š”

์ด๋ฒˆ ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” 4๊ฐ€์ง€ ์ค‘์‹ฌ ์‚ฌํ•ญ๋“ค์„ ์†Œ๊ฐœํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค:

  1. PyTorch style transfer ๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ (๋˜๋Š” ํ•™์Šต์‹œํ‚ค๊ธฐ)
  2. PyTorch ๋ชจ๋ธ์„ ONNX ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ
  3. ONNX ๋ชจ๋ธ์„ CoreML ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ
  4. `style transfer iOS App ์—์„œ CoreML ๋ชจ๋ธ ๋Œ๋ฆฌ๊ธฐ`_

๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์ค€๋น„ํ•˜๊ธฐ

ํ˜„์žฌ ๋กœ์ปฌ์— ์„ค์น˜๋˜์–ด์žˆ๋Š” ํŒจํ‚ค์ง€๋“ค๊ณผ์˜ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด virtualenv๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํŠœํ† ๋ฆฌ์–ผ์—์„œ Python 3.6 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ฒ„์ „๋„ ์ž‘๋™ํ•˜๋Š”๋ฐ ๋ฌด๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

python3.6 -m venv venv
source ./venv/bin/activate

PyTorch์™€ onnx-coreml ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

pip install torchvision onnx-coreml

iPhone ์—์„œ iOS style transfer ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด XCode ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Linux ์—์„œ๋„ ๋ชจ๋ธ์„ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, iOS ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ ํ•˜๋ ค๋ฉด Mac ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

PyTorch style transfer ๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ (๋˜๋Š” ํ•™์Šต์‹œํ‚ค๊ธฐ)

์ด๋ฒˆ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์šฐ๋ฆฌ๋Š” https://github.com/pytorch/examples/tree/master/fast_neural_style ์— PyTorch ๋กœ ๋งŒ๋“ค์–ด์ง„ style transfer ์„ ์ด์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ PyTorch ๋‚˜ ONNX ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด ์ด๋ฒˆ ๋‹จ๊ณ„๋ฅผ ์ƒ๋žตํ•ด๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋ธ๋“ค์€ ์ด๋ฏธ์ง€์— style transfer ๊ฐ€ ์ ์šฉ๋˜๋„๋ก ๋งŒ๋“ค์–ด์ ธ์„œ ๋น„๋””์˜ค์— ์ ์šฉํ•˜๊ธฐ์—๋Š” ์ตœ์ ํ™”๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š์•„ ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด์ƒ๋„๋ฅผ ์–ด๋Š ์ •๋„ ๋‚ฎ์ถ˜๋‹ค๋ฉด ๋น„๋””์˜ค์—์„œ ์ถฉ๋ถ„ํ•œ ์†๋„์— ์ž‘๋™๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ๋“ค์„ ๋‹ค์šด๋ฐ›์•„๋ด…์‹œ๋‹ค.

git clone https://github.com/pytorch/examples
cd examples/fast_neural_style

์ง์ ‘ ๋ชจ๋ธ์„ ํ›ˆ๋ จ์‹œํ‚ค๊ธฐ ์›ํ•œ๋‹ค๋ฉด ๋ฐฉ๊ธˆ ํด๋ก ํ•œ ์ €์žฅ์†Œ์˜ pytorch/examples ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์ €์žฅ์†Œ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฏธ๋ฆฌ ํ›ˆ๋ จ๋œ ๋ชจ๋ธ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค:

python download_saved_models.py

์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฏธ๋ฆฌ ํ›ˆ๋ จ๋œ PyTorch ๋ชจ๋ธ๋“ค์„ ๋‹ค์šด๋ฐ›๊ณ  saved_models ํด๋”์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํด๋”์—๋Š” 4๊ฐ€์ง€ ํŒŒ์ผ candy.pth, mosaic.pth, rain_princess.pth ๊ทธ๋ฆฌ๊ณ  udnie.pth ๊ฐ€ ํด๋”์— ๋‹ค์šด ๋ฐ›์•„์กŒ์Šต๋‹ˆ๋‹ค.

PyTorch ๋ชจ๋ธ์„ ONNX ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ฏธ๋ฆฌ ํ›ˆ๋ จ๋œ PyTorch ๋ชจ๋ธ๋“ค์„ saved_models ํด๋”์— .pth ํŒŒ์ผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ ๋‚˜์ค‘์— ์ € ๋ชจ๋ธ๋“ค์„ ONNX ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ ์ •์˜๋Š” ๋ฐฉ๊ธˆ ์ „ ํด๋ก  ํ–ˆ๋˜ ์ €์žฅ์†Œ์˜ pytorch/examples ์— ์žˆ์œผ๋ฉฐ ๋‹จ ๋ช‡ ์ค„์˜ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ONNX ๋กœ ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ๊ณต ์‹ ๊ฒฝ๋ง์„ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜๋Š” ๋Œ€์‹  ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ์šฐ๋ฆฌ๋Š” torch.onnx._export๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ ์ด๊ฒƒ์€ PyTorch ๊ฐ€ ์ œ๊ณตํ•˜๋Š” API ๋กœ PyTorch ์—์„œ ์ง์ ‘์ ์œผ๋กœ ONNX ํ˜•์‹์˜ ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฒˆ ๊ฒฝ์šฐ์—๋Š” ์šฐ๋ฆฌ๋Š” ์ €๊ฒƒ์„ ํ˜ธ์ถœ ์•ˆํ•ด๋„ ๋˜๋Š”๋ฐ ๊ทธ ์ด์œ ๋Š” ์ €๋Ÿฐ ๊ธฐ๋Šฅ์„ ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ๋Œ€์‹ ํ•ด์ฃผ๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ neural_style/neural_style.py ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. You can also take a look at that script if you would like to apply it to other models. ๋‹ค๋ฅธ ๋ชจ๋ธ์— ์ € ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ ์šฉํ•˜๊ธธ ์›ํ•˜์‹œ๋ฉด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณด๋Š”๊ฒƒ๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

PyTorch ์—์„œ ONNX ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š”๊ฒƒ์€ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‹น์‹ ์˜ ์‹ ๊ฒฝ๋ง์„ ์ถ”์ ํ•ด ๋‚˜๊ฐ€๋Š”๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด API ํ˜ธ์ถœ์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•ด๋‚ด๊ธฐ ์œ„ํ•ด '๋”๋ฏธ ๋ฐ์ดํ„ฐ' ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹ ๊ฒฝ๋ง์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ž…๋ ฅ๊ฐ’์œผ๋กœ style transfer ๋ฅผ ์ ์šฉํ•  ์ด๋ฏธ์ง€๊ฐ€ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ํ•„์š”ํ•˜๋ฉฐ ๊ธฐ๋ณธ์ ์ธ ๋น„์–ด์žˆ๋Š” ์ด๋ฏธ์ง€์—ฌ๋„ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ์ง€์˜ ํ”ฝ์…€ ํฌ๊ธฐ๋Š” ์ค‘์š”ํ•œ๋ฐ ๊ทธ ์ด์œ ๋Š” ํ”ฝ์…€ ํฌ๊ธฐ๋Š” ๋ณ€ํ™˜๋  style transfer ๋ชจ๋ธ์˜ ํฌ๊ธฐ๋กœ๋„ ์ด์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ข‹์€ ํผํฌ๋จผ์Šค๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” 250x540 ์˜ ํ•ด์ƒ๋„๋ฅผ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. FPS๋ณด๋‹ค style transfer์˜ ํ’ˆ์งˆ์— ๋” ๋งŽ์ด ์‹ ๊ฒฝ ์“ฐ์‹ ๋‹ค๋ฉด ๋” ํฐ ํ•ด์ƒ๋„๋ฅผ ์‚ฌ์šฉํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹ค.

ImageMagick ์„ ์‚ฌ์šฉํ•˜์—ฌ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํฌ๊ธฐ์˜ ๋น„์–ด์žˆ๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ด๋ด…์‹œ๋‹ค. .. code-block:: bash

convert -size 250x540 xc:white png24:dummy.jpg

๊ทธ๋ฆฌ๊ณ  PyTorch ๋ชจ๋ธ์„ ๋ณ€ํ™˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ด๋ด…๋‹ˆ๋‹ค.

python ./neural_style/neural_style.py eval --content-image dummy.jpg --output-image dummy-out.jpg --model ./saved_models/candy.pth --cuda 0 --export_onnx ./saved_models/candy.onnx
python ./neural_style/neural_style.py eval --content-image dummy.jpg --output-image dummy-out.jpg --model ./saved_models/udnie.pth --cuda 0 --export_onnx ./saved_models/udnie.onnx
python ./neural_style/neural_style.py eval --content-image dummy.jpg --output-image dummy-out.jpg --model ./saved_models/rain_princess.pth --cuda 0 --export_onnx ./saved_models/rain_princess.onnx
python ./neural_style/neural_style.py eval --content-image dummy.jpg --output-image dummy-out.jpg --model ./saved_models/mosaic.pth --cuda 0 --export_onnx ./saved_models/mosaic.onnx

์œ„์˜ ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด 4๊ฐœ์˜ ํŒŒ์ผ candy.onnx, mosaic.onnx, rain_princess.onnx ๊ทธ๋ฆฌ๊ณ  udnie.onnx, ๊ฐ€ .pth ํŒŒ์ผ๋“ค์— ๊ฐ๊ฐ ๋Œ€์‘๋˜์–ด ์ƒ์„ฑ๋˜์–ด์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ONNX ๋ชจ๋ธ์„ CoreML ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

์ด์ œ ์šฐ๋ฆฌ๋Š” ONNX ๋ชจ๋ธ๋“ค์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Apple ์žฅ์น˜์—์„œ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ชจ๋ธ๋“ค์„ CoreML ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด, ์šฐ๋ฆฌ๋Š” ์ „์— ์„ค์น˜ํ•œ onnx-coreml ์ปจ๋ฒ„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์ปจ๋ฒ„ํ„ฐ๋Š” ์œ„์˜ ์„ค์น˜ ๋‹จ๊ณ„์—์„œ ์ถ”๊ฐ€๋œ convert-onnx-to-coreml ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์‰ฝ๊ฒŒ๋„ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ธ ์‹ ๊ฒฝ๋ง์˜ ์ž…๋ ฅ๊ฐ’๊ณผ ์ถœ๋ ฅ๊ฐ’์„ ์ด๋ฏธ์ง€๋กœ์„œ ํ‘œ์‹œํ•ด์ฃผ์ง€ ๋ชปํ•˜๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ํŒŒ์ด์ฌ์—์„œ ์ปจ๋ฒ„ํ„ฐ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

style transfer ๋ชจ๋ธ์„ ๋ณด๋ฉด (์˜ˆ๋ฅผ ๋“ค๋ฉด .onnx ํŒŒ์ผ์„ Netron๊ณผ ๊ฐ™์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์—ฌ๋Š”๊ฒƒ) ์šฐ๋ฆฌ๋Š” ์ž…๋ ฅ๊ฐ’์ด '0' ์œผ๋กœ ๋˜์–ด์žˆ๊ณ  ์ถœ๋ ฅ๊ฐ’์ด '186' ์œผ๋กœ ๋˜์–ด์žˆ๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ PyTorch ์— ์˜ํ•ด ํ• ๋‹น๋œ ์ˆซ์ž id ๋“ค ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๊ฐ’๋“ค์„ ์ด๋ฏธ์ง€๋กœ์จ ํ‘œ์‹œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ž ๊ทธ๋ž˜์„œ ์ด์ œ onnx_to_coreml.py ๋ผ๊ณ  ํ•˜๋Š” ์ž‘์€ ํŒŒ์ด์ฌ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ touch ๋ช…๋ น์–ด๋‚˜ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ํŽธ์ง‘๊ธฐ๋กœ ๋‹ค์Œ์˜ ๋ช‡์ค„์˜ ์ฝ”๋“œ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋งŒ๋“ค์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import sys
from onnx import onnx_pb
from onnx_coreml import convert

model_in = sys.argv[1]
model_out = sys.argv[2]

model_file = open(model_in, 'rb')
model_proto = onnx_pb.ModelProto()
model_proto.ParseFromString(model_file.read())
coreml_model = convert(model_proto, image_input_names=['0'], image_output_names=['186'])
coreml_model.save(model_out)

์ด์ œ ์‹คํ–‰์‹œ์ผœ๋ด…์‹œ๋‹ค.

python onnx_to_coreml.py ./saved_models/candy.onnx ./saved_models/candy.mlmodel
python onnx_to_coreml.py ./saved_models/udnie.onnx ./saved_models/udnie.mlmodel
python onnx_to_coreml.py ./saved_models/rain_princess.onnx ./saved_models/rain_princess.mlmodel
python onnx_to_coreml.py ./saved_models/mosaic.onnx ./saved_models/mosaic.mlmodel

์ด์ œ saved_models ํด๋”์— CoreML ๋ชจ๋ธ์ด 4๊ฐœ , candy.mlmodel, mosaic.mlmodel, rain_princess.mlmodel and udnie.mlmodel, ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

style transfer iOS์•ฑ์—์„œ CoreML ๋ชจ๋ธ๋“ค ์‹คํ–‰ํ•˜๊ธฐ

์ด ์ €์žฅ์†Œ(README.md๋ฅผ ์ฝ๊ณ  ๊ณ„์‹œ๋Š” ํ˜„์žฌ์˜ ์ €์žฅ์†Œ)๋Š” CoreML style transfer ๋ชจ๋ธ๋“ค์„ ํ•ธ๋“œํฐ ์นด๋ฉ”๋ผ๋กœ ์‹ค์‹œ๊ฐ„ ์นด๋ฉ”๋ผ ์ŠคํŠธ๋ฆผ์„ ์ด์šฉํ•˜์—ฌ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” iOS ์•ฑ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ €์žฅ์†Œ๋ฅผ ํด๋ก ํ•ด๋ด…์‹œ๋‹ค.

git clone https://github.com/onnx/tutorials

๊ทธ๋ฆฌ๊ณ  tutorials/examples/CoreML/ONNXLive/ONNXLive.xcodeproj ํ”„๋กœ์ ํŠธ๋ฅผ XCode ์—์„œ ์—ด์–ด๋ด…์‹œ๋‹ค. ์šฐ๋ฆฌ๋Š” XCode 9.3 ๋ฒ„์ „๊ณผ iPhone X๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ ๊ธฐ๊ธฐ๋‚˜ ์˜ค๋ž˜๋œ ๋ฒ„์ „์˜ XCode ๋ฅผ ์‚ฌ์šฉํ•ด ์‹คํ–‰ํ•˜๋Š”๋ฐ๋Š” ์ด์Šˆ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Models/ ํด๋”์— ํ”„๋กœ์ ํŠธ๋Š” .mlmodel ํŒŒ์ผ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ € ํŒŒ์ผ๋“ค์„ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฉ๊ธˆ ์ƒ์„ฑํ•ด๋‚ธ ๋ชจ๋ธ๋“ค๋กœ ๊ต์ฒดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  iPhone์„ ์ด์šฉํ•ด์„œ ์•ฑ์„ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋ชจ๋“  ์ค€๋น„๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ์„ ํƒญํ•˜๋ฉด์„œ ๋ชจ๋ธ๋“ค์„ ๋ฐ”๊ฟ”๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค.

๊ฒฐ๋ก 

์šฐ๋ฆฌ๋Š” ์ด ํŠœํ† ๋ฆฌ์–ผ์ด ONNX ๊ฐ€ ๋ฌด์—‡์ด๊ณ  ์–ด๋–ป๊ฒŒ ์‹ ๊ฒฝ๋ง๋“ค์„ ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฌ์ด์—์„œ ๋ณ€ํ™˜ํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ถฉ๋ถ„ํžˆ ์„ค๋ช…์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” PyTorch์—์„œ CoreML ๋กœ style transfer ๋ชจ๋ธ๋“ค์„ ๋ณ€ํ™˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์•ž์„œ ์†Œ๊ฐœํ•ด๋“œ๋ฆฐ ๋‹จ๊ณ„๋“ค์„ ํ™œ์šฉํ•˜๋ฉฐ ์ž์œ ๋กญ๊ฒŒ ์ž์‹ ๋งŒ์˜ ๋ชจ๋ธ์„ ์‹คํ—˜ํ•ด ๋ณด์‹œ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ์ด๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.