Ostrakon-VL-8B Python入门项目新手也能做的菜品卡路里估算器你是不是刚开始学Python觉得光看语法有点枯燥想做点有意思的东西或者想试试现在很火的AI模型但又觉得门槛太高今天咱们就来玩一个特别适合新手的项目用Python写一个能“看”懂你吃了什么的卡路里估算器。你只需要拍张美食照片程序就能识别出里面的菜品然后告诉你这顿饭大概有多少热量。听起来是不是挺酷的这可比单纯打印“Hello World”有趣多了。这个项目的核心是一个叫Ostrakon-VL-8B的模型。别被名字吓到它其实就是一个能看懂图片内容的AI。我们不需要自己训练模型只需要学会怎么“问”它问题就行。整个项目用到的Python知识都非常基础比如变量、字典、函数还有一点点调用外部接口的方法。我会手把手带你走一遍从环境准备到代码编写再到最后跑起来看到结果。整个过程就像搭积木一块一块拼起来最后就能得到一个属于你自己的小工具。准备好了吗咱们开始吧。1. 环境准备搭好你的“工作台”做项目之前得先把“工具箱”准备好。这里主要需要两样东西Python运行环境和访问AI模型的“钥匙”。1.1 安装Python如果你电脑上还没装Python先去官网下载一个。建议选择Python 3.8或以上的版本比较新兼容性也好。安装完成后打开你的命令行工具Windows上是“命令提示符”或PowerShellMac或Linux上是“终端”输入下面的命令检查一下python --version或者python3 --version如果能看到类似Python 3.10.6这样的版本号就说明安装成功了。1.2 安装必要的“零件”我们的程序需要几个额外的Python“零件包”才能工作。别担心安装它们只需要一行命令。打开命令行输入以下命令pip install requests pillow简单解释一下这两个“零件”是干嘛的requests这是Python里一个非常流行的工具专门用来和网站或者网络服务“对话”。我们待会儿要用它去“问”Ostrakon-VL-8B模型问题。pillow这是一个处理图片的工具。我们需要它来打开、查看我们拍的美食照片。输入命令后稍微等一会儿看到“Successfully installed”之类的提示就搞定了。1.3 获取模型的“访问钥匙”Ostrakon-VL-8B模型通常需要通过一个网络服务来使用。为了完成这个项目你需要先找到一个能提供这个模型服务的平台并获取一个API密钥就像一把钥匙。这个过程在不同的平台上可能略有不同但大体步骤是注册一个相关平台的账号。在平台上找到Ostrakon-VL-8B模型的服务。创建一个新的应用或项目平台会给你生成一个唯一的API密钥一串字母和数字的组合。把这个密钥复制下来妥善保存我们下一步会用到。重要提示这个API密钥是你的个人凭证不要把它直接写在公开的代码里更不要分享给别人。我们待会儿会教你怎么安全地使用它。好了你的“工作台”已经搭好了。接下来我们开始动手写代码。2. 项目第一步让AI“看”懂图片我们的程序第一个任务就是把一张美食照片“喂”给Ostrakon-VL-8B模型然后问它“嘿看看这张图里有什么菜”2.1 准备一张测试图片首先找一张你想分析的美食照片。可以是网上下载的也可以是自己拍的。把它保存到你的项目文件夹里名字简单点比如my_food.jpg。记住图片的路径比如./my_food.jpg表示在当前文件夹下。2.2 编写图片识别代码现在打开你喜欢的代码编辑器比如VS Code、PyCharm甚至记事本也行新建一个Python文件命名为calorie_estimator.py。我们把代码分成几小块来写这样更容易理解。第一块引入工具和设置“钥匙”# calorie_estimator.py import requests from PIL import Image import base64 import json # 这里是你的API密钥用你刚才从平台获取的真实密钥替换掉‘YOUR_API_KEY_HERE’ API_KEY ‘YOUR_API_KEY_HERE’ # 这里是模型服务的地址不同平台可能不同请根据你使用的平台提供的信息填写 API_URL “https://api.example.com/v1/chat/completions” # 示例地址需要替换这段代码做了四件事import语句就像“拿出工具箱”我们把需要的工具requests, PIL等准备好。API_KEY变量存放你的“访问钥匙”。记得把‘YOUR_API_KEY_HERE’换成你自己那把真实的钥匙。API_URL变量是我们要去“问问题”的地址。这个地址需要根据你选择的AI服务平台来填写。我们引入了base64和json工具用来把图片转换成模型能理解的格式以及处理模型返回的答案。第二块把图片变成模型能读的“语言”模型不能直接理解.jpg或.png文件它需要一种叫Base64的文本格式。下面的函数就是干这个转换工作的。def encode_image_to_base64(image_path): “”“把图片文件转换成Base64编码的字符串。”“” with open(image_path, “rb”) as image_file: # 读取图片的二进制数据然后进行Base64编码最后解码成字符串 encoded_string base64.b64encode(image_file.read()).decode(‘utf-8’) return encoded_string这个函数encode_image_to_base64接收一个图片路径打开它进行编码然后返回一串很长的字符。这串字符就代表了你的图片。第三块向模型提问这是最核心的一步我们要把编码好的图片和我们的问题一起打包发送给模型服务。def ask_model_whats_in_the_image(image_base64): “”“向Ostrakon-VL-8B模型提问识别图片内容。”“” # 准备我们想问的问题。这里我们让它用中文列出图片中的主要菜品。 prompt_text “请详细描述这张图片中的食物。主要有哪些菜品请用中文列出它们的名称。” # 按照模型服务要求的格式组装我们的“问题包裹” headers { “Content-Type”: “application/json”, “Authorization”: f“Bearer {API_KEY}” # 这里用你的API密钥进行认证 } payload { “model”: “Ostrakon-VL-8B”, # 指定使用哪个模型 “messages”: [ { “role”: “user”, “content”: [ {“type”: “text”, “text”: prompt_text}, { “type”: “image_url”, “image_url”: { “url”: f“data:image/jpeg;base64,{image_base64}” } } ] } ], “max_tokens”: 300 # 限制模型回答的长度 } # 发送请求并等待模型的“回信” response requests.post(API_URL, headersheaders, jsonpayload) # 检查请求是否成功 if response.status_code 200: response_data response.json() # 从复杂的回复中提取出模型的文本答案 answer response_data[‘choices’][0][‘message’][‘content’] return answer else: # 如果失败打印错误信息 print(f“请求失败状态码{response.status_code}”) print(response.text) return None这段代码看起来有点长但其实逻辑很清晰我们定义了一个问题prompt_text“请详细描述这张图片中的食物...”。用headers告诉服务器我们发送的是JSON数据并且附上了API密钥作为身份证明。payload就是“问题包裹”的核心内容里面说明了用哪个模型、用户我们说了什么包括文字问题和图片。requests.post这行代码真正把包裹寄了出去。最后检查回信是否成功如果成功就把模型的文字答案提取出来。第四块把前面的步骤连起来跑一下我们来写一个主函数把上面的功能串联起来测试一下。def main(): # 1. 指定你的图片路径 image_path “./my_food.jpg” # 修改为你的图片实际路径 # 2. 编码图片 print(“正在处理图片...”) image_base64 encode_image_to_base64(image_path) # 3. 询问模型 print(“正在询问AI模型识别菜品...”) description ask_model_whats_in_the_image(image_base64) # 4. 打印结果 if description: print(“\n AI识别结果 ”) print(description) print(“\n”) # 这里先返回描述供后续步骤使用 return description else: print(“菜品识别失败。”) return None if __name__ “__main__”: main()保存文件然后在命令行里进入到你的项目文件夹运行python calorie_estimator.py如果一切顺利你会看到终端里先显示“正在处理图片...”然后“正在询问AI模型识别菜品...”最后会打印出AI对图片的描述。它可能会说“图片中有一碗白米饭一份西红柿炒鸡蛋还有几块红烧排骨。”恭喜你你已经成功让AI“看”懂了你的美食图片。接下来我们要从这段描述里找出菜名然后去查它们的卡路里。3. 项目第二步构建卡路里“小字典”AI给了我们一段文字描述我们需要从中提取出具体的菜名比如“红烧排骨”、“白米饭”。然后我们需要知道这些菜每100克大概有多少热量。现实中完整的食物营养成分数据库非常庞大。为了简化我们自己在程序里创建一个“小字典”来模拟。你可以把它想象成一个小本子里面记着一些常见菜品的卡路里。3.1 创建一个食物热量字典在刚才的calorie_estimator.py文件里我们接着添加下面的代码。你可以把它放在文件开头变量定义的后面或者放在main函数之前。# 一个简化的食物热量数据库单位千卡/100克 # 这里只是一个示例实际数据可以更丰富也可以从文件或网络加载 FOOD_CALORIES_DB { “白米饭”: 116, “米饭”: 116, “西红柿炒鸡蛋”: 85, “番茄炒蛋”: 85, “红烧排骨”: 250, “糖醋排骨”: 280, “炒青菜”: 50, “清炒时蔬”: 45, “宫保鸡丁”: 180, “水煮肉片”: 220, “麻婆豆腐”: 120, “拍黄瓜”: 30, “鸡蛋汤”: 35, “面条”: 110, “馒头”: 120, “苹果”: 52, “香蕉”: 89, “牛奶”: 54, “牛肉”: 250, “鸡肉”: 165, “猪肉”: 242, “鱼”: 130, }这个FOOD_CALORIES_DB字典就是我们的“小本子”。键Key是食物名称值Value是每100克的热量千卡。你可以根据需要往里面添加更多你常吃的食物和对应的热量值。3.2 从AI描述中提取菜名AI返回的描述是一段话比如“图片中有一碗白米饭一份西红柿炒鸡蛋还有几块红烧排骨。”我们需要编写一个简单的函数从这段话里找出我们“小本子”里有的菜名。def extract_dishes_from_description(description, food_db): “”“从AI的描述文本中提取出已知的菜品名称。”“” found_dishes [] # 遍历我们数据库里的每一个菜名 for dish in food_db.keys(): # 如果这个菜名出现在AI的描述中就认为图片里有这道菜 if dish in description: found_dishes.append(dish) return found_dishes这个函数很简单它拿着AI给的描述去和我们“小本子”food_db里的每一个菜名对比如果菜名在描述里出现了就把它记录下来。注意这个方法非常基础。如果AI的描述是“一盘番茄炒蛋”而你的数据库里写的是“西红柿炒鸡蛋”那就匹配不上了。更高级的方法可以用一些文本相似度匹配但对我们这个入门项目来说基础方法已经能演示核心思想了。3.3 估算总热量并展示结果找到了菜名查到了每100克的热量但我们还不知道图片里这些菜有多少克。在实际应用中这需要更复杂的图像分析来估算体积和重量。为了项目能进行下去我们这里做一个简单的假设假设识别出的每道菜我们按“一份”来算默认每份是200克。这样我们就可以估算一个大概的热量了。我们来写这个计算和展示结果的函数def estimate_and_display_calories(dishes_list, food_db, portion_size_g200): “”“根据识别出的菜品列表估算并显示总卡路里。”“” if not dishes_list: print(“未识别出已知菜品。”) return total_calories 0 print(“\n 卡路里估算报告 ) print(“识别到的菜品及估算热量按每份200克计算”) print(“-” * 40) for dish in dishes_list: calories_per_100g food_db.get(dish) if calories_per_100g: # 计算这道菜的热量 (热量/100克) * (200克 / 100克) dish_calories calories_per_100g * (portion_size_g / 100) total_calories dish_calories print(f“{dish}: {calories_per_100g} 千卡/100克 - 估算 {dish_calories:.0f} 千卡/份”) else: print(f“{dish}: 数据库中未找到热量信息”) print(“-” * 40) print(f“**估算总热量摄入{total_calories:.0f} 千卡**”) print(“” * 40) print(“注此为粗略估算实际热量受食材、做法、份量影响较大。”)这个函数会检查是否识别到了菜。为每一道识别到的菜从数据库里查找热量。根据我们假设的份量默认200克计算这道菜的热量。累加得到总热量。用清晰的格式把结果打印出来。4. 项目第三步把所有功能组装起来现在我们有了识别图片的函数、有了食物数据库、有了提取菜名和计算热量的函数。是时候把所有的“积木”拼成一个完整的程序了。我们需要修改一下main函数让它把整个流程串起来def main(): # 1. 指定你的图片路径 image_path “./my_food.jpg” # 修改为你的图片实际路径 # 2. 编码图片并询问模型 print(“正在处理图片并识别菜品...”) image_base64 encode_image_to_base64(image_path) description ask_model_whats_in_the_image(image_base64) if not description: print(“菜品识别失败程序退出。”) return print(“\n AI识别结果 ”) print(description) print(“\n”) # 3. 从描述中提取菜名 print(“正在从描述中提取菜品信息...”) detected_dishes extract_dishes_from_description(description, FOOD_CALORIES_DB) if detected_dishes: print(f“提取到菜品{‘ ‘.join(detected_dishes)}”) else: print(“未从描述中匹配到已知菜品。请检查数据库或AI描述。”) # 可以在这里让用户手动输入菜名作为一个扩展功能 # manual_dish input(“请手动输入主要菜品名称”) # if manual_dish: # detected_dishes [manual_dish] # 4. 估算并显示卡路里 estimate_and_display_calories(detected_dishes, FOOD_CALORIES_DB) if __name__ “__main__”: main()现在再次运行你的程序python calorie_estimator.py如果一切正常你将看到一个完整的输出AI对图片的描述。程序从描述中匹配到的菜名。一份详细的卡路里估算报告5. 试试看玩起来项目的主体已经完成了。你可以多找几张不同的美食图片试试看把image_path变量改成你的新图片路径就行。你可能会发现一些问题这正是学习和改进的机会匹配不上如果AI说“番茄炒蛋”而你的数据库是“西红柿炒鸡蛋”就匹配不了。你可以把这两个名字都加进数据库或者尝试改进extract_dishes_from_description函数。热量不准我们的数据库很小份量也是假设的。你可以去网上找更准确的食物热量表把FOOD_CALORIES_DB丰富起来。想识别更多东西你可以修改问AI的问题prompt_text比如让它“列出图片中所有的食物和饮料”然后相应地扩展你的数据库。6. 回顾与下一步怎么样跟着做下来是不是感觉Python一下子变得具体了我们不只是学了语法而是用它完成了一个有趣的小应用。我们来简单回顾一下这个项目用到的核心知识变量和字典用来存储API密钥、食物数据库。函数把不同的功能编码图片、提问AI、提取菜名、计算热量封装成独立的模块让代码清晰好维护。API调用使用requests库与远端的AI模型服务进行通信这是现代编程中非常常见的操作。条件判断和循环用来处理AI返回的结果、遍历数据库进行匹配。字符串操作处理AI返回的文本描述。这个项目就像一个起点你可以基于它做很多扩展做个图形界面用tkinter或PyQt库做一个有按钮、能选择图片、显示结果的小窗口程序。连接真实数据库把食物热量数据存到CSV文件或SQLite数据库里方便管理和扩充。估算份量尝试用更复杂的方法比如结合图片中餐具的尺寸来估算食物的实际克数让热量计算更准。做成Web应用用Flask或FastAPI框架把你的程序变成一个网站上传图片就能看结果。最重要的是你通过这个项目亲手体验了如何将一个想法用AI估算食物热量拆解成一个个小步骤准备环境、识别图片、查数据库、计算展示并用代码实现的过程。这种“分析-拆解-实现”的能力才是编程中最宝贵的。希望这个项目能点燃你对Python编程的兴趣。编程不只是枯燥的代码更是创造有趣事物的工具。多动手多尝试你会发现自己能做出越来越多好玩的东西。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。