이 저장소는 TikTok 라이브 쇼핑 방송을 자동으로 수집하고,
수집된 방송 영상·메타데이터를 기반으로 상품 카테고리를 분류하는 CLIP 기반 모델과
이를 활용한 Python 서버 파이프라인으로 구성된 프로젝트입니다.
크게 다음 세 부분으로 나뉩니다.
tiktok_classifier/
├─ tiktok/ # TikTok 라이브 검색/카드 탐색/녹화/메타데이터 수집
├─ train/
│ ├─ model3.py # CLIP 기반 이미지/텍스트 분류 모델 학습 스크립트
│ └─ finetune.ipynb # 추가 실험/노트북
├─ server/
│ ├─ server.py # Flask 서버: 메타데이터 + 영상 -> 분류/LLM 호출
│ ├─ video_processor.py # OpenCV 기반 프레임 추출
│ ├─ python_server_config.py# 경로/모델/LLM/Mongo 설정
│ └─ python_server_utils.py # CLIP 분류기, GPT/커스텀 LLM 호출 유틸
├─ glot_model/ # 학습된 모델/체크포인트(예: CLIP Cross-Attention)
├─ utils.js # 공통 JS 유틸 (delay, Whisper 서버 호출 등)
├─ main.js # TikTok 크롤러 엔트리 포인트
├─ whisper_fastapi_server.py # 음성 -> 텍스트(Whisper) 처리 서버
├─ cookies.json # TikTok 세션 쿠키 (민감정보, 공유 금지)
└─ README.md # 프로젝트 설명 문서 (이 파일로 교체 가능)
tiktok/ 디렉토리는 TikTok 라이브 쇼핑 방송을 자동으로 수집하는 크롤러를 담고 있습니다.
Puppeteer를 사용하여 브라우저를 띄우고, 라이브 검색 페이지에서 실시간 방송 카드를 탐색하고,
조건에 맞는 방송만 골라 영상 녹화/채팅 수집/메타데이터 저장을 수행합니다.
main.js)launchBrowser()
tiktok/browser.jspuppeteer-extra + stealth plugin을 사용해 실제 크롬 브라우저 실행cookies.json을 로드해서 로그인/연령제한 우회 등 세션 적용openSearchPage(page, url)
tiktok/searchPage.jsextractAllCards(page)
tiktok/cardList.jsdata-e2e="search_live-item" / search-card-desc 를 기준으로 라이브 카드 리스트 추출userId 와 클릭 가능한 link를 묶어서 반환방송 필터링
broadcastFilter.js사용자 쿨다운
userCooldown.jsloadCooldownData / saveCooldownData / isUserCooldown / cleanupCooldown 제공목표 카드 처리 (processTargetCard)
tiktok/cardHandler.jsrecordScreen2로 화면 녹화 (mp4 저장, recordings/ 디렉토리 등)extractChatMessages로 일정 시간 동안 채팅 수집utils.js의 sendToWhisperServer(filepath) 사용에러 및 자원 정리
데이터셋 규모
위 과정을 통해 구축한 라이브 커머스 데이터셋은
약 1만 개 수준의 방송 샘플(메타데이터 + 영상 + 채팅 + Whisper 자막) 으로 구성할 수 있도록 설계되었습니다.
train/model3.py는 TikTok 라이브 영상에서 추출한 이미지들을 입력으로
실제 판매 상품을 카테고리별로 분류하는 CLIP 기반 분류 모델을 학습하는 스크립트입니다.
image_root = "real_images_6_cropped"
label_root = "real_data3"
{
"category": "clothing",
"query": "반팔티 라이브 커머스"
}
데이터셋 클래스: ClipImageOnlyDataset
mode에 따라
"text": 텍스트가 있는 샘플만 사용"both": 텍스트 유무 상관 없이 사용pixel_values (이미지 텐서), text (query 문자열), label (카테고리 id) 반환데이터는 train/val/test로 폴더 단위 랜덤 분할되며,
총 샘플 수는 약 1만개 규모로 설정해 두고 실험했습니다.
CLIPImageClassifier는 이미지 특징만 사용하는 베이스라인 모델입니다.
CLIPVisionModel(예: openai/clip-vit-base-patch16)을 백본으로 사용[CLS] 토큰(첫 토큰) 임베딩을 추출CrossEntropyLoss, AdamW(lr=1e-5)로 학습이 모델은 텍스트 정보 없이도 이미지 만으로 어느 정도 카테고리 분류가 가능한지를 보는 용도입니다.
실제 프로젝트에서는 텍스트(제목/쿼리)와 이미지를 함께 활용하는
CLIPCrossAttentionClassifier를 주요 모델로 사용합니다.
구조 요약:
Vision Encoder
CLIPVisionModel.from_pretrained(clip_model_name)[CLS]를 제외하고 패치 토큰들만 사용하거나,nn.Linear(vis_dim, 512)로 임베딩 차원 축소Text Encoder
CLIPTextModel + CLIPTokenizerquery 또는 Whisper 텍스트 기반 문장Cross-Attention Layer
nn.MultiheadAttention(embed_dim=512, num_heads=8, batch_first=True)t (질문/설명)v (이미지 패치)Pooling & Classifier
학습 설정
CrossEntropyLossAdamWtorch.cuda.amp) 및 gradient clipping으로 안정성 확보EarlyStopping을 사용해 검증 loss 기준으로 best 모델 선택clip_crossattention_classifier.pth로 저장이 구조 덕분에 모델은
server/ 디렉토리는 영상/메타데이터를 입력받아 최종 카테고리/설명을 반환하는 서버 파트를 담당합니다.
server.py
meta_filepath 등을 입력받아 해당 방송의 JSON/영상 정보를 읽음video_processor.extract_frames_opencv로 mp4 파일에서 프레임 추출MONGO_URI, MONGO_DB_NAME, MONGO_COLLECTION_NAME)video_processor.py
num_frames개만 균등 간격으로 추출하여 이미지 저장python_server_config.py
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")python_server_utils.py
PROMPT_TEMPLATE)gpt-4o-mini 호출 함수/generate) 호출 함수⚠️ 실제 경로, 환경변수, API 키, MongoDB URI 등은 개인 환경에 맞게 수정해야 합니다.
# Node.js 의존성 설치
npm install
# 크롤러 실행
node main.js
cookies.json에 TikTok 로그인 쿠키를 저장해 두어야 안정적인 수집이 가능합니다.recordings/, 메타데이터는 별도의 JSON 파일로 저장됩니다.cd train
python model3.py
real_images_6_cropped/, real_data3/ 경로에 맞게 데이터 구성clip_crossattention_classifier.pth가 저장됩니다.cd server
python server.py
python_server_config.py에서 BASE_PROJECT_PATH, NGROK_URL, OPENAI API 키, MONGO_URI 등을 수정3 commits
Python
51.6%
JavaScript
27.9%
Jupyter Notebook
20.5%
이 저장소는 TikTok 라이브 쇼핑 방송을 자동으로 수집하고,
수집된 방송 영상·메타데이터를 기반으로 상품 카테고리를 분류하는 CLIP 기반 모델과
이를 활용한 Python 서버 파이프라인으로 구성된 프로젝트입니다.
크게 다음 세 부분으로 나뉩니다.
tiktok_classifier/
├─ tiktok/ # TikTok 라이브 검색/카드 탐색/녹화/메타데이터 수집
├─ train/
│ ├─ model3.py # CLIP 기반 이미지/텍스트 분류 모델 학습 스크립트
│ └─ finetune.ipynb # 추가 실험/노트북
├─ server/
│ ├─ server.py # Flask 서버: 메타데이터 + 영상 -> 분류/LLM 호출
│ ├─ video_processor.py # OpenCV 기반 프레임 추출
│ ├─ python_server_config.py# 경로/모델/LLM/Mongo 설정
│ └─ python_server_utils.py # CLIP 분류기, GPT/커스텀 LLM 호출 유틸
├─ glot_model/ # 학습된 모델/체크포인트(예: CLIP Cross-Attention)
├─ utils.js # 공통 JS 유틸 (delay, Whisper 서버 호출 등)
├─ main.js # TikTok 크롤러 엔트리 포인트
├─ whisper_fastapi_server.py # 음성 -> 텍스트(Whisper) 처리 서버
├─ cookies.json # TikTok 세션 쿠키 (민감정보, 공유 금지)
└─ README.md # 프로젝트 설명 문서 (이 파일로 교체 가능)
tiktok/ 디렉토리는 TikTok 라이브 쇼핑 방송을 자동으로 수집하는 크롤러를 담고 있습니다.
Puppeteer를 사용하여 브라우저를 띄우고, 라이브 검색 페이지에서 실시간 방송 카드를 탐색하고,
조건에 맞는 방송만 골라 영상 녹화/채팅 수집/메타데이터 저장을 수행합니다.
main.js)launchBrowser()
tiktok/browser.jspuppeteer-extra + stealth plugin을 사용해 실제 크롬 브라우저 실행cookies.json을 로드해서 로그인/연령제한 우회 등 세션 적용openSearchPage(page, url)
tiktok/searchPage.jsextractAllCards(page)
tiktok/cardList.jsdata-e2e="search_live-item" / search-card-desc 를 기준으로 라이브 카드 리스트 추출userId 와 클릭 가능한 link를 묶어서 반환방송 필터링
broadcastFilter.js사용자 쿨다운
userCooldown.jsloadCooldownData / saveCooldownData / isUserCooldown / cleanupCooldown 제공목표 카드 처리 (processTargetCard)
tiktok/cardHandler.jsrecordScreen2로 화면 녹화 (mp4 저장, recordings/ 디렉토리 등)extractChatMessages로 일정 시간 동안 채팅 수집utils.js의 sendToWhisperServer(filepath) 사용에러 및 자원 정리
데이터셋 규모
위 과정을 통해 구축한 라이브 커머스 데이터셋은
약 1만 개 수준의 방송 샘플(메타데이터 + 영상 + 채팅 + Whisper 자막) 으로 구성할 수 있도록 설계되었습니다.
train/model3.py는 TikTok 라이브 영상에서 추출한 이미지들을 입력으로
실제 판매 상품을 카테고리별로 분류하는 CLIP 기반 분류 모델을 학습하는 스크립트입니다.
image_root = "real_images_6_cropped"
label_root = "real_data3"
{
"category": "clothing",
"query": "반팔티 라이브 커머스"
}
데이터셋 클래스: ClipImageOnlyDataset
mode에 따라
"text": 텍스트가 있는 샘플만 사용"both": 텍스트 유무 상관 없이 사용pixel_values (이미지 텐서), text (query 문자열), label (카테고리 id) 반환데이터는 train/val/test로 폴더 단위 랜덤 분할되며,
총 샘플 수는 약 1만개 규모로 설정해 두고 실험했습니다.
CLIPImageClassifier는 이미지 특징만 사용하는 베이스라인 모델입니다.
CLIPVisionModel(예: openai/clip-vit-base-patch16)을 백본으로 사용[CLS] 토큰(첫 토큰) 임베딩을 추출CrossEntropyLoss, AdamW(lr=1e-5)로 학습이 모델은 텍스트 정보 없이도 이미지 만으로 어느 정도 카테고리 분류가 가능한지를 보는 용도입니다.
실제 프로젝트에서는 텍스트(제목/쿼리)와 이미지를 함께 활용하는
CLIPCrossAttentionClassifier를 주요 모델로 사용합니다.
구조 요약:
Vision Encoder
CLIPVisionModel.from_pretrained(clip_model_name)[CLS]를 제외하고 패치 토큰들만 사용하거나,nn.Linear(vis_dim, 512)로 임베딩 차원 축소Text Encoder
CLIPTextModel + CLIPTokenizerquery 또는 Whisper 텍스트 기반 문장Cross-Attention Layer
nn.MultiheadAttention(embed_dim=512, num_heads=8, batch_first=True)t (질문/설명)v (이미지 패치)Pooling & Classifier
학습 설정
CrossEntropyLossAdamWtorch.cuda.amp) 및 gradient clipping으로 안정성 확보EarlyStopping을 사용해 검증 loss 기준으로 best 모델 선택clip_crossattention_classifier.pth로 저장이 구조 덕분에 모델은
server/ 디렉토리는 영상/메타데이터를 입력받아 최종 카테고리/설명을 반환하는 서버 파트를 담당합니다.
server.py
meta_filepath 등을 입력받아 해당 방송의 JSON/영상 정보를 읽음video_processor.extract_frames_opencv로 mp4 파일에서 프레임 추출MONGO_URI, MONGO_DB_NAME, MONGO_COLLECTION_NAME)video_processor.py
num_frames개만 균등 간격으로 추출하여 이미지 저장python_server_config.py
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")python_server_utils.py
PROMPT_TEMPLATE)gpt-4o-mini 호출 함수/generate) 호출 함수⚠️ 실제 경로, 환경변수, API 키, MongoDB URI 등은 개인 환경에 맞게 수정해야 합니다.
# Node.js 의존성 설치
npm install
# 크롤러 실행
node main.js
cookies.json에 TikTok 로그인 쿠키를 저장해 두어야 안정적인 수집이 가능합니다.recordings/, 메타데이터는 별도의 JSON 파일로 저장됩니다.cd train
python model3.py
real_images_6_cropped/, real_data3/ 경로에 맞게 데이터 구성clip_crossattention_classifier.pth가 저장됩니다.cd server
python server.py
python_server_config.py에서 BASE_PROJECT_PATH, NGROK_URL, OPENAI API 키, MONGO_URI 등을 수정3 commits
Python
51.6%
JavaScript
27.9%
Jupyter Notebook
20.5%