% python3
Python 3.8.19 (default, Mar 20 2024, 15:27:52)
[Clang 14.0.6 ] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>>
>>> tf.__version__
'2.13.0'
>>> tf.config.list_physical_devices('GPU')
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
>>>
(tf) admin@gpu-server:/usr/local/cuda$ python
Python 3.9.16 (main, Mar 8 2023, 14:00:05)
[GCC 11.2.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch_geometric
truck, bus같은 경우 인식 오류가 발생한듯 싶으나 대체로 잘 인식한 걸 확인할 수 있습니다.
Image Detection 사용하기 (2) 터미널 명령어를 파이썬 코드로 실행
import subprocess
# 이미지 파일의 경로
image_path = 'path/to/your/image.jpg'
# detect.py 스크립트를 파이썬으로 호출
result = subprocess.run(['python', 'yolov5/detect.py', '--source', image_path])
terminal 에서 실행한 명령어를 파이썬의 subprocess 패키지를 이용해 코드로 실행한 코드입니다.
Image Detection 사용하기 (3) 파이썬 코드로 실행
모델을 불러오고, 분석할 이미지 파일을 모델에 넣어준 뒤에 결과를 받는 코드입니다.
파이썬 코드로 실행하게 되면 결과에 대한 다양한 값들을 확인하고 응용할 수 있습니다.
import torch
from pathlib import Path
from yolov5 import detect
import os
from PIL import Image, ImageDraw
def vehicle_detection_yolov5(image_path):
model = torch.hub.load('ultralytics/yolov5:master', 'yolov5s')
# Inference
results = model(image_path)
# Results, change the flowing to: results.show()
results.show()
# results.save()
print(results.s)
return results
data_path = 'car_image'
image_files = [f for f in os.listdir(data_path) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.gif'))]
for image_file in image_files:
print(image_file)
results = vehicle_detection_yolov5(f'{data_path}/{image_file}')
print(results.s)
'car_image'라는 폴더 안에 있는 이미지파일들을 일괄적으로 분석할 수 있게 코드를 구현하였습니다.
하지만 일괄적으로 입력할 데이터 양도 많고 input tag에 값을 일일이 넣을 경우 사이트가 느려지거나 여러 값들을 일일이 넣어줘야하는 번거로운 상황이 있었다.
1. Python requests와 BeautifulSoup4 package 이용
데이터를 입력하고 submit할 때 호출하는 api와 payload(parameters)값들을 추출하였고 웹브라우저 상에서 테스트 시 정상적으로 작동하였지만 requests 패키지를 활용하여 api를 다루다보니 '세션'관련 문제가 발생하였다.
form-data에 id와 pw를 입력하여 post로 전송하였으나 이 역시 마찬가지 였으며, headers의 세팅 또한 웹브라우저 환경과 동일하게 하였으나 마찬가지 였다.
2. python selenium 활용
입력할 값들을 미리 변수에 넣어서 selenium으로 자동화를 하려하였으나, 관리하는 데이터의 값들과 사이트 폼이 달라서 사실상 의미없는 작업이었다.
3. 세션유지를 위한 문제해결 방법!
결론적으로 requests를 활용하여 api를 호출하는 방법이 가장 효과적이었기에, 세션 유지를 하고자 1 + 2 방법을 혼용하였다.
최초엔 selenium으로 해당사이트에 로그인을 한 뒤, session 값을 가져와서 requests로 제어하니 원하던 작업을 진행할 수 있었다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
driver = webdriver.Chrome(service= Service(ChromeDriverManager().install()))
url = "https://test.com"
driver.get(url)
time.sleep(5)
import requests
# 여기에서 로그인 작업을 수행
# 사용자명과 비밀번호 입력
username_element = driver.find_element(By.XPATH, '//*[@id="UserId"]') # 사용자명 입력 필드
password_element = driver.find_element(By.XPATH, '//*[@id="UserPassword"]') # 비밀번호 입력 필드
username_element.send_keys("id")
password_element.send_keys("password")
# 로그인 버튼 클릭
login_button = driver.find_element(By.XPATH, '//*[@id="myForm"]/button') # 로그인 버튼 선택
login_button.click()
# Selenium을 사용하여 페이지 이동 및 추가 작업 수행
# 이제 requests를 사용하여 세션을 유지하면서 추가 요청을 보낼 수 있음
session = requests.Session()
# 필요한 추가 요청 설정, 세션에 쿠키 등을 추가
# 예를 들어, session.cookies.update(driver.get_cookies())를 사용하여 브라우저 쿠키를 세션에 추가
# requests를 사용하여 추가 요청을 보내거나 데이터를 추출
response = session.get("https://test.com/example/list")
response.text
# Selenium에서 세션 쿠키 가져오기
selenium_cookies = driver.get_cookies()
# requests 세션 초기화
session = requests.Session()
# Selenium에서 가져온 세션 쿠키를 requests 세션에 추가
for cookie in selenium_cookies:
session.cookies.set(cookie['name'], cookie['value'])
# requests를 사용하여 추가 요청을 보냄
response = session.get("https://test.com/example/list")
# 요청을 보낼 URL
url = "https://test.com/api/sample"
# POST 요청에 사용할 데이터
data = {
.........
}
response = session.post(url, data=data)
핵심은 마지막 줄 처럼 'requests.post()'가 아닌 'session.post()'로 호출한다는 점!
유튜브 영상을 다운로드 받는 방법은 여러가지지만 써드파티 유틸리티를 다운받거나 사용하려니 번거로움이 있어서 파이썬으로 간단하게 구현해봤습니다.
유튜브 플레이리스트에 있는 영상도 한 번에 다운로드 할 수 있게 구현한 코드이니 주석 참고해주시고 궁금하신 점은 무엇이든 남겨주세요 ㅎ
프로그램 순서는 대략적으로 아래와 같습니다.
1. 다운로드 받을 유튜브 플레이리스트 URL을 리스트로 생성해줌
2. 유튜브 플레이리스트 제목을 이름으로 갖는 폴더를 생성함
3. 생성한 폴더 안에 유튜브 플레이리스트 안에 있는 모든 영상을 다운로드 해줌
from pytube import YouTube
from pytube import Playlist
import os
# 참고 1) 폴더 생성 : https://data-make.tistory.com/170
# '폴더명'을 매개변수로 받는 함수, 파라미터로 받은 폴더명과 같은 폴더가 없으면 폴더를 새로 생성해줌
def createFolder(directory):
try:
if not os.path.exists(directory):
os.makedirs(directory)
except OSError:
print ('Error: Creating directory. ' + directory)
# 참고 2) pytube 기본 사용법 : https://pytube.io/en/latest/user/playlist.html
# '플레이리스트 URL'을 매개변수로 받는 함수
def playlist_download(playlist_url):
# 플레이리스트 제목을 폴더명으로 사용하여 폴더를 생성할 것 -> 플레이리스트 이름 가져오기
p = Playlist(playlist_url)
############################################################################
# 참고) 아래 방법으로 간다하게 구현할 수 있으나 고해상도 영상을 다운받을 수 없음!!
# for video in p.videos:
# video.streams.first().download(DOWNLOAD_FOLDER)
############################################################################
print(p.title)
DOWNLOAD_FOLDER = p.title
# 플레이리스트 제목으로 폴더 생성
createFolder(DOWNLOAD_FOLDER)
# 플레이리스트 안의 각 영상마다 URL을 가져온 후 지정한한 경로에 다운로드를 해줌
for url in p.video_urls:
print(url)
yt = YouTube(url)
stream = yt.streams.get_highest_resolution()
stream.download(output_path=DOWNLOAD_FOLDER)
print(p.title + " 다운로드 완료\n")
if __name__ == "__main__":
# 다운로드 받을 플레이리스트 url을 리스트에 넣어줌
playlist_url = ['https://www.youtube.com/watch?v=~~~~~~',
'https://youtube.com/playlist?list=~~~~~~~~~~~',
'https://youtube.com/playlist?list=~~~~~~~',
'https://youtube.com/playlist?list=~~~~~~~~~',
'https://youtube.com/playlist?list=~~~~~~~~-',
'https://youtube.com/playlist?list=~~~~~~-5mWbx0zdG0betdeoL']
# 플레이리스트 url을 담고 있는 리스트를 반복문 안 에서 다운로드 함수 매개변수에 할당해주면서 실행
for i in playlist_url:
playlist_download(i)
추가로 단일 유튜브 영상을 받고 싶으시면 아래 처럼 간단하게 구현할 수 있습니다.
from pytube import YouTube
url = '유튜브 동영상 url (플레이리스트 url 아님!)'
DOWNLOAD_FOLDER = '다운로드 받을 폴더 경로' #빈값('')으로 두면 파이썬 소스파일이 있는 폴더에 다운로드 받습니다
yt = YouTube(url)
stream = yt.streams.get_highest_resolution()
stream.download(output_path=DOWNLOAD_FOLDER)