1. AidLux 平台介绍
AidLux 是一款融合架构操作系统,为单一 ARM 设备提供同时运行 Android 和 Linux 环境的能力。其独特之处在于非虚拟机方式实现双系统融合并行,使用户能够在完整的用户体验下无缝切换 Android 和 Linux 系统,而无需重启设备。
主要特点:
-
双系统并行运行: 提供 Android 和 Linux 双系统的完整用户体验,用户可以在两个系统之间自由切换。
-
非虚拟机模式: 使用原生方式实现双系统切换,确保系统的稳定性。
-
支持多系统及互调: 支持 Android、鸿蒙和 Linux 三个系统,并提供互相调用的 API,降低双生态应用适配成本。
-
内核级访问调用: 提供内核级别的互相访问调用,增强系统的灵活性和交互性。
-
丰富的开发部署工具链支持: 提供多种开发工具链,支持用户安装运行海量 Linux 软件、编程语言及框架。
-
应用中心和命令行输入: 用户可以通过应用中心或命令行输入的方式进行软件的安装和运行。
2. 基于 AIMO 的模型转换
Al Model Optimizer(AIMO)是一项在边缘端芯片上进行机器学习模型转换、部署和运行的工具。通过 AIMO,用户能够在不损失精度的情况下,快速将各种机器学习模型迁移到边缘设备上运行。
AIMO 的特点:
-
网页交互: AIMO 以网页的形式与用户进行交互,用户只需上传模型并设置相关选项,即可快速完成模型的转换。
-
支持多种模型: AIMO 提供对各种机器学习模型的支持,使用户能够轻松迁移不同类型的模型。
-
试用账号和密码: AIMOTC001, AIMOTC001
3. 代码分析与实现
上述介绍的智慧教育版面分析应用基于 AidLux 平台,结合了布局引擎和 OCR 技术。以下是代码的主要流程:
-
PDF 转图片: 使用 PyMuPDF 库将输入的 PDF 文件转换为图片,保存在指定目录。
-
版面检测: 使用 AidLux 的布局引擎模块对每张图片进行版面检测,获取教材中各种元素的位置信息。
-
文本检测和识别: 利用 AidLux 的 OCR 引擎进行文本检测和识别,获取文本内容及其位置信息。
-
写入 Word 文档: 根据版面信息和文本内容,将图像、表格等元素裁剪保存,并将文本按照版面顺序写入 Word 文档。
通过结合 AidLux 提供的双系统融合技术和 AIMO 的模型转换工具,实现了在边缘设备上进行智慧教育版面分析的全流程。
4.智慧教育版面分析应用实例解析
在这个实例中,我们通过 Python 代码展示了一个基于 AidLux 平台的智慧教育版面分析应用。以下是对代码的详细解析和分析。
from layout_engine import * # cap = cvs.VideoCapture() if __name__ == "__main__": print("----------------------------- 相关配置 --------------------------------") # 加载检测和识别模型 OCR_model = OcrEngine() layout_model = predictor.load_layout_model() print("-->模型加载成功") # 输入的 PDF 路径 pdf_path = "inputs/paper1.pdf" pdf_name = pdf_path.split("/")[-1].split(".pdf")[0] print("----------------------------- PDF 转图片 --------------------------") # 获取当前请求时间 ti = time.localtime() date = f"{ti[0]}_{ti[1]}_{ti[2]}" uid = uuid.uuid4().hex[:10] # 需要储存图片的目录 imagePath = f"outputs/pdf/{ti[0]}_{ti[1]}_{ti[2]}_{ti[3]}_{ti[4]}_{ti[5]}_{uid}" os.makedirs(imagePath, exist_ok=True) pyMuPDF_fitz(pdf_path, imagePath) # 创建一个 doc 文档,用于后续填充内容 doc = docx.Document() default_section = doc.sections[0] default_section.page_width = Cm(21) default_section.page_height = Cm(30) pdf_image_path_list = os.listdir(imagePath) # os.listdir 的数字从小到大排序 pdf_image_path_list.sort(key=lambda x: int(x[:-4])) img_num = 0 for pdf_image in tqdm.tqdm(pdf_image_path_list): print("----------------------------- 版面检测--------------------------") pdf_image_path = os.path.join(imagePath, pdf_image) im_cv2 = cv2.imread(pdf_image_path) im_b64 = np2base64(im_cv2) layout_result, results = predictor.layout_predict(layout_model, im_b64) results = results[0].plot() # 填充图像、表格、页眉、页脚区域为白色,避免文本 OCR 的干扰 im_cv2_plot = im_cv2.copy() for item in layout_result: points = item.values() for point in points: im_cv2_plot = cv2.rectangle(im_cv2_plot, (point[0], point[1]), (point[2], point[3]), (255, 255, 255), -1) print("----------------------------- 文本检测和识别--------------------------") img_draw, result_list = OCR_model.text_predict(im_cv2_plot, 960) # 文本检测和识别 # 将绘制后的图片从 BGR 格式转换为 RGB 格式 img_draw_PIL = Image.fromarray(cv2.cvtColor(results, cv2.COLOR_BGR2RGB)) ocr_result = [] for result in result_list: ocr_dict = {} box, text = result[0].tolist(), result[1] box_xy = [box[0][0], box[0][1], box[2][0], box[2][1]] ocr_dict[text] = box_xy ocr_result.append(ocr_dict) img_draw_PIL = cv2ImgAddText(img_draw_PIL, text, box[0][0], box[0][1]) img_draw_cv = cv2.cvtColor(np.asarray(img_draw_PIL), cv2.COLOR_RGB2BGR) # cvs.imshow(img_draw_cv) cv2.imwrite(f"outputs/plot/{img_num}.jpg", img_draw_cv) img_num = img_num + 1 print("----------------------------- 写入 Word--------------------------") # 图片和文本行按照 y 轴方向进行排序(单栏适用,多栏请先做好分栏操作) final_result = ocr_result + layout_result final_result_sort = sorted(final_result, key=lambda x: x[list(x.keys())[0]][1]) for item in final_result_sort: keys_list = item.keys() for key in keys_list: # 对图片和表格进行处理:裁剪-->保存-->写入 Word 文档 if key in ["Figure", "Table"]: points = item[key] crop_img = im_cv2[points[1]:points[3], points[0]:points[2]] uid = uuid.uuid4().hex[:10] name = f"{ti[0]}_{ti[1]}_{ti[2]}_{ti[3]}_{ti[4]}_{ti[5]}_{uid}" crop_img_path = f"outputs/crop/{name}.jpg" cv2.imwrite(crop_img_path, crop_img) doc.add_picture(crop_img_path, width=Cm(11)) # 对页眉和页脚不做写入操作,跳过 elif key in ["Header", "Footer"]: continue # 对其他情况(Text 正文部分):保存并设置字体和大小 else: paragraph = doc.add_paragraph() run = paragraph.add_run(key) font = run.font font.name = 'Times New Roman' font.size = docx.shared.Pt(11) # 保存文档 word_name = f"{pdf_name}_{ti[0]}_{ti[1]}_{ti[2]}_{ti[3]}_{ti[4]}_{ti[5]}_{uid}" word_path = f'outputs/words/{word_name}.docx' doc.save(word_path) print("Done!")
代码解析
-
加载模型: 通过
OCR_model = OcrEngine()
和layout_model = predictor.load_layout_model()
分别加载文本检测和识别模型以及版面检测模型。 -
PDF 转图片: 使用 PyMuPDF 库将 PDF 转换为图片,并按照时间戳创建输出目录。
-
版面检测: 利用 AidLux 提供的版面检测模型对每张图片进行分析,获取各元素的位置信息。
-
文本检测和识别: 利用 AidLux 的 OCR 引擎对处理后的图片进行文本检测和识别。
-
写入 Word 文档: 将检测结果按照版面顺序写
入 Word 文档,包括对图像和表格的处理。
-
保存结果: 最终将生成的 Word 文档保存在指定目录。
这个实例结合了多个技术,包括 AidLux 平台的模型加载、PDF 转图片、版面检测、文本检测与识别,以及 Word 文档的生成。整个流程展示了如何在智慧教育领域应用这些技术,为教育内容的智能处理提供了一种解决方案。
5.基于AidLux的版面分析应用
视频: https://www.bilibili.com/video/BV1CV411R7M6/?share_source=copy_web&vd_source=7050d963fe40d31ae959bb792350a7bb