用Python寫一個圖片標註工具

weixin_34116110發表於2018-12-27

程式補充庫

# tkinter
$ sudo apt intall python-tk
# PIL (Python Image Library)
$ sudo apt-get install python-imaging
# 上面的命令如果不行的話
$ sudo apt-get install python-pil
# 需要安裝python-imaging-tk
$ sudo apt install python-imaging-tk

過程很重要

我們要實現一個點選輸入框就彈出資料夾選擇的介面,然後點選確定就把取到的檔案路徑顯示在文字框上面;
點選輸入框的方法沒有找到,為方便起見我們寫了一個按鈕專門用來調起系統資料夾;

import tkFileDialog

# 調取系統檔案選擇框
dirPath_ = tkFileDialog.askdirectory()

# 如果是選取檔案,則應該是
filePath_ = tkFileDialog.askopenfilename(title=u'choose file', initialdir=(os.path.expanduser("預設開啟路徑")))
# 文字框清除並重新填寫文字
entry.delete(0, END)
entry.insert(END, "要顯示的內容")

接下來我們要對選擇的路徑下的圖片進行操作,理論上這裡應該考慮多種圖片格式以增加程式健壯性,但是這裡我們不作擴充套件,這就涉及到了一種程式設計的思想,“增量式程式設計————羅馬不是一天建成的”(一本正經的胡說八道)。

雖然我們這裡不做其他圖片格式的考慮,但是我們需要給出提示,所以我們要進行某種警告來告訴我們的小白使用者,“你錯了!”;

import tkMessageBox
# 非常簡單,就一句話
tkMessageBox.showerror("Error!", message='究竟做錯了什麼')

路徑的問題解決之後,我們就要載入圖片了,這部分使用了github上的一部分程式碼,稍候我們慢慢講解;

from Tkinter import *
from PIL import Image, ImageTk
# load image
imagepath = image_path
pil_image = Image.open(imagepath)

# get the size of the image
#獲取影象的原始大小
global w0,h0
w0, h0 = pil_image.size

#縮放到指定大小
pil_image = pil_image.resize((DEST_SIZE[0], DEST_SIZE[1]), Image.ANTIALIAS)
self.tkimg = ImageTk.PhotoImage(pil_image)

self.mainPanel = Canvas(self.frame, cursor='tcross')
self.mainPanel.config(width = max(self.tkimg.width(), 400), height = max(self.tkimg.height(), 400)) 
self.mainPanel.create_image(0, 0, image = self.tkimg, anchor=NW)

到這裡,我們的圖片已經載入成功,下面我們要做的是標定,就是框出我們要標識的真實物品;

這裡順便說一下我們接下來的產品需求,我們的圖片是一組照片,照片內容是一個物體,我們在第一張照片上標定要tracking的物品,既而使用其他工具把接下來的其他圖片的該物品全部標定出來;

拉下來我們要做的是用框標定第一張圖片內容,並將所標定的資料記錄下來;

self.mainPanel.bind("<Button-1>", self.mouseClick)
def mouseClick(self, event, save=True):
    print event.x, event.y

資料標計已完成,然後我們就到了本文最重要的部分,使用深度學習網路框架對圖片進行tracking,這裡我們選用的是py-MDNet,有關於該框架的論文可以看一下 這裡

網路標定請看下節;

py-MDNet環境

Python2.7下安裝matplotlib

sudo apt-get build-dep python-matplotlib --fix-missing
git clone git://github.com/matplotlib/matplotlib.git
cd matplotlib
python -mpip install
# 說一下這裡的-mpip 
pip install matplotlib==2.1.2 # (3.0.2)

我們在伺服器上使用scp命令進行檔案下載時,使用ipv6地址時需要注意ip位置需要轉義;

scp username@\[ipv6 host\]:/filepath localpath

py-MDNet過程

這部分內容略過,本篇主要講UI部分內容;說一下該網路主要做了一個影象的tracking工作,具體請見py-MDNet

圖片標識還沒完

這篇就先寫到這吧,持續時間有點久,接下來內容後續另寫一篇進行補充。

相關文章