YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
Food Classifier Test Platform for Trained model with PHOTOMATO
๋ง์ง๋ง ์ ๋ฐ์ดํธ: 2021/02/21
๊ฐ๋ฐํ๊ฒฝ: Ubuntu 16.04 (Windows 10) ํ ์คํธ ์๋ฃ
python ํ๊ฒฝ์ค์ : conda env (webdev) with python=3.5
ํ์ ํฉํค์ง: Flask, opencv, pillow
์ต์ข ์ ์ผ๋ก Naver Server ์ REST API ๋ฅผ Flask framework ์ ์ด์ฉํ์ฌ ์๋น์คํจ.
Windows 10 test: working on anaconda environment with pyTh37-pyTorch-Opencv420-office.yml
ํ ์คํ ํ๋ผ๋ฏธํฐ๋ config/config.py ๋ฅผ ์ฐธ์กฐ.
0. ์์๋ฐ์ดํฐ ๋ผ๋ฒจ์ ์นดํ ์ฝ๋ฆฌ ํ์ค์ฝ๋ ๊ด๋ฆฌ์ ์ต์ข ์ฝ๋๋ฅผ ์ฐธ์กฐํ์ฌ class ๋ก ๋ถ๋ฆฌํจ... 1. ํ์ฌ 3165์ข ์ผ๋ก ๊ตฌ๋ถํจ.. 2. YOLO ๊ณต์ ํํ์ด์ง์์ ์ ์ํ๊ธฐ๋ก๋ ๊ฐ ํด๋์ค๋น ์ ์ด๋ 2000๊ฐ์ด์์ ์์์ด ํ์ํจ. 3. ํ์ฌ PHOTOMATO dataset ๊ธฐ์ค์ผ๋ก 1000๋ฒ ์ํ ๊ธฐ์ค 2GPU ๋ก 10์๊ฐ์ฉ ๊ฑธ๋ฆผ.. 4. ์ ์ด๋ 100,000๋ฒ์ ์ํ์ด ๊ฒฝํ์ ํ์ํ๋ค๊ณ ํ๋จ๋๋ ์๊ฐ๊ด๊ณ์ 20000๋ฒ์ ํตํด ๋ชจ๋ธ ์ทจ๋ 5. ์ค๊ฐ๊ฒฐ๊ณผ ๋ถ์ 13000๋ฒ ์ด์ ์ํ ํ ์ฅ๊ฐ๋ก(class_id:384), ๋ฉ๊ฒ(class_id:563)์ ๊ฒฝ์ฐ "์ฅ๊ฐ๋ก 0.78852534 - confidence: 0.7352499 - thres : 0.1" : "๋ฉ๊ฒ 0.67948073 - confidence: 0.59680355 - thres : 0.1 " : ๊ณ์ ์ํํจ์ ๋ฐ๋ผ(์ฝ 200 epoch ๋ ์งํ ํ, 2์๊ฐ ํ). "์ฅ๊ฐ๋ก 0.78726465 - confidence: 0.6972475 - thres : 0.1" : "๋ฉ๊ฒ 0.7939826 - confidence: 0.69312614 - thres : 0.1 " : ๋ก ์ ๋๋ก ์ธ์ํจ.. 15000๋ฒ: ๋ฉ๊ฒ์ ๊ฒฝ์ฐ๋ฅผ ๋ณด๋ฉด ์๋นํ ์ฑ๋ฅ์ด ์ข์์ง๊ณ ์์. ์ฅ๊ฐ๋ก์ ๋ณด๋ฉด ์์ง ๋ถ์์ ํ ๊ฒ์ผ๋ก ํ๋จํ ์ ์์ ์ฅ๊ฐ๋ก: 0.55149615 - confidence: 0.4864739 - thres : 0.1 ๋ฉ๊ฒ: 0.93912053 - confidence: 0.65867484
Preparing data
1. data ์ค๋น
์์์ ์์น๋ ์๊ด์ด ์์ผ๋ ๊ธฐ๊ณ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ์ํด json ํ์ผ์ด ๊ฐ์ ํด๋์์ ์กด์ฌํ๋๊ฒ ์ข๋ค.
json-> yolo txt ํ์ผ ํฌ๋งท (class_id, center_x, center_y, width, height)์ tuple ๋ก
์ ์ฅ์ด ๋์ด ์์ด์ผ ํ๋ค. ๋จ ์ขํ๋ ๋ฌผ์ฒด๋ฅผ ๋๋ฌ์๋ box์ ์ค์ฌ, ๊ฐ๋ก๊ธธ์ด, ์ธ๋ก๊ธธ์ด๋ ๋ฐ๋์ ์ ์ฒด์์์ ๊ฐ๋ก์ ์ธ๋ก๋ก ์ ๊ทํ ๋์ด์ผ ํ๋ค.
2. data๊ฐ ์ค๋น๋๋ฉด training data:validation data์ ๋น์จ์ ๋ฐ๋ผ
train.txt ์ val.txt์ ๋๋์ด ๋ชฉ๋ก์ ๋ง๋ ๋ค. ํ์ฌ์ ๋ฌธ์๋ (8:2)๋ก ๋น์จ์ ์ ํ์๋ค.
3. class/label/category๋ฅผ ๋ํ๋ด๋ ๋ชฉ๋ก์
./yolo/data/food/food-classes.names ์ ๋ฃ์ด์ ธ์ผ ํ๋ค. ํ์ฌ 3165๊ฐ์ ํด๋์ค๊ฐ ๋ค์ด๊ฐ ์๋ค.
Training
1. ๋ฐ์ดํฐ๊ฐ ์ค๋น๊ฐ ๋๋ฉด ./yolo/config/food-darknet-v1.data ์ ์๋์ ๊ฐ์ด ํ๋ จ์ ์ฌ์ฉํ train list, validation list,
ํด๋์ค ์ ์, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ธ์ ์์ ์ ์ฅํ ํด๋ ๋ฑ์ ๋ํ ์ ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ํ๋ค. ๋ณธ์ธ์ ํ๊ฒฝ์ ๋ง๊ฒ ์ ํด ์ฃผ๋ฉด ๋๋ค.
classes =3165
train = /workspace/food_classification/yolo/data/food/food_train_20210211.txt
valid = /workspace/food_classification/yolo/data/food/food_val_20210211.txt
names = /workspace/food_classification/yolo/data/food/food-classes.names
backup = /workspace/food_classification/yolo/data/food/weights/
2. docker๋ฅผ ํตํด ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง container๋ก ๋ค์ด๊ฐ๋ค. (docker ์ ๊ฒฝํ์๋ ์๊ฒ ์ง๋ง image๊ฐ ์์ผ๋ฉด ์๋์ผ๋ก archive์์ ๋ฐ๊ฒ ๋๋ค.)
$ sudo docker run --gpus all -it -v ~/workspace:/workspace --ipc=host sangkny/darknet:yolov4 /bin/bash
3. docker ๋ด์์ training์ ์์ํ๋ค.
$ ./darknet detector train /workspace/food-classifier/yolo/config/food-darknet-v1.data /workspace/food-classifier/yolo/config/food-dark-yolov3-tiny_3l-v3-2.cfg /workspace/food-classifier/yolo/config/darknet53.conv.74 -gpus 0,1 2>&1 |tee /workspace/food-classifier/yolo/data/food/food-train-v3-highGPU.log
Inference and WebService
1. ํ๋ จ๋ ๋ชจ๋ธ์ ๋ํ ํ
์คํธ๋ conda ๊ฐ์ํ๊ฒฝ์ ๋ง๋ค๊ณ ๊ทธ์์์ ์ค์ํ๋ค.
$ conda create --name webdev python=3.5 flask, opencv=3.4.2, pillow
$ conda activate webdev
์์ ๋ช
๋ น๊น์ง ์ ์์ ์ผ๋ก ์คํ์ด ๋๋ฉด ๊ฐ์ํ๊ฒฝ ๋ด์ ์์ด์ผ ํ๋ฉฐ ๋ค์๊ณผ ์ ์ฌํ ํ๋กฌํํธ ์์ ๋์ด๊ฒ ๋๋ค.
$ (webdev)
2. ๋ณธ๊ฒฉ์ ์ธ inference test๋ food_classifier_yolo.py ๋ก ๊ตฌํ์ด ๋์ด ์์ผ๋ฉด
$ python food_classifier_yolo.py ๋ฅผ ์คํํ๋ฉด ๋๋ค.
๊ฐ์ข
parameter ์กฐ์ ์ ./config/config.py ๋ฅผ ์ฐธ์กฐํ์ฌ ์กฐ์ ํ๋ฉด ๋๋ค.
3. REST API ๋ฅผ Flask framework ๋ฅผ ํตํด ๊ตฌํํ์๋ค.
$ python WebAPI.py
๋ฅผ ์คํํ๋ฉด ๋๋ค. ํนํ, local ip(0.0.0.0, 127.0.0.1) ์ ubuntu, windows ๊ฐ๊ฐ local host๋ก ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค.
local host๋ ์๋ฒ ๋ณธ์ฒด์ด๋ฉฐ, ํฌํธ(๋ด/์ธ๋ถ ๊ฒฝ๋ก ๊ณตํต)๋ฅผ ํตํด ์ธ๋ถ์์ ๋ค์ด์ค๋ ์์ฒญ์ ๋ฐ์๋ค์ด๊ฒ ๋๋ค. ์ธ๋ถ์์์ ์์ฒญ์
๊ณต์ ์น์๋ฒ ip๋ฅผ ํตํด ์ ๋ฌ๋๋ค.
๊ฐ webํ๊ฒฝ์ ๋ง๊ฒ WebAPI.py ์ ์ผ ๋ง์ง๋ง main ํจ์์ ์๋ ip ์ port๋ฅผ ์กฐ์ ํ์ฌ ์๋น์ค๋ฅผ ํ๋ฉด ๋๋ค.
ํ์ฌ ๋ค์ด๋ฒ ์๋ฒ๋ http://xxx.xxx.xx.x:8080/uploader ๋ก ์ ์์ ํ๋ฉด ํ์ผ์ ์ ์กํ๋ผ๋ webpage๊ฐ ๋จ๊ณ
์ ์ ํ ํ์ผ์ ์ ํ ํ ์ ์ก์ ํ์ฌ request๋ฅผ ํ๋ฉด
์ ์ํ ์๋ฒ์์ json์ ํฌ๋งท์ผ๋ก ํ์ง๋ ๋ฌผ์ฒด์ ๋ํ ์ ๋ณด๋ฅผ ๋ํ๋๊ฒ ๋๋ค.
4. ์ด๋ ๊ฒ ์น์๋ฒ์ ๋์๋์ framework(Flask)๊ฐ ๋ก๊ทธ ์์์ด ๋์ด๋ ์ง์๋๊ฒ ํ๊ธฐ ์ํด ์ ์ผ ๋ง์ง๋ง์ &๋ฅผ ๋ถ์ฌ
$ python WepAPI.py &
๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์ daemon ๊ฐ์ด ์ธ ์ ์๋ค.
ํน์ process๊ฐ ์ฃฝ์ด๋ ๊ณ์ ์จ๋น์ค ํ๊ธฐ ์ฐํด์๋ no hang up์ ์ฝ์์ธ nohup์ ์์ ๋ถ์ฌ ์ฌ์ฉํ๋ค.
$ hohup python WepAPI.py &
์ฌ๊ธฐ์ ๋ก๊ทธ๋ฅผ ์ ์ฅํ๊ณ ์ถ์ผ๋ฉด
$ nohup python WebAPI.py > app.log &
๋ก ์ฌ์ฉํ๋ฉด ๋๋ค. ํ์ง๋ง ํ๋ฉด์ ์ถ๋ ฅ๊น์ง ๋ณด๊ณ ์ถ๋ค๋ฉด,
$ nohup python WebAPI.py 2>&1 |tee app.log &
ํ๋ฉด๋๋ค.
5. ์น์๋ฒ์ ์๋ต์ WebAPI.py ์ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ด..
(ClassID, ClassName, x, y, width, height) ๋ฅผ ํ์ง๋ ๋ฌผ์ฒด์ ๊ฐ์ ๋งํผ json format ์ผ๋ก ๋๊ฒจ์ฃผ๊ฒ ๋๋ค.
----------- ํจ์ ์ ์ ------- WepAPI.py ์ food_classifier_Json(image) ์ food_classifier_yolo.py ์ ์์ ---------------
def food_classifier_Json(image):
# do somthing
print(args.showText)
locations = food_classifier_pipeline(frame=image) #[(2321, 0, 0, 10, 10)] # list of (id, rect) from classification
jsons = []
for j,location in enumerate(locations):
class_id, x, y, width, height =location
res_json = {}
res_json["ClassID"] = classes_codes[class_id] # code , class_id (training class)
res_json["ClassName"] = classes[class_id]
res_json["x"] = int(x)
res_json["y"] = int(y)
res_json["w"] = int(width)
res_json["h"] = int(height)
jsons.append(res_json)
print(json.dumps(jsons,ensure_ascii=False)) # debug purpose
return json.dumps(jsons,ensure_ascii=False)
6. ์๋ฒ๋ฅผ ์ฌ ๋ถํ
์ ์์ ์ค์ ์ ์๊ตฌ๋๋ ์ฌํญ์ CTL ๋ฑ์ ์๋ฒ๊ด๋ฆฌ์์๊ฒ ์ค์ ์ ํ๊ฒ ํ๋ฉด ๋๋ค.
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐ Ask for provider support