진짜 하루종일 환경설정하느라 머리 터질뻔했는데 생각보다 매우 쉽고... 좋은 방법이 있었다.

아나콘다 접속

conda create --name tf python=3.9
conda activate tf

conda install -c conda-forge cudatoolkit=11.2 cudnn=8.1.0
pip install --upgrade pip
pip install "tensorflow-gpu<2.11"
pip install "tensorflow<2.11"

그리고 주피터 노트북도 혹시 모를 충돌이 있을 수 있으니 새로운 커널을 만들어서 실행하면 된다...

너무나 많은 삽질을 하고 깔고 지우고를 반복했다.

이제 그만... 진짜 이 쉬운 방법 알려준 분 감사합니다.

 

Reference:

https://stackoverflow.com/questions/74926403/how-to-set-up-tensorflow-gpu-on-windows-11

 

 

정말 간만에 글을 쓰게 되었다.
코딩을 딱히 하지 않고 싶었는데 막상 또 필요한 게 생기니 하고 싶어진다.

이번에 하고자 하는 프로젝트는 예술작품에 있는 나무나 사람, 별, 달 등을 구분해내도록 하는 것이다.
사진과 달리 미술작품은 작가마다 표현하는 스타일이 다르고, 사용하는 재료가 다르고, 정형화되지 않았기에(매우 불규칙하고) 딥러닝을 하는데에 적절하지 않다.
물론 시장성이 없기 때문에 잘 연구가 이루어지지 않는 것도 하나의 이유라고 볼 수 있다.
당장 Image Processing은 자율주행, 얼굴인식 잠금해제, 차량 번호판 인식 등 다양한 분야에서 활발하게 사용되고 있는 것만 보아도 알 수 있다.
데이터셋도 방대하고 성능도 매우 좋다. 나는 이런 주목 받지 않는 연구에도

시간을 할애할 여유;
논문을 발표하여 실적을 올릴 수 있는 동기;
시각장애인을 위한 연구라는 사명감;
국가에서 그런 연구를 하라고 주는 인건비, 장학금;

이 있어서 이같은 연구를 할 수 있게 되었으니 얼마나 행운인가!
아무튼 오늘 하루를 할애하여 공부한 것에 대해서 정리한다.

여러 방법들을 찾아보았지만 조코딩님이 정리한 내용이 가장 깔끔하고, 정확하고, 정보의 누락이 적어서(다른 데에서는 몇 가지 중요한 정보를 누락하고 뛰어넘어서 이해하기 어려운 부분이 많았다) 강의를 들으며 주석처리까지 해보았다.

총 세 가지의 코딩으로 나뉜다.

1. 구글 이미지에서 검색된 사진의 큰 이미지의 주소를 불러오는 것
2. 구글 이미지에서 검색된 최초 50개의 항목만을 다운로드
3. 구글 이미지에서 검색된 모든 내용을 다운로드

 

1. 구글 이미지에서 검색된 사진의 큰 이미지의 주소를 불러오는 것

 

기본적으로 이는 selenium을 사용한 것으로, 처음에 selenium을 깔아주어야 한다.
Jupyter를 사용했는데 jupyter notebook 내에서는 다운로드가 되지 않고 anaconda prompt에 들어가서 해주어야 한다.
(매우 기본적인 것일테지만 이것조차도 나는 시행착오를 겪었던 거라서 오랜 시간이 지나도 잊지 않기 위해...!)

pip install selenium

을 아래와 같이 입력해 넣으면 다운로드 및 설치가 진행된다.

 

이미 다운이 되어있으면 아래같이 뜬다.

크롤링이 그냥 자동화된 라이브러리를 사용해서 아주 간편하게 불러오는 것인줄 알았는데 생각보다 코딩스러운 작업들이 많이 이루어지는 것을 볼 수 있었다. 말 그대로 우리가 검색할 때 클릭하는 과정들을 쭉 코딩으로 정리한 것이었다.

크롬 브라우저를 켜는 것부터가 자동화의 단계에 속해 있다. 이를 위해서는 먼저 내가 사용하는 크롬의 버전을 알아야 한다.

크롬 브라우저 오른쪽 위 점 세 개를 눌러서 크롬 정보 확인
버전이 92인것을 확인

