220513

HyeonKi Jo·2022년 5월 12일
0
post-thumbnail

Good Morning yall

5장, 구글 이미지 크롤링, Selenium

selenium

  • 셀레늄은 웹 애플리케이션 테스트를 위한 포터블 프레임워크이다.
  • pyautogui와 비슷하게 마우스를 컨트롤할 수 있지만,
    웹 브라우저에서만 가능한 것이 다른점이다.
  • selenium은 웹브라우저 자동화 작업 도구이다.

CSS

  • 웹 페이지는 크게 HTML과 CSS로 분류할 수 있다.
  • CSS의 선택자를 Beautiful Soup에서 사용하게 된다.
  • * : 모든 요소 선택
  • . : 클래스 선택자, 모든 클래스 요소 선택
  • # : ID 선택자, ID 요소 선택
  • [autoplay] : autoplay특성을 설정한 모든 요소 선택

결합자

  • A, B : A태그와 B태그 둘다
  • A B : A태그 안의 B태그 선택
  • A > B : A태그 안의 첫번째 B태그 선택
    • ul > li : ul태그 바로 아래 첫번째 li태그 선택

conda update

  • conda update --all : conda의 업데이트 하는법, 베이스에 설치되어있는 패키지들의 업데이트가 있는지 확인 및 업데이트
  • conda install -c conda-forge selenium : 셀레니움 설치
  • conda install -c conda-forge webdriver-manager : 웹드라이버 매니저 설치
  • 웹드라이버 매니저가 설치되어 있다.
  • 패키지지만 __init__.py에서 패키지처럼 사용할 수 있게 정의되어 있다.

웹 크롤링

# 셀레니움으로 크롬 웹브라우저 오픈
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
#
driver = webdriver.Chrome(ChromeDriverManager().install())
#
URL='https://www.google.co.kr/imghp'
driver.get(url=URL)
# 브라우저가 완전히 켜질때까지 대기 (최대 10초)
driver.implicitly_wait(time_to_wait=10)

  • CSS에서 요소를 찾을 것이다. sbtc아이디의 첫번째 div의 첫번 째 div클래스 a5bIc의 첫번째 인풋요소를 찾는다.
  • input태그가 유니크하기 때문에 위 경로에서 줄여서 아래 경로처럼 써도 똑같은 결과가 나온다.
  • html -> 오른쪽마우스 -> copy -> copy selector 에서 요소의 Path를 복사할 수 있다.
  • body태그를 찾고, 거기에서 반복문으로 page_down키를 60번 입력한다.
  • #islmp > div > div > div > div.gBPM8 > div.qvfT1 > div.YstHxe > input 위치는 input (결과더보기 버튼) 을 찾아서 또다시 Page_down키를 60번입력한다.
  • headless모드로, 웹 브라우저를 띄우지 않고 화면 띄움 없이 작업하면 더 빠르게 작업 할 수 있다.
  • 이미지의 src (url)을 links리스트에 추가한다.
  • css셀렉터에서 요소를 찾고, 그 요소에서 src요소의 정보를 link에 append한다.
  • deprecated Warning : 이제 곧 지원이 종료된다.
    • find_elements_by_css_selector 대신 다른 명령어를 쓰는 것이 좋을 것이다.
  • urllib.request.urlretrive명령어로 이미지를 다운받고, 저장한다.
  • 사진들이 잘 들어와있다.

23. 사진에서 얼굴만 찾아 모자이크 처리 (OpenCV)

  • 이미지, 영상처리를 위한 파이썬 모듈
  • conda install -c conda-forge opencv-python : opencv 설치
    • 안된다면 pip install opencv-contrib-python을 사용한다.

bagging VS boosting

bagging

  • 여러개의 모델을 돌려 결과를 병합하여 사용하는것

boosting

  • 하나의모델을 강화하는 것

stacking

  • 데이터를 part로 나누고 각각 다른 모델을 적용해 학습?
    • 겹겹이 쌓여있다 해서 stacking이다.

Cascading

  • 계단식 폭포를 뜻한다.
  • 단계적으로 영상의 feature를 찾는 알고리즘이다.
  • fase_cascade, eye_cascade로 얼굴과 눈을 찾을 것이다.
  • ff : np.fromfile은 이미지를 nparray로 바꿔주는 것 같다.
  • cv2.imdecode해서 nparray를 cv2의 읽기전용 데이터형태로 바꿔준다.
  • cv2.resize로 사이즈를 맞춰준다.
  • face_cascade로 얼굴을 감지해준다. 리턴값은 얼굴의 (x, y, w, h)값이다.
  • 방금전 웹 크롤링 프로그램에서 얼굴을 크롤링해서 데이터를 사용해 보았다.
  • 얼굴과 눈에 사각형이 생겼지만 입이 눈으로 인식되는 등, 성능이 좋지는 않다.
  • 얼굴과 눈의 (x,y,w,h)값이 주어지기 때문에 그 부분만 따로 작업을 진행할 수 있다.
  • 위 코드와 비슷하지만, 얼굴부분의 사이즈를 매우 작은 이미지로 만들고 다시 키우는 방법으로 모자이크를 생성한다.

