丹青识画系统与Claude Code结合:AI编程辅助生成影像处理脚本

1. 引言:当图像识别遇上AI编程助手

你有没有遇到过这种情况?手头有一套功能强大的图像识别系统,比如丹青识画,它能看懂图片里的内容,能分析场景,能提取文字。但你想让它帮你批量处理一批图片,或者把识别结果自动整理成表格,又或者根据识别内容触发一些后续操作。这时候,你就需要写点代码了。

可问题来了:不是每个人都擅长编程。就算你会一点,面对一个新的API,光是看文档、理解接口、调试参数,可能半天时间就过去了。更别提那些复杂的图像预处理、结果后处理逻辑了。

这就是我们今天要聊的场景。我想分享一个特别高效的组合玩法:用丹青识画系统来处理图像,然后用Claude Code这样的AI编程助手来帮你写调用它的脚本。你不需要是个编程高手,甚至不需要完全理解每一行代码,你只需要用大白话告诉AI助手你想要什么。

比如,你可以说:“帮我写个Python脚本,调用丹青识画API,把images文件夹里所有的JPG图片都识别一遍,然后把识别出的物体名称和置信度保存到一个Excel文件里。”几分钟后,一个能直接运行的脚本就摆在你面前了。

这种模式,本质上是在降低技术使用的门槛。让图像识别这种能力,能更快速、更灵活地融入到你的具体工作流里,无论是做内容审核、电商商品管理,还是自媒体素材分析。接下来,我就通过几个实际的例子,带你看看这种协作模式到底有多方便。

2. 场景构想:哪些事情可以交给AI编程助手?

在具体写代码之前,我们先看看,围绕丹青识画这样的图像识别系统,通常有哪些编程需求是AI助手可以帮上忙的。了解这些,你才能更好地向它描述你的任务。

2.1 自动化批量处理脚本

这是最常见、也最实用的需求。人工一张张上传图片去识别,效率太低了。你需要的是一段能自动遍历文件夹、调用API、并管理好结果的代码。

  • 批量识别与归档:自动扫描某个目录下的所有图片(支持多种格式),调用识别接口,然后根据识别结果(例如,识别出的主要场景是“风景”还是“人像”)将图片移动到不同的子文件夹里。
  • 结果导出与报告:识别完成后,把关键信息,比如图片文件名、识别出的标签、置信度分数,整理成结构化的数据,导出为CSV或Excel文件,方便后续用表格软件进行筛选和分析。
  • 定时任务与监控:写一个脚本,让它定时(比如每天凌晨)去检查某个网络文件夹或云存储桶里是否有新图片,有的话就自动拉取、识别、并发送结果摘要到你的邮箱或办公软件里。

2.2 数据预处理与后处理工具

丹青识画API通常接收的是处理好的图片数据。但你的原始图片可能千奇百怪,这就需要一些预处理。同样,识别返回的原始数据也可能需要加工才能用。

  • 图片预处理:自动调整图片尺寸到API要求的大小、统一转换为RGB格式、对图片进行简单的裁剪或旋转校正、或者将PDF文件里的每一页都转成图片再识别。
  • 结果过滤与增强:API可能返回几十个识别标签和分数。你可以让AI助手写代码,只保留置信度高于某个阈值(比如0.7)的结果,或者将相似的标签进行合并归类,让最终结果更清晰。
  • 结果可视化:单纯看数据不直观。可以让脚本在识别完成后,在原图片上画出识别框(如果API支持返回坐标),或者把识别出的关键标签用醒目的文字标注在图片上,生成一份带标注的结果图。

2.3 定制化业务逻辑集成

