如何使用图片、标签、坐标自动生成xml后制作VOC数据集

一,新建VOC2007文件夹

新建一个文件夹,用来存放整个数据集,或者和voc2007一样的名字:VOC2007
然后像voc2007一样,在文件夹里面新建如下文件夹:
在这里插入图片描述

二、将训练图片放到JPEGImages

将所有的训练图片放到该文件夹里,然后将图片重命名为VOC2007的“000005.jpg”形式

重命名文件:

import os
path = "E:\\image"
filelist = os.listdir(path) #该文件夹下所有的文件(包括文件夹)
count=0
for file in filelist:
    print(file)
for file in filelist:   #遍历所有文件
    Olddir=os.path.join(path,file)   #原来的文件路径
    if os.path.isdir(Olddir):   #如果是文件夹则跳过
        continue
    filename=os.path.splitext(file)[0]   #文件名
    filetype=os.path.splitext(file)[1]   #文件扩展名
    Newdir=os.path.join(path,str(count).zfill(6)+filetype)  #用字符串函数zfill 以0补全所需位数
    os.rename(Olddir,Newdir)#重命名
    count+=1

主要代码:

str(VOC2007_JPEG_path_len).zfill(6)

可根据自己按照以上代码做修改

三,标签+坐标

样式:000003.jpg LabelC 220 168 120 150

需要注意的是坐标:
220 左上顶点X坐标
168 左上顶点Y坐标
120 标签图片宽
150 标签图片高

四,生成xml代码

txt内标签 置信度 x_min y_min w h
注:x_max = x_min + w
   y_max = y_min + h
