본문 바로가기

개인 공부

4/26 화_웹 스크래핑, Average Precision, Detector, Object Detection 모델(R-CNN, YOLO)

728x90

1. 구분

- 웹 크롤링 : 웹페이지에서 주어진 링크들을 쭉 따라가며 허용된 범위 내에서 모든 내용을 긁어 오는 것
- 웹 스크래핑 : 웹페이지에서 내가 원하는 부분만을 긁어 오는 것
- 웹 파싱 : 웹페이지의 정보를 가져와서 가공하는 것

 

2. ChromeDriver, CVAT

- 웹 스크래핑에 ChromeDriver 사용 https://chromedriver.chromium.org/downloads

검색창

import urllib.request  # 웹 url을 파이썬이 인식할 수 있게하는 패키지
from bs4 import BeautifulSoup  # html에서 데이터 검색을 용이하게 하는 패키지
from selenium import webdriver  # 웹 애플리케이션의 테스트를 자동화하기 위한 프레임 워크
from selenium.webdriver.common.keys import Keys  # 손으로 클릭하는 것을 컴퓨터가 대신
import time  # 중간중간 sleep 을 걸어야 해서 time 모듈 import

# 스크롤링하게 하는 패키지
########################### url 받아오기 ###########################

# 웹브라우저로 크롬을 사용할거라서 크롬 드라이버를 다운받아 위의 위치에 둔다
# 팬텀 js로 하면 백그라운드로 실행할 수 있음
# binary = 'C:\chromedriver/chromedriver.exe'
binary = 'D:\chromedriver\chromedriver.exe'

# 브라우져를 인스턴스화
browser = webdriver.Chrome(binary)

# 구글의 이미지 검색 url 받아옴(아무것도 안 쳤을때의 url)
# browser.get("https://www.google.co.kr/imghp?hl=ko&tab=ri&ogbl")
browser.get("https://www.google.co.kr/imghp?hl=ko&ogbl")

# 구글의 이미지 검색에 해당하는 input 창의 id 가 '  ?  ' 임(검색창에 해당하는 html코드를 찾아서 elem 사용하도록 설정)
# input창 찾는 방법은 원노트에 있음

# elem = browser.find_elements_by_class_name('gLFyf gsfi')

elem = browser.find_element_by_xpath("//*[@class='gLFyf gsfi']")

########################### 검색어 입력 ###########################

# elem 이 input 창과 연결되어 스스로 안내견을 검색
# elem.send_keys("eyes closed face")
elem.send_keys("eyes open awake")

# 웹에서의 submit 은 엔터의 역할을 함
elem.submit()

########################### 반복할 횟수 ###########################


# 스크롤을 내리려면 브라우져 이미지 검색결과 부분(바디부분)에 마우스 클릭 한번 하고 End키를 눌러야함
for i in range(1, 3):
    browser.find_element_by_xpath("//body").send_keys(Keys.END)
    time.sleep(10)  # END 키 누르고 내려가는데 시간이 걸려서 sleep 해줌

time.sleep(10)  # 네트워크 느릴까봐 안정성 위해 sleep 해줌
html = browser.page_source  # 크롬브라우져에서 현재 불러온 소스 가져옴
soup = BeautifulSoup(html, "lxml")  # html 코드를 검색할 수 있도록 설정


########################### 그림파일 저장 ###########################


def fetch_list_url():
    params = []
    imgList = soup.find_all("img", class_="rg_i Q4LuWd")  # 구글 이미지 url 이 있는 img 태그의 _img 클래스에 가서
    for im in imgList:
        try:
            params.append(im["src"])  # params 리스트에 image url 을 담음
        except KeyError:
            params.append(im["data-src"])
    return params


# 이미지의 상세 url 의 값이 있는 src 가 없을 경우
# data-src 로 가져오시오 ~


def fetch_detail_url():
    params = fetch_list_url()
    print(params)
    for idx, p in enumerate(params, 1):
        # 다운받을 폴더경로 입력
        # urllib.request.urlretrieve(p, "C:/guide/" + str(idx) + ".jpg")
        # urllib.request.urlretrieve(p, "D:/pictures_db/" + str(idx) + ".jpg")
        # urllib.request.urlretrieve(p, "D:/pictures_db/eyes closed/" + str(idx) + ".jpg")
        urllib.request.urlretrieve(p, "D:/pictures_db/eyes open/" + str(idx) + ".jpg")


# enumerate 는 리스트의 모든 요소를 인덱스와 쌍으로 추출
# 하는 함수 . 숫자 1은 인덱스를 1부터 시작해라 ~

fetch_detail_url()

# 끝나면 브라우져 닫기
browser.quit()

- 이미지 라벨링에 CVAT 사용 https://cvat.org 또는 roboflow https://app.roboflow.com/

 

3. 복사할 수 없는 텍스트 긁어오기

해당 텍스트가 있는 페이지에서 F12(DevTools) → F1  Settings_Preferences_Debugger : ∨(체크) Disable JavaScript

 