Chromedriver라고 검색하면 아래의 링크에 들어갈 수 있다.

https://chromedriver.chromium.org/downloads

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 93, please download ChromeDriver 93.0.4577.15 If you are using Chrome version 92, please download ChromeDriver 92.0.4515.43 If you are using Chrome version 91, please download ChromeDriver 91.0.4472.101 For

chromedriver.chromium.org

 

92 버전은 이것을 다운받으라고 설명

다운받아서 아래와 같이 드라이버의 위치를 지정하고 자동화된 시스템이 이를 켜도록 한다.
##예시 라고 되어있는 부분은 Selenium에 쓰여있는 예제활용코드이다. 이것들을 가져다가 쓴 것이다.

HTML에 대해서 전혀 모르더라도 할 수 있다.
F12 키를 누르면 다음과 같이 엄청난 양의 코드가 있다. 

그중 저 화살표 키를 누르고 사진을 누르면 사진이 지정된 코드의 위치가 뜬다. 여기에 따라서 확인해보면 아래에 설명되어있는 태그들이 보인다.

자세한 설명은 주석 참고. 참고로 아래 코드는 큰 사진의 URL을 불러오는 것까지만의 과정이다. 다음 과정부터가 크롤링이다. 참고로 크롬 드라이버의 경로는 복잡하게 할 것 없이 해당 파일을 클릭하고 아래와 같이 윈도우즈 왼쪽 위에 있는 경로 복사 버튼을 누르면 간편하게 활용이 가능하다. 그대로 dir_driver = 다음에 넣으면 된다.

#조코딩 이미지 웹크롤링 앞부분까지만
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request

dir_driver = "" # "" 안에 실제로 크롬 드라이버가 위치의 경로를 표현
driver = webdriver.Chrome(dir_driver)
driver.get("https://www.google.co.kr/imghp?hl=ko&authuser=0&ogbl")
elem = driver.find_element_by_name("q") # 검색창의 name 태그 이름이 q
elem.send_keys("car images") #키보드 입력값 보내기
elem.send_keys(Keys.RETURN) #엔터키 치도록 하는 것
driver.find_elements_by_css_selector(".rg_i.Q4LuWd")[0].click()
#find_ 이후에 element는 하나만, 여러 개는 elements 
#class는 css
#가장 첫 번째 요소를 가져와야 해서 [0]
#이렇게 되면 클릭이 되서 오른쪽에 큰 이미지 뜨게 됨
time.sleep(2) #이렇게 지연시켜주어야 너무 긴 URL이 뜨지 않는다.
driver.find_element_by_css_selector(".n3VNCb").get_attribute("src")
#src 가져오는 방법은 get_attribute
# urllib.request.urlretrieve(imgUrl, "test.jpg")
#다운받도록 하는 것


##예시
# assert "Python" in driver.title
# elem = driver.find_element_by_name("q")
# elem.clear()
# elem.send_keys("pycon")
# elem.send_keys(Keys.RETURN)
# assert "No results found." not in driver.page_source
# driver.close()

 

 

나는 당장은 많은 이미지를 활용할 계획이 없어서 아래의 내용까지만을 사용해 50개의 이미지를 다운받았다.
참고로 다운이 받아지는 경로는 주피터 노트북이 있는 그 파일 내에 있다.
나의 경우 User라는 폴더 안에 있는 내 계정 폴더에 들어가 있었다.

#조코딩 이미지 크롤링 by ChromeBrowser
#50개까지만 다운로드
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request

dir_driver = "" # "" 안에 실제로 크롬 드라이버가 위치의 경로를 표현
driver = webdriver.Chrome(dir_driver)
driver.get("https://www.google.co.kr/imghp?hl=ko&authuser=0&ogbl")
elem = driver.find_element_by_name("q") # 검색창의 name 태그 이름이 q
elem.send_keys("tree photos") #키보드 입력값 보내기
elem.send_keys(Keys.RETURN) #엔터키 치도록 하는 것
images = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")
count = 1
for image in images:
    image.click()
    #find_ 이후에 element는 하나만, 여러 개는 elements 
    #class는 css
    #가장 첫 번째 요소를 가져와야 해서 [0]
    #이렇게 되면 클릭이 되서 오른쪽에 큰 이미지 뜨게 됨
    time.sleep(2) #이렇게 지연시켜주어야 너무 긴 URL이 뜨지 않는다.
    imgUrl = driver.find_element_by_css_selector(".n3VNCb").get_attribute("src")
    #src 가져오는 방법은 get_attribute
    urllib.request.urlretrieve(imgUrl, "Tree" + str(count) + ".jpg")
    #다운받도록 하는 것
    count = count + 1


