VOC ํ์ ์์ยถ
ไธญๆ | ํ๊ตญ์ด | ๆฅๆฌ่ช | ะ ัััะบะธะน | Deutsch | Franรงais | Espaรฑol | Portuguรชs | Tรผrkรงe | Tiแบฟng Viแปt | ุงูุนุฑุจูุฉ
Ultralytics Explorer API ๋ ธํธ๋ถ์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค! ์ด ๋ ธํธ๋ถ์ ์๋งจํฑ ๊ฒ์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ํ์ํ๋ ๋ฐ ๋์์ด ๋๋ ๋ค์ํ ๋ฆฌ์์ค( Ultralytics )๋ฅผ ํ์ํ๋ ์์์ ์ญํ ์ ํฉ๋๋ค. ๋ฒกํฐ ๊ฒ์์ด๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด ํน์ ์ ํ์ ๋ ์ด๋ธ์ ์กฐ์ฌํ ์ ์๋ ์ ํธ๋ฆฌํฐ๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ๋ ธํธ๋ถ์ ๋ฆฌ์์ค๊ฐ Ultralytics ์ ์ต๋ํ ํ์ฉํ๋ ๋ฐ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์์ธํ ๋ด์ฉ์ ํ์๊ธฐ ๋ฌธ์๋ฅผ ์ฐพ์๋ณด๊ณ , GitHub์ ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ์ฌ ์ง์์ ์์ฒญํ๊ณ , Discord ์ปค๋ฎค๋ํฐ์ ์ฐธ์ฌํ์ฌ ์ง๋ฌธ๊ณผ ํ ๋ก ์ ๋๋์ธ์!
์๋ yolo explorer
Exlorer API ๊ธฐ๋ฐ
๊ฐ๋จํ๊ฒ pip install ultralytics
๋ฅผ ํด๋ฆญํ๊ณ yolo explorer
๋ฅผ ํฐ๋ฏธ๋์ ์ถ๊ฐํ์ฌ ๋ธ๋ผ์ฐ์ ๋ด์์ ๋ฐ๋ก ๋ฐ์ดํฐ ์ธํธ์ ๋ํ ์ฌ์ฉ์ ์ง์ ์ฟผ๋ฆฌ์ ์๋งจํฑ ๊ฒ์์ ์คํํ์ธ์!
%pip install ultralytics[explorer] openai
import ultralytics
ultralytics.checks()
์์ ultralytics import ํ์๊ธฐ
์ ์ฌ ๊ฒ์ยถ
๋ฒกํฐ ์ ์ฌ๋ ๊ฒ์์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์๋ฒ ๋ฉ ๊ณต๊ฐ์์์ ๊ฑฐ๋ฆฌ์ ํจ๊ป ๋ฐ์ดํฐ ์ธํธ์์ ์ ์ฌํ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ์ฃผ์ด์ง ๋ฐ์ดํฐ ์ธํธ-๋ชจ๋ธ ์์ ๋ํ ์๋ฒ ๋ฉ ํ ์ด๋ธ์ ์์ฑํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ด ํ ์ด๋ธ์ ํ ๋ฒ๋ง ํ์ํ๋ฉฐ ์๋์ผ๋ก ์ฌ์ฌ์ฉ๋ฉ๋๋ค.
exp = ํ์๊ธฐ("VOC.yaml", model="yolov8n.pt")
exp.create_embeddings_table()
์๋ฒ ๋ฉ ํ ์ด๋ธ์ด ๊ตฌ์ถ๋๋ฉด ๋ค์ ์ค ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์๋งจํฑ ๊ฒ์์ ์คํํ ์ ์์ต๋๋ค:
- ๋ฐ์ดํฐ ์ธํธ์ ์ฃผ์ด์ง ์ธ๋ฑ์ค/์ธ๋ฑ์ค ๋ชฉ๋ก์์ ๋ค์๊ณผ ๊ฐ์ด -.
exp.get_similar(idx=[1,10], limit=10)
- ๋ฐ์ดํฐ ์ธํธ์ ์๋ ๋ชจ๋ ์ด๋ฏธ์ง/์ด๋ฏธ์ง ๋ชฉ๋ก - -
exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10)
์ฌ๋ฌ ๊ฐ์ ์ ๋ ฅ์ด ์๋ ๊ฒฝ์ฐ ์๋ฒ ๋ฉ๋ ํญ๋ชฉ์ ์ง๊ณ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
ํ๋ค ๋ฐ์ดํฐ ํ๋ ์์ด ํฌํจ๋ limit
์๋ฒ ๋ฉ ๊ณต๊ฐ์์์ ๊ฑฐ๋ฆฌ์ ํจ๊ป ์
๋ ฅ๊ณผ ๊ฐ์ฅ ์ ์ฌํ ๋ฐ์ดํฐ ํฌ์ธํธ์ ์์
๋๋ค. ์ด ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐ ํํฐ๋ง์ ์ํํ ์ ์์ต๋๋ค.
์ ์ฌ = exp.get_similar(idx=1, limit=10)
์ ์ฌ.head()
์ ์ฌํ ์ํ์ ์ง์ ํ๋กฏํ ์๋ ์์ต๋๋ค. plot_similar
ํ์ฉ
exp.plot_similar(idx=6500, limit=20)
# exp.plot_similar(idx=[100,101], limit=10) # Can also pass list of idxs or imgs
exp.plot_similar(
img="https://ultralytics.com/images/bus.jpg", limit=10, labels=False
) # Can also pass any external images
2. AI์๊ฒ ์ง๋ฌธ: ์์ฐ์ด๋ก ๊ฒ์ ๋๋ ํํฐ๋งํ๊ธฐยถ 2.
ํ์๊ธฐ ๊ฐ์ฒด์ ๋ณด๊ณ ์ถ์ ๋ฐ์ดํฐ ํฌ์ธํธ์ ์ข ๋ฅ๋ฅผ ์ ๋ ฅํ๋ฉด ํด๋น ๋ฐ์ดํฐ ํฌ์ธํธ๊ฐ ํฌํจ๋ ๋ฐ์ดํฐ ํ๋ ์์ ๋ฐํํ๋ ค๊ณ ์๋ํฉ๋๋ค. LLM์ ์ํด ๊ตฌ๋๋๊ธฐ ๋๋ฌธ์ ํญ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐํ๋๋ ๊ฒ์ ์๋๋๋ค. ์ด ๊ฒฝ์ฐ ์์์ด ๋ฐํ๋ฉ๋๋ค.
df = exp.ask_ai("2๋ช
์ด์์ ์ฌ๋์ด ์๋ 10๊ฐ ์ด์์ ๊ฐ์ฒด๊ฐ ํฌํจ๋ ์ด๋ฏธ์ง ๋ณด์ฌ์ค")
df.head(5)
๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๊ฒฐ๊ณผ๋ฅผ ํ๋กํ
ํ ์ ์์ต๋๋ค. plot_query_result
ํ์ฉ
์์:
plt = plot_query_result(exp.ask_ai("show me 10 images containing exactly 2 persons"))
Image.fromarray(plt)
# plot
from PIL import Image
from ultralytics.data.explorer import plot_query_result
plt = plot_query_result(exp.ask_ai("show me 10 images containing exactly 2 persons"))
Image.fromarray(plt)
3. ๋ฐ์ดํฐ์งํฉ์์ SQL ์ฟผ๋ฆฌ ์คํํ๊ธฐ!
๋ฐ์ดํฐ ์งํฉ์์ ํน์ ์ ํ์ ํญ๋ชฉ์ ์กฐ์ฌํ๊ณ ์ถ์ ๋๊ฐ ์์ต๋๋ค. ์ด ํ์๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด SQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๋ ๊ฐ์ง ํ์ ์ค ํ๋๋ฅผ ํ์ฉํฉ๋๋ค:
- "WHERE"๋ก ์์ํ๋ ์ฟผ๋ฆฌ๋ ๋ชจ๋ ์ด์ ์๋์ผ๋ก ์ ํํฉ๋๋ค. ์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋จํ ์ฟผ๋ฆฌ๋ก ์๊ฐํ ์ ์์ต๋๋ค.
- ์ ํํ ์ด์ ์ง์ ํ ์ ์๋ ์ ์ฒด ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์๋ ์์ต๋๋ค.
์ด๋ ๋ชจ๋ธ ์ฑ๋ฅ ๋ฐ ํน์ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์กฐ์ฌํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด
- ๋ชจ๋ธ์ด ์ฌ๋๊ณผ ๊ฐ๊ฐ ์๋ ์ด๋ฏธ์ง์์ ์ด๋ ค์์ ๊ฒช๊ณ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ์ฌ๋ 2๊ฐ ์ด์๊ณผ ๊ฐ๊ฐ ํ ๋ง๋ฆฌ ์ด์ ์๋ ํฌ์ธํธ๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
SQL ์ฟผ๋ฆฌ์ ์๋งจํฑ ๊ฒ์์ ๊ฒฐํฉํ์ฌ ํน์ ์ ํ์ ๊ฒฐ๊ณผ๋ก ํํฐ๋งํ ์ ์์ต๋๋ค.
ํ
์ด๋ธ = exp.sql_query("WHERE ๋ ์ด๋ธ์ด '%person, person%' AND ๋ ์ด๋ธ์ด '%dog%' LIMIT 10")
table
์ ์ฌ๋ ๊ฒ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ค์์ ์ฌ์ฉํ์ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ๋กํ
ํ ์ ์๋ ์ ํธ๋ฆฌํฐ๋ ์ ๊ณต๋ฉ๋๋ค. exp.plot_sql_query
exp.plot_sql_query("WHERE ๋ ์ด๋ธ์ด '%person, person%' AND ๋ ์ด๋ธ์ด '%dog%' LIMIT 10", labels=True)
3. ์๋ฒ ๋ฉ ํ ์ด๋ธ ์์ (๊ณ ๊ธ)ยถ 3.
ํ์๊ธฐ๋ ๋ค์์์ ์๋ํฉ๋๋ค. LanceDB ํ
์ด๋ธ์ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ๋ค์์ ์ฌ์ฉํ์ฌ ์ด ํ
์ด๋ธ์ ์ง์ ์ก์ธ์คํ ์ ์์ต๋๋ค. Explorer.table
๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ , ์ฌ์ ๋ฐ ์ฌํ ํํฐ๋ฅผ ํธ์ ๋ค์ดํ๋ ๋ฑ์ ์์
์ ์ํํฉ๋๋ค.
ํ
์ด๋ธ = exp.table
table.์คํค๋ง
์์ ์ฟผ๋ฆฌ ์คํยถ
๋ฒกํฐ ๊ฒ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฒกํฐ๋ฅผ ์ฐพ์ต๋๋ค. ์ถ์ฒ ์์คํ ์ด๋ ๊ฒ์ ์์ง์์๋ ๊ฒ์ํ ์ํ๊ณผ ์ ์ฌํ ์ํ์ ์ฐพ์ ์ ์์ต๋๋ค. LLM ๋ฐ ๊ธฐํ AI ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ๋ ์ผ๋ถ ๋ชจ๋ธ์์ ์์ฑ๋ ์๋ฒ ๋ฉ์ผ๋ก ํ์๋ ์ ์์ผ๋ฉฐ, ๊ฐ์ฅ ๊ด๋ จ์ฑ์ด ๋์ ๊ธฐ๋ฅ์ ๋ฐํํฉ๋๋ค.
๊ณ ์ฐจ์ ๋ฒกํฐ ๊ณต๊ฐ์์์ ๊ฒ์์ ์ฟผ๋ฆฌ ๋ฒกํฐ์ ์ต์ ๊ทผ ์ด์(KNN)์ ์ฐพ๋ ๊ฒ์ ๋๋ค.
Metric LanceDB์์ ๋ฉํธ๋ฆญ์ ํ ์์ ๋ฒกํฐ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์ค๋ช ํ๋ ๋ฐฉ์์ ๋๋ค. ํ์ฌ ๋ค์๊ณผ ๊ฐ์ ๋ฉํธ๋ฆญ์ ์ง์ํฉ๋๋ค:
- L2
- ์ฝ์ฌ์ธ
- Dot Explorer์ ์ ์ฌ๋ ๊ฒ์์ ๊ธฐ๋ณธ์ ์ผ๋ก L2๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ ์ด๋ธ์์ ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ฑฐ๋ Lance ํ์์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ง์ ์ ํธ๋ฆฌํฐ๋ฅผ ๊ตฌ์ถํ์ฌ ๋ฐ์ดํฐ ์งํฉ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ LanceDB ํ ์ด๋ธ ์์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ฌธ์์์ ํ์ธํ์ธ์.
๋๋ฏธ_์ด๋ฏธ์ง_์๋ฒ ๋ฉ = [i for i ์ ๋ฒ์(256)]
table.search(Dummy_IMG_์๋ฒ ๋ฉ).limit(5).to_pandas()
์ธ๊ธฐ ์๋ ๋ฐ์ดํฐ ํ์์ผ๋ก์ ์ํธ ๋ณํยถ
df = table.to_pandas()
pa_table = table.to_arrow()
์๋ฒ ๋ฉ์ผ๋ก ์์ ํ๊ธฐยถ
lancedb ํ
์ด๋ธ์์ ์์ ์๋ฒ ๋ฉ์ ์ก์ธ์คํ์ฌ ๋ถ์ํ ์ ์์ต๋๋ค. ์ด๋ฏธ์ง ์๋ฒ ๋ฉ์ ์ด์ ์ ์ฅ๋ฉ๋๋ค. vector
import numpy as np
์๋ฒ ๋ฉ = table.to_pandas()["๋ฒกํฐ"].tolist()
์๋ฒ ๋ฉ = np.array(embedding)
์ค์บํฐํ๋กฏยถ
์๋ฒ ๋ฉ์ ๋ถ์ํ๋ ์๋น ๋จ๊ณ ์ค ํ๋๋ ์ฐจ์ ์ถ์๋ฅผ ํตํด 2D ๊ณต๊ฐ์ ์๋ฒ ๋ฉ์ ํ๋กํ ํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
!pip ์ค์น scikit-learn --q
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from sklearn.decomposition import PCA
# Reduce dimensions using PCA to 3 components for visualization in 3D
pca = PCA(n_components=3)
reduced_data = pca.fit_transform(embeddings)
# Create a 3D scatter plot using Matplotlib's Axes3D
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection="3d")
# Scatter plot
ax.scatter(reduced_data[:, 0], reduced_data[:, 1], reduced_data[:, 2], alpha=0.5)
ax.set_title("3D Scatter Plot of Reduced 256-Dimensional Data (PCA)")
ax.set_xlabel("Component 1")
ax.set_ylabel("Component 2")
ax.set_zlabel("Component 3")
plt.show()
4. ์ ์ฌ์ฑ ์ง์ยถ 4.
๋ค์์ ์๋ฒ ๋ฉ ํ
์ด๋ธ๋ก ๊ตฌ๋๋๋ ๊ฐ๋จํ ์์
์ ์์
๋๋ค. Explorer์๋ similarity_index
์๋-
- ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ๊ฐ ๋๋จธ์ง ๋ฐ์ดํฐ ์ธํธ์ ์ผ๋ง๋ ์ ์ฌํ์ง ์ถ์ ํฉ๋๋ค.
- ์ผ๋ง๋ ๋ง์ ์ด๋ฏธ์ง ์๋ฒ ๋ฉ์ด ๋ค์๋ณด๋ค ๊ฐ๊น์ด ๊ณณ์ ์๋์ง ๊ณ์ฐํ์ฌ ์ด๋ฅผ ์ํํฉ๋๋ค.
max_dist
๋ฅผ ์์ฑ๋ ์๋ฒ ๋ฉ ๊ณต๊ฐ์ ํ์ฌ ์ด๋ฏธ์ง์ ์ถ๊ฐํฉ๋๋ค.top_k
๋น์ทํ ์ด๋ฏธ์ง๋ฅผ ํ ๋ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ฃผ์ด์ง ๋ฐ์ดํฐ ์งํฉ์ ๋ํด ๋ชจ๋ธ๋งํฉ๋๋ค, max_dist
& top_k
๋ก ์ค์ ํ๋ฉด ํ ๋ฒ ์์ฑ๋ ์ ์ฌ๋ ์ธ๋ฑ์ค๊ฐ ์ฌ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ์ดํฐ ์ธํธ๊ฐ ๋ณ๊ฒฝ๋์๊ฑฐ๋ ๋จ์ํ ์ ์ฌ๋ ์ธ๋ฑ์ค๋ฅผ ๋ค์ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฌํ ์ ์์ต๋๋ค. force=True
.
๋ฒกํฐ ๋ฐ SQL ๊ฒ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ง์ ํ๋กฏํ ์ ์๋ ์ ํธ๋ฆฌํฐ๋ ํจ๊ป ์ ๊ณต๋ฉ๋๋ค. ๋จผ์ ํ๋กฏ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
exp.ํ๋กฏ_์ ์ฌ์ฑ_์ธ๋ฑ์ค(max_dist=0.2, top_k=0.01)
์ด์ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
import numpy as np
sim_idx = exp.์ ์ฌ์ฑ_์ธ๋ฑ์ค(max_dist=0.2, top_k=0.01, force=False)
sim_idx
์ ์ฌ๋ ์นด์ดํธ๊ฐ 30 ์ด์์ธ ๋ฐ์ดํฐ ํฌ์ธํธ๊ฐ ๋ฌด์์ธ์ง ํ์ธํ๊ณ ์ด์ ์ ์ฌํ ์ด๋ฏธ์ง๋ฅผ ํ์ํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
import numpy as np
sim_count = np.array(sim_idx["count"])
sim_idx["im_file"][sim_count > 30]
๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด ํ์๋์ด์ผ ํฉ๋๋ค.
exp.plot_similar(idx=[7146, 14035]) # Using avg embeddings of 2 images