这才是发挥创造力的地方。把图像识别能力作为你更大业务逻辑中的一个环节。

  • 内容审核辅助:自动识别用户上传的图片是否包含违规内容(如特定物体、文字),如果置信度超过阈值,则自动将图片标记为“待审核”或移动到隔离区,并记录日志。
  • 智能相册管理:为你个人的照片库写个管理脚本。识别照片中的人物(如果支持人脸识别)、地点(通过场景识别推断)、活动,然后自动按照“人物-年份-事件”这样的规则重命名文件或整理目录结构。
  • 工作流触发器:识别到图片中的特定元素后,触发后续动作。比如,识别到发票图片,就自动提取金额和日期信息,并录入财务系统;识别到设计稿中的“完成”水印,就自动通知下一个环节的同事。

理清了这些场景,你就知道该让Claude Code帮你做什么了。接下来,我们看看具体怎么操作。

3. 实战演练:从想法到可运行脚本

光说不练假把式。我们直接来看几个具体的例子,看看如何用自然语言指令,让Claude Code生成我们需要的脚本。我会模拟一个完整的对话过程。

3.1 案例一:生成批量图片识别与导出脚本

假设你是新媒体运营,每周需要分析几百张文章配图的内容主题,手动操作简直是一场噩梦。你的需求很明确:批量处理,结果要能方便地统计。