##예시
# assert "Python" in driver.title
# elem = driver.find_element_by_name("q")
# elem.clear()
# elem.send_keys("pycon")
# elem.send_keys(Keys.RETURN)
# assert "No results found." not in driver.page_source
# driver.close()

 

3. 구글 이미지에서 검색된 모든 내용을 다운로드

 

마지막 과정은 자동으로 스크롤해서 검색된 모든 이미지들을 뜨게 하고 그 내용들을 모두 저장한다.

#조코딩 이미지 크롤링 by ChromeBrowser
#50개까지만 다운로드
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request

dir_driver = "" # "" 안에 실제로 크롬 드라이버가 위치의 경로를 표현
driver = webdriver.Chrome(dir_driver)
driver.get("https://www.google.co.kr/imghp?hl=ko&authuser=0&ogbl")
elem = driver.find_element_by_name("q") # 검색창의 name 태그 이름이 q
elem.send_keys("tree photos") #키보드 입력값 보내기
elem.send_keys(Keys.RETURN) #엔터키 치도록 하는 것

SCROLL_PAUSE_SEC = 1

# 스크롤 높이 가져옴
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # 끝까지 스크롤 다운
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") #브라우저 끝까지 스크롤 내리기

    time.sleep(SCROLL_PAUSE_SEC) #1초간 로딩까지 기다린다.

    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height: 
        #두개가 같다는 건 같아서 이제 스크롤을 더 내릴 필요 없다는 것
        #??결과더보기를 조금만 하려면 for문을 다시 돌리면 되겠지??
        try:
            driver.find_element_by_css_selector(".mye4qd").click() #결과더보기 버튼 누르기
        except:
            break #결과 더보기를 더이상 누를 게 없으면 종료
    last_height = new_height

images = driver.find_elements_by_css_selector(".rg_i.Q4LuWd") #작은이미지들
count = 1
for image in images:
    try:
        image.click()
        #find_ 이후에 element는 하나만, 여러 개는 elements 
        #class는 css
        #가장 첫 번째 요소를 가져와야 해서 [0]
        #이렇게 되면 클릭이 되서 오른쪽에 큰 이미지 뜨게 됨
        time.sleep(2) #이렇게 지연시켜주어야 너무 긴 URL이 뜨지 않는다.
        imgUrl = driver.find_element_by_css_selector(".n3VNCb").get_attribute("src")
        #src 가져오는 방법은 get_attribute
        #class 이름인 ".n3VNCb" 로 할 경우 다른 데에 중복이 있어서 오류가 뜨기도 한다.
        #따라서 아랫줄과 같이 정확도를 위해서 copy full path를 사용하는 것도 방법이다.
        #/html/body/div[2]/c-wiz/div[3]/div[2]/div[3]/div/div/div[3]/div[2]/c-wiz/div/div[1]/div[1]/div[2]/div[1]/a/img
        #대신 그렇게 되면 아래와 같이 바꿔야 한다.
            #dir_xpath = "/html/body/div[2]/c-wiz/div[3]/div[2]/div[3]/div/div/div[3]/div[2]/c-wiz/div/div[1]/div[1]/div[2]/div[1]/a/img"
            #driver.find_element_by_xpath(dir_xpath).get_attribute("src")
        urllib.request.urlretrieve(imgUrl, "Tree" + str(count) + ".jpg")
        #다운받도록 하는 것
        count = count + 1
    except:
        pass # 여러번 돌리게 되면 오류가 발생하기도 한다. 그래서 오류나면 pass
driver.close() #모든 이미지를 다운받고나서는 창을 닫는다.


##예시
# assert "Python" in driver.title
# elem = driver.find_element_by_name("q")
# elem.clear()
# elem.send_keys("pycon")
# elem.send_keys(Keys.RETURN)
# assert "No results found." not in driver.page_source
# driver.close()

 

