개발/머신러닝

[간단하게 바로 실습]해보는 '닮은 꼴 찾기' 파이썬 AI 만들기!

glennnnn 2023. 2. 12. 21:54
반응형

요즘 ChatGPT로 다시금 인공지능, 머신러닝, AI가 급부상 하고 있는 것 같습니다.

점점 삶의 한 부분으로 인공지능이 들어오고 있는 것 같은데요! 인공지능이 그렇게 어려운 일은 아니라는 것, 그리고 개발에 대해 조금이라도 관심이 있으신분들은 바로 실습해볼 수 있다는 것이라는 걸 같이 한번 배워보고자 [간단하게 바로 실습] 해보는 시리즈를 만들어 봤습니다.

 

그 첫번째로 준비된 데이터들이 있다면, 그 안에서 닮은 꼴을 찾아주는 간단한 서비스 코드를 만들어보려고 합니다.

바로 따라해보시죠!

 

** 아직 컴퓨터에 파이썬 세팅이 안되신분들은 이전 글을 참고해주세요!

https://glenn90.tistory.com/32

 

import pandas as pd
from sklearn.neighbors import NearestNeighbors

# Load the data into a pandas DataFrame
data = pd.read_csv("data.csv")

# Define the features to use for the look-alike service
features = ["age", "gender", "interests", "purchasing_behavior"]

# Train a NearestNeighbors model using the defined features
model = NearestNeighbors(n_neighbors=10, algorithm='ball_tree')
model.fit(data[features])

# Define a function to find the nearest neighbors of a given user
def find_neighbors(user):
    user_features = [user[feature] for feature in features]
    distances, indices = model.kneighbors([user_features])
    return data.iloc[indices[0]]

# Use the function to find the nearest neighbors of a given user
user = {"age": 30, "gender": "female", "interests": ["sports", "fashion"], "purchasing_behavior": "high"}
neighbors = find_neighbors(user)

# Do something with the nearest neighbors, such as printing them
print(neighbors)

 

이 예에서는 sklearn 라이브러리의 Nearest Neighbors 클래스를 사용하여 주어진 사용자의 가장 가까운 이웃을 찾을 수 있는 모델을 훈련합니다. 우리는 데이터에 대한 모델을 훈련하기 위해 적합 방법을 사용하고 주어진 사용자의 가장 가까운 이웃을 찾기 위해 무릎을 꿇는 방법을 사용합니다. 데이터는 팬더 데이터 프레임에 저장되며 유사한 서비스에 사용되는 기능은 열 이름 목록으로 정의됩니다. find_neighbors 함수는 사용자를 입력으로 사용하고 데이터에서 해당 사용자의 가장 가까운 이웃을 반환합니다.

 

 

그러면 data = pd.read_csv("data.csv") 여기에 입력해야 하는 csv 파일의 형식은 어떻게 생긴건가요?

 

데이터 = pd.read_csv("data.csv")에 입력해야 하는 CSV 파일의 형식은 룩업 서비스에 사용할 기능에 따라 달라집니다.

예를 들어 다음과 같은 기능이 있는 경우입니다:

 

  • age
  • gender
  • interests
  • purchasing_behavior

그런 다음 CSV 파일에는 이러한 각 기능에 대한 열과 데이터의 각 사용자에 대한 행이 하나씩 있어야 합니다. 다음은 CSV 파일의 예입니다:

 

관심 및 구매_행동 열의 정확한 형식은 데이터에서 이러한 특징을 표현하는 방법에 따라 달라질 수 있습니다. 예를 들어, 관심 열에는 쉼표로 구분된 관심 목록이 포함되거나 각 관심 항목이 데이터에서 별도의 열로 표시될 수 있습니다. purching_behavior 열에는 "low", "medium" 또는 "high"와 같은 문자열 값이 포함되거나 숫자 값이 포함될 수 있습니다.

 

 

하지만 우리는 사람의 얼굴 이미지에서 닮은 점을 찾고 싶습니다. 이 경우, 위에서 공부한 코드를 어떻게 발전시키면 가능할까요?

 

import numpy as np
import cv2
import os
from sklearn.neighbors import NearestNeighbors

# Load the images into a list of numpy arrays
images = []
for filename in os.listdir("faces"):
    image = cv2.imread(os.path.join("faces", filename))
    image = cv2.resize(image, (224, 224))
    image = image.flatten()
    images.append(image)