24. 사진을 그림처럼 바꾸기

  • 위 코드와 비슷하다.
  • 이미지를 그림처럼 바꿀 수 있다.

  • GUI를 추가하여 조정할 수 있게 해준다.

25. 로또번호 시각화 하기

  • conda install -c conda-forge pandas : 판다스 설치
  • conda install -c conda-forge openpyxl : 엑셀파일을 읽을 수 있는 openpyxl 설치
  • 엑셀파일을 읽어왔다.
  • 0~1 인덱스를 제거했다. 컬럼정보가 컬럼이아니라 데이터처럼 들어가있기 때문에 지워주었다
  • 컬럼의 정보를 다시 정해주었다.

matplotlib으로 그리기


  • 아래와 같이 회차별 당첨 금액이 그래프로 잘 그려졌다.
  • 가장 많이 나온 숫자도 살펴볼 수 있다.

2. 전국의 대학교 위치 시각화하기

  • 전국의 대학교 위치를 DataFrame으로 만들어서, 컬럼별로 출력해봤다.
  • df 컬럼별로 보기 (Series로 출력됨)
  • 인덱스로 검색해서 보기
  • 둘다써서 인덱스로 검색해서 컬럼정보만 보기
  • .iloc로 슬라이싱 할 수 있다. 또, 이때는 Dataframe형태로 나온다.
  • array형으로 데이터만 꺼내 올 수 있다.

지역이름으로 위도, 경도 알아보기

  • 미리 url과 url에 함께보낼 데이터들을 정의하고, primary_key도 넣어서 API를 사용해보았다. 현재 key에러인지 x값, y값이 0으로 나온다.
  • 지도에 위도와 경도를 넣어서 마커를 넣는다.

지도그리기

  • conda install -c conda-forge folium : folium 설치

28. 플라스크 웹서버 만들기

  • 파이썬에 웹서버를 구동시킬 수 있도록 하는 대표적인 어플리케이션
    • Django
      • RDBM과 상호작용을 완전히 지원하는 기본 내장 ORM (Object-relative mapping)과 함께 제공
        • Object : 프로그램
        • relative : 데이터베이스
        • 프로그램과 데이터베이스간 상호작용을 완전히 지원하는 mapping이 잘되어있다
      • 이 ORM은 마이그레이션 생성 및 관리도 지원.
      • 내장 된 유효성 검사를 사용하여 데이터베이스 모델을 만드는 것이 상대적으로 더 쳔안함
      • 유지보수하기 편함
    • Flask
      - 매우 가볍고 심플한 Framework를 지향하는 것이 특징 (Micro framework)
      - Flask는 기본 기능 제공에 다양한 확장 모듈을 이용할 수 있다.
  • 기본 flask의 형태라고 볼 수 있다.
  • @는 파이썬의 데코레이터이다. 작성할때는 def hello만 사용할 것 같지만, @app.route가 def hello를 감싸 더 내용을 추가해준다. (프레임워크 같이?)

패키지

  • greeting.py를 만들어서 패키지로 불러와본다.

Flask

  • 기본적인 flask를 실행해본다.
  • 서버는 작동하지만 접속이 안된다....
  • localhost/map으로 접속하면 지도가 나올 것이다.

30. 가상화폐 금액표시 GUI프로그램 만들기

  • tkinter라는 모듈을 사용한다.
  • PYQT랑 비슷한 모듈이지만 tkinter가 더 촌스럽다고 한다...
  • GUI를 꾸며주는 모듈이다.
  • 위 코드 실행 결과.
  • 폰트를 바꿀 수 있따.
  • window.mainloop()는 window창이 떠있을 때, 무한루프로 유지시켜주는 것이다.
  • window.pack()은 내부 요소의 위치를 지정해줄 수 있는 것 같다.

  • 함수 외부의 변수 cnt를 1씩 증가시켜 출력해준다.
  • 함수 외부의 변수 cnt를 글로벌로 만들어 줘야 내부 함수에서 똑같이 사용할 수 있다.
  • 내부 로컬 변수에 글로벌 변수 값을 받아서 출력해주는 방식이다.
  • 글로벌 변수 cnt는 이후, 가상화폐 가격정보가 될 것이다.
  • window.after(1000, get_coin_1sec) : 1000 밀리초 = 1초, 마다 get_coin_1sec를 실행한다.

