Kfoods / README.md
cooler8's picture
inferences codes
d658572 verified
|
Raw
History Blame Contribute Delete
7.47 kB

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 ๋“ฑ์€ ์„œ๋ฒ„๊ด€๋ฆฌ์ž์—๊ฒŒ ์„ค์ •์„ ํ•˜๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค.