最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

labelimg總是崩潰的若干解決辦法

2023-04-21 23:12 作者:T-Sherry  | 我要投稿


一. 為什么labelimg總是在崩潰

Labelimg是一個用來對圖片進(jìn)行標(biāo)注的工具,標(biāo)注的過程是用鼠標(biāo)進(jìn)行的,涉及到程序圖形界面的工作和文件的讀寫操作,這便是程序崩潰的兩大來源。如果我們?nèi)タ闯绦虮罎r的報錯信息,那么我們可以總結(jié)出如下幾條:

①? 畫線時的drawLine參數(shù)類型出錯

②? 使用txt文件進(jìn)行標(biāo)注時classes.txt的編碼不能正常識別

③? TXT標(biāo)注中分隔符的問題

二. 畫線時參數(shù)類型的解決方法

畫框框時,鼠標(biāo)圖標(biāo)上下左右,有十字相隨。十字的出現(xiàn)是伴隨著鼠標(biāo)圖標(biāo)的,所以要以鼠標(biāo)圖標(biāo)位置為事件,觸發(fā)繪圖函數(shù),并在鼠標(biāo)圖標(biāo)離開后消除原有十字,形成新十字。

要畫出十字,則需要確認(rèn)十字的顏色。由于版本的兼容性問題,setPen函數(shù)有時無法正常使用。根據(jù)報錯信息,定位到問題所在之地為canvas.py文件。找到paintEvent(self, event)函數(shù),發(fā)現(xiàn)setPen函數(shù)在調(diào)用時的參數(shù)不能正常使用,為此,可以直接定其為常量。由于這個函數(shù)在此是確定畫筆顏色的,為了簡單,我們完全可以設(shè)置畫筆顏色為純粹的黑,那么那里就成了

這個函數(shù)貌似是Qt里面的


當(dāng)然,為了好看,也可以是別的顏色。

另外,顏色設(shè)置的后面是畫十字的,前一行是在圖像區(qū)域畫豎線,后一行表示畫橫線。因?yàn)閰?shù)問題,電腦經(jīng)常報錯說傳入的參數(shù)是float而非int,但是在電腦屏幕上顯示圖形,坐標(biāo)往往是int的。開始畫框時,欲顯示十字,則報錯如下:

我這里是第530行開始出錯


對此,直接一個強(qiáng)制的數(shù)據(jù)類型轉(zhuǎn)換,不管原來是什么東西,反正改成int就行了。

而且,前方顯示框框的地方也是這樣:

它不是要int嘛,你給它就行了


由此,畫線的閃退問題解決。

有意思的是,后面還有一個很無聊的玩意,點(diǎn)了一個verify按鈕,就是換了一個背景顏色,真不知道有什么用。

這是來搞笑的嗎



三.保存標(biāo)簽名稱的TXT文件編碼出錯之解決方法

??? 為了方便,很多時候標(biāo)簽的名稱是中文的,這也就意味著UTF編碼的更多的使用。經(jīng)過幾次試驗(yàn),發(fā)現(xiàn)當(dāng)標(biāo)簽的名稱是中文時,文件classes.txt必須以UTF-8的編碼來保存,但是,每次做完標(biāo)注后,按下保存的按鍵,這個文件就變成了ANSI編碼的。

??? 由于程序一開始不認(rèn)識中文,默認(rèn)的是以純英文的方式去讀取文件的,所以標(biāo)注工作一開始就會出問題。為此,我們需要讓程序認(rèn)識中文,也就是對classes.txt文件以UTF-8的形式讀取。當(dāng)程序一開始不認(rèn)識中文時,我們根據(jù)其報錯的信息找到文件yolo_io.py,鎖定在某一部分的代碼。

可見控制臺頁面有時候是多么的重要


上面是報錯信息,判定出錯之地的文件路徑在C:\Users\你的電腦用戶名\AppData\Local\Programs\Python\Python310\Lib\site-packages\libs

?

看見這個'r'了嗎?對,就是這里


這里是一個讀取文件進(jìn)行標(biāo)注工作初始化的部分。可以看到,出錯的read函數(shù)是不能識別漢字的,而這與文件打開的方法有關(guān),在上面的open函數(shù)里,我們可以在最右邊寫上?? ??? ,encoding='utf-8'??? 表明這里用UTF-8編碼打開文件,由此完成classes.txt的讀取工作。

反之,在保存標(biāo)注結(jié)果時,經(jīng)過實(shí)驗(yàn),發(fā)現(xiàn)中文的標(biāo)簽也容易出問題。根據(jù)報錯信息我們可以找到對應(yīng)的代碼:

這個編碼問題真的坑死人啊


這里是負(fù)責(zé)保存文件的,將對象out_class_file的文件打開的方式中,加上同樣的UTF-8編碼的說明,告知機(jī)器用UTF-8編碼保存文件,從而解決問題。同理,在yolo_io.py之結(jié)尾處,為了保險起見,也要如此。在函數(shù)parse_yolo_format(self)中同樣是open方法,針對對象bnd_box_file修改。

?

三. 分隔符問題的解決方法

既然我們都是用UTF-8編碼了,那么寫文件的操作也是很有可能寫入UTF-8的字符。TXT文件中每一行都有空格,寫入時可能是中文的空格,也可能是英文的。查有關(guān)資料可以發(fā)現(xiàn),中文和英文的空格居然不是同一個字符。

如果TXT文件內(nèi)有中文空格,那么用labelimg打開試一試,必然報錯。問題同樣出在yolo_io.py上,看它的結(jié)尾處,是這樣的:

?

兩種空格用人眼似乎是不能區(qū)分的,邪惡啊

看報錯信息,在循環(huán)體的第一行上,里面有一個split函數(shù),這是一個使用正則表達(dá)式進(jìn)行匹配,匹配的內(nèi)容是對每一行的遍歷,匹配的選項(xiàng)是一個英文的空格。

如果發(fā)現(xiàn)中文空格而不是英文的,那么匹配失敗,報錯。反之,我們也不能保證所有的空格都是中文的空格,也很有可能報錯,為此,可以進(jìn)行錯誤檢測。另外,如果在某些條件下人為修改TXT文件,很有可能會促使標(biāo)注的數(shù)值之間多了空格。所以為了避免這種極端情況的報錯,可以要求匹配多個空格,修改結(jié)果如下:

正則表達(dá)式厲害啊


其中”\s”是用來匹配多個空格的。


labelimg總是崩潰的若干解決辦法的評論 (共 條)

分享到微博請遵守國家法律
岗巴县| 静乐县| 清河县| 双鸭山市| 无为县| 盐源县| 察哈| 东乌| 孟村| 新田县| 金湖县| 黔江区| 辽中县| 华亭县| 读书| 涞水县| 思南县| 武鸣县| 凉城县| 遂宁市| 临朐县| 衡水市| 汕尾市| 保定市| 宜兰市| 彰化市| 衢州市| 柏乡县| 那坡县| 堆龙德庆县| 龙山县| 奉化市| 文成县| 泊头市| 咸宁市| 射阳县| 芜湖县| 尚义县| 崇明县| 锦屏县| 弥勒县|