ytcollector 1.2.3__py3-none-any.whl → 1.2.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ytcollector/__init__.py CHANGED
@@ -22,7 +22,7 @@ from .analyzer import VideoAnalyzer, check_dependencies
22
22
  from .downloader import YouTubeDownloader
23
23
  from .cli import run, main as cli_main
24
24
 
25
- __version__ = "1.2.3"
25
+ __version__ = "1.2.4"
26
26
  __all__ = [
27
27
  # 주요 클래스
28
28
  "VideoAnalyzer",
ytcollector/analyzer.py CHANGED
@@ -32,7 +32,7 @@ try:
32
32
  except ImportError:
33
33
  USE_GPU = False
34
34
 
35
- from .config import LICENSE_PLATE_PATTERNS, LICENSE_PLATE_MODEL_PATH, YOLO_CONFIDENCE
35
+ from .config import LICENSE_PLATE_PATTERNS, LICENSE_PLATE_MODEL_PATH, YOLO_CONFIDENCE, YOLO_HIGH_CONFIDENCE
36
36
 
37
37
 
38
38
  class VideoAnalyzer:
@@ -167,9 +167,9 @@ class VideoAnalyzer:
167
167
 
168
168
  def detect_license_plate(self, frame, texts=None):
169
169
  """
170
- ROI 기반 번호판 감지 (최적화 버전)
170
+ ROI 기반 번호판 감지
171
171
  1. YOLO로 번호판 영역(ROI)을 먼저 찾음
172
- 2. 찾은 영역만 잘라서 OCR 수행 (속도 및 정확도 향상)
172
+ 2. 고신뢰도(>=0.6)면 바로 인정, 저신뢰도면 OCR 패턴 매칭 필요
173
173
  """
174
174
  if not YOLO_AVAILABLE or frame is None:
175
175
  return False
@@ -177,59 +177,46 @@ class VideoAnalyzer:
177
177
  try:
178
178
  self._init_yolo()
179
179
  results = self.yolo_model(frame, verbose=False, conf=YOLO_CONFIDENCE)
180
-
181
- yolo_detected = False
182
- roi_ocr_matched = False
183
180
 
184
181
  for r in results:
185
- # 0: license plate
186
182
  for box in r.boxes:
187
183
  if box.cls == 0:
188
- yolo_detected = True
184
+ conf = float(box.conf[0])
189
185
 
190
- # ROI 크기 필터링 (너무 작거나 큰 영역 제외)
186
+ # ROI 크기 필터링
191
187
  x1, y1, x2, y2 = map(int, box.xyxy[0])
192
188
  roi_w, roi_h = x2 - x1, y2 - y1
193
189
  frame_h, frame_w = frame.shape[:2]
194
190
  roi_area_ratio = (roi_w * roi_h) / (frame_w * frame_h)
195
191
 
196
- # ROI가 전체 화면의 0.1% ~ 20% 사이여야 함
197
192
  if roi_area_ratio < 0.001 or roi_area_ratio > 0.2:
198
193
  continue
199
194
 
200
- # ROI 크로핑 및 타겟 OCR
195
+ # 고신뢰도면 바로 인정
196
+ if conf >= YOLO_HIGH_CONFIDENCE:
197
+ return True
198
+
199
+ # 저신뢰도면 OCR 패턴 매칭 필요
201
200
  h, w = frame.shape[:2]
202
- # 패딩 10% 추가
203
- pad_w = int((x2 - x1) * 0.1)
204
- pad_h = int((y2 - y1) * 0.1)
205
-
201
+ pad_w = int((x2 - x1) * 0.15)
202
+ pad_h = int((y2 - y1) * 0.15)
203
+
206
204
  crop_x1 = max(0, x1 - pad_w)
207
205
  crop_y1 = max(0, y1 - pad_h)
208
206
  crop_x2 = min(w, x2 + pad_w)
209
207
  crop_y2 = min(h, y2 + pad_h)
210
-
208
+
211
209
  roi = frame[crop_y1:crop_y2, crop_x1:crop_x2]
212
210
  if roi.size > 0:
213
- # ROI에 대해서만 OCR 실행
214
211
  roi_texts = self.detect_text(roi)
215
212
  if roi_texts:
216
- combined_roi = "".join([re.sub(r'[^0-9가-힣]', '', t) for t in roi_texts])
213
+ combined = "".join([re.sub(r'[^0-9가-힣A-Za-z]', '', t) for t in roi_texts])
217
214
  for pattern in LICENSE_PLATE_PATTERNS:
218
- # 개별 텍스트 및 결합 텍스트 확인
219
215
  if any(re.search(pattern, re.sub(r'[^0-9가-힣]', '', t)) for t in roi_texts) or \
220
- re.search(pattern, combined_roi):
221
- roi_ocr_matched = True
222
- break
223
-
224
- if roi_ocr_matched: break
225
- if roi_ocr_matched: break
226
-
227
- # 최종 판정: YOLO 감지 + OCR 패턴 매칭 둘 다 만족해야 함 (오탐지 방지)
228
- if yolo_detected and roi_ocr_matched:
229
- return True
230
-
216
+ re.search(pattern, combined):
217
+ return True
218
+
231
219
  except Exception as e:
232
- # print(f" ⚠ 번호판 ROI 분석 에러: {e}")
233
220
  pass
234
221
 
235
222
  return False
ytcollector/config.py CHANGED
@@ -81,7 +81,8 @@ BLACKLIST_KEYWORDS = {
81
81
  }
82
82
 
83
83
  # YOLO 설정
84
- YOLO_CONFIDENCE = 0.5 # 오탐지 방지를 위해 신뢰도 상향
84
+ YOLO_CONFIDENCE = 0.3 # 감지율 향상을 위해 낮춤
85
+ YOLO_HIGH_CONFIDENCE = 0.6 # 고신뢰도 (OCR 없이 바로 인정)
85
86
 
86
87
  # 번호판 정규식 패턴 (한국 자동차 번호판 중심)
87
88
  LICENSE_PLATE_PATTERNS = [
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ytcollector
3
- Version: 1.2.3
3
+ Version: 1.2.4
4
4
  Summary: YouTube 콘텐츠 수집기 - 얼굴, 번호판, 타투, 텍스트 감지
5
5
  Author: YTCollector Team
6
6
  License: MIT
@@ -0,0 +1,13 @@
1
+ ytcollector/__init__.py,sha256=Z6wl96XcqT160HYKVglJiEAxAnaVjUYC--KrBbAMmmY,1152
2
+ ytcollector/analyzer.py,sha256=tUD3-SrcyXuSAkfOUERM1bd-cSjZiMfa51Yd66njkLY,13693
3
+ ytcollector/cli.py,sha256=aHF4EuQRPLKh65lnkI_dZ0ResztlVjpHlS5iHfzmpig,5577
4
+ ytcollector/config.py,sha256=2v4tFn1LX7aljsoFMdO8woq_ptNTsvTEy5_5WssviC0,3706
5
+ ytcollector/dataset_builder.py,sha256=nfArEwszoCln48n3T0Eff_4OOaYv8FF0YH8cARBGMWQ,2608
6
+ ytcollector/downloader.py,sha256=TeC6agUmSPHZSZ9jdoc42i8i_NobzTEkoRtAIgW80kI,14544
7
+ ytcollector/utils.py,sha256=6XDif-e3GbMHmUvTsBT0YblxNxYnS-2I8HnmjMBZs-M,4254
8
+ ytcollector/models/license_plate_detector.pt,sha256=jsOyVKbIdhDwN6kJV0Ysr6EanAMiTjOijGodGsKsUbA,6241454
9
+ ytcollector-1.2.4.dist-info/METADATA,sha256=9afCmbZ1kxNwM1hbXuvulER6eWKIy_xAtvUVApEDjzg,7319
10
+ ytcollector-1.2.4.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
11
+ ytcollector-1.2.4.dist-info/entry_points.txt,sha256=waiVuSJJYt-6_DAal-T4JkHgejo7wKYLdKrEI7tZ-ms,127
12
+ ytcollector-1.2.4.dist-info/top_level.txt,sha256=wozNyCUm0eMOm-9U81yTql6oGaM2O5rWVBXDb93zzyQ,12
13
+ ytcollector-1.2.4.dist-info/RECORD,,
@@ -1,13 +0,0 @@
1
- ytcollector/__init__.py,sha256=P4AIOCG2glB95wwN9QhUuF0HsgVxy6JyjTvkZKuQQXg,1152
2
- ytcollector/analyzer.py,sha256=zgtcw6pSCzJwa4NJ04XFJlLaoRt8CwXGxwuL9o8eduM,14414
3
- ytcollector/cli.py,sha256=aHF4EuQRPLKh65lnkI_dZ0ResztlVjpHlS5iHfzmpig,5577
4
- ytcollector/config.py,sha256=lpzYaODbOErUni_oAJ_zU0dpIQzy8gJDz-Cisrqf1tE,3646
5
- ytcollector/dataset_builder.py,sha256=nfArEwszoCln48n3T0Eff_4OOaYv8FF0YH8cARBGMWQ,2608
6
- ytcollector/downloader.py,sha256=TeC6agUmSPHZSZ9jdoc42i8i_NobzTEkoRtAIgW80kI,14544
7
- ytcollector/utils.py,sha256=6XDif-e3GbMHmUvTsBT0YblxNxYnS-2I8HnmjMBZs-M,4254
8
- ytcollector/models/license_plate_detector.pt,sha256=jsOyVKbIdhDwN6kJV0Ysr6EanAMiTjOijGodGsKsUbA,6241454
9
- ytcollector-1.2.3.dist-info/METADATA,sha256=u3Xz0naQgl9F-ZFOM7vw4fu25KxR28KfOPuz6eTzGkI,7319
10
- ytcollector-1.2.3.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
11
- ytcollector-1.2.3.dist-info/entry_points.txt,sha256=waiVuSJJYt-6_DAal-T4JkHgejo7wKYLdKrEI7tZ-ms,127
12
- ytcollector-1.2.3.dist-info/top_level.txt,sha256=wozNyCUm0eMOm-9U81yTql6oGaM2O5rWVBXDb93zzyQ,12
13
- ytcollector-1.2.3.dist-info/RECORD,,