[컴비콜라] 가위바위보 로봇 한번 만들어 봤습니다(rock-paper-scissors bot)

안녕하세요. 컴비콜라의 심교훈입니다.

코로나로 인해 영상을 촬영할 장소와 시간을 찾기가 어렵네요.

갓난 아기가 집에 둘이라...ㅎㅎ

그래서 오늘 영상은 제 목소리 없이 촬영해보려고 합니다. 

 

 


혹시 예전에 이런 영상 보신 적 있으신가요?? 

가위 바위 보 로봇.


저도 한번 비슷하게 가위 바위 보 로봇을 만들어봤습니다. 

시연 영상 한 번 보실까요?

 


이 로봇 어떻게 만들었는지 궁금하신가요?

컴퓨터 비전에 대해서 어느 정도 선지식이 있는 분들은 대강 감이 오실 것이라 생각합니다만..


이 가위 바위 보 로봇을 어떻게 만드는지에 대해서 몇 개의 영상을 통해 자세히 알려드리도록 하겠습니다.

그 과정을 통해 여러분들은 다음과 같은 것들을 배우실 수 있을 것입니다.

1. 파이썬 코딩
2. 아나콘다 가상환경 설정
3. 이미지 데이터 수집
4. 텐서플로
5. 미리 훈련된 이미지 분류 모델 사용
6. 전이학습(transfer learning)
7. 딥러닝 모델 훈련시키기



아마 유익하실 것입니다. 그럼 저와 함께 가위바위보 로봇 만들어보실까요??

https://www.youtube.com/watch?v=fTBX4kxXbIA&t=39s

 

댓글()

[Anaconda+python] 훈련시킨 딥러닝 모델 저장하고 불러오기

컴퓨터비전/python|2020. 3. 20. 12:47

괜찮은 성능을 낼 수 있는 딥러닝 모델을 훈련시키는데는 적게는 몇시간, 많게는 몇일이 걸리기도 합니다. 공들여 힘들게 훈련시킨 모델을 저장할 수 있는 방법이 없다면, 절망스럽겠죠. 한 번의 작업수행을 위해 그 훈련의 과정을 계속 반복해야합니다. 하나의 이미지를 분류하는데 몇일을 소요해야합니다. 

 

인간은 저를 포함해서 꽤 어리석긴 하지만, 그렇게까지 어리석진 않습니다. 모델을 저장하고, 그 저장을 불러올 방법이 필요하다는 것을 인지했고 개발했습니다. 개발자는 필요를 인지하면, 기어코 개발하고야 말죠. 

 

딥러닝 모델은 기본적으로 여러 층으로 이뤄진 구조를 가지고 있고, 층마다 훈련시켜야할 가중치들을 가지고 있습니다. 딥러닝 모델을 훈련시킨다는 뜻은 수많은 데이터를 이용해서 이 가중치들이 최적의 값을 갖도록 해주는 것입니다.  

 

따라서, 딥러닝 모델을 저장하고 불러오는 것도 두가지 차원에서 생각해야 합니다. 구조(structure 또는 architecture)와 가중치(weights). 이 두 가지를 모두 저장해야 모델을 저장했다고 말할 수 있습니다.

 

저희는 오늘 이 구조와 가중치를 각각 어떻게 저장하고, 또 하나의 파일의 형태로 저장할 수 있는지에 대해 살펴볼 것입니다. 하나의 파일의 형태로 저장이 되어있어야 나중에 불러와서 사용할때도 좋겠죠? 

 

모델 구조는 두 가지의 형식으로 저장될 수 있습니다. 하나는 JSON이고 또다른 하나는 YAML입니다. 그리고 모델 가중치들은 HDF5 형식으로 저장됩니다. 낯선 형식들에 대한 이야기는 차치하고 어떻게 사용하는지에 집중해서 글을 이어가겠습니다. YAML보다는 JSON을 좀 더 많이 사용하는 것 같아 JSON의 형식으로 모델 구조를 저장하고, HDF5 형식으로 모델 가중치를 저장하는 예제 코드를 공유해드리겠습니다. 

 