덕분에 딥러닝에 활용할 사진들을 대략 모았다.
Tree와 Car 사진을 학습한 인공지능이 새로 보여주는 사진을 얼마나 잘 맞출 것인지가 관건이다.

 

출처: https://www.youtube.com/watch?v=1b7pXC1-IbE 

 

모두에게 적용되는 것은 아니겠지만 적어도 나는 이거 하나 때문에 고생을 좀 많이 했다.

이상하게 안 되는 무언가들이 있었기 때문이다.

카카오톡 맞춤법 어플을 만들 때에도 이것 때문에 다른 방법들을 찾느라 고생을 참 많이 했는데 지금 보니 이게 문제였던 것같다.

바로 androidx로 모든 버전을 맞추는 것.

이번 어플리케이션 만들기에서도 똑같이 다른 사람이 한 코드를 가져왔는데 오류가 뜨길래 알아보니까 애초에 시작할 때부터 잘못된 거였다.

아래와 같이 Use legacy android.support libraries 를 체크해줘야 문제가 생기지 않는다.

나처럼 이 문제로 떠도는 또다른 안드로이드 스튜디오 초보자가 이 글로 빛을 보기를...

지난번에는 이미지를 여러 개의 그리드로 나누는 것을 해보았다.

이번에는 전체 그림을 모자이크 처리하여 색상을 단순화하고 각 부분의 RGB 값을 알 수 있도록 하는 것을 해보도록 하자. 포뇨아빠라는 블로그의 내용을 참고하여 연습했다.

아래와 같이 opencv를 다운받고 모자이크 처리할 이미지를 지정한다.

1
2
3
4
5
6
7
8
9
10
11
!pip install opencv-python #opencv를 우선 다운로드 받아야 한다.
 
import cv2
 
src = cv2.imread('/파일경로명'#모자이크 처리할 이미지
def mosaic(src, ratio=0.1):
    small = cv2.resize(src, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
    return cv2.resize(small, src.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)
 
dst_01 = mosaic(src)
cv2.imwrite('/파일경로명', dst_01), dst_01) #저장할 파일명
cs

이렇게 하니 다음과 같은 그림이 나온다.

나는 좀 더 단순화해야해서 아래와 같이 비율을 달리해봤다.

1
2
3
4
dst_005= mosaic(src, ratio=0.05)
cv2.imwrite('/파일경로명', dst_005), dst_005) #저장할 파일명
dst_002= mosaic(src, ratio=0.02)
cv2.imwrite('/파일경로명', dst_002), dst_002) #저장할 파일명
cs

0.05

0.02

훨씬 더 단순화되어가는 것을 볼 수 있다.

0.001

비율을 더 작게 하니 형태를 알아볼 수 없을 정도가 되었다.

크게 단순화된 것을 확인할 수 있었다.

다음으로는 위에서 0.001로 처리된 이미지의 픽셀 크기를 확인하고 RGB 값을 추출해내고 싶었다.

이건 PIL(Python Image Library)을 이용해서 처리할 수 있었다.

