lucianotonet commited on
Commit
690d40a
1 Parent(s): 18c3760

Aprimora processamento de imagens e validação de entrada

Browse files

Adiciona verificação para assegurar que pelo menos uma imagem é fornecida antes do processamento e simplifica a passagem das imagens como uma lista de listas. Isso melhora a robustez do código, garantindo um tratamento adequado de potenciais entradas vazias e reforçando a estrutura dos dados durante a inferência com o modelo. Além disso, melhora a legibilidade e manutenção do código.

Files changed (1) hide show
  1. app.py +10 -6
app.py CHANGED
@@ -18,18 +18,17 @@ processor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-2B-Instruct", min_pixel
18
  def process_image(image_data: str) -> Image.Image:
19
  if image_data.startswith("http://") or image_data.startswith("https://"):
20
  response = requests.get(image_data)
21
- response.raise_for_status() # Adiciona verificação de erro na requisição
22
  img = Image.open(BytesIO(response.content))
23
  elif image_data.startswith("data:image"):
24
  img_data = base64.b64decode(image_data.split(",")[1])
25
  img = Image.open(BytesIO(img_data))
26
- else: # Assume que é um caminho de arquivo local
27
  img = Image.open(image_data)
28
  return img
29
 
30
  @app.post("/predict")
31
  async def predict(messages: List[Dict[str, Union[str, List[Dict[str, str]]]]] = Body(...)):
32
- # Processamento e inferência
33
  texts = []
34
  image_inputs = []
35
  video_inputs = []
@@ -51,15 +50,20 @@ async def predict(messages: List[Dict[str, Union[str, List[Dict[str, str]]]]] =
51
  else:
52
  raise ValueError(f"Formato inválido para o conteúdo: {content}")
53
 
 
 
 
 
 
54
  inputs = processor(
55
  text=texts,
56
- images=image_inputs,
57
  videos=video_inputs,
58
  padding=True,
59
  return_tensors="pt"
60
  )
61
- inputs = inputs.to("cpu") # Altere para "cuda" se tiver GPU disponível
62
-
63
  generated_ids = model.generate(**inputs, max_new_tokens=128)
64
  generated_ids_trimmed = [
65
  out_ids[len(in_ids):] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
 
18
  def process_image(image_data: str) -> Image.Image:
19
  if image_data.startswith("http://") or image_data.startswith("https://"):
20
  response = requests.get(image_data)
21
+ response.raise_for_status()
22
  img = Image.open(BytesIO(response.content))
23
  elif image_data.startswith("data:image"):
24
  img_data = base64.b64decode(image_data.split(",")[1])
25
  img = Image.open(BytesIO(img_data))
26
+ else:
27
  img = Image.open(image_data)
28
  return img
29
 
30
  @app.post("/predict")
31
  async def predict(messages: List[Dict[str, Union[str, List[Dict[str, str]]]]] = Body(...)):
 
32
  texts = []
33
  image_inputs = []
34
  video_inputs = []
 
50
  else:
51
  raise ValueError(f"Formato inválido para o conteúdo: {content}")
52
 
53
+ if not image_inputs:
54
+ raise ValueError("Nenhuma imagem fornecida para processamento.")
55
+
56
+ print(f"Imagens processadas: {image_inputs}")
57
+
58
  inputs = processor(
59
  text=texts,
60
+ images=[image_inputs], # Passa as imagens como uma lista de listas
61
  videos=video_inputs,
62
  padding=True,
63
  return_tensors="pt"
64
  )
65
+ inputs = inputs.to("cpu")
66
+
67
  generated_ids = model.generate(**inputs, max_new_tokens=128)
68
  generated_ids_trimmed = [
69
  out_ids[len(in_ids):] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)