| ## 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 ๋ฅผ ์ฐธ์กฐ. | |
| ```angular2html | |
| 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 | |
| ```angular2html | |
| 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 | |
| ```angular2html | |
| 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 | |
| ```angular2html | |
| 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 ๋ฑ์ ์๋ฒ๊ด๋ฆฌ์์๊ฒ ์ค์ ์ ํ๊ฒ ํ๋ฉด ๋๋ค. | |
| ``` |