저는 지금 여러분께서 어떠한 딥러닝 모델을 훈련시켰다고 가정하겠습니다. 그러면 마지막 부분에 다음과 같은 코드가 있겠죠?

 

이 코드는 각자의 상황에 따라 조금씩 다를 수 있습니다.^^ 

 

이런 상황에서 이제 이 훈련된 모델을 저장하는 코드는 다음과 같습니다. 

 

모델 저장하기!

 

다른 .py 파일에서 이 모델을 불러올 때는 다음과 같이 불러오면 됩니다. 

 

모델 불러오기!

 

어렵지 않죠? ㅎㅎ 제대로 불러와졌는지 확인해보는겸 model.summary()를 입력해봤습니다. 이 딥러닝 모델이 심교훈님의 모델이 맞습니까? 

 

 

네! 제가 훈련시킨 딥러닝 모델이 맞습니다!!

 

재밌게 읽으셨나요? ㅎㅎ 이 글은 여기서 마치도록 하겠습니다. 참고로 저도 한 줌의 지식만 갖고 있을 뿐입니다. 그것도 제가 관심있거나 제가 알아야하는 분야에 대해서 말이죠. 그 한 줌의 지식도 딥러닝 모델의 가중치가 업데이트되듯이 조정이 필요할 때가 많습니다. 그래서 항상 질문과 지적과 토론은 환영합니다. 댓글 남겨주세요.^^ 

 

 

<참고자료>

[1] https://machinelearningmastery.com/save-load-keras-deep-learning-models/, Jason Brownlee, "How to save and load your keras deep learning model"

댓글()

[Anaconda+python] 웹캠 영상 프레임 샘플링해서 저장하기(쉽게 이미지 데이터베이스 만들기)

컴퓨터비전/python|2020. 3. 19. 16:13

다음 파이썬 코드는 웹캠으로 촬영되는 영상의 프레임을 샘플링해서 이미지 파일로 저장해주는 코드입니다. 특정 대상에 대한 이미지 데이터베이스를 만들기 위해서 작성한 코드입니다. 모든 프레임을 저장하면 사실상 각 이미지간 차이가 거의 없기 때문에 4개 프레임마다 하나씩 저장하는 식으로 코딩했습니다. img1.jpg, img2.jpg, img3.jpg,...와 같은 이름의 이미지 파일이 images라는 이름의 하위 디렉토리에 저장됩니다. q키를 입력하면 영상 촬영이 종료되고, 이어서 프로그램도 종료됩니다. 

 

참고로 이 코드는 opencv-python 패키지에 의존합니다. 즉, opencv-python 패키지를 설치해주셔야 합니다. 

>> conda install opencv-python

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import cv2
 
# open webcam (웹캠 열기)
webcam = cv2.VideoCapture(0)
 
if not webcam.isOpened():
    print("Could not open webcam")
    exit()
    
 
sample_num = 0    
captured_num = 0
    
