다빈치 SW 공모전

'언택트 시대에 유용한 앱 혹은 서비스를 주제로한 SW 공모전으로
2020-2학기 비공학 전공 재학생 2인 이상이면 참가 가능합니다.

자세히 알아보기

캡스톤 디자인 경진대회

캡스톤 디자인 교과목 수행 결과물 또는 졸업 작품 심사
2019년 2학기, 2020년 1학기 중 한 학기 이상 캡스톤 디자인 교과목을
수강한 학생만 참가 가능합니다.

자세히 알아보기

PE연구활동 발표대회

PE연구/개발 활동을 수행하면서 얻어진 다양한 형태의 결과물
(논문형태의 결과보고서, 논문, 발명품, 작품, 콘텐츠 등)을 심사

자세히 알아보기

SW·AI 창업아이디어경진대회

SW 관련 전공 학부생 여러분!
반짝이는 SW창업 아이디어로 여러분의 미래를 바꾸십시오!

자세히 알아보기

SW·AI융합우수성과 발표회

SW융합전공 / 복수 전공 학생 여러분!
SW융합전공 / 복수전공을 이수하는 과정에서 얻어진 성과를 뽐내 주세요.

자세히 알아보기

다빈치 주니어 SW 작품대회

창의적인 아이디어와 소프트웨어를 활용한
멋진 SW 작품을 만들어 보세요!

자세히 알아보기

다빈치오픈소스 SW·AI 딥러닝 해커톤

4차 산업혁명을 견인하는 심층학습을 주제로한 SW·AI 딥러닝 해커톤으로
소프트웨어대학 재학생으로 구성된 2인 이하 팀으로 참가 가능합니다.

자세히 알아보기

코딩경진대회

소프트웨어 중심 대학으로서 중앙대학교의 소프트웨어 관련
교육 프로그램 성과를 공유합니다.

자세히 알아보기

PE연구활동 발표대회

  • COBOBs

    등록자
    김현주 (소프트웨어학부 | 3학년)
좋아요 151