33. 계산기 만들기(PYQT)

  • 터미널에 designer 입력
  • PYQT는 GUI를 쉽게 만들 수 있게 이런 도구를 지원한다.
  • 계산기 GUI를 만들어준다. 먼저 Layout을 vertical로 만들어준다.

    input output이 되는 곳을 넣어준다.

이미 정의되어 있는 파일을 사용해보자

import sys 
from PyQt5.QtWidgets import *
from PyQt5 import uic

ui_path = r"33. 계산기 만들기(PYQT)\계산기.ui"
form_class = uic.loadUiType(ui_path)[0] 

class WindowClass(QMainWindow, form_class) : 
   def __init__(self) :
       super().__init__()
       self.setupUi(self)

       self.btn_C.clicked.connect(self.btn_clicked)
       self.btn_number0.clicked.connect(self.btn_clicked)
       self.btn_number1.clicked.connect(self.btn_clicked)
       self.btn_number2.clicked.connect(self.btn_clicked)
       self.btn_number3.clicked.connect(self.btn_clicked)
       self.btn_number4.clicked.connect(self.btn_clicked)
       self.btn_number5.clicked.connect(self.btn_clicked)
       self.btn_number6.clicked.connect(self.btn_clicked)
       self.btn_number7.clicked.connect(self.btn_clicked)
       self.btn_number8.clicked.connect(self.btn_clicked)
       self.btn_number9.clicked.connect(self.btn_clicked)
       self.btn_result.clicked.connect(self.btn_clicked)
       self.btn_minus.clicked.connect(self.btn_clicked)
       self.btn_add.clicked.connect(self.btn_clicked)
       self.btn_multipy.clicked.connect(self.btn_clicked)
       self.btn_divide.clicked.connect(self.btn_clicked)

       self.le_view.setEnabled(False)
       
       self.text_value = ""
       
   def btn_clicked(self):
       btn_value = self.sender().text()
       if btn_value == 'C':
           print("clear")
           self.le_view.setText("0")
           self.text_value = ""
       elif btn_value == '=':
           print("=")
           try:
               resultValue = eval(self.text_value.lstrip("0")) 
               self.le_view.setText(str(resultValue))
           except:
               self.le_view.setText("error")
       else:
           if btn_value == 'X':
               btn_value = '*'
           self.text_value = self.text_value + btn_value
           print(self.text_value)
           self.le_view.setText(self.text_value)


if __name__ == "__main__" :
   app = QApplication(sys.argv) 
   myWindow = WindowClass() 
   myWindow.show() 
   app.exec_()
  • class는 버튼 클릭과 같은 이벤트를 정의하는 것이다. PyQt에서 자동으로 생성해주는 것도 있다.
  • 모듈 설치에 이슈가 있어 넘어간다.

37. 인공지능 사과와 오렌지 구분하기

tensorflow

  • keras가 지원하는 백엔드중 하나였지만, 현재는 tensorflow에 keras가 편입되었다.

keras

  • 현재 keras는 TensorFlow, Theano, CNTK의 세가지 백엔드를 지원한다.
  • Theano는 현재 개발이 종료되었다.
  • CNTK는 Microsoft가 지원하는 오픈소스 딥러닝 툴킷이다.

pytorch

  • 오픈소스 머신러닝 프레임워크이다. 연구에서부터 상품화까지 지원한다.

TeachableMachine

https://teachablemachine.withgoogle.com/

  • google과 함께하는 간단한 머신러닝 모델을 만들 수 있는 웹 사이트이다.
  • 이미지, 오디오, 포즈등 다양한 프로젝트를 지원한다.
  • 임베디드용 이미지도 지원하는 듯 하다.
  • 여기서 데이터와 feature를 추가할 수 있다.
  • 모델이 완성되면 이렇게 나온다.
  • 완성된 모델을 사용하여 사과와 오렌지를 분류해본다.
  • normalized_image_array : SVM등 여러 모델들은 입력받는 데이터의 스케일에 민감하다. 각 컬럼의 값(Feature)들의 범위가 들쭉날쭉하면 학습에 영향을 많이 끼치게 된다. 그래서 모든 값이 비슷비슷한 범위에 있도록 하기위해 정규화, 표준화 시킨다.

39. 삼성전자의 주식 예측하기

시계열 데이터

  • 순서가 중요한 데이터는 시계열데이터라고 하는데, RNN 모델이 유효하다.
  • from keras.models import Sequential로 시계열 데이터 모델 툴을 불러온다.
  • from keras.layers import LSTM, Dense를 불러온다. LSTM이 시계열데이터 학습에 유효한 학습방법일 것이다.

데이터 불러오기


트레이닝, 테스트 데이터 분리

모델 빌드

모델 학습

모델 검증

  • 파랑색은 실제 주가를 뜻하고, 노란색이 예측한 주가이다. 조금 다르지만 이정도면 매우 정확하다고 할 수 있다.
profile
Talking Potato

0개의 댓글