# Convert the list of images to a numpy array
images = np.array(images)

# Train a NearestNeighbors model using the images
model = NearestNeighbors(n_neighbors=10, algorithm='ball_tree')
model.fit(images)

# Define a function to find the nearest neighbors of a given image
def find_neighbors(image):
    distances, indices = model.kneighbors([image.flatten()])
    return images[indices[0]]

# Use the function to find the nearest neighbors of a given image
image = cv2.imread("face.jpg")
image = cv2.resize(image, (224, 224))
neighbors = find_neighbors(image)

# Do something with the nearest neighbors, such as displaying them
for i, neighbor in enumerate(neighbors):
    cv2.imshow(f"Neighbor {i}", neighbor.reshape(224, 224, 3))
    cv2.waitKey(0)

 

이 예에서는 sklearn 라이브러리의 Nearest Neighbors 클래스를 사용하여 주어진 이미지의 가장 가까운 이웃을 찾을 수 있는 모델을 훈련합니다. 우리는 이미지에 대한 모델을 훈련하기 위해 적합 방법을 사용하고 주어진 이미지의 가장 가까운 이웃을 찾기 위해 무릎을 꿇는 방법을 사용합니다. 영상은 numpy 배열 목록으로 저장되며 cv2 라이브러리를 사용하여 디렉토리에서 로드됩니다. find_neighbors 함수는 이미지를 입력으로 사용하고 데이터에서 해당 이미지의 가장 가까운 이웃을 반환합니다. 그런 다음 cv2 라이브러리를 사용하여 가장 가까운 이웃이 표시됩니다.

 

 

for filename in os.listdir("faces"): image = cv2.imread(os.path.join("faces", filename)) 

 

이부분은 어떻게 데이터를 불러오고 준비하는 걸까요?
예를 들어 이미지 URL을 엑셀 파일 형식으로 해야 합니까? 또는 폴더에 이미지 파일이 있어야 합니까?

 

예제 코드에서 이미지는 Excel 파일이 아닌 이미지 파일이 들어 있는 디렉토리에서 로드됩니다.

for filename in os.listdir("faces"):
    image = cv2.imread(os.path.join("faces", filename))



여기서 os.listdir("faces")는 "faces" 디렉토리에 있는 파일 이름 목록을 반환합니다. 각 파일 이름에 대해 코드는 cv2.imread() 및 os.path.join("faces", filename)을 사용하여 해당 이미지를 읽어 이미지 파일의 전체 경로를 만듭니다.

Excel 파일에 이미지 URL이 있는 경우 먼저 Excel 파일을 읽은 다음 URL을 사용하여 다음과 같은 이미지를 다운로드할 수 있습니다:

 

import pandas as pd
import requests

# Read the Excel file containing the image URLs
df = pd.read_excel("image_urls.xlsx")

# Loop through the URLs and download the images
images = []
for i, row in df.iterrows():
    response = requests.get(row["url"])
    image = cv2.imdecode(np.frombuffer(response.content, np.uint8), cv2.IMREAD_UNCHANGED)
    images.append(image)

# Convert the list of images to a numpy array
images = np.array(images)



이 예에서 코드는 팬더 라이브러리를 사용하여 Excel 파일 "image_urls.xlsx"를 데이터 프레임으로 읽습니다. 그런 다음 데이터 프레임의 URL을 루프하여 요청 라이브러리를 사용하여 이미지를 다운로드하고 목록에 저장합니다. 마지막으로, 코드는 이미지 목록을 널찍한 배열로 변환합니다.

 

 

웹 사이트에서 다운로드하거나 유명인 사진에 액세스할 수 있는 API를 사용하여 인터넷에서 많은 유명인 사진을 쉽게 찾을 수 있습니다. 예를 들어 다음 웹 사이트는 무료 퍼블릭 도메인 이미지를 제공합니다:

스플래시를 해제합니다(https://unsplash.com/)
Pexels (https://www.pexels.com/)입니다
픽사베이(https://pixabay.com/))입니다
이러한 웹 사이트에는 테스트 목적으로 사용할 수 있는 많은 이미지 컬렉션이 있습니다.

 

 

** 아직 컴퓨터에 파이썬 세팅이 안되신분들은 이전 글을 참고해주세요!

https://glenn90.tistory.com/32

 

반응형