| import os |
| import json |
| from tqdm import tqdm |
| import openai |
| import traceback |
| import threading |
| from concurrent.futures import ThreadPoolExecutor |
| import json_repair |
|
|
| lock = threading.Lock() |
|
|
| client = openai.Client( |
| api_key = os.environ.get("DEEPSEEK_API_KEY", "[DEEPSEEK_API_KEY]"), |
| base_url = "https://api.deepseek.com/v1", |
| ) |
|
|
| with open("output1.json", "r") as f: |
| data = json.load(f) |
|
|
| new_data = {} |
| if os.path.exists("output.json"): |
| with open("output.json", "r") as f: |
| new_data = json.load(f) |
|
|
| progress = tqdm(data.items(), total=len(data), leave=True, position=0) |
| with ThreadPoolExecutor(max_workers=8) as executor: |
| for key, value in data.items(): |
| if key in new_data and new_data[key]: |
| progress.update(1) |
| continue |
| def process_and_update(key, value): |
| try: |
| prompt = "Given the following description of objects in an image, format the information as a JSON array where each object has 'name', 'bbox', and 'confidence' fields. The 'bbox' should be a list of four integers representing [x_min, y_min, width, height]. Here is the description: " + value + "\n\nOutput Format:\nOutput in JSON format: [{\"name\": object_name1, \"bbox\": bounding_box1, \"confidence\": confidence1}, {\"name\": object_name2, \"bbox\": bounding_box2, \"confidence\": confidence2}].\nDO NOT OUTPUT any other content besides JSON. If the name or bbox of certain objects cannot be determined, skip them in the output." |
| response = client.chat.completions.create( |
| model="deepseek-chat", |
| messages=[ |
| { |
| "role": "user", |
| "content": prompt |
| } |
| ], |
| temperature=0.1, |
| ) |
| resp_json = response.choices[0].message.content |
| resp_dict = json_repair.loads(resp_json) if resp_json else "" |
| new_data[key] = resp_dict |
| except Exception as e: |
| print(f"Error processing key {key}: {e}") |
| print(traceback.format_exc()) |
| new_data[key] = "" |
| finally: |
| progress.update(1) |
| with lock: |
| with open("output.json", "w") as f: |
| json.dump(new_data, f, indent=4, ensure_ascii=False) |
| executor.submit(process_and_update, key, value) |
|
|