# loop through frames
while webcam.isOpened():
    
    # read frame from webcam 
    status, frame = webcam.read()
    sample_num = sample_num + 1
    
    if not status:
        break
 
    # display output
    cv2.imshow("captured frames", frame)
    
    if sample_num == 4:
        captured_num = captured_num + 1
        cv2.imwrite('./images/img'+str(captured_num)+'.jpg', frame)
        sample_num = 0
        
    
    # press "Q" to stop
    if cv2.waitKey(1& 0xFF == ord('q'):
        break
    
# release resources
webcam.release()
cv2.destroyAllWindows()   
cs

 

위 코드를 실행시키고 충분히 데이터가 수집될 때까지 웹캠으로 영상을 촬영했더니 다음과 같은 이미지 파일들이 생성되었습니다. 참고로 저는 가위, 바위, 보를 분류할 수 있는 분류기를 재미삼아 만들고 있기 때문에, 가위, 바위, 보에 대한 이미지들을 수집했습니다. 다른 이미지들을 얻기 위해 손을 이리저리 돌려가며 촬영했습니다. 

 

바위

 

가위

 

 

잠시만 촬영했는데도 수백장의 이미지가 수집되었네요. ㅎㅎ 아마 이 방법이 가장 빠르게 수백, 수천, 수만 장의 이미지를 수집하는 방법이 아닐까 싶습니다. 구글의 teachable machine이 딥러닝 모델을 훈련시키기 위해 필요한 이미지들을 이러한 방식으로 수집하더군요. ㅎㅎ  

 

언제나 질문과 지적에는 열려 있습니다. 댓글로 남겨주세요.^^

태그 : python, 웹캠, 코딩

댓글()

[python] 문자열과 숫자 입력 받기, input 함수

컴퓨터비전/python|2020. 3. 19. 10:44

 

문자열 입력 받기

사용자로부터 문자열을 입력받고 싶을 때는 input()이라는 함수를 사용합니다. 아래와 같이 a = input()과 같이 코딩하면, 입력받은 문자열을 변수 a에 대입시켜줍니다. 또한 b = input("질문")의 형식으로 코딩할 수도 있습니다. 사용자에게 무엇에 대해 입력해야할지 질문을 던질 수 있는 것이죠. 

 

 

숫자 입력 받기

이번에는 사용자로부터 숫자를 입력받아서 더해주는 예제 코드를 작성해보겠습니다. 역시 input() 함수를 사용할 것인데, 차이가 있다면 input()을 int()로 감싸서 정수형으로 변환해서 대입시킬 것입니다. 

 

 

input() 함수와 관련해서 다른 기능을 사용하게 된다면, 그때 다시 글을 업데이트하기로 하고 오늘은 짧게 글을 마치겠습니다. 

 

 

 

<참고자료>

[1] https://wikidocs.net/25, 점프 투 파이썬, "04-2 사용자 입력과 출력"

[2] https://ossian.tistory.com/62, ossians, "[Python] 데이터 입력 받기(Input)"

태그 : input(), python

댓글()

[Anaconda+python] 웹에서 이미지 수집하기, 이미지 크롤링

컴퓨터비전/python|2020. 3. 18. 23:00

딥러닝 모델을 훈련시키려면 기본적으로 데이터가 많이 필요합니다. 컴퓨터 비전을 위한 딥러닝 모델을 훈련시키려면, 자연스럽게 많은 이미지들이 필요하게 되죠. 만약에 강아지 이미지가 많이 필요하다면 구글이나 네이버와 같은 검색 엔진에서 강아지라고 입력해서 나오는 이미지들을 하나씩 다운로드하는 방식을 취할 수도 있지만, 이런식으로 하나씩 가져오려면 너무나 번거롭습니다.

 

만약에 1,000,000장의 이미지가 필요하다고 생각해볼까요? 손이 매우 빨라서 하나의 이미지를 저장하는데 1초가 걸린다고 해도, 1,000,000초가 걸립니다. 1,000,000초 = 약 16666분 = 약 277시간 = 약 11.5일 동안 이 짓을 해야한다니, 생각하기도 싫죠?ㅎㅎ 개발자들은 대개 이런 상황을 매우 싫어합니다. 그래서 애꿎은 컴퓨터에게 이렇게 말합니다. "사랑스러운 컴퓨터야, 이 작업은 너가 해줘. 너는 나와 달리 쉽게 싫증을 느끼지 않잖아. 너가 매우 잘할 수 있는 일이야. 내가 너가 알아들을 수 있는 말로 적절하게 명령해줄게." 그 후 이 번거로운 작업을 자동으로 해낼 수 있는 코드를 작성하기 시작하죠.

 

참고로 웹상에서 데이터를 수집하는 것을 크롤링(crawling)이라고 하고, 수집하고자 하는 데이터가 이미지라면 이미지 크롤링이라고 부릅니다.    

 

오늘은 네이버에서 강아지 사진들을 크롤링 해보는 예제를 다루도록 하겠습니다. 다음과 같이 네이버 이미지에서 강아지를 검색했을 때 나오는 사진들을 크롤링해보겠습니다. 

 

얘네들 어떻게 가져오지?

 

이를 위해 필요한 파이썬 코드는 다음과 같습니다. 이 코드는 또마님[1]께서 작성하신 것을 토대로 제가 저의 필요에 맞게 살짝 수정한 것입니다. 코드를 실행하시기 전에 크롤링과 관련된 패키지인 beautifulsoup를 미리 설치해주셔야합니다. 다음과 같이 명령해주면 됩니다.

 

>> pip install beautifulsoup4

 

코드에 대해 간략하게 설명드리겠습니다. '검색어'와 '크롤링할 이미지의 갯수'를 입력해주면 images라는 이름의 하위 디렉토리에 img1.jpg, img2.jpg, img3.jpg,... 등의 이름으로 이미지가 저장되는 코드입니다.

 

참고로 최대 50개의 이미지만 한번에 크롤링 가능합니다. 그 이유는 네이버에서 이미지를 검색했을 때 한 페이지에 50개의 이미지를 보여주기 때문입니다. 두번째 페이지, 세번째 페이지의 이미지들도 크롤링하고 싶은데 현재로선 방법을 잘 모르겠습니다. 만약 더 많은 강아지 이미지를 크롤링하려면 검색을 "개", "귀여운 강아지" 이런식으로 해서 크롤링하는 것도 하나의 방법이 될 것 같습니다.  

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from bs4 import BeautifulSoup as bs
from urllib.request import urlopen
from urllib.parse import quote_plus
 
baseUrl = 'https://search.naver.com/search.naver?where=image&sm=tab_jum&query='
plusUrl = input('검색어 입력: '
crawl_num = int(input('크롤링할 갯수 입력(최대 50개): '))
 
url = baseUrl + quote_plus(plusUrl) # 한글 검색 자동 변환
html = urlopen(url)
soup = bs(html, "html.parser")
img = soup.find_all(class_='_img')
 
= 1
for i in img:
    print(n)
    imgUrl = i['data-source']
    with urlopen(imgUrl) as f:
        with open('./images/img' + str(n)+'.jpg','wb') as h: # w - write b - binary
            img = f.read()
            h.write(img)
    n += 1
    if n > crawl_num:
        break
    
    
print('Image Crawling is done.')
cs

 

코드를 실행하면 검색어와 크롤링할 갯수에 대해 순차적으로 묻습니다. 그 물음에 대답해주셔야 합니다. 저는 강아지에 대한 이미지를 40장 크롤링할 것이기 때문에 다음과 같이 답했습니다.

 

 

필요에 맞게 대답하시면 이미지 크롤링을 시작합니다. 크롤링이 완료되면 Image Crawling is done! 이라는 문구를 띄워줍니다.  

 

 

자, images라는 하위 디렉토리 안에 강아지 이미지들이 잘 저장되었는지 확인해보겠습니다. 

 

크롤링 성공!

 

우리가 원하는 대로 40장의 강아지 사진이 크롤링된 것을 확인할 수 있습니다.

 

만약 이 강아지 사진들을 이미지 분류 모델의 훈련에 사용하려면 이 중에 적합하지 않은 이미지들은 지워줘야 합니다. 이건 수동으로 할 수 밖에 없습니다. 이것도 귀찮은 일이죠. 그래서 이미 필요한 이미지와 관련해서 괜찮은 데이터베이스가 있다면, 그것을 찾아서 사용하는 것이 최선입니다. 우리가 크롤링한 강아지의 경우는 이미 누군가 잘 만들어놓은 데이터베이스가 많이 있습니다. 그러나 물론 데이터베이스가 없는 것도 많겠죠. ㅎㅎ 그렇다면 이 포스팅에서 다룬 이미지 크롤링의 방법으로 수집하던가, 무료 이미지 사이트에서 이미지들을 수집하던가, 필요한 이미지들을 돈을 주고 사던가, 정 안되면 나가서 직접 촬영하던가 해야합니다. 크롤링은 때론 위험할 수 있는 것이 어떤 이미지들은 저작권 문제가 걸려있기 때문에 조심하셔야 합니다. 

 

오늘 포스팅은 여기서 마치도록 하겠습니다. 끝까지 읽어주셔서 감사합니다. 코딩과 관련된 글이기 때문에 파이썬 코드 꼭 한번 실행해보세요.^^ 

 

 

<참고자료>

[1] https://ultrakid.tistory.com/13, 브라보 마이라이프, 또마, "파이썬으로 네이버 이미지 크롤링하기 (Image Crawling)"

댓글()