취미삼아 배우는 프로그래밍

생초보가 해보는 머신러닝일지-1(이미지 분류) 본문

머신러닝

생초보가 해보는 머신러닝일지-1(이미지 분류)

Nadure 2020. 5. 27. 22:07

너도 나도 다 했길래 나도 해봤다.

 

우선,

머신러닝, 그놈은 무엇인가

 

일단, 머신러닝을 하기 앞서서 여러 책들을 읽어봤다

여타 다른 곳에서 하는 말은

 

문제와 답만 가지고 과정을 통째로 학습하는 과정

이라고 말하는것 같다.

 

 

일단, 처음은.. 이렇게 시작을 호기롭게 했다.

근데 책을 사서 보니 무슨

'adam' 'relu' 선형회귀

괴랄한 용어들 밖에 나오지 않는다.

tf.variable이 어쩌고

@tf.function이 어쩌고..

 

내 느낌상

책만 읽어서는 이놈들이 구체적으로 어떤 의미로 다가오는지를 알 수 가 없었다.

그래서 그냥 일단 만들어 보기로 했다.

물론 책에있는 예제를 해보기도 했다.

 

 

 

책에서 본바

머신러닝을 구사하는데에는 여러 툴들이 있지만,

나는 구글이 선택한 텐서플로우를 선택하기로 했다.

무엇보다 예제가 잘 있었기 때문에 선택을 하게 됐다.

 

 

 

그럼 뭐에다 쓸까?

굳이,, 사용코자 하면 내가하는 업무중 하나에 적용을 시키면 좋을 것 같았다.

우리 회사에서 사용하고 있는 도면의 예제 사진인데,

정말 귀찮게도 현재 ERP에는 신재 제작을 따로 표기할 방법이 없어서

도면을 하나 하나 보고 해당 품번을 체크해야한다.

정말 소름돋는건 내가 체크한 이거가지구 돈계산도 한다는거다.ㄷㄷ

 

얼핏 보면 글을 OCR 툴인 테서렉트로 불러오면 될거같은데?

싶었는데,

이거도 절대 호락호락 하지 않았다.

이게 그나마 옵션 잘 찾아서 잘 나온 편이다

다행스럽게 품번에 관한 OCR은 아주 잘 진행된다

 

그치만 이건 뭔 말인지 모르겠다

그치만, 혼자 유달리 글자크기가 크기 때문일까, 정작 필요한 신재사용 이라는 단어는 추출이 안된다

 

 

근데 여기서 더 나가서,

다른 도면을 표기 양식도 제멋대로며 표기 형식 및 위치도 제멋대로다

미친거아니야?

 

 

그래도 아주 다행스러운건 PDF파일은 준다

 

 


근데 이거어는,,

도면을 하나하나 보고 손으로 세서 하는거 밖에는 절대 답이 없었다.

그의 신재체크

 

 

아무리 해도 [신재 사용바람], [신재사용] 에 관한 위치를 특정시킬 수 없었고,

테서렉트 등을 쓰더라도 항상 내용이 같을 순 없었기 때문이다.

언제 설계자가 무슨 괴랄한 문구를 어떻게 넣을런지를

알 수가 없기 때문에,,,

 

 

그래서 머신러닝을 사용해 적용하면 괜찮을듯 싶었다.

 

마침 좋은 예제가 텐서플로우 공홈에 있었다.

www.tensorflow.org/tutorials/images/classification?hl=ko

 

Image classification  |  TensorFlow Core

This tutorial shows how to classify cats or dogs from images. It builds an image classifier using a tf.keras.Sequential model and load data using tf.keras.preprocessing.image.ImageDataGenerator. You will get some practical experience and develop intuition

www.tensorflow.org

 

이미지 분류에 관한 문서인데,

예제에서는 개냐 고양이냐 그것에 관한 문제를 다루고 있었다

개사진 2000장, 고양이 사진 2000장을 학습하는 예제다

 

그 말은 즉

신재냐 신재가 아니냐

라는 내 문제와 아주 부합했다.

 

 

그래서 저걸 다운받고 파이썬도 3.7버전을 따로 설치하고, venv 환경 자체도

3.7버전으로 설치해서 pip install tensorflow도 하였다.

 

 

공홈 예제를 다운받아다가,, 저시기 옮겨놓고

대충 복사하고 내용 지워서 사용했다.

 

 

 

