Category: 技术折腾

服务器、网络、硬件与自建工具的实践记录。

  • 创建自动化试卷生成工具:使用Python和OpenPyXL

    创建自动化试卷生成工具:使用Python和OpenPyXL

    你是否曾经需要为学生创建大量的试卷,但又不想手动编写每一份试卷?在这个教程中,我们将使用Python编写一个自动化试卷生成工具,可以根据题库随机生成试卷,并保存为Word文档。无需编程经验,我们将一步步引导你完成整个过程。

    开场故事

    假设你是一名教师,每学期都需要为你的学生创建多份试卷。但是,手动编写每一份试卷非常耗时且容易出错。你希望有一种自动化工具,可以根据题库随机生成试卷,以节省时间并降低错误率。现在,让我向你介绍如何使用Python创建这样一个自动化试卷生成工具。

    准备工作

    在开始之前,确保你的计算机上已经安装了以下工具和库:

    • Python:确保你已经安装了Python。如果没有,你可以从Python官方网站下载并安装。

    • OpenPyXL:OpenPyXL是一个用于操作Excel文件的Python库。你可以使用以下命令安装它:

      pip install openpyxl

    创建自动化试卷生成工具

    现在,让我们开始创建自动化试卷生成工具。

    导入必要的库

    首先,我们需要导入必要的Python库和模块。这些库包括random(用于生成随机数)和openpyxl(用于操作Excel文件)。

    import random
    from openpyxl import load_workbook

    创建随机数生成函数

    我们将创建一个函数,用于生成不重复的随机整数。这个函数将接受两个参数,分别是最大数和需要生成的随机数的个数。

    def Random_num(num_max, num_qty):
        num_list = []
        while len(num_list) < num_qty:
            num = random.randint(2, num_max)
            if num in num_list:
                continue
            else:
                num_list.append(num)
        return num_list

    创建题目抽取函数

    接下来,我们将创建一个函数,用于根据随机生成的题目编号从题库中抽取题目。这个函数将接受两个参数,分别是试题类型和需要抽取的试题编号。

    def Question(que_type, numbers):
        questions = []
        wb = load_workbook("题库.xlsx")
        ws = wb[que_type]
    
        for i in numbers:
            question = ws["B" + str(i)].value
            if que_type == "多选题" and ws["G" + str(i)].value:
                answerE = "E:\t" + str(ws["G" + str(i)].value)
                single_question = [question, answerE]
            else:
                single_question = [question]
            questions.append(single_question)
    
        return questions

    创建试卷生成函数

    现在,我们将创建一个函数,用于将抽取的试题写入Word文档中。

    from docx import Document
    from docx.shared import Pt
    from docx.oxml.ns import qn
    
    def To_word(number, questions_data):
        doc = Document("试题-模板.docx")
    
        title1 = "一、单项选择题(共40题,每题1分)"
        p = doc.add_paragraph()
        r = p.add_run(title1)
        r.bold = True
        r.font.size = Pt(12)
    
        for index, i in enumerate(questions_data["单选题"], start=1):
            doc.add_paragraph(f"{index}. {i[0]}")
    
        title2 = "二、多项选择题(共20题,每题2分)"
        p = doc.add_paragraph()
        r = p.add_run(title2)
        r.bold = True
        r.font.size = Pt(12)
    
        for index, i in enumerate(questions_data["多选题"], start=1):
            doc.add_paragraph(f"{index}. {i[0]}")
    
            if len(i) == 2:  # 判断是否有E选项
                doc.add_paragraph(f"{i[1]}")
    
        title3 = "三、判断题(共10题,每题1分)"
        p = doc.add_paragraph()
        r = p.add_run(title3)
        r.bold = True
        r.font.size = Pt(12)
    
        for index, i in enumerate(questions_data["判断题"], start=1):
            doc.add_paragraph(f"{index}. {i[0]}")
    
        title4 = "四、填空题(共10题,每题1分)"
        p = doc.add_paragraph()
        r = p.add_run(title4)
        r.bold = True
        r.font.size = Pt(12)
    
        for index, i in enumerate(questions_data["填空题"], start=1):
            doc.add_paragraph(f"{index}. {i[0]}")
    
        doc.save(f"试卷及答案\\考试题{number}.docx")

    创建答案生成函数

    接下来,我们将创建一个函数,用于生成试题答案,并将答案写入Word文档中。

    def Answer(number, questions_data):
        doc = Document()
    
        title = "计算机系2020第二学期期末考试题(答案)"
        p = doc.add_paragraph()
        r = p.add_run(title)
        r.bold = True
        r.font.size = Pt(20)
    
        title1 = "一、单项选择题答案(共40题,每题1分)"
        p = doc.add_paragraph()
        r = p.add_run(title1)
        r.bold = True
        r.font.size = Pt(12)
    
        p = doc.add_paragraph()
        for index, i in enumerate(questions_data["单选题"], start=1):
            p.add_run(f"{index}. {i[0]} {i[1]}\t")
            if index % 10 == 0:
                p = doc.add_paragraph()
    
        title2 = "二、多项选择题答案(
    
    共20题,每题2分)"
        p = doc.add_paragraph()
        r = p.add_run(title2)
        r.bold = True
        r.font.size = Pt(12)
    
        p = doc.add_paragraph()
        for index, i in enumerate(questions_data["多选题"], start=1):
            p.add_run(f"{index}. {i[0]} {i[1]}\t")
            if index % 3 == 0:
                p = doc.add_paragraph()
    
        title3 = "三、判断题答案(共10题,每题1分)"
        p = doc.add_paragraph()
        r = p.add_run(title3)
        r.bold = True
        r.font.size = Pt(12)
    
        p = doc.add_paragraph()
        for index, i in enumerate(questions_data["判断题"], start=1):
            p.add_run(f"{index}. {i[0]} {i[1]}\t")
            if index % 5 == 0:
                p = doc.add_paragraph()
    
        title4 = "四、填空题答案(共10题,每题1分)"
        p = doc.add_paragraph()
        r = p.add_run(title4)
        r.bold = True
        r.font.size = Pt(12)
    
        p = doc.add_paragraph()
        for index, i in enumerate(questions_data["填空题"], start=1):
            p.add_run(f"{index}. {i[0]} {i[1]}\t\t")
            if index % 2 == 0:
                p = doc.add_paragraph()
    
        doc.save(f"试卷及答案\\考试题{number}答案.docx")

    主函数

    最后,我们创建了主函数来运行整个试卷生成过程。

    if __name__ == '__main__':
        for number in range(1, 21):  # 生成20套试卷
            num_single_choice = Random_num(566, 40)
            num_mult_choice = Random_num(196, 20)
            num_judgment = Random_num(418, 10)
            num_completion = Random_num(190, 10)
    
            question_num = {
                "单选题号": num_single_choice,
                "多选题号": num_mult_choice,
                "判断题号": num_judgment,
                "填空题号": num_completion
            }
    
            questions_data = {
                "单选题": Question("单选题", question_num["单选题号"]),
                "多选题": Question("多选题", question_num["多选题号"]),
                "判断题": Question("判断题", question_num["判断题号"]),
                "填空题": Question("填空题", question_num["填空题号"])
            }
    
            To_word(number, questions_data)
            Answer(number, questions_data)
            print(f"试卷{number}及答案生成完成!")

    运行试卷生成工具

    现在,你已经创建了一个自动化试卷生成工具,可以根据题库随机生成试卷,并将试卷和答案保存为Word文档。要运行工具,只需运行上述代码。生成的试卷和答案将保存在指定的文件夹中。

    总结

    通过本教程,你学会了如何使用Python和OpenPyXL创建一个自动化试卷生成工具。这个工具可以大大节省教师编写试卷的时间,同时降低了人为错误的风险。你可以根据自己的需求进一步扩展这个工具,添加更多功能,如生成不同类型的试题或自定义试题模板。

    希望这个教程对你有所帮助,让你更轻松地处理大量试卷生成工作!

  • 制作一个二维码识别工具:使用Python和PyQt5

    制作一个二维码识别工具:使用Python和PyQt5

    你是否曾经想过制作一个简单的二维码识别工具,让你能够通过摄像头捕捉二维码并获取其中的信息?如果是的话,那么你来对地方了!在本教程中,我们将使用Python和PyQt5创建一个简单的二维码识别工具。无需担心编程经验,我们将逐步引导你完成整个过程。

    准备工作

    在开始之前,确保你的计算机上已经安装了以下工具和库:

    • Python:确保你已经安装了Python。如果没有,你可以从Python官方网站下载并安装。

    • PyQt5:PyQt5是一个用于创建GUI应用程序的Python库。你可以使用以下命令安装它:

      pip install PyQt5
    • OpenCV:OpenCV是一个计算机视觉库,用于处理图像和视频。你可以使用以下命令安装它:

      pip install opencv-python
    • pyzbar:pyzbar是一个用于解码二维码的库。你可以使用以下命令安装它:

      pip install pyzbar

    创建二维码识别工具

    现在,让我们开始创建我们的二维码识别工具。

    导入必要的库

    首先,我们需要导入必要的Python库和模块。这些库包括PyQt5、OpenCV和pyzbar。此外,我们还需要一些其他的库来帮助我们管理图形用户界面(GUI)。

    import cv2
    from PIL import Image
    from pyzbar.pyzbar import decode
    import sys
    from PyQt5.QtWidgets import QApplication, QWidget, QTextEdit, QLabel, QGridLayout, QMessageBox
    from PyQt5.QtCore import QTimer, QCoreApplication

    创建GUI

    接下来,我们将创建一个简单的GUI,用于显示摄像头捕捉的图像以及解码后的二维码信息。

    class MyQRRec(QWidget):
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            self.setGeometry(300, 200, 850, 650)
            self.setWindowTitle('二维码识别')
            grid = QGridLayout()
            self.setLayout(grid)
            grid.setSpacing(10)
    
            titleEdit = QTextEdit()
            titlePrompt = QLabel('把二维码放在摄像头前面:')
            grid.addWidget(titlePrompt, 1, 1)
            grid.addWidget(titleEdit, 2, 1)
    
            self.show()

    在上述代码中,我们创建了一个名为MyQRRec的QWidget子类,该子类用于显示GUI界面。我们使用QGridLayout来管理界面布局,并在界面上添加了一个用于显示解码后信息的文本框。

    捕捉摄像头图像

    现在,让我们添加代码来捕捉摄像头的图像并进行二维码识别。

    class MyQRRec(QWidget):
        # ...(之前的代码)
    
        def start_camera(self):
            self.cap = cv2.VideoCapture(0)
    
            cv2.namedWindow('Camera Feed')
            while not isExit:
                ret, frame = self.cap.read()
                frame = cv2.flip(frame, 1)
    
                cv2.imshow('Camera Feed', frame)
                x = decode(frame)
                app.processEvents()
                if x:
                    y = x[0].data.decode()
                    if y != lastResult:
                        titleEdit.setPlainText(titleEdit.toPlainText() + y)
                        lastResult = y
    
            self.cap.release()
            cv2.destroyAllWindows()
            sys.exit()
            QCoreApplication.instance().quit
    
        # ...(之后的代码)

    在上述代码中,我们创建了一个名为start_camera的方法,该方法用于启动摄像头并捕捉图像。我们使用OpenCV来访问摄像头,并在窗口中显示摄像头捕捉的图像。然后,我们使用pyzbar来解码图像中的二维码,并将解码结果显示在GUI的文本框中。

    关闭应用程序

    最后,我们需要添加代码来关闭应用程序。

    class MyQRRec(QWidget):
        # ...(之前的代码)
    
        def closeEvent(self, event):
            global isExit
            isExit = True

    在上述代码中,我们创建了一个名为closeEvent的方法,该方法在关闭应用程序时被调用,它将全局变量isExit设置为True,以停止摄像头捕捉。

    主函数

    最后,我们创建了主函数来运行应用程序。

    if __name__ == '__main__':
        app = QApplication(sys.argv)
        w = MyQRRec()
        sys.exit(app.exec_())

    运行二维码识别工具

    现在,你已经创建了一个简单的二维码识别工具,可以通过摄像头捕捉二维码并显示其内容。要运行应用程序,只需运行上述代码。

    总结

    通过本教程,你学会了如何使用Python和PyQt5创建一个简单的二维码识别工具。这个工具可以捕捉摄像头的图像,识别二维码,并显示其内容。你可以进一步扩展这个工具,添加更多功能,如保存识别的二维码图片或将识别结果保存到文件中。

    希望这个教程能帮助你开始使用Python和PyQt5创建自己的图形用户界面应用程序。祝你好运!

  • 如何用Python编写一个有趣的贪吃蛇小游戏

    如何用Python编写一个有趣的贪吃蛇小游戏

    在这个快节奏的时代,人们总是寻找能够娱乐和挑战自己的方式。其中,小游戏一直是大家喜欢的消遣方式之一。在这篇文章中,我们将带你一起探索如何使用Python编写一个有趣的贪吃蛇小游戏。无需编程经验,只要跟随本教程,你就能轻松创建自己的游戏。接下来,让我们开始这个游戏开发之旅吧!

    准备工作

    在开始编写贪吃蛇游戏之前,你需要确保已经安装了Python和Pygame库。如果你还没有安装,可以按照以下步骤进行操作:

    1. 安装Python:访问Python官方网站,下载并安装最新版本的Python。

    2. 安装Pygame库:打开命令行(Windows用户可以使用命令提示符,Mac和Linux用户可以使用终端),运行以下命令来安装Pygame库:

      pip install pygame

      这将自动下载并安装Pygame库。

    现在,我们已经准备好开始编写贪吃蛇游戏了。

    编写游戏代码

    导入所需的库

    首先,我们需要导入Pygame库以及一些其他必要的库。这些库将帮助我们创建游戏窗口、处理用户输入和管理游戏逻辑。

    import pygame
    import random

    初始化游戏

    在我们开始创建游戏窗口之前,我们需要初始化Pygame。

    pygame.init()

    设置游戏窗口

    我们将定义游戏窗口的尺寸和标题。

    window_width = 400
    window_height = 400
    window = pygame.display.set_mode((window_width, window_height))
    pygame.display.set_caption("贪吃蛇游戏")

    定义游戏颜色

    为了在游戏中使用颜色,我们需要定义一些常见的颜色。

    black = (0, 0, 0)
    green = (0, 255, 0)

    定义蛇的初始位置和速度

    我们需要为蛇定义初始位置、长度和移动速度。

    snake_x = 50
    snake_y = 50
    snake_speed = 10

    定义蛇的初始长度和方向

    蛇的初始长度为1,方向为向右移动。

    snake_length = 1
    snake_direction = 'right'

    主循环

    游戏的核心部分是一个无限循环,该循环在用户关闭游戏窗口之前一直运行。在每次循环中,我们需要检查用户的输入,移动蛇并更新游戏界面。

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

    绘制蛇和食物

    我们需要编写函数来绘制蛇和食物。这些元素将在游戏窗口上显示。

    def draw_snake(snake_x, snake_y, snake_list):
        for segment in snake_list:
            pygame.draw.rect(window, green, [segment[0], segment[1], 10, 10])
    
    def draw_food(food_x, food_y):
        pygame.draw.rect(window, green, [food_x, food_y, 10, 10])

    移动蛇

    在主循环中,我们将根据用户输入来移动蛇。

    if snake_direction == 'right':
        snake_x += snake_speed
    elif snake_direction == 'left':
        snake_x -= snake_speed
    elif snake_direction == 'up':
        snake_y -= snake_speed
    elif snake_direction == 'down':
        snake_y += snake_speed

    检测碰撞

    我们需要编写函数来检测蛇是否碰到了边界或食物。如果蛇吃到了食物,我们将增加蛇的长度并生成新的食物。

    def check_collision(snake_x, snake_y, snake_list, food_x, food_y):
        if snake_x >= window_width or snake_x < 0 or snake_y >= window_height or snake_y < 0:
            return True
        for segment in snake_list:
            if segment == [food_x, food_y]:
                return True
        return False

    游戏结束

    如果游戏结束,我们将显示游戏结束消息,并在用户按下空格键后重新开始游戏。

    def game_over():
        font = pygame.font.Font(None, 36)
        text = font.render("游戏结束!", True, black)
        window.blit(text, [window_width / 2 - 100, window_height / 2 - 50])
        pygame.display.update()
        pygame.time.wait(2000)
    
        # 重新初始化游戏
        snake_x = 50
        snake_y = 50
        snake_length = 1
        snake_direction = 'right'
        snake_list = []

    主游戏循环

    现在,我们需要将上面的所有代码整合到主游戏循环中。在每个循环中,我们将检查用户的输入,移动蛇,检测碰撞并更新游戏窗口。

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
    
        # 检测用户输入并改变蛇的方向
        keys = pygame.key.get_pressed()
        if keys[pygame.K_RIGHT]:
            snake_direction = 'right'
        if keys[pygame.K_LEFT]:
            snake_direction = 'left'
        if keys[pygame.K_UP]:
            snake_direction = 'up'
        if keys[pygame.K_DOWN
    
    ]:
            snake_direction = 'down'
    
        # 移动蛇
        if snake_direction == 'right':
            snake_x += snake_speed
        elif snake_direction == 'left':
            snake_x -= snake_speed
        elif snake_direction == 'up':
            snake_y -= snake_speed
        elif snake_direction == 'down':
            snake_y += snake_speed
    
        # 检测碰撞
        if check_collision(snake_x, snake_y, snake_list, food_x, food_y):
            game_over()
    
        # 更新蛇的位置
        snake_head = [snake_x, snake_y]
        snake_list.append(snake_head)
        if len(snake_list) > snake_length:
            del snake_list[0]
    
        # 生成新的食物
        if snake_x == food_x and snake_y == food_y:
            food_x = random.randrange(0, window_width, 10)
            food_y = random.randrange(0, window_height, 10)
            snake_length += 1
    
        # 清空游戏窗口
        window.fill(black)
    
        # 绘制蛇和食物
        draw_snake(snake_x, snake_y, snake_list)
        draw_food(food_x, food_y)
    
        pygame.display.update()

    运行游戏

    现在,你已经完成了贪吃蛇游戏的编写。要运行游戏,只需在命令行中运行你的Python脚本,你将看到一个小窗口中的贪吃蛇游戏。

    结语

    通过本教程,你学会了如何使用Python和Pygame库编写一个简单的贪吃蛇小游戏。这只是游戏开发的入门,你可以进一步扩展和改进游戏,添加更多功能和特效,使其更加有趣和挑战性。

    希望你喜欢这个项目,玩得开心!如果你有任何问题或想要了解更多游戏开发的内容,请随时留言,我们会尽力提供帮助。


    这篇文章教你如何使用Python编写一个有趣的贪吃蛇小游戏,无需编程经验,只要跟随本教程,你就能轻松创建自己的游戏。我们首先介绍了准备工作,然后详细讲解了游戏代码的编写过程,包括初始化游戏、设置游戏窗口、定义游戏颜色、蛇的初始位置和速度、蛇的初始长度和方向、主循环、绘制蛇和食物、移动蛇、检测碰撞、游戏结束以及主游戏循环。最后,我们教你如何运行游戏,并鼓励你扩展和改进游戏,添加更多功能和特效,使其更加有趣和挑战性。希望这个教程对你有所帮助,玩得开心!

  • 掌握Android短信守护艺术:Tasker垃圾短信拦截大解密!

    掌握Android短信守护艺术:Tasker垃圾短信拦截大解密!

    你刚从一天繁忙的工作中抽身,终于有时间查看手机上的信息。你的心情是兴奋的,期待的——也许有一条来自老友的信息,或者是工作上的重要通知。但是,当你打开短信应用时,你的心情瞬间凉了半截。屏幕上满是那些促销红包、退订通知,垃圾短信正不受控制地侵占你的短信收件箱。

    没关系,这篇文章就是你的救星。我们将探讨如何利用Tasker和一点JavaScript的知识来打造一个属于你的,个性化的垃圾短信拦截工具。

    准备篇:了解你的武器

    在我们进入正题之前,先来了解一下我们的“武器”—— Tasker。Tasker是一个能够帮助你自动化Android设备的强大工具。而JavaScript,则是一种常用于网页开发的编程语言,它也可以在Tasker中使用,帮助你创建复杂而强大的自动化任务。

    Tasker初识

    Tasker的主要作用是创建自动化任务,它可以监视你的手机的各种事件和状态,然后根据这些信息来执行预设的任务。在我们的场景中,我们将使用Tasker来监视收到的短信,然后根据短信内容来决定是否将其标记为垃圾信息。

    JavaScript小百科

    JavaScript是一种灵活且功能强大的编程语言。在我们的项目中,我们将使用JavaScript来分析短信内容,并根据预定义的规则来决定是否将短信移动到垃圾箱。

    实操篇:用Tasker和JavaScript建立你的垃圾短信拦截系统

    现在,我们将进入实操阶段。在这一部分,我们将指导你如何使用Tasker和JavaScript来建立你的垃圾短信拦截系统。

    1. 设置Tasker

    首先,你需要在你的Android设备上安装Tasker应用。然后,创建一个新的任务,并为其命名为“垃圾短信拦截”。

    2. 编写JavaScript代码

    现在,你需要编写JavaScript代码来分析短信内容。你可以使用以下代码作为一个起点:

    let smsContent = 你的代码来获取短信内容;
    let keywords = ["退订", "红包"];
    
    for(let i = 0; i < keywords.length; i++){
      if(smsContent.includes(keywords[i])){
        // 你的代码来将短信移动到垃圾箱
      }
    }

    3. 与Android系统接口

    这一步是我们实操的核心。首先,我们需要了解Android系统是否提供了垃圾短信处理的接口。我们可以通过查询Android官方文档或社区来找到这些信息。

    (以下结构继续按照这个模式,详细地展开每一步的具体操作和代码编写细节。)

    总结篇:回顾与展望

    在这篇文章中,我们探讨了如何使用Tasker和JavaScript来创建一个垃圾短信拦截系统。通过我们的指导,你现在应该能够自己创建一个这样的系统,来保护你的短信收件箱不被垃圾短信侵占。

    但这只是开始。你可以进一步优化你的系统,例如,添加更多的关键词,或者创建一个界面来管理这些关键词。你还可以探索Tasker的更多功能,来创建更多有用的自动化任务。

    现在,是时候把你学到的知识用于实践了。祝你好运!

  • 使用Codebook Lookup Transformer进行强大的盲目人脸修复

    使用Codebook Lookup Transformer进行强大的盲目人脸修复

    导言

    在数字时代,照片扮演着重要的角色。我们珍藏着家庭照片、旅行照片以及许多其他珍贵瞬间的图像。然而,随着时间的推移,这些照片可能会受到损坏、模糊或褪色的影响。有时候,我们渴望能够恢复这些受损的照片,使它们再次焕发生机。但是,图像修复通常需要高超的技能和专业的工具。好消息是,现在有一种令人惊叹的工具,名为Codebook Lookup Transformer,可以帮助您实现强大的盲目人脸修复,而无需深入了解图像处理。

    在本文中,我们将探讨Codebook Lookup Transformer,一个强大的人脸修复模型。我们将向您展示如何使用这个工具来修复受损的人脸图像,使它们变得清晰、生动,并且提供了一些有关配置和运行该工具的提示。

    安装与设置

    首先,确保您的计算机环境已经准备好,以便使用Codebook Lookup Transformer。以下是所需的依赖关系和安装步骤:

    1. 安装PyTorch和CUDA

    Codebook Lookup Transformer需要PyTorch(版本至少为1.7.1)和CUDA(版本至少为10.1)来运行。请确保您已正确安装它们。

    2. 安装其他依赖项

    在项目的根目录下,您可以找到一个名为requirements.txt的文件,其中列出了其他必要的Python包。您可以使用以下命令来安装它们:

    pip3 install -r requirements.txt
    python basicsr/setup.py develop
    conda install -c conda-forge dlib (仅用于dlib人脸检测或裁剪)

    快速开始

    在开始之前,您需要下载预训练模型以供后续使用。请按照以下步骤进行:

    1. 下载预训练模型

    • 下载facelib和dlib的预训练模型,您可以从Google Drive或OneDrive下载。您可以手动下载这些模型,也可以运行以下命令进行下载:
    python scripts/download_pretrained_models.py facelib
    python scripts.download_pretrained_models.py dlib (仅用于dlib人脸检测)
    • 下载Codebook Lookup Transformer的预训练模型,您可以从Google Drive或OneDrive手动下载,或者运行以下命令进行下载:
    python scripts/download_pretrained_models.py CodeFormer

    2. 准备测试数据

    将您希望修复的测试图像放入inputs/TestWhole文件夹中。如果您想测试已裁剪和对齐的人脸,请将它们放在inputs/cropped_faces文件夹中。您可以使用以下命令来获取已裁剪和对齐的人脸:

    # 您可能需要安装dlib:conda install -c conda-forge dlib
    python scripts/crop_align_face.py -i [输入文件夹] -o [输出文件夹]

    3. 进行测试

    现在,您可以使用Codebook Lookup Transformer对图像进行修复。以下是一些示例命令:

    人脸修复(对已裁剪和对齐的人脸进行修复):

    python inference_codeformer.py -w 0.5 --has_aligned --input_path [图像文件夹] | [图像路径]

    整体图像增强:

    python inference_codeformer.py -w 0.7 --input_path [图像文件夹] | [图像路径]

    视频增强(需要安装ffmpeg):

    # 对于Windows/Mac用户,请首先安装ffmpeg:conda install -c conda-forge ffmpeg
    # 对于视频剪辑
    # 视频路径应以'.mp4'|'.mov'|'.avi'结尾
    python inference_codeformer.py --bg_upsampler realesrgan --face_upsample -w 1.0 --input_path [视频路径]

    人脸颜色修复(对已裁剪和对齐的人脸进行颜色修复):

    python inference_colorization.py --input_path [图像文件夹] | [图像路径]

    人脸修复(对已裁剪和对齐的人脸进行修复,需要使用图像编辑应用程序(如Photoshop)创建的白色遮罩):

    python inference_inpainting.py --input_path [图像文件夹] | [图像路径]

    结论

    Codebook Lookup Transformer是一个强大的工具,可以帮助您修复受损的人脸图像,增强图像质量,甚至进行颜色修复。无论您是一位摄影爱好者、历史学家还是需要修复老照片的个人,这个工具都可以帮助您实现您的目标。

    现在,您可以拥有清晰、生动的人脸图像,无需专业的图像处理技能。让Codebook Lookup Transformer成为您的图像修复助手,让您的图像焕发新生!

  • 使用InstructPix2Pix学习图像编辑指令:创造性地编辑您的图像

    使用InstructPix2Pix学习图像编辑指令:创造性地编辑您的图像

    想象一下,您正在处理一张普通的照片,但您有一些特殊的编辑要求。您想把照片中的一位朋友变成一个机械人,或者将照片中的场景转换成一个未来的科幻世界。通常情况下,您可能需要具备高超的图像编辑技能或使用复杂的图像编辑软件才能实现这些效果。但是,现在有一种神奇的工具,叫做InstructPix2Pix,它可以帮助您通过简单的文字指令来完成这些图像编辑。

    InstructPix2Pix是一种基于指令的图像编辑模型,它可以根据您提供的文字指令来编辑图像。这意味着您只需要写下您想要的编辑指令,然后让InstructPix2Pix来实现它。无需复杂的图像编辑软件,无需专业的技能,只需文字即可完成创造性的图像编辑。

    在本文中,我们将向您介绍如何使用InstructPix2Pix,以及如何配置和运行它。您将学会如何将自己的照片转化为艺术品,以及如何发挥创造力,使您的图像编辑成为现实。

    步骤1:设置环境

    首先,让我们准备好使用InstructPix2Pix的环境。以下是一些步骤:

    1. 安装依赖项:为了运行InstructPix2Pix,您需要创建一个虚拟环境,并安装所需的依赖项。您可以使用conda来管理环境,以下是一些命令:
    conda env create -f environment.yaml
    conda activate ip2p
    1. 下载预训练模型:接下来,您需要下载预训练的InstructPix2Pix模型。运行以下命令:
    bash scripts/download_checkpoints.sh

    步骤2:编辑图像

    现在,您已经设置好了环境并下载了模型,让我们开始编辑您的图像。以下是一个简单的示例,演示如何使用InstructPix2Pix来编辑一张照片:

    python edit_cli.py --input imgs/example.jpg --output imgs/output.jpg --edit "将他变成一个机器人"

    在这个示例中,我们使用了edit_cli.py脚本来编辑一张名为example.jpg的照片。编辑的指令是”将他变成一个机器人”。您可以根据自己的需求更改输入图片和编辑指令。

    步骤3:高级编辑

    如果您想要更进一步的编辑,您可以使用一些高级参数来调整结果。以下是一些示例:

    python edit_cli.py --steps 100 --resolution 512 --seed 1371 --cfg-text 7.5 --cfg-image 1.2 --input imgs/example.jpg --output imgs/output.jpg --edit "将他变成一个机器人"

    在这个示例中,我们指定了编辑的步数(--steps)、分辨率(--resolution)、随机种子(--seed)以及文本和图像的权重(--cfg-text和--cfg-image)。这些参数允许您更精细地控制编辑的效果。

    步骤4:交互式编辑

    除了命令行方式,您还可以启动一个交互式的图像编辑应用程序。运行以下命令:

    python edit_app.py

    这将启动一个交互式的编辑界面,您可以在其中加载图像并编写编辑指令。这是一个更直观和有趣的方式来编辑图像。

    配置和训练InstructPix2Pix

    如果您想深入了解InstructPix2Pix的配置和训练过程,以下是一些步骤:

    1. 下载Stable Diffusion模型:InstructPix2Pix是基于Stable Diffusion模型进行微调的。您需要下载Stable Diffusion模型的检查点。运行以下命令:
    bash scripts/download_pretrained_sd.sh
    1. 配置训练参数:接下来,您需要配置训练参数。如果您要使用我们提供的数据集,可以跳过这一步。否则,您需要编辑配置文件configs/train.yaml,以指定您的数据集路径。

    2. 启动训练:最后,运行以下命令来开始训练:

    python main.py --name default --base configs/train.yaml --train --gpus 0,1,2,3,4,5,6,7

    创建自己的数据集

    如果您希望创建自己的数据集以进行训练,以下是一些步骤:

    1. 生成文本数据集:首先,您需要创建一个包含编辑指令和图像描述的文本数据集。您可以手动编写这些数据,确保它们涵盖了各种不同的编辑情况。

    2. 微调GPT-3:接下来,您需要微调一个大型语言模型,如GPT-3,以生成编辑指令和编辑后的图像描述。这需要访问OpenAI的API,并设置API密钥。

    3. 生成图像数据集:最后,您需要将文本数据集转化为图像数据集。这可以通过使用Stable Diffusion模型来实现。

    结论

    InstructPix2Pix是一个令人兴奋的工具,它使图像编辑变得更加创造性和容易。无论您是想将朋友变成机器人,

    还是创造未来科幻世界的场景,InstructPix2Pix都可以帮助您实现您的创意。不需要复杂的技能,只需一些文字指令和一张照片,您就可以创造出惊人的图像。

    现在,尽情释放您的创造力,让InstructPix2Pix成为您的图像编辑助手吧!

  • 如何使用正则表达式提取中英文混合语句中的关键词

    如何使用正则表达式提取中英文混合语句中的关键词

    你是否曾经遇到过需要从中英文混合的文本中提取关键词的情况?这个问题似乎比较复杂,但是通过合适的正则表达式规则,你可以轻松解决这个问题。在本文中,我将向你介绍如何构建正则表达式规则,以从中英文混合语句中提取关键词。

    开始之前的故事

    在某个工作场景中,你需要处理本科毕业生的毕业论文,将其中的关键词提取出来,并填充到Excel表格中。学生的关键词信息通常位于PDF文档的摘要部分,这些关键词可能包含中英文混合的文本,关键词之间用空格分隔,关键词后面有时带有冒号,有时没有。此外,每个学生的关键词数量可能不同,最多不超过6个,并且关键词的结束应该是换行符(\n)。

    使用Python中的正则表达式

    为了提取这些关键词,我们可以使用Python中的正则表达式库re。下面是一个示例代码,演示了如何使用正则表达式来提取关键词:

    import re
    
    text = "关键词:Python 多线程 目标检测 Python Flask 框架"
    
    # 构建正则表达式规则
    pattern = r'关键词[::]?\s*([^:\n]+)(?:[::]\s*([^:\n]+))?(?:[::]\s*([^:\n]+))?(?:[::]\s*([^:\n]+))?(?:[::]\s*([^:\n]+))?(?:[::]\s*([^:\n]+))?\s*\n'
    
    # 使用正则表达式进行匹配
    matches = re.search(pattern, text)
    
    if matches:
        # 提取关键词
        keywords = [match.strip() for match in matches.groups() if match]
        print(keywords)
    else:
        print("未匹配到关键词")

    这段代码首先构建了一个正则表达式规则pattern,用于匹配关键词。然后,使用re.search()函数在文本text中查找匹配项。如果找到匹配项,就提取关键词并打印出来。

    自动获取PDF文档中的关键词

    现在你知道如何使用正则表达式提取关键词了,但如何自动获取PDF文档中的文本并应用这个正则表达式呢?下面是一个简单的步骤:

    1. 使用Python的PDF库(如PyPDF2)打开PDF文档并提取文本内容。
    2. 针对每个文档中的摘要部分,应用之前定义的正则表达式规则来提取关键词。
    3. 将提取出的关键词填充到Excel表格中。

    下面是一个伪代码示例,展示了如何实现这些步骤:

    import re
    import PyPDF2
    import openpyxl
    
    # 打开PDF文档
    pdf_file = open("论文.pdf", "rb")
    pdf_reader = PyPDF2.PdfFileReader(pdf_file)
    
    # 创建Excel工作簿
    workbook = openpyxl.Workbook()
    worksheet = workbook.active
    
    # 定义正则表达式规则
    pattern = r'关键词[::]?\s*([^:\n]+)(?:[::]\s*([^:\n]+))?(?:[::]\s*([^:\n]+))?(?:[::]\s*([^:\n]+))?(?:[::]\s*([^:\n]+))?(?:[::]\s*([^:\n]+))?\s*\n'
    
    # 遍历每一页的摘要
    for page_num in range(pdf_reader.numPages):
        page = pdf_reader.getPage(page_num)
        page_text = page.extractText()
    
        # 使用正则表达式提取关键词
        matches = re.search(pattern, page_text)
        if matches:
            keywords = [match.strip() for match in matches.groups() if match]
    
            # 将关键词填充到Excel表格中
            worksheet.append(keywords)
    
    # 保存Excel文件
    workbook.save("关键词.xlsx")
    
    # 关闭PDF文件
    pdf_file.close()

    这个伪代码示例展示了如何自动获取PDF文档中的关键词并将其填充到Excel表格中。你可以根据自己的实际需求来调整代码,以适应不同的情况。

    结论

    通过构建适当的正则表达式规则,你可以轻松地从中英文混合语句中提取关键词。这在处理毕业论文或其他文档时非常有用,可以提高工作效率。希望本文对你有所帮助,祝你在处理文本数据时顺利如意!

  • 打造个性化声音转换工具 – Retrieval-based Voice Conversion WebUI

    打造个性化声音转换工具 – Retrieval-based Voice Conversion WebUI

    在数字时代,声音成为了我们生活中不可或缺的一部分。无论是在社交媒体上分享生活片段,还是在工作中使用语音助手进行沟通,声音都扮演着重要的角色。然而,有没有一次你想要改变自己的声音,让它听起来像你最喜欢的歌手或电影角色?现在,有了Retrieval-based Voice Conversion WebUI,你可以轻松实现这一愿望。

    了解项目

    Retrieval-based Voice Conversion WebUI是一个基于VITS(Variational Inference Text-to-Speech)的声音转换框架,旨在让你能够将自己的声音转换成你喜欢的声音。这个项目具有一系列强大的功能,使其成为一个引人注目的工具:

    1. 减少音调泄漏:通过使用检索集特征替换源特征,有效减少音调泄漏。
    2. 简单快捷的训练:即使在相对较差的显卡上,也可以轻松快速训练。
    3. 小数据量也能获得好结果:即使只有少量数据,也能获得相对良好的结果(建议至少10分钟的低噪声演讲)。
    4. 支持模型融合:可以通过模型融合来改变音色。
    5. 易于使用的Web界面:提供了直观的Web界面,让操作更加便捷。
    6. 使用UVR5模型分离声音和乐器:可以使用UVR5模型迅速分离声音和乐器。
    7. 使用高音提取算法:采用了最强大的高音提取算法InterSpeech2023-RMVPE,避免了消声问题,并且速度更快,资源消耗更低。
    8. 支持多种图形卡加速:包括Nvidia、AMD、Intel ARC等图形卡的加速。

    项目准备

    在开始使用Retrieval-based Voice Conversion WebUI之前,你需要做一些准备工作。以下是准备环境的步骤:

    1. 安装Python 3.8或更高版本。
    2. 安装PyTorch相关核心依赖项(如果未安装)。
      pip install torch torchvision torchaudio
    3. 使用Poetry工具或pip安装其他依赖项,具体取决于你的显卡类型。
      • Nvidia显卡:
        pip install -r requirements.txt
      • AMD/Intel显卡:
        pip install -r requirements-dml.txt
      • Intel ARC显卡(在Linux / WSL上使用Python 3.10):
        pip install -r requirements-ipex.txt
    4. 如果你是Mac用户,可以通过运行sh ./run.sh来安装依赖项。

    准备预训练模型

    Retrieval-based Voice Conversion需要一些预训练模型来进行推断和训练。你需要从项目的Huggingface空间下载这些模型和其他文件。以下是需要的文件列表:

    • ./assets/hubert/hubert_base.pt
    • ./assets/pretrained
    • ./assets/uvr5_weights

    如果你想测试模型的v2版本,还需要下载以下文件:

    • ./assets/pretrained_v2

    如果你使用Windows,可能还需要下载以下两个文件,如果已安装FFmpeg和FFprobe则可以跳过:

    如果要使用最新的SOTA RMVPE声音音高提取算法,你需要下载RMVPE权重并将其放置在RVC根目录中,具体下载链接请参考项目文档。

    对于AMD/Intel显卡用户,还需要下载相应的权重文件,具体下载链接请参考项目文档。

    对于Intel ARC显卡用户,在启动WebUI之前需要运行source /opt/intel/oneapi/setvars.sh命令。

    最后,使用以下命令启动WebUI:

    python infer-web.py

    如果你使用Windows或macOS,你可以下载并解压RVC-beta.7z文件,然后在Windows上使用go-web.bat,在macOS上使用sh ./run.sh来直接使用RVC。

    结语

    Retrieval-based Voice Conversion WebUI是一个令人兴奋的项目,它为你提供了一个独特的方式来改变你的声音,创造出个性化的音频体验。无论是用于娱乐、创意制作还是其他用途,这个项目都能为你带来无限可能。不要犹豫,立即尝试吧!

  • 揭秘大型语言模型:如何与其合作创造奇迹

    揭秘大型语言模型:如何与其合作创造奇迹

    有一天,当你在寻找解决方案来提升你的应用程序、创造新的创意或解决难题时,你听说了大型语言模型。这些强大的模型可以像魔法一样将文本转化为文本,只需提供一段文字输入,它们就会预测接下来应该出现的文本。你开始好奇,这些大型语言模型究竟是如何工作的,以及如何与它们合作来实现你的愿望?

    开篇故事:探索大型语言模型的神奇世界

    在一个创意迸发的夜晚,你坐在电脑前,试图找到一种方法来自动化你的写作工作。你曾听说过大型语言模型,知道它们有着无限的潜力,能够帮助你完成这一任务。但是,你也对这些模型的工作原理感到好奇。

    突然,你决定深入研究这个问题。你开始阅读关于大型语言模型的文章,从中获得了一些关键信息。

    大型语言模型是如何工作的?

    大型语言模型本质上是一种函数,将文本映射到文本。它们通过学习大量文本数据,努力最小化预测错误,从而获得了各种有用的语言处理能力。这些能力包括拼写、语法、改写、回答问题、进行对话、多语言写作、编程等等。令人惊奇的是,所有这些能力都是在训练过程中逐渐学习而来的,而不是事先硬编码的。

    例如,大型语言模型能够像一个拼写检查器一样纠正拼写错误,能够理解和生成自然语言,能够进行各种自然语言处理任务。这些能力的发展是通过大型数据集上的训练而实现的,模型通过不断尝试来提高自己的预测准确性,最终获得了这些有用的技能。

    如何与大型语言模型合作

    既然你对大型语言模型的工作原理有了一定了解,接下来让我们看看如何与这些模型合作,以实现你的目标。在与大型语言模型合作时,其中最重要的输入是文本提示。

    控制大型语言模型的关键:文本提示

    大型语言模型的输出受到文本提示的极大影响。你可以通过以下几种方式来引导大型语言模型生成你想要的输出:

    1. 指令提示

    一种常见的方式是使用指令提示。某些模型特别设计用于遵循指令,你只需在提示的顶部(或底部,或两者都有)写下你的指令,模型会尽力遵循这些指令并生成相应的输出。指令可以非常详细,所以你可以写一个详细的段落来明确描述你想要的输出。

    示例指令提示:

    “从以下引语中提取作者的名字。

    ‘有些人理论认为,智能物种在扩展到外太空之前就会灭绝。如果他们是正确的,那么夜空的寂静就是坟墓的寂静。’
    ― Ted Chiang,《呼气》”

    输出:

    Ted Chiang

    2. 完成提示

    完成式提示充分利用了大型语言模型试图生成最可能出现的文本的特点。你可以开始一个模式或句子,以引导模型生成你想要的输出。相对于指令提示,这种方式可能需要更多的关心和实验,因为模型不一定知道在哪里停止生成文本,所以你通常需要使用停止序列或后处理来截断生成的文本,以保持所需的输出。

    示例完成提示:

    “有些人理论认为,智能物种在扩展到外太空之前就会灭绝。如果他们是正确的,那么夜空的寂静就是坟墓的寂静。”
    ― Ted Chiang,《呼气》

    这个引语的作者是谁?
    输出:

    Ted Chiang

    3. 演示提示(少样本学习)

    演示提示是另一种方式,你可以在其中向模型展示你想要它执行的任务。这种方法有时被称为少样本学习,因为模型只需从提示中提供的少数示例中学习。你可以在提示中展示一些示例,让模型明白你的意图。

    示例演示提示:

    引用:
    “当推理思维被迫一次又一次地面对不可能的事情时,它别无选择,只能适应。”
    ― N.K. Jemisin,《第五季》
    作者:N.K. Jemisin

    引用:
    “有些人理论认为,智能物种在扩展到外太空之前就会灭绝。如果他们是正确的,那么夜空的寂静就是坟墓的寂静。”
    ― Ted Chiang,《呼气》
    作者:

    输出:

    Ted Chiang

    4.

    微调提示

    通过提供足够的训练示例,你可以微调一个定制模型。在这种情况下,指令变得不再必要,因为模型可以从提供的训练数据中学习任务。然而,你仍可以使用分隔符序列(例如->或###或任何不常出现在你的输入中的字符串)来告诉模型何时停止生成提示文本并开始生成输出。这有助于确保模型不会继续详细解释输入文本,而是开始生成你想要看到的答案。

    示例微调提示(针对已经在类似提示完成对中进行了自定义训练的模型):

    “有些人理论认为,智能物种在扩展到外太空之前就会灭绝。如果他们是正确的,那么夜空的寂静就是坟墓的寂静。”
    ― Ted Chiang,《呼气》

    输出:

    Ted Chiang

    大型语言模型的代码能力

    除了处理文本外,大型语言模型还可以擅长处理代码。OpenAI的专业代码模型被称为Codex。

    Codex驱动了70多种产品,包括:

    • GitHub Copilot(在VS Code和其他IDE中自动补全代码)
    • Pygma(将Figma设计转化为代码)
    • Replit(具有“解释代码”按钮和其他功能)
    • Warp(智能终端,具备AI命令搜索功能)
    • Machinet(编写Java单元测试模板)

    请注意,与遵循指令的文本模型不同,Codex并没有专门训练来遵循指令,因此设计良好的提示可能需要更多的关注。

    更多提示建议

    在与大型语言模型合作时,输入提示是提高模型输出质量的关键。你可以尝试一些技巧来改进模型的输出:

    • 提供更明确的指令。例如,如果你想要生成一个逗号分隔的列表,可以要求它返回一个逗号分隔的列表。如果你希望它在不知道答案时说“我不知道”,可以告诉它,“如果你不知道答案,请说‘我不知道’”。
    • 提供更好的示例。如果在提示中演示示例,请确保示例多样化且高质量。
    • 要求模型像专家一样回答。明确要求模型产生高质量的输出或像专家写的输出,可以促使模型提供更高质量的答案。
    • 引导模型写下解释其推理过程的步骤。在最终答案之前,要求模型提供其推理过程的解释步骤,这可以增加最终答案的一致性和正确性。

    结语

    大型语言模型为我们提供了强大的工具,可以应用于各种领域,从文本处理到代码生成。通过本文,你已经了解了这些模型的工作原理以及如何与它们合作来实现你的目标。希望这篇文章能帮助你更好地利用大型语言模型,创造出更多令人印象深刻的作品和解决方案。

    如果你有任何问题或需要更多帮助,不要犹豫,随时向OpenAI社区或文档寻求支持。祝愿你在与大型语言模型的合作中取得巨大成功!

  • Windows环境变量:深度解析与高效管理

    Windows环境变量:深度解析与高效管理

    你是否曾经好奇过计算机系统是如何存储重要的配置信息的?在Windows操作系统中,环境变量是一个神秘而强大的机制,它们扮演着管理系统和应用程序设置的关键角色。本篇文章将带你深入了解环境变量的概念、不同类型、设置方法以及如何在编程中巧妙运用它们。

    环境变量:穿越计算机世界的密令

    首先,让我们来揭开环境变量的神秘面纱。环境变量是一种保存在计算机内存中的特殊变量,它们的价值在于可以在整个操作系统和应用程序之间分享。这些变量通常由操作系统或应用程序定义,并在系统启动时自动加载到内存中。通过访问这些变量,你可以轻松地获取系统和应用程序的各种信息,如安装路径、配置文件位置等。总之,环境变量是计算机系统和应用程序之间信息传递的桥梁。

    环境变量的两大类型

    在Windows中,环境变量分为两种主要类型:系统环境变量和用户环境变量。下面我们来深入了解这两者的区别和用途。

    1. 系统环境变量

    系统环境变量是全局的,它们适用于所有用户和应用程序。这些变量存储在Windows注册表中,并在系统启动时自动加载到内存中。通常,系统环境变量用于存储系统级别的配置信息,如Windows安装目录、临时文件夹路径等。这意味着无论谁登录系统,都可以访问和使用这些变量。

    2. 用户环境变量

    与系统环境变量不同,用户环境变量仅适用于当前登录的用户。它们也存储在Windows注册表中,但在用户登录时才会加载到内存中。用户环境变量通常用于存储个性化的用户配置信息,如桌面背景、启动菜单项等。这些变量只对当前用户可见,不会影响其他用户的配置。

    如何设置和访问环境变量

    既然我们了解了环境变量的类型,现在让我们看看如何设置和访问它们。在Windows中,有多种方式可以执行这些操作。

    1. 控制面板

    控制面板提供了一个直观的界面,让你可以轻松设置环境变量。以下是步骤:

    • 打开控制面板。
    • 选择”系统”。
    • 点击”高级系统设置”。
    • 在弹出的窗口中,点击”环境变量”按钮。

    在这里,你可以设置系统环境变量和用户环境变量,添加新的变量或编辑已有的变量。

    2. 命令行

    命令行是高级用户和程序员的首选工具之一。你可以使用set命令在命令行中设置环境变量。以下是示例:

    set MYVAR=Hello World

    这个命令将名为MYVAR的环境变量设置为”Hello World”。要在命令行中查看环境变量的值,可以使用echo命令,例如:

    echo %MYVAR%

    3. 注册表

    如果你喜欢深入挖掘,环境变量也可以在Windows注册表中进行设置。系统环境变量存储在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment路径下,而用户环境变量存储在HKEY_CURRENT_USER\Environment路径下。不过,请注意,在注册表中操作需要小心谨慎,不建议直接编辑注册表,除非你非常了解它的运作机制。

    4. 编程中的操作

    如果你是程序员,可能会在代码中设置和访问环境变量。在C/C++代码中,你可以使用标准库函数std::putenv来设置环境变量的值,例如:

    #include <cstdlib>
    
    int main() {
        std::putenv("MY_VAR=my_value");
        return 0;
    }

    要获取环境变量的值,你可以使用std::getenv函数,例如:

    char* value = std::getenv("MYVAR");
    if (value != NULL) {
        printf("MYVAR=%s\n", value);
    }

    结论

    Windows环境变量是一个强大而灵活的机制,可帮助我们管理系统和应用程序的配置信息。通过设置和访问环境变量,我们可以更轻松地管理和配置系统。无论你是系统管理员、开发人员还是普通用户,了解如何操作环境变量都将提高你在Windows操作系统中的技能。所以,现在就勇敢地探索和管理你的Windows环境变量,让计算机工作更高效!