4. 딥러닝 프레임워크 비교

 
장점
단점
텐서플로(TensorFlow)
텐서보드(TensorBoard)를 통해서 파라미터 변화 양상이나 DNN의 구조를 알 수 있음
메모리를 효율적으로 사용하지 못함
케라스(Keras)
배우기 쉽고 모델을 구축하기 쉬움
오류가 발생할 경우 케라스 자체의 문제인지 backend의 문제인지 알 수 없음
파이토치(Pytorch)
- 간단하고 직관적으로 학습 가능
- 속도 대비 빠른 최적화가 가능
- 텐서플로우에 비해 사용자층이 얕음
- 예제 및 자료를 구하기 힘듦

혼공러들의 스터디 공간

https://post.naver.com/viewer/postView.naver?volumeNo=32281950&memberNo=25379965&vType=VERTICAL 

 

5. AWS(EC2 GPU 인스턴스) GPU 사용을 위해 Linux GPU의 빌드 구성 확인(Tensorflow, Python, CUDA, cuDNN)

https://www.tensorflow.org/install/source?hl=ko#gpu_support_2 

 

멀캠 AWS EC2 인스턴스에서는 이미 CUDA와 cuDNN이 설치되어 있는 가상환경을 사용하면 됨

tensorflow2_latest_p37 : TensorFlow 2.4 with Python3.7 (CUDA + and Intel MKL-DNN)

 

- 설치되어있는 것들 버전 확인

pip list

 

6. Object Detection 모델의 성능평가 방법

- AP(Average Precision) : 인식 알고리즘의 성능을 하나의 값으로 표현한 것으로 precision-recall 곡선에서 그래프 선 아래쪽의 면적으로 계산된다. Average Precision이 높으면 높을수록 그 알고리즘의 성능이 전체적으로 우수하다는 걸 의미한다. 컴퓨터 비전 분야에서 물체인식 알고리즘의 성능은 대부분 Average Precision으로 평가한다.

- mAP(mean Average Precision) : 물체 클래스가 여러 개인 경우 각 클래스당 AP를 구한 다음에 그것을 모두 합한 다음 물체 클래스의 개수로 나눠줌으로 알고리즘의 성능을 평가한다.

 

7. Detector

 

 

8. Algorithms(Models) For Object Detection

Object Detection = 물체의 위치정보를 파악하는 Localization + 여러 가지 물체에 대한 Classification

AI 프로젝트에서 사용하려는 모델은 One-Stage Detector 중 YOLOV3(ver. 3), EfficientDet,

Two-Stage Detector 중 Faster R-CNN

Faster R-CNN 구조

Two-Stage Detector로 유명한 R-CNN 계열은 Region Proposal Network가 오브젝트가 있을 것 같은 후보(ROI, Region Of Interest, 관심 영역. 학습 과정에서 2,000개, 테스트 과정에서는 300개의 영역)를 먼저 뽑는다. 후보로 뽑힌 ROI(영상의 작은 부분) 들은 분류기(Classification network)에 의해 클래스 분류가 이뤄지고 경계 박스(Bound Box)를 찾는다.

 

One-Stage Detector로 유명한 YOLO는 실시간성을 확보하기 위해 Proposal의 수가 적은 grid(cheaper grids) 방식을 더욱 발전시켜서 사용했다. YOLO는 네트워크의 최종 출력단에서 경계 박스를 위치 찾기와 클래스 분류가 동시에 이뤄진다. 단 하나의 네트워크가 한 번에 특징도 추출하고, 경계 박스도 만들고, 클래스도 분류한다. 그러므로 간단하고 빠르다.

영상을 7x7의 그리드 셀로 분할하여 각 그리드 셀을 중심으로 하는 각종 크기의 오브젝트에 대해서 경계 박스 후보를 2개 예측한다. 총 7x7x2 = 98개의 후보를 제안하므로 이로 인해 성능이 떨어진다.

Proposal 2가지 방식 비교

YOLO, Object Detection Network https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=sogangori&logNo=220993971883&parentCategoryNo=6&categoryNo=&viewDate=&isShowPopularPosts=true&from=search

[HYU] One-Stage Detectors https://goodgodgd.github.io/ian-flow/archivers/hyu-detection-lecture3#5-efficientdet

[딥러닝] Object detection (2)(R-CNN / Fast R-CNN / Faster R-CNN 총정리) https://bigdaheta.tistory.com/60

 

9. layer들의 구성을 그림으로 표현해주는 keras.utils 패키지의 plot_model() 함수

from tensorflow import keras

keras.utils.plot_model(model, show_shapes=True)

 

10. AWS 서버 PyTorch GPU 사용여부 확인

import torch
 
print("쿠다 가능 :{}".format(torch.cuda.is_available()))
print("현재 디바이스 :{}".format(torch.cuda.current_device()))
print("디바이스 갯수 :{}".format(torch.cuda.device_count()))
 
for idx in range(0, torch.cuda.device_count()):
    print("디바이스 :{}".format(torch.cuda.device(idx)))
    print("디바이스 이름 :{}".format(torch.cuda.get_device_name(idx)))

 

11. 리눅스 배포판의 이름과 버전, 리눅스 커널 버전 확인

grep . /etc/*-release

 

12. MySQL 전체 용량 확인

SELECT SUM(data_length+index_length)/1024/1024 used_MB, SUM(data_free)/1024/1024 free_MB FROM information_schema.tables;
728x90