# 标注数据 格式(filename label x_min y_min x_max y_max)
"""

import cv2
import os
import xml.etree.ElementTree as ET


"""
pretty_xml函数:对写入的xml文件进行美化修饰
elemnt为传进来的Elment类,参数indent用于缩进,newline用于换行
"""
def Coordinate2XML(imagepath,outputxmlpath,Coordinatelist,folder):
    def pretty_xml(element, indent, newline, level=0):
        if element:  # 判断element是否有子元素
            if (element.text is None) or element.text.isspace():  # 如果element的text没有内容
                element.text = newline + indent * (level + 1)
            else:
                element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * (level + 1)
                # else:  # 此处两行如果把注释去掉,Element的text也会另起一行
                # element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * level
        temp = list(element)  # 将element转成list
        for subelement in temp:
            if temp.index(subelement) < (len(temp) - 1):  # 如果不是list的最后一个元素,说明下一个行是同级别元素的起始,缩进应一致
                subelement.tail = newline + indent * (level + 1)
            else:  # 如果是list的最后一个元素, 说明下一行是母元素的结束,缩进应该少一个
                subelement.tail = newline + indent * level
            pretty_xml(subelement, indent, newline, level=level + 1)  # 对子元素进行递归操作
    xml_file_path = './anno.xml'
    annotation_dir = '/Annotations/'
    img_file_name = os.path.split(imagepath)[1]
    tree = ET.parse(xml_file_path)
    root = tree.getroot()
    for i,line in enumerate(Coordinatelist):
        trainFile = line.split()
        # txt中的第一条information在写入xml时,负责将img_name、size、object写入;其余的information只写object
        if i ==0:

            lable = trainFile[1]
            xmin = int(float(trainFile[2]))-1
            ymin = int(float(trainFile[3]))-1
            xmax = int(float(trainFile[4]))+1 + xmin+1
            ymax = int(float(trainFile[5]))+1 + ymin+1
            root.find('filename').text = img_file_name
            root.find('folder').text = folder
            root.find('path').text = imagepath.replace('\\', '/')
            # size
            sz = root.find('size')
            img = cv2.imread(imagepath)  # 读取图片信息
            # cv2.imshow("img",img)
            # cv2.waitKey(0)
            sz.find('height').text = str(img.shape[0])
            sz.find('width').text = str(img.shape[1])
            sz.find('depth').text = str(img.shape[2])

            # object
            obj = root.find('object')
            obj.find('name').text = lable
            bb = obj.find('bndbox')
            bb.find('xmin').text = str(xmin)
            bb.find('ymin').text = str(ymin)
            bb.find('xmax').text = str(xmax)
            bb.find('ymax').text = str(ymax)

            # 如果重复,则需要添加object框

        else:
            lable = trainFile[1]
            xmin = int(float(trainFile[2]))-1
            ymin = int(float(trainFile[3]))-1
            xmax = int(float(trainFile[4]))+1 + xmin+1
            ymax = int(float(trainFile[5]))+1 + ymin+1

            # 建立新的object元素
            obj = ET.SubElement(root, 'object')
            name = ET.SubElement(obj, 'name')
            name.text = lable
            pose = ET.SubElement(obj, 'pose')
            pose.text = "Unspecified"
            truncated = ET.SubElement(obj, 'truncated')
            truncated.text = "0"
            difficult = ET.SubElement(obj, 'difficult')
            difficult.text = "0"

            # 建立bndbox信息
            bndbox = ET.SubElement(obj, 'bndbox')
            bndbox_xmin = ET.SubElement(bndbox, 'xmin',)
            bndbox_xmin.text = str(xmin)
            bndbox_ymin = ET.SubElement(bndbox, 'ymin')
            bndbox_ymin.text = str(ymin)
            bndbox_xmax = ET.SubElement(bndbox, 'xmax')
            bndbox_xmax.text = str(xmax)
            bndbox_ymax = ET.SubElement(bndbox, 'ymax')
            bndbox_ymax.text = str(ymax)


    xml_file = img_file_name.replace('jpg', 'xml')
    pretty_xml(root, '\t', '\n')  # 执行美化方法
    tree.write(os.path.join(outputxmlpath,xml_file), encoding='utf-8')

imagepath 图片路径
outputxmlpath 输出xml路径
Coordinatelist 坐标列表
Coordinatelist例如:

['000003.jpg LabelA 277 235 240 160', '000003.jpg LabelB 220 168 120 150', '000003.jpg LabelC 220 168 120 150']

folder 图片文件夹名

生成xml:

在这里插入图片描述

XML:

<annotation>
	<folder>JPEGImages</folder>
	<filename>000001.jpg</filename>
	<path>E:/beto/DrawingIdentification/fasterrcnn/VOC2007/JPEGImages/000001.jpg</path>
	<source>
		<database>Unknown</database>
	</source>
	<size>
		<width>610</width>
		<height>610</height>
		<depth>3</depth>
	</size>
	<segmented>0</segmented>
	<object>
		<name>LabelA</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>276</xmin>
			<ymin>234</ymin>
			<xmax>518</xmax>
			<ymax>396</ymax>
		</bndbox>
	</object>
	<object>
		<name>LabelB</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>219</xmin>
			<ymin>167</ymin>
			<xmax>341</xmax>
			<ymax>319</ymax>
		</bndbox>
	</object>
	<object>
		<name>LabelC</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>219</xmin>
			<ymin>167</ymin>
			<xmax>341</xmax>
			<ymax>319</ymax>
		</bndbox>
	</object>
</annotation>

五,xml制作VOC数据集

import os
import random
import xml.etree.ElementTree as ET

import numpy as np

from fasterrcnn.utils.utils import get_classes


def voc_annotation():
    #--------------------------------------------------------------------------------------------------------------------------------#
    #   annotation_mode用于指定该文件运行时计算的内容
    #   annotation_mode为0代表整个标签处理过程,包括获得VOCdevkit/VOC2007/ImageSets里面的txt以及训练用的2007_train.txt、2007_val.txt
    #   annotation_mode为1代表获得VOCdevkit/VOC2007/ImageSets里面的txt
    #   annotation_mode为2代表获得训练用的2007_train.txt、2007_val.txt
    #--------------------------------------------------------------------------------------------------------------------------------#
    annotation_mode     = 0
    #-------------------------------------------------------------------#
    #   必须要修改,用于生成2007_train.txt、2007_val.txt的目标信息
    #   与训练和预测所用的classes_path一致即可
    #   如果生成的2007_train.txt里面没有目标信息
    #   那么就是因为classes没有设定正确
    #   仅在annotation_mode为0和2的时候有效
    #-------------------------------------------------------------------#
    classes_path        = 'model_data/voc_classes.txt'
    #--------------------------------------------------------------------------------------------------------------------------------#
    #   trainval_percent用于指定(训练集+验证集)与测试集的比例,默认情况下 (训练集+验证集):测试集 = 9:1
    #   train_percent用于指定(训练集+验证集)中训练集与验证集的比例,默认情况下 训练集:验证集 = 9:1
    #   仅在annotation_mode为0和1的时候有效
    #--------------------------------------------------------------------------------------------------------------------------------#
    trainval_percent    = 0.9
    train_percent       = 0.9
    #-------------------------------------------------------#
    #   指向VOC数据集所在的文件夹
    #   默认指向根目录下的VOC数据集
    #-------------------------------------------------------#
    VOCdevkit_path  = '../fasterrcnn'

    VOCdevkit_sets  = [('2007', 'train'), ('2007', 'val')]
    classes, _      = get_classes(classes_path)

    #-------------------------------------------------------#
    #   统计目标数量
    #-------------------------------------------------------#
    photo_nums  = np.zeros(len(VOCdevkit_sets))
    nums        = np.zeros(len(classes))
    def convert_annotation(year, image_id, list_file):
        in_file = open(os.path.join(VOCdevkit_path, 'VOC%s/Annotations/%s.xml'%(year, image_id)), encoding='utf-8')
        tree=ET.parse(in_file)
        root = tree.getroot()

        for obj in root.iter('object'):
            difficult = 0
            if obj.find('difficult')!=None:
                difficult = obj.find('difficult').text
            cls = obj.find('name').text
            if cls not in classes or int(difficult)==1:
                continue
            cls_id = classes.index(cls)
            xmlbox = obj.find('bndbox')
            b = (int(float(xmlbox.find('xmin').text)), int(float(xmlbox.find('ymin').text)), int(float(xmlbox.find('xmax').text)), int(float(xmlbox.find('ymax').text)))
            list_file.write(" " + ",".join([str(a) for a in b]) + ',' + str(cls_id))

            nums[classes.index(cls)] = nums[classes.index(cls)] + 1

    random.seed(0)
    if " " in os.path.abspath(VOCdevkit_path):
        raise ValueError("数据集存放的文件夹路径与图片名称中不可以存在空格,否则会影响正常的模型训练,请注意修改。")

    if annotation_mode == 0 or annotation_mode == 1:
        print("Generate txt in ImageSets.")
        xmlfilepath = os.path.join(VOCdevkit_path, 'VOC2007/Annotations')
        saveBasePath = os.path.join(VOCdevkit_path, 'VOC2007/ImageSets/Main')
        temp_xml = os.listdir(xmlfilepath)
        total_xml = []
        for xml in temp_xml:
            if xml.endswith(".xml"):
                total_xml.append(xml)

        num = len(total_xml)
        list = range(num)
        tv = int(num * trainval_percent)
        tr = int(tv * train_percent)
        trainval = random.sample(list, tv)
        train = random.sample(trainval, tr)

        print("train and val size", tv)
        print("train size", tr)
        ftrainval = open(os.path.join(saveBasePath, 'trainval.txt'), 'w')
        ftest = open(os.path.join(saveBasePath, 'test.txt'), 'w')
        ftrain = open(os.path.join(saveBasePath, 'train.txt'), 'w')
        fval = open(os.path.join(saveBasePath, 'val.txt'), 'w')

        for i in list:
            name = total_xml[i][:-4] + '\n'
            if i in trainval:
                ftrainval.write(name)
                if i in train:
                    ftrain.write(name)
                else:
                    fval.write(name)
            else:
                ftest.write(name)

        ftrainval.close()
        ftrain.close()
        fval.close()
        ftest.close()
        print("Generate txt in ImageSets done.")

    if annotation_mode == 0 or annotation_mode == 2:
        print("Generate 2007_train.txt and 2007_val.txt for train.")
        type_index = 0
        for year, image_set in VOCdevkit_sets:
            image_ids = open(os.path.join(VOCdevkit_path, 'VOC%s/ImageSets/Main/%s.txt' % (year, image_set)),
                             encoding='utf-8').read().strip().split()
            list_file = open('%s_%s.txt' % (year, image_set), 'w', encoding='utf-8')
            for image_id in image_ids:
                list_file.write('%s/VOC%s/JPEGImages/%s.jpg' % (os.path.abspath(VOCdevkit_path), year, image_id))

                convert_annotation(year, image_id, list_file)
                list_file.write('\n')
            photo_nums[type_index] = len(image_ids)
            type_index += 1
            list_file.close()
        print("Generate 2007_train.txt and 2007_val.txt for train done.")

        def printTable(List1, List2):
            for i in range(len(List1[0])):
                print("|", end=' ')
                for j in range(len(List1)):
                    print(List1[j][i].rjust(int(List2[j])), end=' ')
                    print("|", end=' ')
                print()

        str_nums = [str(int(x)) for x in nums]
        tableData = [
            classes, str_nums
        ]
        colWidths = [0] * len(tableData)
        len1 = 0
        for i in range(len(tableData)):
            for j in range(len(tableData[i])):
                if len(tableData[i][j]) > colWidths[i]:
                    colWidths[i] = len(tableData[i][j])
        printTable(tableData, colWidths)

        if photo_nums[0] <= 500:
            print("训练集数量小于500,属于较小的数据量,请注意设置较大的训练世代(Epoch)以满足足够的梯度下降次数(Step)。")

        if np.sum(nums) == 0:
            print("在数据集中并未获得任何目标,请注意修改classes_path对应自己的数据集,并且保证标签名字正确,否则训练将会没有任何效果!")
            print("在数据集中并未获得任何目标,请注意修改classes_path对应自己的数据集,并且保证标签名字正确,否则训练将会没有任何效果!")
            print("在数据集中并未获得任何目标,请注意修改classes_path对应自己的数据集,并且保证标签名字正确,否则训练将会没有任何效果!")
            print("(重要的事情说三遍)。")


# if __name__ == "__main__":
#     voc_annotation()

生成效果:

在这里插入图片描述

后面就可以开始训练啦

相关推荐

工作协作用邮件?易出错还效率低?看看这个工具靠谱吗?

现在技术部门开发了一个新工具,大家可以在上面上传文件和沟通,文件一到就会收到提醒。还可以在线讨论,实时修改内容,甚至轻松管理不同的版本。所有沟通内容和文件和都会自动保存,支持随时查看。找之前的讨论记录和文件要翻半天。这些问题让人既焦虑,又害怕出错。邮件里说的跟文件里写的有出入。还在用邮件进行工作协作?那真是容易出错又低效,哎。工作沟通协作不够及时。

DOCUVIX的博客 510

话说你们维保到期通知都是谁通知的

直接做一个维保合同到期自动提醒的工具。商务说运维部门应该到期给客户发通知,客户有无阅读、意见回复都能够知道。离谱了,公司有个客户维保到期了。可以直接转发到期通知给客户,客户也不愿意给这两个月钱。是为什么2个月都没人发现。现在商务和运维在扯皮,运维说商务到期要续签,说这不是谁通知的问题,

DOCUVIX的博客 328

大家觉得我这个产品点子怎样,能打造出爆品吗

你可以通过这个工具,随时将文件发送给客户、伙伴或同事的手机。各方人员可以针对这些材料进行沟通协作,事项完成后又成为经验与档案,为以后证据需要或员工培训服务,形成闭环。历史经验、模板、材料等各种文件,可以存在公司的共享文件库中。在业务有需要自动提醒你要用哪一些文件或版本。例如:项目经理给客户提供项目方案;维保团队给客户发到期通知;业务员给客户发送报价等等。现在都说B端市场还是蓝海,最近调研了一下,发现好像很少人做“文件收发管存”的产品。我们设想这样一个产品,大家看看能做爆款不?

DOCUVIX的博客 384

不想做报价了,怕报错,怕被同行套报价了?

我可以找IT部门做个工具,把报价模板公式和历史报价都存档进去,业务员直接查来用,然后在线发到客户手机上直接沟通,沟通过程和报价单我都可以线上把关。我公司新来的业务助理,她做报价做了一天。我还以为她在摸鱼😂,过去问她怎么回事。她才说今天加了一个客户,一直用命令式的口气要报价。然后她被催得紧张,又害怕报错,自己捣鼓了半天才做好发出去。但是报完价之后对方一直不回复,才发现已经被删了😂。是不是新人业务员都有害怕报错价,害怕被套价、不熟悉公式之类的问题?她说应该是被同行套价格了,所以也没敢告诉我。

DOCUVIX的博客 408

道可维斯受邀参加2024金蝶佛山生态峰会,助力企业财务共享建设

广州道可维斯借此机会,重点展示了经过长期市场验证的电子影像及会计档案综合解决方案。作为影像及档案管理综合解决方案提供商,广州道可维斯应邀参加了此次盛会。未来,广州道可维斯将继续倾听市场声音,不断优化产品体验,为更多追求稳定、可靠的企业提供值得信赖的解决方案。成熟可靠:道可维斯的影像及会计档案综合解决方案,已经在众多知名企业中长期应用,表现稳定可靠。在当前阶段,许多企业正在寻找既能跟上时代步伐,又不会带来太多风险和困扰的产品。简单易用:操作简便直观,用户友好,减少学习成本,适合各类用户。

DOCUVIX的博客 388

收款业务中的3大合规风险,你知道吗

随着国家政策监管日趋严格,企业合规管理正在受到高度关注。在企业收业务款场景中,银行回单管理容易被忽略,若处理不当,将面临合规风险。

DOCUVIX的博客 586

行政人事的日常丨如何优化企业知识资产管理?

小思能否最终实现成功的,企业知识资产管理呢?

DOCUVIX的博客 339

运维人的日常,不被理解的背后

小春总是尽最大努力在24小时内给客户一个满意的答复,她认为运维就是守护客户业务平稳、顺利进行。

DOCUVIX的博客 293

打破数据孤岛,实现文档数据互通

随着数字经济加速发展,企业数字化转型正向更深层次推进。非结构化数据量也正在飞速增长,这些数据以文档、图片、音频等形式散落在组织内部,这给数据的整理和统一利用增加了难度。由于部门、应用、框架、多云环境等原因形成非结构化数据孤岛。如何使数据规范统一、消除数据孤岛,并利用好这些已形成的数据源,为后续运营提供数据支撑,是多数企业目前亟待解决的问题。

DOCUVIX的博客 461

集团企业内部交易发票查重不通过?解决方法来了!

某地产是全国第一批成立的综合性房地产开发企业之一,目前旗下涵盖多个业务板块,包括住宅开发、物业服务、商业、长租、康养和教育。开启全国化布局后,进驻全国30个一线和强二线城市,开发大型住宅项目200多个,拥有包括广州国际金融中心在内的40多个大型商业物业。在某地产开启全国化布局时期,随着业务规模不断扩大,对企业管理能力要求越来越高,某地产进行数字化转型,并通过财务共享中心建设持续提升管控能力。近期,某地产逐步推进他版块公司财务共享上线,这些公司存在内部交易的情况,存在出现交易双方都上传同一张发票的情况。

DOCUVIX的博客 350

最新政策丨政务服务电子文件归档和电子档案管理办法说了什么?

这一办法的主要要点涵盖了政务服务电子文件的归档和电子档案的全流程管理。重要亮点包括电子档案的定义、归档范围、归档期限、管理要求、安全保障措施等方面。此举旨在通过全面规范政务服务电子档案的管理,推动政府数字化转型,提高政务服务质量。1. 电子档案的界定办法明确,电子档案是以数字化格式进行归档管理的各类政务服务文件,包括在政务服务活动中形成和调用的文字、图片、音视频等。这些电子档案与传统纸质档案一样,具有法律效力,可作为合法凭证。2. 电子档案归档范围。

DOCUVIX的博客 592

合规管理,企业生存之本!这4大方法,助你规避风险

当下,合规管理已成为企业必修的一门学问。无论是上市公司还是民营企业,都面临着日益严苛的监管合规要求。

DOCUVIX的博客 609

广州道可维斯受邀参加首届金蝶暨佛山数字化生态峰会

活动当日,道可维斯的客户成功中心主任梁健,做了以“企业内容管理3.0,助力企业合规成长”为主题的产品解决方案分享。她详细介绍了道可维斯最新推出的数字化产品矩阵,并通过多个客户成功案例解析,让与会者充分了解了道可维斯产品在实现企业数字化转型过程中的强大支撑作用和丰富实施经验。通过这次峰会,我们不仅加深了与行业领先企业的合作关系,也进一步拓展了战略合作网络。此次大会由金蝶软件集团主办,共有超150家软件行业企业莅临参与,共同探讨数字化行业的最新动态和趋势。

DOCUVIX的博客 386

一图读懂数电票丨发票新时代的机遇与挑战

数电票的应用,将有助于彻底解决现有业务流程中的发票管理环节存在的集中化和自动化难题。它将推动对发票的管理与企业的业务流程、法务工作、财务核算、税收管理、资金运作、成本控制、档案管理以及供应链管理等进行深度的数字化整合。这将全面提升企业的经营管理水平和运营效率,降低运营成本,为企业业务的快速发展提供强大支撑。根据数电票的新特性,发票管理、流程制度需要改变、发票相关的合规风险管理需要改变、对接数电票相关的软件需要改变等等,企业需要及时准备,以顺利安全、合规地应用数电票。关注我们,及时获取更多最新资讯。

DOCUVIX的博客 628

企业内容管理升级 3.0:构建生态协同,助力合规成长

企业内容管理3.0基于开放平台与生态理念,连接内外部系统,实现内容共享和协作。它打开了企业边界,释放内容价值,为企业带来机遇与收益。

DOCUVIX的博客 476

费报只是小 case!电子影像系统,工作效率up无限

电子影像系统的应用,使企业拥有强大的“记忆”和“联想”功能,各业务部门可随时调用相关信息,促进业务流程的高效协同。它构建起企业业务“神经网络”,帮助企业在信息海洋中找到自己需求的“记忆”,实现业务的高度智能化和数字化。

DOCUVIX的博客 607

深度解读新档案法①:企业如何提高档案管理规范性?

结合企业实践案例,详细解读档案管理的相关法规,帮助大家加强档案管理的规范性。

DOCUVIX的博客 1196

如何解决企业客户签收回执慢,缩短回款周期?

这意味着企业将面临着货款回收延迟,对企业的运营资金和现金流造成了影响。此外,对客户关系也会产生一定的影响,需要企业与客户进行沟通和协商,以维护客户关系。还给企业的财务管理带来一定的挑战,需要企业加强对账期和货款回收的管理和控制,以保证企业的财务稳健和可持续发展。

DOCUVIX的博客 1325

企业内容管理入门指南:从概念到实践,提升协作效率和质量

企业内容管理是企业信息化建设中非常重要的一环,可以帮助企业更好地管理和利用企业内部的各种数据和信息资源,提高协作效率和质量,降低风险,提升企业核心竞争力

DOCUVIX的博客 907

档案信息化建设,这份法律法规清单,请收好

为了推进档案管理的数字化落地,国家颁布了一系列法律法规和标准规范,当企业在进行档案信息化建设时,应遵循相应的法律法规,保障信息安全、规范档案管理、保障档案使用和保存。DA/T 18-2022 《档案著录规则》 DA/T 92-2022 《电子档案单套制管理一般要求》 DA/T 93-2022 《电子档案移交接收操作规程》针对电子档案和纸质档案要有检索关系,能够快速定位查询的要求,e企档案提供电子档案与纸质档案位置关联,通过搜索电子档案即可找到纸质档案的存放位置。已 经实现数字化的,应当对档案原件妥善保管。

DOCUVIX的博客 1023

PDM入门指南:一文带你了解PDM的基本知识

上一期,我们聊过PLM;这一期,我们接着聊聊PDM。在介绍之前,先回答之前客户提出的问题:上线PLM/PDM后,还需要e企拆图吗?可能需要,原因放在最后,有需要的朋友可直接跳到最后。我们先来聊聊什么是PDM?

DOCUVIX的博客 2778

什么是企业内容管理?

在时间就是金钱的今天,.对于分散在各个位置(邮件、各个业务系统、共享网盘等)、不同类型(业务流程、图纸、纸质文件、音视频等)的企业内容,如何能够在企业各部门之间、企业与供应商之间、企业与客户之间更快、更准确地传递与获得?费用报销解决方案、智能纸电对比解决方案、客户签收回执在线回传解决方案、影像中台解决方案、港口企业计费解决方案、供应商协同对账解决方案、实物收单系统解决方案、电子会计档案解决方案、电子档案借阅系统解决方案、全电子档案解决方案、自动识别图纸生成BOM解决方案。

DOCUVIX的博客 914

解决方案丨票据集中在集团总部处理,如何解决实物票据管理难?

解决实物票据从报销人员到分支机构到共享中心到档案室的全流程监控

DOCUVIX的博客 739

PLM听过很多遍,却依旧不知道是什么?看完这篇你就懂

PLM,是Product Lifecycle Management的缩写,代表的是产品全生命周期管理。产品生命周期最早是由经济领域提出,为了研究产品的市场战略,那时产品生命周期的划分按照产品在市场中的演化过程,分为推广、成长、成熟和衰亡阶段。后期,并行工程首次将产品生命周期的概念从经济管理领域扩展到研制阶段,真正提出了覆盖从产品需求分析、概念设计、详细设计、制造、销售、售后服务,直到产品报废回收全过程的产品生命周期的概念。

DOCUVIX的博客 979

订单交期迟滞,销售回应慢,怎么解决客户问题?

本文首发于“道可维斯”公号,订阅“道可维斯”公号,了解更多聚焦企业业务场景的数字化解决方案)按客户定制产品订单,进行报价和生产的制造企业,有拆解图纸生成物料BOM的工序,通常由企业产品设计部门的拆图员岗位专门负责。

DOCUVIX的博客 1076

道可维斯|益企行动,点亮星空数字化转型峰会

2023年,“烟火气”回归,但企业挑战仍在继续。找寻企业增长转型的内生动力,仍是中小企业不变的探索话题。如何寻找穿越周期的高成长机会?4月21日,佛山金蝶软件科技有限公司主办的主题为“益企行动,点亮星空”的数字化转型峰会,在佛山千灯湖酒店隆重举办。道可维斯一直深耕企业业务场景数字化,服务超200多家大中型集团企业。作为金蝶14年的战略合作伙伴,道可维斯受邀出席本次峰会活动。此次活动,道可维斯展出了最新产品e企拆图和e企档案解决方案,在展会现场广受欢迎。

DOCUVIX的博客 742

会计凭证管理难,怎么解决?

对于纸质档案,会计电子档案可以关联实物位置,支持业务人员快速检索、调阅,让档案利用更高效。法务在查阅电子材料时,还需要关联实物材料,但实物材料分散保管,法务需要与多个部门沟通,找到关联的纸质档案,沟通成本高,花费时间较长。会计电子档案与实物档案及位置进行关联,财务人员可以通过会计电子档案快速找到关联的电子档案,还可以根据实物关联,快速准确地找到纸质档案,完成审计。会计人员调账比较多,需要找到前置的单据、附件,但系统数据不互通,需要会计人员在不同的应用系统之间切换,耗时较长,效率较低。

DOCUVIX的博客 517

【休息吧,打工人】 让AI代替人工拆解图纸

3天的拆解图纸工作量,1天就完成!

DOCUVIX的博客 262

行业洞察丨非诉讼律师行业数字化转型痛点和解决方案

非诉讼律所如何加入数字化转型,优化企业业务服务,提升客户满意度,提高律所的竞争力?

DOCUVIX的博客 482

行业洞察丨小微企业信息化管理痛点与解决方案

从事商贸和服务业的老板和员工,对通过信息化和软件去管理企业业务的认知比较简单,应用比较离散。

DOCUVIX的博客 717
上一篇: .Net 5 读取appsettings.json 配置文件
下一篇: .net core 使用Htppclient 发送post请求传递文件跟数据
道可维斯
道可维斯 广州道可维斯信息技术有限公司官方账号 广州道可维斯信息技术有限公司官方账号
博客等级 码龄8年 28粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值