Fix CI: resolve opencv-contrib-python conflict and use lazy QR detector init
This commit is contained in:
parent
a04471d574
commit
59425ca9fb
2
.gitignore
vendored
2
.gitignore
vendored
@ -6,4 +6,4 @@ build
|
|||||||
/detection/model
|
/detection/model
|
||||||
/api/db.sqlite3
|
/api/db.sqlite3
|
||||||
/emblemscanner-release
|
/emblemscanner-release
|
||||||
/models
|
models
|
||||||
|
|||||||
@ -174,7 +174,13 @@ def predict(model, transforms, image, ncells=1):
|
|||||||
r = predict_multi(model, transforms, [image], ncells)
|
r = predict_multi(model, transforms, [image], ncells)
|
||||||
return r[0]
|
return r[0]
|
||||||
|
|
||||||
qr_detector = cv2.wechat_qrcode_WeChatQRCode()
|
_qr_detector = None
|
||||||
|
|
||||||
|
def _get_qr_detector():
|
||||||
|
global _qr_detector
|
||||||
|
if _qr_detector is None:
|
||||||
|
_qr_detector = cv2.wechat_qrcode_WeChatQRCode()
|
||||||
|
return _qr_detector
|
||||||
|
|
||||||
def find_qr(img, scale=1.0):
|
def find_qr(img, scale=1.0):
|
||||||
# Convert PIL Image to OpenCV format
|
# Convert PIL Image to OpenCV format
|
||||||
@ -189,6 +195,7 @@ def find_qr(img, scale=1.0):
|
|||||||
new_size = orig_size
|
new_size = orig_size
|
||||||
resized_img = img
|
resized_img = img
|
||||||
img_cv = cv2.cvtColor(np.array(resized_img), cv2.COLOR_RGB2BGR)
|
img_cv = cv2.cvtColor(np.array(resized_img), cv2.COLOR_RGB2BGR)
|
||||||
|
qr_detector = _get_qr_detector()
|
||||||
qr, corners = qr_detector.detectAndDecode(img_cv)
|
qr, corners = qr_detector.detectAndDecode(img_cv)
|
||||||
if not qr:
|
if not qr:
|
||||||
if scale > 0.05:
|
if scale > 0.05:
|
||||||
|
|||||||
@ -19,7 +19,6 @@ seaborn
|
|||||||
torch
|
torch
|
||||||
torchvision
|
torchvision
|
||||||
kornia
|
kornia
|
||||||
opencv-python
|
|
||||||
opencv-contrib-python
|
opencv-contrib-python
|
||||||
|
|
||||||
# RAG dependencies
|
# RAG dependencies
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import json
|
|||||||
import requests
|
import requests
|
||||||
import argparse
|
import argparse
|
||||||
import logging
|
import logging
|
||||||
|
import base64
|
||||||
from multiprocessing import Pool
|
from multiprocessing import Pool
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
import oss2
|
import oss2
|
||||||
@ -352,6 +353,63 @@ class ListModelsCommand(SubCommand):
|
|||||||
print(f"Error listing models: {e}", file=sys.stderr)
|
print(f"Error listing models: {e}", file=sys.stderr)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
class QrVerifyCommand(SubCommand):
|
||||||
|
name = "qr-verify"
|
||||||
|
want_argv = False
|
||||||
|
help = "Post image to qr-verify endpoint"
|
||||||
|
|
||||||
|
def setup_args(self, parser):
|
||||||
|
parser.add_argument("--image", required=True, help="Path to image file")
|
||||||
|
parser.add_argument("--qrcode", required=True, help="QR code value")
|
||||||
|
|
||||||
|
def do(self, args, argv):
|
||||||
|
if not os.path.exists(args.image):
|
||||||
|
print(f"Error: Image file not found: {args.image}", file=sys.stderr)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
# Read image and convert to base64 data URL
|
||||||
|
with open(args.image, 'rb') as f:
|
||||||
|
image_data = f.read()
|
||||||
|
|
||||||
|
# Determine MIME type from file extension
|
||||||
|
ext = os.path.splitext(args.image)[1].lower()
|
||||||
|
mime_types = {
|
||||||
|
'.jpg': 'image/jpeg',
|
||||||
|
'.jpeg': 'image/jpeg',
|
||||||
|
'.png': 'image/png',
|
||||||
|
'.gif': 'image/gif',
|
||||||
|
'.webp': 'image/webp',
|
||||||
|
}
|
||||||
|
mime_type = mime_types.get(ext, 'image/jpeg')
|
||||||
|
|
||||||
|
# Encode to base64 data URL
|
||||||
|
base64_data = base64.b64encode(image_data).decode('utf-8')
|
||||||
|
data_url = f"data:{mime_type};base64,{base64_data}"
|
||||||
|
|
||||||
|
# Prepare request data
|
||||||
|
data = {
|
||||||
|
'qrcode': args.qrcode,
|
||||||
|
'image_data_urls': [data_url],
|
||||||
|
}
|
||||||
|
|
||||||
|
# Post to qr-verify endpoint
|
||||||
|
server = self.get_server()
|
||||||
|
url = f'{server}/api/v1/qr-verify/'
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
}
|
||||||
|
headers.update(self.make_headers())
|
||||||
|
|
||||||
|
try:
|
||||||
|
r = requests.post(url, headers=headers, json=data)
|
||||||
|
r.raise_for_status()
|
||||||
|
print(json.dumps(r.json(), indent=2))
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error posting to qr-verify: {e}", file=sys.stderr)
|
||||||
|
if hasattr(e, 'response') and e.response is not None:
|
||||||
|
print(f"Response: {e.response.text}", file=sys.stderr)
|
||||||
|
return 1
|
||||||
|
|
||||||
def global_args(parser):
|
def global_args(parser):
|
||||||
parser.add_argument("--env", "-E", help="Env", default="prod")
|
parser.add_argument("--env", "-E", help="Env", default="prod")
|
||||||
parser.add_argument("-D", "--debug", action="store_true",
|
parser.add_argument("-D", "--debug", action="store_true",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user