heojae / FoodImageRotationAdmin

Food Image Rotation (음식이미지 회전) 이라는 주제에 대해서. 실제로 딥러닝(deeplearning)을 어떻게 도입하고, 이를 API(backend)로서 서버에 올리며, 웹(frontend) 를 통해서 올리는 과정을 구현하기 위해서 만든 프로젝트입니다.
0 stars 0 forks source link

[DeepLearning] 데이터 전처리 및 생성방법 #5

Open heojae opened 3 years ago

heojae commented 3 years ago

대주제 : 딥러닝 모델의 학습을 하고싶다.

소주제 : 데이터의 전처리 방법과 실행방법을 정리하고 싶다.

데이터 전처리 및 생성 방법 정리

1. 음식 이미지 모으기

데이터를 모으기 위해서는, 2가지 방법이 있습니다.

예전에, Crawler 를 통해서, 데이터를 수집을 하였으나, (crawler.py 를 약 1년전에 구현을 했기에, 현재에는 쓰시는 것을 추천 드리지 않습니다.)

올바르지 못한 이미지의 비율이 많았기에(제가 정의를 한 클래스의 기준과 데이터 셋의 기준, 데이터의 분류와 클래스 선정의 이유 정리 )

손으로 하는 것이 더 빠르기에, 직접 손으로 모았습니다.

0도를 기준으로 한 폴더에(before_rotate) 에 모았습니다.

접기/펼치기 버튼
![스크린샷 2021-02-07 오전 10 38 27](https://user-images.githubusercontent.com/41981538/107134473-c25d2700-6935-11eb-8697-75be907e0e99.jpg)
2. 전처리 코드 실행시키기

deeplearning/preprocess_data 폴더를 보시면, 총 3가지 python 파일이 있습니다.

  1. rename.py

    사실 안해도 괜찮은 것이긴 하지만, 좀 더 간편하게 데이터에 대한 접근과 한글 naming 파일들을 가능한 쓰지 않기위해서, 다음과 같이 변형하였습니다.

    • 추후 리눅스 서버로 옮길 때, 한글의 경우 파일명이 깨질수 있기 때문에 이를 변형하는 것을 추천드립니다.
  2. make_rotated_images.py

    위에서, rename 된 이미지 파일들을 0, 90, 180, 270 도로 회전을 시키는 작업입니다.

    Image_size = 224 로서, efficient-b0 에 넣기위해서, 다음과 같이 바꾸었으며,

    추후 다른 모델들을 활용하고 싶으시다면, 아래를 참고해서, 작업해주시기를 바랍니다.

    https://github.com/lukemelas/EfficientNet-PyTorch/blob/master/efficientnet_pytorch/utils.py

접기/펼치기 버튼
![스크린샷 2021-02-07 오전 10 58 06](https://user-images.githubusercontent.com/41981538/107134459-a194d180-6935-11eb-8356-139d8e78f2f4.jpg)
폴더구조

폴더 구조는 아래와 같습니다.

   data
    - after_rotate
        - train
            - degree_0
                - food1.jpg
                - food2.jpg
                - ...
            - degree_90
            - degree_180
            - degree_270
        - test
            - degree_0
            - degree_90
            - degree_180
            - degree_270

    - before_rotate
        - food1.jpg
        - food2.jpg
        - ...

before_rotate 에 있는 파일들을 아래와 같이 전처리 작업을 합니다.

접기/펼치기 버튼
|0|90|180|270| |---|---|---|---| |||||
  1. make_csv.py

    위 폴더 구조를 기반으로, 추후 DatasetDataLoader 를 통한 접근을 편리화 하기위해서, csv 파일로 만든다.

    train.csv

    train_or_test,degree_dir_name,image_name
    train,degree_270,1.jpg
    train,degree_90,1.jpg
    train,degree_0,1.jpg
    train,degree_180,1.jpg
    train,degree_270,10.jpg
    train,degree_90,10.jpg
    train,degree_0,10.jpg
    train,degree_180,10.jpg
    ...
  2. run_preprocess.sh

    위 파일들을 실행시키기 위한, 인자들을 간편하게 실행시키기 위해서 필요한 인자들을 넣어두었습니다.

    간편하게,

    # sh run_preprocess.sh
    python rename.py --dir_path ../data/before_rotate
    python make_rotated_images.py --before_dir_path ../data/before_rotate --save_dir_path ../data/after_rotate
    python make_csv.py --after_rotate_dir_path ../data/after_rotate \
                      --save_train_csv_path ../train.csv \
                      --save_test_csv_path ../test.csv \

    간편하게, 아래와 같이 실행시킬수 있습니다. 만약 폴더의 위치를 바꾸고 싶으시다면, 저 인자들을 수정하시길 바랍니다.

    sh run_preprocess.sh
heojae commented 3 years ago

참고 자료 - Exif Data

추후, 실제 데이터를 활용함이 필요할 경우,

Exif Data 를 고려할 필요가 있습니다.

이미지 내부에 있는 Exif 의 Rotaion 정보를 접근할 필요가 있으며, 이를 고려하여, 데이터를 전처리 하여야합니다.

만약, Exif Data 가 존재하는 데, 이를 고려하지 않고, 저장을 할 경우, 잘못 회전된 이미지가 저장됩니다.

스크린샷 2021-02-07 오전 11 38 14 스크린샷 2021-02-07 오전 11 38 20

https://stackoverflow.com/questions/13872331/rotating-an-image-with-orientation-specified-in-exif-using-python-without-pil-in

https://sga8.tistory.com/7