detectron2中save_text_instance_predictions⭐

save_text_instance_predictions

  • demo.py中修改
    • 关于路径
      • os.path.join()函数用于路径拼接文件路径,可以传入多个路径
      • os.path.basename(path)就是给定一串路径的最终找到的那个文件
      • python官方文档链接
    • 将 Python 对象序列化为 JSON 字符串
      • with open 打开文件,并以写入模式 **创建或覆盖 ** 文件
      • 使用 json.JSONEncoder() 方法
      • dump、dumps序列化为json格式和序列化为json字符串,区别?(用到再说)
        • 保存列表为.txt文件
        • python对CSV、Excel、txt、dat、mat文件的处理
      • python将数据保存为json文件时,打开json文件里面的中文发现是unicode码
      • with open(os.path.join(args.output, "data.json"), "a") as file: 读写文件参数
    • predictor.py
    • visualizer.py中save_text_instance_predictions(deepsolo/adet/visualizer.py,import了 detectron2的visualizer.py⭐

demo.py中修改

import json

## 生成json格式的数据
class Result:
    def __init__(self, id, image, value):
        self.id = id
        self.image = image
        self.value = value


def result_encoder(obj):
    if isinstance(obj, Result):
        return {'id': obj.id, 'image': obj.image, 'value': obj.value}
    return json.JSONEncoder.default(obj)
    

    visualized_output.save(out_filename)
    #predictions.save(out_filename)
    #print(predictions)
    res = Result(os.path.basename(path), out_filename, text_output)
    with open(os.path.join(args.output, "data.json"), "a", encoding="utf8") as file:
        json.dump(result_encoder(res), file, ensure_ascii=False, indent=4)

关于路径

assert os.path.isdir(args.output), args.output 
	out_filename = os.path.join(args.output, os.path.basename(path))

Python编程语言判断是否是目录

在Python编程语言中可以使用os.path.isdir()函数判断某一路径是否为目录。其函数原型如下所示。

os.path.isdir(path) 

其参数含义如下。path 要进行判断的路径。以下实例判断E:\book\temp是否为目录。

>>> import os  
>>> os.path.isdir('E:\\book\\temp') 

判断E:\book\temp是否为目录

True 表示 E:\book\temp是目录,注意力 python里面是True不是true

os.path.join()函数用于路径拼接文件路径,可以传入多个路径

>>> import os
>>> print(os.path.join('path','abc','yyy'))
path\abc\yyy

os.path.basename(path)就是给定一串路径的最终找到的那个文件

在这里插入图片描述
在这里插入图片描述
来个例子

import os
# --------------------------------------------------------#
filePath = r"D:\Python\Python35\Lib\site-packages\jieba\analyse\idf.txt"
print('路径为:',filePath)
print(os.path.basename(filePath))
print(os.path.dirname(filePath))
# --------------------------------------------------------#
filePath = r'D:\Python\Python35\Lib\site-packages\jieba'
print('路径为:',filePath)
print(os.path.basename(filePath))
print(os.path.dirname(filePath))

输出

路径为: D:\Python\Python35\Lib\site-packages\jieba\analyse\idf.txt
idf.txt
D:\Python\Python35\Lib\site-packages\jieba\analyse
路径为: D:\Python\Python35\Lib\site-packages\jieba
jieba
D:\Python\Python35\Lib\site-packages
————————————————

原文链接:https://blog.csdn.net/m0_46653437/article/details/115876616

python官方文档链接

将 Python 对象序列化为 JSON 字符串

with open 打开文件,并以写入模式 **创建或覆盖 ** 文件

这段很基础对我很重要,一开始在想,是否需要手动创建之后才能with open……,如果不存在,会自动创建

import json

# 创建一个字典对象


data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

# 打开文件,并以写入模式创建或覆盖文件
with open("data.json", "w") as file:
    # 将字典对象转换为JSON格式并写入文件
    json.dump(data, file)

上述代码将创建一个名为data.json的JSON文件,并将data字典对象写入文件中。如果你想要格式化输出的JSON文件,使其更易读,你可以使用indent参数指定缩进级别,如下所示:

import json

data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

with open("data.json", "w") as file:
    json.dump(data, file, indent=4)

作者:百科全书77
链接:https://www.zhihu.com/question/631483792/answer/3299538515
来源:知乎

使用 json.JSONEncoder() 方法

我们还可以使用 json.JSONEncoder() 方法来创建自定义的编码器,将 Python 对象序列化为 JSON 字符串,然后将其写入文件。以下是一个示例:

import json
 
class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city
 
def person_encoder(obj):
    if isinstance(obj, Person):
        return {'name': obj.name, 'age': obj.age, 'city': obj.city}
    return json.JSONEncoder.default(obj)
 
person = Person('John', 30, 'New York')
 
with open('data.json', 'w') as f:
    json_str = json.dumps(person, default=person_encoder)
    f.write(json_str)

在这个示例中,我们首先定义了一个自定义的类 Person,然后定义了一个自定义的编码器 person_encoder,将 Person 对象序列化为 JSON 格式。最后,我们使用 json.dumps() 方法将 Person 对象序列化为 JSON 字符串,并将其写入文件 data.json 中。

原文链接:Python 如何创建 json 文件?

dump、dumps序列化为json格式和序列化为json字符串,区别?(用到再说)

import json
 
data = {'name': 'John', 'age': 30, 'city': 'New York'}
 
with open('data.json', 'w') as f:
    json.dump(data, f)

在这个示例中,我们使用了 json.dump() 方法将 Python 字典对象 data 序列化为 JSON 格式,并将其写入到文件 data.json 中。

除了使用 json.dump() 方法直接将 Python 对象写入到文件中,我们还可以使用 json.dumps() 方法将 Python 对象序列化为 JSON 字符串,然后将其写入文件。以下是一个示例:

import json
 
data = {'name': 'John', 'age': 30, 'city': 'New York'}
 
with open('data.json', 'w') as f:
    json_str = json.dumps(data)
    f.write(json_str)

在这个示例中,我们首先使用 json.dumps() 方法将 Python 字典对象 data 序列化为 JSON 字符串,然后使用文件对象的 write() 方法将其写入文件 data.json 中。
在这里插入图片描述
python中dict和json的转换以及读取json文件
python 把字典转json
将dict类型变量转换为json存在dump和dumps两个方法
dump将dict转换为str类型
注意
如果想将dict输出到文件中,直接用dumps即可,如果先dump再dumps就会输出一整个字符串,因为有引号的存在并不是正常的json格式

保存列表为.txt文件
#1/list写入txt

ipTable = ['158.59.194.213', '18.9.14.13', '58.59.14.21']  
fileObject = open('sampleList.txt', 'w')  
for ip in ipTable:  
    fileObject.write(ip)  
    fileObject.write('\n')  
fileObject.close()  

python对CSV、Excel、txt、dat、mat文件的处理

python将数据保存为json文件时,打开json文件里面的中文发现是unicode码

开保存之后的json文件发现除了字母,原来的字典数据里面的中文全部变成了unicode码,像下面这个样子
在这里插入图片描述

Python 使用 json.dump() 保存文件时中文会变成 Unicode。在打开写出文件时加入 encoding="utf8",在dump时加入 ensure_ascii=False 即可解决。

city_list = [{"name": "黑龙江呼玛", "lon": 126.6, "lat": 51.72}, 
			/{"name": "黑龙江塔河", "lon": 124.7, "lat": 52.32}, 
			/{"name": "黑龙江漠河", "lon": 122.37, "lat": 53.48}]
f = open("city.json", "w", encoding="utf8")
json.dump(city_list, f, ensure_ascii=False)

总结一下:

1、python3里面默认编码是unicode

2、做dump与dumps操作时,会默认将中文转换为unicode,但在做逆向操作load和loads时会转换为中文,但是中间态(例如存储的json文件)的中文编码方式仍然是unicode

解决办法:
在dump里面添加ensure_ascii=False
原文链接

with open(os.path.join(args.output, “data.json”), “a”) as file: 读写文件参数

在这里插入图片描述
Python实现将内容写入文件的五种方法总结

predictor.py

def run_on_image(self, image):

……
 else:
     if "sem_seg" in predictions:
          vis_output = visualizer.draw_sem_seg(
              predictions["sem_seg"].argmax(dim=0).to(self.cpu_device))
      if "instances" in predictions:
          instances = predictions["instances"].to(self.cpu_device)
          vis_output = visualizer.draw_instance_predictions(predictions=instances)
          
  text_output = visualizer.save_text_instance_predictions(predictions=instances)

  return predictions, vis_output,text_output

追溯到 visualizer.py写的save_text_instance_predictions 函数

visualizer.py中save_text_instance_predictions(deepsolo/adet/visualizer.py,import了 detectron2的visualizer.py⭐

class TextVisualizer(Visualizer):
……

    def _ctc_decode_recognition(self, rec):
        last_char = '###'
        s = ''
        for c in rec:
            c = int(c)
            if c < self.voc_size - 1:
                if last_char != c:
                    if self.voc_size == 37 or self.voc_size == 96:
                        s += self.CTLABELS[c]
                        last_char = c
                    else:
                        s += str(chr(self.CTLABELS[c]))
                        last_char = c
            else:
                last_char = '###'
        return s

    def draw_instance_predictions(self, predictions):
        ctrl_pnts = predictions.ctrl_points.numpy()
        scores = predictions.scores.tolist()
        recs = predictions.recs
        bd_pts = np.asarray(predictions.bd)

        self.overlay_instances(ctrl_pnts, scores, recs, bd_pts)

        return self.output
    def overlay_instances(self, ctrl_pnts, scores, recs, bd_pnts, alpha=0.4):
        colors = [(0,0.5,0),(0,0.75,0),(1,0,1),(0.75,0,0.75),(0.5,0,0.5),(1,0,0),(0.75,0,0),(0.5,0,0),
        (0,0,1),(0,0,0.75),(0.75,0.25,0.25),(0.75,0.5,0.5),(0,0.75,0.75),(0,0.5,0.5),(0,0.3,0.75)]
        fg=True
        for ctrl_pnt, score, rec, bd in zip(ctrl_pnts, scores, recs, bd_pnts):
            color = random.choice(colors)

            # draw polygons
            if bd is not None:
                bd = np.hsplit(bd, 2)
                bd = np.vstack([bd[0], bd[1][::-1]])
                self.draw_polygon(bd, color, alpha=alpha)

            # draw center lines
            line = self._process_ctrl_pnt(ctrl_pnt)
            line_ = LineString(line)
            center_point = np.array(line_.interpolate(0.5, normalized=True).coords[0], dtype=np.int32)
            # self.draw_line(
            #     line[:, 0],
            #     line[:, 1],
            #     color=color,
            #     linewidth=2
            # )
            # for pt in line:
            #     self.draw_circle(pt, 'w', radius=4)
            #     self.draw_circle(pt, 'r', radius=2)

            # draw text
            text = self._ctc_decode_recognition(rec)

            if self.voc_size == 37:
                text = text.upper()
            # text = "{:.2f}: {}".format(score, text)
            text = "{}".format(text)
            
            lighter_color = self._change_color_brightness(color, brightness_factor=0)
            if bd is not None:
                text_pos = bd[0] - np.array([0,15])
            else:
                text_pos = center_point
            horiz_align = "left"
            font_size = self._default_font_size
            self.draw_text(
                        text,
                        text_pos,
                        color=lighter_color,
                        horizontal_alignment=horiz_align,
                        font_size=font_size,
                        draw_chinese=False if self.voc_size == 37 or self.voc_size == 96 else True
                    )


    def draw_text(
        self,
        text,
        position,
        *,
        font_size=None,
        color="g",
        horizontal_alignment="center",
        rotation=0,
        draw_chinese=False
    ):
        """
        Args:
            text (str): class label
            position (tuple): a tuple of the x and y coordinates to place text on image.
            font_size (int, optional): font of the text. If not provided, a font size
                proportional to the image width is calculated and used.
            color: color of the text. Refer to `matplotlib.colors` for full list
                of formats that are accepted.
            horizontal_alignment (str): see `matplotlib.text.Text`
            rotation: rotation angle in degrees CCW
        Returns:
            output (VisImage): image object with text drawn.
        """
        if not font_size:
            font_size = self._default_font_size

        # since the text background is dark, we don't want the text to be dark
        color = np.maximum(list(mplc.to_rgb(color)), 0.2)
        color[np.argmax(color)] = max(0.8, np.max(color))
        
        x, y = position
        if draw_chinese:
            font_path = "./simsun.ttc"
            prop = mfm.FontProperties(fname=font_path)
            self.output.ax.text(
                x,
                y,
                text,
                size=font_size * self.output.scale,
                family="sans-serif",
                bbox={"facecolor": "white", "alpha": 0.8, "pad": 0.7, "edgecolor": "none"},
                verticalalignment="top",
                horizontalalignment=horizontal_alignment,
                color=color,
                zorder=10,
                rotation=rotation,
                fontproperties=prop
            )
        else:
            self.output.ax.text(
                x,
                y,
                text,
                size=font_size * self.output.scale,
                family="sans-serif",
                bbox={"facecolor": "white", "alpha": 0.8, "pad": 0.7, "edgecolor": "none"},
                verticalalignment="top",
                horizontalalignment=horizontal_alignment,
                color=color,
                zorder=10,
                rotation=rotation,
            )
        return self.output

结合这几段,按图索骥,
overlay_instances函数里的

for ctrl_pnt, score, rec, bd in zip(ctrl_pnts, scores, recs, bd_pnts):
……
text = self._ctc_decode_recognition(rec)

总之就是模仿draw_instance_predictions添加了一个函数save_text_instance_predictions

    def save_text_instance_predictions(self, predictions):
        recs = predictions.recs
        text_output = ""
        for rec in recs:
            text_output = text_output + ' ' + self._ctc_decode_recognition(rec)
            
        return text_output   

就是不知道return self.output有什么特别含义,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/236884.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PostGIS学习教程十三:几何图形创建函数

PostGIS学习教程十三&#xff1a;几何图形创建函数 目前我们看到的所有函数都可以处理已有的几何图形并返回结果&#xff1a; 分析几何图形&#xff08;ST_Length(geometry), ST_Area(geometry)) 几何图形的序列化&#xff08;ST_AsText(geometry), ST_AsGML(geometry)) 选取…

动态规划_不同路径||

//一个机器人位于一个 // m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 // // 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 // // 现在考虑网格中有障碍物。那么…

坚守数字化创新烽火之地 百望云入选新华社“品牌信用建设典型案例”

潮起海之南&#xff0c;风好正扬帆。2023年12月2日-5日&#xff0c;南海之滨&#xff0c;由新华通讯社、海南省人民政府、中国品牌建设促进会主办的主题为“聚焦新质生产力&#xff0c;增强发展新动能”的2023中国企业家博鳌论坛在海南博鳌隆重举行。 群贤毕至&#xff0c;高朋…

vue零基础

vue 与其他框架的对比 框架设计模式数据绑定灵活度文件模式复杂性学习曲线生态VueMVVM双向灵活单文件小缓完善ReactMVC单向较灵活all in js大陡丰富AngularMVC双向固定多文件较大较陡&#xff08;Typescript&#xff09;独立 更多对比细节&#xff1a;vue 官网&#xff1a;ht…

银河麒麟v10系统SSH远程管理及切换root用户的操作方法

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Linux》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一…

深入解析C++中的虚函数和虚继承:实现多态性与继承关系的高级特性

这里写目录标题 虚函数虚函数实现动态绑定虚继承抽象类 虚函数 虚函数是在C中用于实现多态性的一种特殊函数。它通过使用关键字"virtual"进行声明&#xff0c;在基类中定义&#xff0c;可在派生类中进行重写。虚函数允许在运行时根据对象的实际类型来调用相应的函数…

在HarmonyOS上使用ArkUI实现计步器应用

介绍 本篇Codelab使用ArkTS语言实现计步器应用&#xff0c;应用主要包括计步传感器、定位服务和后台任务功能&#xff1a; 通过订阅计步器传感器获取计步器数据&#xff0c;处理后显示。通过订阅位置服务获取位置数据&#xff0c;处理后显示。通过服务开发实现后台任务功能。…

MySQL使用教程

数据构成了我们日益数字化的社会基础。想象一下&#xff0c;从移动应用和银行系统到搜索引擎&#xff0c;再到如 ChatGPT 这样的先进人工智能聊天机器人&#xff0c;这些工具若没有数据支撑&#xff0c;将寸步难行。你有没有好奇过这些海量数据都存放在哪里呢&#xff1f;答案正…

基于JavaWeb+SpringBoot+Vue在线拍卖系统的设计和实现

基于JavaWebSpringBootVue在线拍卖系统系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 摘 要 1 Abstract 1 1 系统概述 4 1.1 概述 4 1.2课题意义 4 1.3 主要内容 4 2 …

Android--Jetpack--Databinding源码解析

慢品人间烟火色&#xff0c;闲观万事岁月长 一&#xff0c;基本使用 关于databinding的基本使用请看之前的文章 Android--Jetpack--Databinding详解-CSDN博客 二&#xff0c;xml布局解析 分析源码呢&#xff0c;主要就是从两方面入手&#xff0c;一个是使用&#xff0c;一个…

C语言-枚举

常量符号化 用符号而不是具体的数字来表示程序中的数字 枚举 用枚举而不是定义独立的const int变量 枚举是一种用户定义的数据类型&#xff0c;他用关键词enum以如下语法来声明&#xff1a; enum枚举类型名字{名字0&#xff0c;…&#xff0c;名字n}&#xff1b; 枚举类型名…

HubSpot细分目标市场:拓展业务边界,突破增长瓶颈

在数字化时代&#xff0c;企业面临前所未有的市场挑战。随着科技的飞速发展&#xff0c;消费者期望个性化的体验&#xff0c;即时的互动&#xff0c;以及高质量、有价值的信息。这些变化使得企业不仅需要适应新的技术和趋势&#xff0c;还需要更加精细化地理解和满足不同细分市…

【广州华锐互动】AR昆虫在线教学软件:增强现实技术带你近距离探索微观世界

随着科技的不断发展&#xff0c;教育方式也在不断创新。在这个信息爆炸的时代&#xff0c;传统的教育方式已经无法满足人们对知识的渴望。为了让孩子们更好地了解自然界的奥秘&#xff0c;一款名为“AR昆虫在线教学软件”的应用程序应运而生&#xff0c;它将带领孩子们踏上一段…

HarmonyOS应用开发-手写板

这是一个基于HarmonyOS做的一个手写板应用&#xff0c;只需要简单的几十行代码&#xff0c;就可以实现如下手写功能以及清空画布功能。 一、先上效果图&#xff1a; 二、上代码 Entry Component struct Index {//手写路径State pathCommands: string ;build() {Column() {//…

kubeadm搭建单master多node的k8s集群--小白文,图文教程

参考文献 K8S基础知识与集群搭建 kubeadm搭建单master多node的k8s集群—主要参考这个博客&#xff0c;但是有坑&#xff0c;故贴出我自己的过程&#xff0c;坑会少很多 注意&#xff1a; 集群配置是&#xff1a;一台master&#xff1a;zabbixagent-k8smaster&#xff0c;两台…

基于YOLOv7算法的高精度实时烟头目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时烟头目标检测系统可用于日常生活中检测与定位烟头目标&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算法来训练数…

重磅!2023中国高校计算机大赛-人工智能创意赛结果出炉

目录 中国计算机大赛-人工智能创意赛现场C4-AI大赛颁奖及留影800个AI应用&#xff1f;这届大学生真能“搞事情”AI原生时代&#xff0c;百度要再培养500万大模型人才 中国计算机大赛-人工智能创意赛现场 12月8日&#xff0c;杭州&#xff0c;一位“白发老人”突然摔倒在地&…

halcon一维测量

标定的作用&#xff1a; 得到相机的内参和外参&#xff0c;即相机成像的模型规律 * fuse.hdev: measuring the width of a fuse wire * dev_update_window (off) dev_close_window () * **** * step: acquire image * **** read_image (Fuse, fuse) get_image_size (Fuse, Wid…

公交站间的距离

&#x1f388; 算法并不一定都是很难的题目&#xff0c;也有很多只是一些代码技巧&#xff0c;多进行一些算法题目的练习&#xff0c;可以帮助我们开阔解题思路&#xff0c;提升我们的逻辑思维能力&#xff0c;也可以将一些算法思维结合到业务代码的编写思考中。简而言之&#…

LeetCode 279完全平方数 139单词拆分 卡码网 56携带矿石资源(多重背包) | 代码随想录25期训练营day45

动态规划算法6 LeetCode 279 完全平方数 2023.12.11 题目链接代码随想录讲解[链接] int numSquares(int n) {//1确定dp数组&#xff0c;其下标表示j的完全平方数的最少数量//3初始化&#xff0c;将dp[0]初始化为0&#xff0c;用于计算&#xff0c;其他值设为INT_MAX用于递推…