如何減少opencv標註中文的時間

2021-10-14 18:50:11 字數 1749 閱讀 1926

眾所周之,用opencv畫圖,是不能直接在上標註中文的,如果要標註中文,需要用到pil庫。在用pil庫進行處理時,需要把讀入的轉成pil的image格式,處理完之後,又得把image格式轉化成array格式。在這兩個轉化的過程,其實是非常耗時的,它的耗時量與的畫素數量成正比。你可以看下面這個例子,就知道耗時量有多大了。

import numpy as np

from pil import image

import time

a=np.random.random((1920,1080)) #生成乙個1080p的單通道

t1=time.time()

image_a=image.fromarray(a)

aa=np.asarray(image_a)

t2=time.time()

b=np.random.random((64,64)) #生成乙個64*64的單通道

t3=time.time()

image_b=image.fromarray(b)

bb=np.asarray(image_b)

t4=time.time()

執行的結果如下:

可見,對於一張1080p的,不包括畫圖,只是進行格式轉換,就用了26毫秒多,所用時間已經夠我用yolov5進行兩次目標檢測。在深度學習框架裡,如果用這種方法進行標記中文,將嚴重拖慢演算法的推理時間,不知道的還以為是深度學習演算法不行呢。

解決思路可以從上面的例子中看出,既然格式轉換的時間與影象的畫素大小有關,那我們就可以只將中需要處理的畫素部分截出來,只對這部分畫素進行格式轉換,標註中文,再轉換回去,再覆蓋在原影象上面,這樣就可以達到快速標註中文。

程式**圖下:

import numpy as np

import cv2

from pil import image,imagefont,imagedraw

import time

frontstyle = imagefont.truetype("simhei.ttf",size=15,encoding="utf-8")

a=np.random.random((1920,1080,3)) #生成乙個1080p的rgb

while true:

t1=time.time()

c1=(int(200),int(200))

c2=(int(260),int(230))

cv2.rectangle(a, c1, c2, (0,0,0), -1, cv2.line_aa) # filled

b=a[200:230,200:260]

image_b=image.fromarray(np.uint8(b))

draw = imagedraw.draw(image_b)

draw.text((0,0),"中國智慧型",(0,255,0),font=frontstyle)

bb=np.asarray(image_b)

a[200:230,200:260]=bb

t2=time.time()

cv2.imshow('image',a)

c= cv2.waitkey(0)

標註效果如下:

執行結果如下:

可見,這樣處理之後,包括標註中文,總用時才1毫秒左右,時間已經比原來的1/26還少了。

中文標準標註語料的標註中的幾個問題

想讓機器能夠跟人一些樣非常智慧型地處理自然語言,一直是我們的夢想。實現這個理想涉及到很多領域的技術,不管如何設計,自然語言處理 nlp 技術是必備的一環。而自然語言處理中,想要訓練乙個好的模型,語料是繞不過去的門檻。沒有語料,來的模型?而且語料標註規則是否統 一 自洽是訓練自動處理模型的關鍵。不管專...

如何減少silverlight XAP包的尺寸

這次得到了乙個做silverlight應用開發的機會,在發布時遇到 xap 包太大的問題,上網看了半天,最後把微軟的這個文件 如何使用應用程式庫快取 翻來覆去看了半天,終於搞明白了它說的內容,暈啊,真應了 會者不難 這句老話。最後決定把這個其實很簡單的東西總結一下,避免別的新學者浪費時間。開發場景 ...

如何減少silverlight XAP包的尺寸

這次得到了乙個做silverlight應用開發的機會,在發布時遇到 xap 包太大的問題,上網看了半天,最後把微軟的這個文件 如何使用應用程式庫快取 翻來覆去看了半天,終於搞明白了它說的內容,暈啊,真應了 會者不難 這句老話。最後決定把這個其實很簡單的東西總結一下,避免別的新學者浪費時間。開發場景 ...