1
2
3
4
5
from PIL import Image
im = Image.open('/파일경로명.jpg''r'#픽셀 크기를 확인할 이미지
width, height = im.size
pixel_values = list(im.getdata())
im.size
cs

(740, 845) 이라는 결과가 나왔다.

즉 x픽셀이 740, y픽셀이 845라는 뜻이다.

원래는 아래 이미지가 왼쪽에 흰 선이 하나가 더 있었다. 그래서 색깔 그리드로 구분했을 때 가로축이 6칸, 세로축이 7칸이었다. 나는 가로축 4번째 세로축 6번째 궁금해서 각 픽셀을 그리드의 값으로 나눈 뒤에 어림잡아서 10정도를 값을 빼서 아래의 코드에 넣어봤다.

아래에 있는 순서는 x와 y가 역순으로 되어야 한다.

1
pixel_values[width*730+520#y와 x 순서
cs

결과는 (215, 159, 66)

이 값을 검색해보니 

이런 결과가 나왔다. 구글 참 좋다 ㅎㅎㅎ

내가 정확히 원했던 그 색깔이 나왔다.

다음 번에는 추출된 색깔을 RGB 값으로 실행 창에 나타나도록 해봐야겠다.

계속 찾아봤지만... 도대체 왜 없는지 모르겠다... 구글에 일일이 쳐보기도 번거로운데 방법을 어서 알아냈으면 좋겠다...

 
 

다이얼 성공출처다국어분류

 
시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 32825 18590 16829 57.302%

문제

상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다.

전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.

숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.

상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다.

할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 시간을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어는 2글자~15글자로 이루어져 있다.

출력

첫째 줄에 다이얼을 걸기 위해서 필요한 시간을 출력한다.

 

예제 입력 1

UNUCIC

예제 출력 1

36
 

출처

Contest > Croatian Open Competition in Informatics > COCI 2012/2013 > Contest #6 1번

알고리즘 분류

메모

 

메모 작성하기

1
2
3
4
5
6
7
8
9
10
dial = ['ABC''DEF''GHI''JKL''MNO''PQRS''TUV''WXYZ']
= input()
ret = 0
for j in range(len(a)):
    for i in dial:
        if a[j] in i:
            ret += dial.index(i)+3
            continue
print(ret)
 
cs

 

출처: j-remind.tistory.com/76

 

(파이썬) 백준 알고리즘 5622번 다이얼

문제 풀이 (Python) 1 2 3 4 5 6 7 8 dial = ['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ'] a = input() ret = 0 for j in range(len(a)):     for i in dial:      ..

j-remind.tistory.com

 

크로아티아 알파벳 성공출처다국어분류

문제

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

크로아티아 알파벳변경

č c=
ć c-
dz=
đ d-
lj lj
nj nj
š s=
ž z=

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

입력

첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.

단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.

출력

입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

 

예제 입력 1

ljes=njak

예제 출력 1

6

예제 입력 2

ddz=z=

예제 출력 2

3

예제 입력 3

nljj

예제 출력 3

3

예제 입력 4

c=c=

예제 출력 4

2

출처

Contest > Croatian Open Competition in Informatics > COCI 2008/2009 > Contest #5 1번

 

내가 풀이한 코딩...

그냥 재밌게 내가 생각하는 대로 하면서도 for를 썼어야 했나 하는 생각이 들었지만 그냥 이대로 썼다. 왜냐면 귀찮으니까 ㅎㅎ

1
2
3
4
5
6
7
8
txt = input() # 입력
cnt = txt.count('')-1 # 문자열 카운팅 후에 공백을 센 것이기에 1을 빼준다
= txt.count('nj')
= txt.count('lj')
= txt.count('dz=')
= txt.count('=')
= txt.count('-')
print(cnt - (a + b + c + d + e)) # dze의 경우는 하나를 더 빼서 수를 맞춰준다.
cs

다른 사람이 한 방식을 보니까 이걸 하나로 모아준 사람도 있었다.

내거보다 더 깔끔해졌다. 줄이 확실히 줄고 내가 쓰려던 for문까지도 잘 활용!

1
2
3
4
5
6
7
= ['c=''c-''dz=''d-''lj''nj''s=''z='
alpha = input() 
 
for t in a: 
    alpha = alpha.replace(t, '*'
 
print(len(alpha))​
cs

조금 귀찮음을 덜고 다른 시도도 해봐야겠다 ㅎㅎ

 

'코딩 > 백준코딩 파이썬' 카테고리의 다른 글

[5622]_다이얼_백준_파이썬(python)  (0) 2020.09.16
[1152]_단어개수_백준_파이썬(python)  (0) 2020.09.03
백준 코딩 시작!!  (0) 2020.09.03

 

위에는 저렇게 앱에 x 표시가 떠있고 아래 오류에는 빨갛게 글씨가 가득하다

Manifest merger failed : uses-sdk:minSdkVersion 15 cannot be smaller than version 16 declared in library [com.google.android.gms:play-services-ads:19.3.0]
Suggestion: use a compatible library with a minSdk of at most 15,
		or increase this project's minSdk version to at least 16,
		or use tools:overrideLibrary="com.google.android.gms.ads.impl" to force usage (may lead to runtime failures)

그러면 정말 하라는대로 저 Build Gradle 안에 있는 minSdkVersion을 16으로 설정해주고 Sync Now 를 해주면 깔끔하게 해결이 된다.

잘 실행되고 에뮬레이터도 돌아간다.

+ Recent posts