1 line
7.9 KiB
JSON
1 line
7.9 KiB
JSON
{"repo": "chenwn1186/chatpro", "files": {"backend/backend.py": {"4eac92df6fb414e0948086c07a77147742647390": {"t": 1785674632.6719472, "n": 6277, "h": "78e7c3fcdbd391a9", "c": "import re\nimport cv2\nfrom PIL import Image\nimport base64\nimport io\nimport torch\nfrom ultralytics import YOLO\nfrom flask import Flask, request, jsonify\nfrom openai import OpenAI\nimport os\nimport time\nimport datetime\nimport logging\nimport requests\n\n# 配置日志记录\nlogging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')\n\n# 初始化 OpenAI 客户端\n# API_KEY = \"3MFOSXFhX8cuMahAJVKnnR9dh31NsKMqecGTX7zX6hnTfYX03bT0fJT9DqMNshBqu\"\n# client = OpenAI(api_key=API_KEY, base_url=\"https://api.stepfun.com/v1\")\n\n#can use:(doubao)\nAPI_KEY = \"sk-528.kT3wdhoKY531DD59egtWtRZKT8deOwLVo0i0IxorxyQVePoY\"\nclient = OpenAI(api_key=API_KEY, base_url=\"https://wcode.net/api/gpt/v1\")\n# API_KEY=\"sk-XIOIPGBOc3agtjmCB73fE6630089490a92Ea220f35F5F166\"\n# client = OpenAI(api_key=API_KEY,base_url=\"https://vip.yi-zhan.top/v1\")\napp = Flask(__name__)\n\ndev = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n# 加载模型\nmodel = YOLO(\"D:/FlutterProjects/yolo/yolo11m.pt\")\n\n\n@app.route(\"/analyseImg\", methods=[\"POST\"])\ndef analyse_img():\n try:\n ip = request.remote_addr\n # 获取上传的文件\n file = request.files.get(\"image\")\n if not file:\n return jsonify({\"error\": \"未上传图片\"}), 400\n\n # 打开图片\n image = Image.open(file.stream)\n\n # 获取图片格式信息\n image_format = image.format\n\n # 计算压缩前图片体积\n before_buffered = io.BytesIO()\n image.save(before_buffered, format=image_format)\n before_size = len(before_buffered.getvalue()) / (1024 * 1024)\n print(f\"压缩前图片体积: {before_size:.2f} MB\")\n\n # 进行图片质量压缩\n # 压缩质量,范围从 0 到 100,数值越小压缩率越高,图片质量越低\n quality = 70 \n buffered = io.BytesIO()\n image.save(buffered, format=image_format, quality=quality)\n # 重置文件指针到文件开头\n buffered.seek(0) \n # 使用压缩后的图片数据重新打开图片\n image = Image.open(buffered) \n\n # 读取图片元数据(在转换为 PNG 之前)\n metadata = image._getexif() if image._getexif() else {}\n\n # 将图像转换为 PNG 格式\n image = image.convert('RGB')\n buffered = io.BytesIO()\n image.save(buffered, format='JPEG')\n buffered.seek(0)\n image = Image.open(buffered)\n image_format = 'JPEG'\n\n # 计算压缩后图片体积\n after_size = len(buffered.getvalue()) / (1024 * 1024)\n print(f\"压缩后图片体积: {after_size:.2f} MB\")\n\n # 将图片转换为 base64 编码\n buffered = io.BytesIO()\n image.save(buffered, format=image_format)\n img_base64 = base64.b64encode(buffered.getvalue()).decode()\n\n yolo_results = model.predict(image, save=False, device=dev.index)[0].to_json()\n\n # 生成与大模型对话的字符串\n conversation_str = f\"data:image/{image_format.lower()};base64,{img_base64}\"\n\n prompt = \"\"\"根据提供的元数据 JSON 和图像,你要尽可能详细地描述图像中的内容,包括人物、物体和事件。你要特别注意,如果以下某些字段不存在,直接返回\"\"或者[]。\n 以 JSON 格式返回响应,包含以下字段:\"时间\"(精确时间、星期几、上午/下午/晚上,是字符串)、\n \"地点\"(位置,是字符串)、\"场景\"(场景类型,是字符串)、\"人物\"(包含描述的人物,是字符串的列表)、\n \"物体\"(包含描述的物体,是字符串的列表)、\"环境\"(天气等,是字符串)、\n \"活动\"(包含描述的活动,是字符串的列表)、\"情绪\"(带有推理的情绪,是字符串)。\n \"\"\"\n \n # 调用OpenAI API获取大模型的回复\n response, code = get_openai_response(conversation_str, yolo_results, metadata, prompt)\n\n # 处理 Markdown 格式数据,提取 JSON 内容\n start_tag = \"```json\"\n end_tag = \"```\"\n response = response.replace(start_tag, \"\")\n response = response.replace(end_tag, \"\")\n # print(f'from ip: {ip}, response:{response}')\n print(f'from ip: {ip}, response:{response}')\n return jsonify({\"result\": response}), code\n\n except Exception as e:\n return jsonify({\"error\": str(e)}), 500\n\n\ndef get_openai_response(image_url, yolo_results, metadata, prompt):\n \"\"\"\n 根据传入的图片URL和文本信息,调用OpenAI的API获取大模型的回复。\n\n :param image_url: 图片的URL地址\n :param text: 用户输入的文本描述\n :return: OpenAI大模型的回复结果\n \"\"\"\n # 记录函数开始时间\n start_time = time.time()\n logging.info(f\"函数开始执行,起始时间戳: {start_time}\")\n\n # 构建请求大模型的消息\n messages = [\n {\"role\": \"system\", \"content\": prompt},\n {\n \"role\": \"user\",\n \"content\": [\n {\"type\": \"text\", \"text\": f'yolo results:{yolo_results}'},\n {\"type\": \"text\", \"text\": f'metadata:{metadata}'},\n {\"type\": \"image_url\", \"image_url\": {\"url\": image_url, \"detail\": \"high\"}},\n ],\n },\n ]\n # print(f\"构建的消息内容: {image_url[:30]}\")\n\n try:\n # 调用 OpenAI 接口获取结果\n logging.info(\"开始调用 OpenAI API...\")\n completion = client.chat.completions.create(\n model=\"Doubao-1.5-vision-pro-32k\", messages=messages\n # model=\"gpt-4-vision-preview\",\n # model=\"yi-vision\",\n # messages=messages\n )\n logging.info(\"成功调用 OpenAI API,获取到结果。\")\n except Exception as e:\n logging.error(f\"调用 OpenAI API 时出错: {e}\")\n # get_money()\n return f\"调用 OpenAI API 时出错: {e}\", 400\n \n\n # 记录函数结束时间\n end_time = time.time()\n # 计算函数执行时间\n elapsed_time = end_time - start_time\n \n # 将 start_time 转换为真实时间\n start_datetime = datetime.datetime.fromtimestamp(start_time)\n start_time_str = start_datetime.strftime(\"%Y-%m-%d %H:%M:%S\")\n logging.info(f\"起始时间: {start_time_str}, 获取大模型回复所消耗的时间: {elapsed_time} 秒\")\n\n result = completion.choices[0].message.content\n # logging.info(f\"大模型回复结果: {result}\")\n # get_money()\n return result, 200\n\n\n\ndef get_money():\n url = \"https://wcode.net/api/account/billing/grants\"\n\n payload = {}\n headers = {\n 'Authorization': f'Bearer {API_KEY}'\n }\n\n response = requests.request(\"GET\", url, headers=headers, data=payload)\n if response.status_code == 200:\n try:\n data = response.json()\n if data.get(\"status\") == \"success\":\n total_available = data[\"data\"][\"total_available\"]\n total_available_currency_symbol = data[\"data\"][\"total_available_currency_symbol\"]\n print(f'剩余余额:{total_available_currency_symbol}{total_available}')\n else:\n print(f\"请求失败,错误信息:{data.get('error_message', '未知错误')}\")\n except (KeyError, ValueError):\n print(\"解析响应数据时出错,请检查响应格式。\")\n else:\n print(f\"请求失败,状态码:{response.status_code}\")\n\n\nif __name__ == \"__main__\":\n # app.run(host=\"172.16.91.233\", port=5408, threaded=True)\n app.run(host=\"0.0.0.0\", port=5408, threaded=True)\n"}}}} |