PDF 이미지도 fitz 모듈을 사용해서 죄다 스플릿해가지고 이미지를 전부 분류했다.

다른게 오래걸린게 아니고, 데이터 준비가 오래걸렸다.

 

Train data는

신재를 의미하는 True, 신재가 아님을 의미하는 False 두가지로 나누었고

위처럼 천 개 정도씩 따로 분류해서 진행했다.

 

그리고 검증데이터는 대충 400개정도씩했다. 원래 500개는 맞춰야할 것 같았는데, 

데이터가 딸려서 방법이 없었다.

학습모델은 그냥 공홈에 있는거 그대로 가져다 썻다.

 

아무것도 모르는채로 해보면서 느낀건데

' 생각보다 모델을 만드는데는 시행착오가 적다. '
' 그치만 정확도 문제는 똥꼬쇼를 조금 해야할 듯 하다. '

는 느낌?

 

무엇보다 가장 좋았던건 의미를 제껴도 일단 대충 학습시키는데는 전혀 문제가 없다!

는 점이었다.

 

이게 좀 이해안가지는게, 진짜 분명 쉽고 간단한건 아니라고 생각하는데,

생각보다 별 이론 없이도 잘 된다

,,,

 

 

어찌어찌 학습시켜 만든 모델을

따로 테스트 코드를 짜서 학습된 이미지 자체를 통과시켜서 실제 결과값이 다를 경우 따로 파일을 복사하게끔 코드를 짜서 테스트해봤다.

그 결과

신재의 경우엔 75/999 개가 결과 값이 달랐고, 7.5% 오류

신재가 아닌 경우엔 20/999 가 결과값이 달랐다. 2% 오류

 

합치면 10%정도 오류가 난 샘인데

 

 

정확도 90%정도면 '앟ㅎㅎ 실숳햏네용' 으로도 해결이 안될 것 같다

이정도면 덜도말고 더도말고 내가 딱 불려가기 좋다

왜냐면 페이지 갯수로 쳤을 때 10%정도지 실상

페이지에 몇 개의 품번이 들어가있는지가 랜덤이기 때문에

 

이들을 합치면 엄청 많아서 대중없이 로스 값이 튀기 때문이다.

는거 보다도사실

아놔, 내 세치 혀가 문제지

 

 

그러면,, 이 90% 정도의 정확도 모델을 어떻게 하면 정확도를 끌어올릴 수 있을까?

 

 

음.. 일단 하나는 데이터셋 999개를 사용

하나는 틀린 것들을 모아둔 걸 이용했고 나머지는 채워가지구

100개정도로 학습을 진행했다.

 

 

1안: 잡기술사용 - [ A and B ]

두 가지 각기 다른 모델을 따로 학습해서 둘 모두에 대한 참거짓값으로 구분

둘 다 참이거나 둘다 거짓일 경우를 제한해 구분짓는 방법

 

은 좀 아닌거같다

or로 할 경우 둘 모두의 결과값들에 대해서 오류가 더블이 되버린다

and로 할 경우 결과값이 하나만 같지 않더라도 거짓이 되버리기 때문에

둘중 한 놈만 틀려도 그냥 거짓이 돼버린다

 

 

2안: 잡기술 사용 - [ A + B ]

모델을 예측하면 아래처럼 음수냐 양수냐 에 따라 신재냐 신재가 아니냐를 구분짓는다

그리고 값에 대한 결과값이 숫자로서 나오게 되는데

1번 모델
2번 모델

그러면,, 두 모델의 가중치 값을 합한다면,,??

이게 참 그럴싸 하긴한데,,

한 번 고려해봐야겠다

 

 

3안: Batch사이즈를 줄이고, 학습시간을 늘리기

100개 짜리 데이터를 가지구 학습을 하는데,

BATCH사이즈 128개로 설정해놓고 하니까 학습이 전혀 안되더라..

당연한 수순이긴 했는데,, 조금 섭섭한느낌

 

그래서 10개 정도로 진행하고 Epoch를 늘려서 학습을 진행했다.

 

이 과정을 참고했을 때

그냥 모델 하나를 길게길게 붙잡고 학습시켜보는거도 나쁘지않으면서

제일 정상적인 방법이지 않을까 싶다.

 

 

 

 

회사에서 데이터좀 더 갖구와야겠다

'머신러닝' 카테고리의 다른 글

생초보가 해보는 머신러닝일지-2(이미지 분류)  (0) 2020.05.28
Comments