你对Claude Code说: “我需要一个Python脚本。它要完成以下任务:

  1. 遍历当前脚本所在目录下的一个叫 input_images 的文件夹,读取里面所有的jpg和png图片。
  2. 调用丹青识画系统的图像识别API(假设API端点是 https://api.example.com/v1/vision/recognize,需要通过Authorization: Bearer YOUR_API_KEY验证)。
  3. 对于每张图片,API会返回一个JSON,里面包含一个tags列表,每个标签有nameconfidence字段。我只需要保留confidence大于0.6的标签。
  4. 把所有图片的识别结果整理起来,保存到一个名为 image_analysis_results.csv 的文件里。文件需要包含这些列:图片文件名、识别标签1、置信度1、识别标签2、置信度2...(如果标签数量不一样,可以只记录前3个主要的,或者用分号隔开放在一个单元格里)。
  5. 处理过程中,如果某张图片识别失败,要在控制台打印错误信息,但不要中断整个程序,继续处理下一张。 请用requests库发HTTP请求,用pandas库处理数据和保存CSV。记得在代码里用注释标出哪里需要我填自己的API密钥。”

Claude Code生成的脚本核心部分可能如下:

import os
import requests
import pandas as pd
from PIL import Image
import json
import time

# 配置信息 - 请用户修改这里
API_ENDPOINT = "https://api.example.com/v1/vision/recognize"
API_KEY = "YOUR_API_KEY_HERE"  # 请替换为你的实际API密钥
INPUT_FOLDER = "input_images"
OUTPUT_CSV = "image_analysis_results.csv"

def process_image(image_path):
    """处理单张图片,调用API并返回结果"""
    try:
        with open(image_path, 'rb') as img_file:
            files = {'image': img_file}
            headers = {'Authorization': f'Bearer {API_KEY}'}
            
            # 发送请求
            response = requests.post(API_ENDPOINT, files=files, headers=headers)
            response.raise_for_status()  # 如果状态码不是200,抛出异常
            
            result = response.json()
            
            # 解析结果,过滤低置信度标签
            filtered_tags = []
            for tag in result.get('tags', []):
                if tag.get('confidence', 0) > 0.6:
                    filtered_tags.append({
                        'name': tag.get('name', ''),
                        'confidence': tag.get('confidence', 0)
                    })
            
            # 按置信度从高到低排序,只取前3个
            filtered_tags.sort(key=lambda x: x['confidence'], reverse=True)
            filtered_tags = filtered_tags[:3]
            
            return {
                'status': 'success',
                'tags': filtered_tags
            }
            
    except Exception as e:
        print(f"处理图片 {os.path.basename(image_path)} 时出错: {e}")
        return {
            'status': 'error',
            'error': str(e)
        }

def main():
    # 收集所有图片文件
    image_files = []
    for ext in ['*.jpg', '*.jpeg', '*.png', '*.JPG', '*.JPEG', '*.PNG']:
        image_files.extend(glob.glob(os.path.join(INPUT_FOLDER, ext)))
    
    if not image_files:
        print(f"在 {INPUT_FOLDER} 文件夹中未找到图片文件。")
        return
    
    print(f"找到 {len(image_files)} 张待处理图片。")
    
    all_results = []
    
    for idx, img_path in enumerate(image_files, 1):
        print(f"正在处理 ({idx}/{len(image_files)}): {os.path.basename(img_path)}")
        
        result = process_image(img_path)
        
        # 构建结果行
        row = {'filename': os.path.basename(img_path)}
        
        if result['status'] == 'success':
            tags = result['tags']
            for i, tag in enumerate(tags, 1):
                row[f'tag_{i}_name'] = tag['name']
                row[f'tag_{i}_confidence'] = round(tag['confidence'], 3)
            # 如果标签不足3个,后面的列留空
            for i in range(len(tags)+1, 4):
                row[f'tag_{i}_name'] = ''
                row[f'tag_{i}_confidence'] = ''
        else:
            row['error'] = result['error']
        
        all_results.append(row)
        
        # 礼貌性延迟,避免对API造成压力
        time.sleep(0.1)
    
    # 保存到CSV
    df = pd.DataFrame(all_results)
    df.to_csv(OUTPUT_CSV, index=False, encoding='utf-8-sig')
    print(f"处理完成!结果已保存至 {OUTPUT_CSV}")

if __name__ == "__main__":
    main()

你看,你只需要用清晰的语言描述步骤,AI助手就能生成结构完整、考虑异常处理、甚至加了友好提示的代码。你拿到后,基本上只需要填个API密钥,就能直接运行了。

3.2 案例二:生成图片预处理与结果标注脚本

这次的需求更深入一点。你有一批手机拍的照片,大小不一,方向也可能不对。你想在识别之后,直接把识别出的主要物体用框和文字标在图片上,生成一份直观的报告。

你对Claude Code提出新要求: “刚才的脚本很好。现在请帮我升级一下,增加两个功能:

  1. 图片预处理:在调用API前,检查图片。如果图片宽度或高度超过2000像素,就等比例缩放,让长边等于2000像素。同时,用PIL库检查图片的EXIF方向信息,如果有旋转信息,就自动把它转正。
  2. 结果可视化:对于识别成功的图片,如果返回的标签里有‘objects’字段(里面每个物体有‘name’, ‘confidence’, 和‘bbox’坐标[x1, y1, x2, y2]),就在原图上用红色矩形框把这个物体框出来,并在框上方用白色文字写上物体名称和置信度。处理后的图片保存到一个新的annotated_images文件夹里。 请修改之前的代码,加入这些功能。”

Claude Code会在原有基础上进行增补,生成的新代码会包含类似下面的函数:

from PIL import Image, ImageDraw, ImageFont
import PIL.ExifTags

def preprocess_image(image_path):
    """预处理图片:调整大小和旋转"""
    try:
        img = Image.open(image_path)
        
        # 处理EXIF旋转
        exif = img._getexif()
        if exif:
            for tag, value in exif.items():
                decoded = PIL.ExifTags.TAGS.get(tag, tag)
                if decoded == 'Orientation':
                    if value == 3:
                        img = img.rotate(180, expand=True)
                    elif value == 6:
                        img = img.rotate(270, expand=True)
                    elif value == 8:
                        img = img.rotate(90, expand=True)
                    break
        
        # 调整大小
        max_size = 2000
        if max(img.size) > max_size:
            ratio = max_size / max(img.size)
            new_size = tuple(int(dim * ratio) for dim in img.size)
            img = img.resize(new_size, Image.Resampling.LANCZOS)
        
        # 临时保存处理后的图片用于上传
        temp_path = f"temp_{os.path.basename(image_path)}"
        img.save(temp_path)
        return temp_path, img.size  # 返回临时路径和调整后的大小
        
    except Exception as e:
        print(f"预处理图片 {image_path} 失败: {e}")
        return None, None

def annotate_image(original_img_path, objects, new_size):
    """在原图上标注识别出的物体"""
    try:
        img = Image.open(original_img_path)
        draw = ImageDraw.Draw(img)
        
        # 尝试使用一个字体,如果系统没有就使用默认字体
        try:
            font = ImageFont.truetype("arial.ttf", 20)
        except:
            font = ImageFont.load_default()
        
        for obj in objects:
            bbox = obj.get('bbox', [])
            if len(bbox) == 4:
                # 绘制矩形框
                draw.rectangle(bbox, outline='red', width=3)
                # 绘制标签文本
                label = f"{obj.get('name', '')} ({obj.get('confidence', 0):.2f})"
                text_bbox = draw.textbbox((0, 0), label, font=font)
                text_width = text_bbox[2] - text_bbox[0]
                text_height = text_bbox[3] - text_bbox[1]
                
                # 文本背景框
                text_bg = [bbox[0], bbox[1] - text_height - 5, 
                          bbox[0] + text_width, bbox[1] - 5]
                draw.rectangle(text_bg, fill='red')
                # 文本
                draw.text((bbox[0], bbox[1] - text_height - 5), 
                         label, fill='white', font=font)
        
        # 保存到标注文件夹
        os.makedirs('annotated_images', exist_ok=True)
        output_path = os.path.join('annotated_images', os.path.basename(original_img_path))
        img.save(output_path)
        print(f"已生成标注图片: {output_path}")
        
    except Exception as e:
        print(f"标注图片 {original_img_path} 失败: {e}")

通过这样迭代式的对话,你可以像搭积木一样,逐步完善你的脚本,让它越来越贴合你的实际业务需求。AI助手负责处理繁琐的语法和通用逻辑,你则专注于定义“做什么”。

4. 协作模式的心得与建议

用了一段时间这种“丹青识画 + Claude Code”的模式后,我总结出几点心得,能让这个过程更顺畅。

第一,需求描述要具体、分步骤。 别只说“帮我写个识别图片的脚本”。要像给实习生布置任务一样,把步骤拆解开:第一步做什么,第二步做什么,遇到错误怎么办,结果输出成什么样。越具体,生成的代码就越靠谱。

第二,充分利用上下文。 Claude Code这类工具通常能记住一段对话历史。你可以先让它生成一个基础版本,运行测试,然后把错误信息或者你发现的问题反馈给它,让它修正。比如:“刚才的脚本运行时提示requests模块找不到,请检查并修正。”或者:“返回的JSON结构好像和你说得不一样,实际是result['data']['objects'],请按这个调整解析代码。” 这是一种高效的“调试”方式。

第三,从简单到复杂。 不要一开始就追求一个完美解决所有问题的大而全脚本。先实现核心的批量识别和导出功能,跑通流程。然后再慢慢增加预处理、后处理、错误重试、日志记录等高级功能。每次只增加一个明确的小目标,成功率会高很多。

第四,生成的代码要“审阅”,不要盲从。 AI生成的代码是很好的起点,但你可能需要做一些微调。比如,API有调用频率限制(QPS),你可能需要在循环里加个time.sleep。或者,你需要把一些配置信息(如API地址、密钥)从代码里抽出来,放到配置文件里。这些关乎稳定性和安全性的细节,需要你结合自己的知识来判断和补充。

第五,积累你自己的“提示词库”。 把那些描述清晰、生成效果好的指令保存下来。比如“创建一个从S3桶读取图片、调用视觉API、结果写入DynamoDB的Lambda函数模板”。下次遇到类似需求,稍作修改就能复用,效率倍增。

说到底,这种模式的价值在于,它把你从记忆API细节和编程语法的负担中解放出来,让你能更专注于业务逻辑本身——也就是“到底想用图像识别来做什么”。它让图像识别这项技术,变得像调用一个普通函数一样简单直接。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