작품영상

  • 참여 목적 및 참여 당시 활동 목표
    1. 참여 목적
    2학기에 머신러닝 과목 수업을 들으며 처음으로 머신러닝을 접하게 되었다. 수업에서 mnist 숫자 판별하기, 문서를 통한 감정 분류하기 등의 과제를 하며 머신러닝에 흥미가 생겼고 지금까지 해보고 싶었던 프로젝트들을 머신러닝과 접목시키면 문제를 해결할 수 있을 것 같아서 이에 대해 더 공부하고자 이미지 연구실의 pe에 참여하게 되었다.
     
    1. 활동 목표
    • 수업에서 이미지 관련 머신러닝 과제는 mnist 숫자 분류밖에 없었는데 그 외 다른 이미지 관련 프로젝트를 진행하고 싶었다. 또 머신러닝은 이미지 분야에서 굉장히 다양하게 쓰이는데 이미지 class 분류 외에 모션 인식 등 다른 여러 이미지 관련 연구에 대해 공부하고자 했다.
    • 과제를 하며 가장 애를 먹은 부분이 learning rate를 몇으로 할지, layer는 몇 개로 해야 하는지 등 architecture를 설계하는 것이었다. 이를 어떻게 결정하는지, 어떻게 설계하는지, 또 우리가 수업시간에 배운 DNN구조, sigmoid function외에 다른 인공신경망 구조나 activation function, 학습 알고리즘 등이 있는지 등을 공부하여 더 효율적인 신경망 설계를 하는 것이 목표였다.
    • 과제를 할 때는 pytorch나 tensorflow와 같은 머신러닝 라이브러리를 사용하지 않고 모든 코드를 작성했는데 성능을 더 올리기 위해, 더 빠른 시간안에 효율적으로 돌리기 위해 라이브러리를 사용하는 방법을 공부하고 프로젝트에 적용하고 싶었다.
  • 연구 및 학습활동 결과
  • <연구 목적>
    피부병으로 의심되는 병변의 사진을 input으로 하여 이 병변이 실제 피부병인지, 어떤 피부병인지를 판별하는 classifier를 만드는 과정에서 병변을 더 잘 보이게 하기 위해 사진 속 피부에 털이 있는지 없는지 판별하고 털이 있다면 그 털을 제거하는 데이터 전 처리 프로그램을 만드는 것이 연구 목적이다.


    <
    연구 계획>
    7월 2째주: 연구 과제 확정 (SIIM-ISIC Melanoma Classification으로 결정)
    7월 3째주: 학부 연구생들끼리 연구 과제의 어떤 파트를 맡을 것인지 결정(segmentation, scale space, auto ML, GAN 중에서 GAN으로 결정)
    7월 4째주~8월 1째주: GAN 개념 공부, pytorch 사용법 공부, CNN 및 DNN 개념 공부, 사진 속 병변의 털 유무 판별하여 털 유무 classifier를 만들기 위한 데이터 셋을 구축
    8월 2째주: 털 유무 classifier 만들기, 다양한 크기의 사진 resize 하는 모듈 완성
    8월 3째주~8월 4째주: 완성된 데이터 셋으로 털을 제거해주는 GAN 모델 완성


    <
    연구 내용>
    1. 털 유무 classifier을 만들고, 다양한 크기의 이미지 데이터들을 resize 시켜 input data 만들기
    -> 문제를 해결하기 위해 사용한 방법: CNN(Convolution Neural Network) model, ,VGGNet, image crop, torchvision.transition

    털 제거 네트워크를 만들기 위해서는 털이 있는 다량의 병변 데이터들이 필요한데, 전체 약 35,000개의 병변 이미지 데이터들에는 털의 유무에 대한 정보가 제공되지 않는다. 따라서 전체 중 일부를 hand labeling하여 hair classification 학습을 위한 초기 데이터를 만들고 그 결과로 나머지 데이터들의 hair labeling을 자동으로 하여 뒤의 과제를 위한 데이터 셋을 만들고자 했다.

    1.PNG
    위와 같은 데이터들을 가지고 이미지가 input으로 들어왔을 때 1또는 0으로 hair의 유무를 output으로 반환하는 신경망을 CNN, 그 중 VGGNet으로 구축하였다.

    2.png

    3.PNG
     이 때 이 CNN에서 성능을 높이는 네트워크의 깊이에 초점을 맞추어 VGGNet 구조를 사용하여 학습망을 완성시켜 코드를 돌려보았다.
     

    4.png
    (VGG16의 구조)

    1000개의 데이터에서 750의 train dataset과 250의 test dataset을 랜덤하게 나누어 네트워크에 넣고 돌려보니 다음과 같은 결과가 나왔다.
     

    5.png
    [blue : train | red : test]
    마지막 Epoch에서 
    loss: 0.0355 - accuracy: 0.9897 - val_loss: 1.0947 - val_accuracy: 0.8142

    위와 같은 결과가 나왔다. 육안으로 털의 유무를 판단하여 데이터를 분류할 때 털의 유무에 대한 기준이 매번 주관적이라는 점과 dataset input size가 1000개로 적었던 점에서 81.42%의 정확도도 의미있는 수치이며, input size의 크기를 늘리고 털의 유무 기준을 보다 명확히 잡아 더 제대로 된 input dataset을 마련하여 정확도를 높여보고 자한다. 또한 epoch을 늘리거나 모델을 약간 수정하는 등의 과정을 통해서도 정확도를 높여보고자 한다. 아래는 hair classification network를 google colab 환경에서 구축하여 돌려본 코드이다.

    https://github.com/dlguswn3659/2020_Image_Lab/blob/master/hair_classification_recent_ver.ipynb


    2. inpainting을 통해 이미지에서 털을 제거해보기

    -> 문제를 해결하기 위해 사용한 방법: blackhat filtering, inpainting

    6.PNG
    맨 처음엔 이러한 방식으로 hair이미지에서 털을 제거하고 남은 부분을 제거되지 않은 부분들을 참조하여 복구하여 결과적으로는 털이 제거된 이미지를 만들고자 시도해보았다. Dicom 파일을 처음 다뤄보아 어려움이 있었지만 이는 dicom파일을 load할 수 있도록 해주는 외부 라이브러리를 통해 해결할 수 있었다.

    - 구현 결과
     

    7.PNG
       - 결과

    8.png
      - 원본과 결과 비교
     

    9.png

    제거가 되기는 하지만 해당 테스트 이미지가 워낙 모발이 많고 굵은 편에 속하여 결과가 그다지 눈에 띄지 않고 성능도 좋아 보이지 않는다. 각 단계의 숫자들을 조율하여 최적의 inpainting 결과를 도출하거나, 거듭한 inpainting을 시도해 보는 등의 방법을 통해 hair removal의 정확도를 높여야 할 것 같다.

    그러나 다음과 같은 문제점이 있었고 새로 배운 GAN이 우리 프로젝트에 잘 적용이 되는지 실험해보고 싶어서 다른 방식으로 문제를 접근해보기로 하였다.
     -> 이미지 마다 용량이 다른데 사이즈가 클수록 inpainting하는데 걸리는 시간이 기하급수적으로 증가한다.
     -> 피부병 발생 부위와 모발의 색이 유사하면 inpainting 정확도가 확연히 낮아진다. 이 부분을 해결하려면 다른 방법을 도입해야 할 것 같다.

    아래는 위 inpainting 작업을 돌려본 코드이다.
    https://github.com/dlguswn3659/2020_Image_Lab/tree/master/hair_removal


    3. 완성된 데이터 셋으로 털을 제거하는 네트워크 구축하기

    -> 문제를 해결하기 위해 사용한 방법: GAN(Generative Adversarial Network) model

    털이 있는 사진을 털이 없는 사진으로 변환시키기 위해 GAN 모델을 사용하였다. GAN은 그럴듯한 fake image를 만들어 주는 model이다. 우리가 사용하는 실제 image는 털이 있는 병변 사진이고 fake image는 실제 image에서 털만 제거된 image이다.

    10.png
    일반적인 GAN은 2가지 부분으로 나눌 수 있다. random noise에서 fake image를 만드는 Generative model과 image를 input으로 하여 그것이 fake image인지, real image인지를 판별하는 Discriminative model이 있다. 먼저 discriminative model에서 아래 objective function을 이용하여 실제 image는 1로, fake image는 0으로 분류할 수 있도록 학습시킨다.

    11.png
    또 generative model에서 아래 objective function을 이용하여 어떠한 임의의 분포(대표적으로 가우시안 분포)를 우리가 원하는 real image와 비슷한 분포를 가지도록 학습시켜 output을 만든다.
     

    12.png
    그리고 그 output을 discriminative model에 넣어 그 사진이 가짜인지, 진짜인지 판별할 수 있도록 한다. 여기서 학습을 반복시키면 D(G(z))값이 처음에 0에서 1로 점점 가까워지면서 fake image임에도 불구하고 discriminator가 real이라고 판별하는, 진짜에 가까운 image가 나오게 된다.
    여기서 우리는 random noise를 generative model의 input으로 넣는 일반적인 GAN과 다르게, 털이 있는 사진을 input으로 하여 그 input에서 다른 것은 변하지 않고 딱 털 부분만 제거되고 그 제거된 부분이 주위 픽셀들과 자연스럽게 연결되야 한다는 설계적인 차이점이 있다.
    우리는 이 GAN을 적용하여 non_hair이미지들을 input으로 넣을 때 discriminator와 generator를 통해 원래 이미지와 비슷하나 non_hair가 아닌 hair이미지로 인식할 때까지 돌아가는 네트워크를 설계해 성능을 실험해보았다.
    8000개의 hair, non_hair 분류 데이터를 통해 약 5000개의 hair 데이터를 넣어 epoch=10(epoch을 키워 여러 번 돌리면 좋지만, 매 epoch마다 5000개의 데이터들을 resize 시키기 때문에 상당히 오랜시간이 걸린다. 이 부분을 초기에만 resize를 시키고 따로 numpy 형식으로 저장하여 그 데이터를 활용하는 방식으로 수정하면 더 빠르게 돌려 성능을 향상시킬 수 있을 것으로 추정되어 향후 이러한 방법으로 진행해볼 예정이다.), height=128, weight=128, batch_size=4, learning_rate = 0.0001로 돌려본 결과는 다음과 같다.

    13.png
    위의 결과는 매 Epoch마다 가운데 hair input데이터가 네트워크를 통해 왼쪽의 hair removed output을 생산해 낸 것을 보여주고 있다. 이러한 방식으로 네트워크가 제대로 동작하고 있음을 알 수 있다.

    Shell 파일의 값들을 조정하여 여러 차례 시도해본 후 distance와 loss(discriminator와 generator) 그래프는 다음과 같다.

    14.PNG

    아래는 hair removal GAN network를 구축하여 돌려본 코드이다.
    https://github.com/dlguswn3659/imagelab_cau_2020_summer_proj/tree/master/hair_removal
     

  • 참여 소감 및 향후 계획
    1. 참여 소감
    직접 프로젝트를 해결하기 위한 코드를 작성해보면서 이론으로 학습한 pytorch나 tensorflow와 같은 머신러닝 라이브러리들을 직접 활용해볼 수 있었다. 지난 학기 수업시간에 돌려보았던 프로젝트보다 훨씬 큰 규모인데다가 흔히 보급되는 jpg데이터가 아닌 dicom데이터를 다루다 보니 성능면에서나 데이터 로드에서 다루는 과정까지 처음겪는 시행착오들이 굉장히 많았다. 하지만 팀원들과 서로 코드와 아이디어를 공유하면서 데이터를 다루는데 성공할 수 있었고, 여러 개발환경과 라이브러리들을 통해 수차례 시도를 해보면서 성능 향상의 중요성을 몸소 경험할 수 있었다.
     
    1. 향후 계획
    남은 PE기간 동안 위에서 언급했듯이 GAN에서 매 epoch마다 5000개의 데이터들을 resize 시키기 때문에 상당히 오랜 시간이 걸리는 부분을 초기에만 resize를 시키고 따로 numpy 형식으로 저장하여 그 데이터를 활용하는 방식으로 수정하면 더 빠르게 돌려 성능을 향상시킬 수 있을 것으로 추정되어 향후 이러한 방법으로 진행해볼 예정이다. 또한 해당 부분을 연구실 CPU를 사용하면 더 빠르게 돌릴 수 있으므로 이 방법을 사용해볼 예정이다. 그리고 input size를 늘리거나 input의 hair labeling을 더욱 섬세하게 검토하여 성능을 향상시켜 볼 계획이다.
    위와 같이 성능 향상 시도를 해본 후 완성된 최종 코드를 다른 부분을 맡은 팀원들과 합쳐서 최종적인 병변 판별 네트워크를 완성시켜볼 계획이다.
  • 증빙자료
  • 1. 병변 사진 data: https://www.kaggle.com/c/siim-isic-melanoma-classification/data
    2. hair classification network code: 
    https://github.com/dlguswn3659/2020_Image_Lab/blob/master/hair_classification_recent_ver.ipynb
    3. inpainting을 이용한 hair removal code:
    https://github.com/dlguswn3659/2020_Image_Lab/tree/master/hair_removal
    4. GAN을 이용한 hair removal code:
    https://github.com/dlguswn3659/imagelab_cau_2020_summer_proj/tree/master/hair_removal
    5. 발표영상 youtube 주소
    https://youtu.be/XYFTtG7Mwp0
    * 동일 내용을 2020 여름 PE 연구활동 보고서 - COBOBs로 첨부함

좋아요 참여 151

  • 학년 별

  • 학과 별

중앙대학교 다빈치 sw tech fair 참가신청 닫기