QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3526|回复: 0
打印 上一主题 下一主题

深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提...

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2021-7-14 15:18 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta

    5 _  f9 A0 U" q* H, y) A" J( `深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提取图像信息
    ( A6 }! z, V- L& w图像标注主要用于创建数据集进行图片的标注。本篇博客将推荐一款非常实用的图片标注工具LabelImg,重点介绍其安装使用过程。如果想简单点,请直接下载打包版(下载地址见结尾),无需编译,直接打开即可!! x+ i6 o) X! L' z
    . J9 J* X5 J( g' O& {5 z
    9 t+ d( ]( O) R9 U# @6 R
    感谢原作者对Github的贡献,博主发现软件已经更新,可以关注最新版本。这个工具是一个用 Python 和 Qt 编写的完整的图形界面。最有意思的是,它的标注信息可以直接转换成XML文件,这和PASCAL VOC和ImageNet使用的XML是一样的。
    % i7 t7 b" o9 w3 W0 `/ F/ E
    6 d' Q/ o0 F- [. U9 _1 C- F0 c! O

    * F: P% ^3 V" c- T附注。作者在5月份更新了代码,现在最新版本号是1.3.0,博主亲测,源码在Windows 10和Ubuntu 16.04上正常运行。2 I9 y. f+ v2 F5 x1 X) y5 m' @* O
    % _; b1 d2 R, f  @7 Q6 x" G
    4 H. L" f6 d/ S$ o$ t7 C% q
    具体的安装查看Github教程:https://github.com/wkentaro/labelme/#installation/ G7 v, s  p1 `

      a/ [7 D; K' ~* y$ b4 T
    " e/ _+ x" H) w7 r3 _
    在原作者的github下载源码:https://github.com/tzutalin/labelImg/ ^( _# Q8 d9 {! n" V  y3 e
    。解压名为labelImg-master的文件夹,进入当前目录的命令行窗口,输入如下语句依次打开软件。+ i- r2 r' Q# _: E2 `; x/ V

    ; j! n) \" Z$ u: J

    - D  f6 G5 Q7 P, t0 xpython labelImg.py" b  N3 E4 t8 }5 b  h0 P3 A
    1/ s7 v* O4 I; k

    3 M4 D) Q7 O7 d! M) l- ]& \- M7 G
    : E0 i6 V, P4 u/ w

    + k8 h' }- W/ Y( o5 p

    3 F1 L5 J: R" |7 @$ K6 P6 x具体使用
    # U0 L# q$ r, w0 J7 O修改默认的XML文件保存位置,使用快捷键“Ctrl+R”,更改为自定义位置,这里的路径一定不能包含中文,否则不会保存。
    2 w2 E6 J4 M4 Z! E
    4 g' d7 X# m- m! _9 \$ @: f0 m, P
    # {6 z/ W; i7 [* R( N: Y! {/ F+ v0 |& |
    使用notepad++打开源文件夹中的data/predefined_classes.txt,修改默认分类,如person、car、motorcycle这三个分类。
    1 i. L, S* k- K1 t) H
    ; y: i* m1 L( n$ M7 \
    5 ]  h' `& D) I+ C- `1 f
    “打开目录”打开图片文件夹,选择第一张图片开始标注,用“创建矩形框”或“Ctrl+N”启动框,点击结束框,双击选择类别。完成一张图片点击“保存”保存后,XML文件已经保存到本地了。单击“下一张图片”转到下一张图片。
    / B& _4 i. o) Z6 p8 S$ y- P0 I. F* e3 n' U% I( t6 n; l; q

    2 N! N! c, O! h( u! w贴标过程可以随时返回修改,保存的文件会覆盖上一个。/ {3 P0 Y, a, t; ?- U" R( {3 x

      E* d8 _( U  F, k; H# S# j

    # K+ l; ]6 \; B& ~' ?% W完成注解后,打开XML文件,发现和PASCAL VOC格式一样。
    9 U* w9 I$ V+ V& \. z
    0 k- ^; x. H  q& @% P

    & V. s+ T) K. \9 S; }将xml文件提取图像信息
    7 H  X4 L; X- F( @. Z( J* o下面列举如何将xml文件提取图像信息,图片保存到image文件夹,xml保存标注内容。图片和标注的文件名字一样的。2 i, U+ v7 H7 S# Z) f

    ( ?! A3 \; @" \; T- ?2 S% [
    - n# g/ Q3 t- W5 p

    $ r5 n1 b4 s0 J% f- u+ ]: f9 Q1 o

    2 V. ^2 y% d, x+ ~& Q, M3 `3 o下面是images图片中的一个。
    , B# K& g2 Y- x# h* u0 I; Q
    1 e# s" B, Y$ ?0 w3 J8 S
    , J9 H3 F/ y1 L- \( ^) ]
    下面是对应的xml文件。, X% ?- X! ]  b4 ~
    + J$ _1 u0 b2 e
    " |. M1 o0 x+ S. |: K$ e
    <annotation>  i0 m4 S1 R* X7 k9 v" \3 E
            <folder>train</folder>! v) A' q2 V8 N1 R
            <filename>apple_30.jpg</filename>
    0 e9 p  r; A* u! Z+ E  l        <path>C:\tensorflow1\models\research\object_detection\images\train\apple_30.jpg</path>
    ) t4 \" z* [* ]0 C. d        <source>
    4 y& i. [- Z4 z; A+ W                <database>Unknown</database>
    ' Y, ]+ Z: ?) j( d) c/ b% g' u2 L        </source>
    + R, _9 G* N* H/ C5 u( L* M        <size>) K6 H" m; K5 d) ?$ i; i
                    <width>800</width>/ g8 I, f% [2 w: X
                    <height>800</height>
    ' ]; _2 z* w  x* s4 E8 ~                <depth>3</depth>
    1 o8 p0 f6 |* ?2 {/ A        </size>
    . D6 {$ v3 m3 n: S, z8 r. ~" \5 B        <segmented>0</segmented>
    ) C& Q  Y4 S) V. U2 l5 Y        <object>
    ( I1 _6 D: Q* L) E: q8 x                <name>apple</name>
      B# o1 e! r& B7 z( |                <pose>Unspecified</pose>
    ) R' O2 ?/ ~. t- e3 G                <truncated>0</truncated>
    + I4 t. P4 t- H: g( R, C1 {                <difficult>0</difficult>
    / ]4 s  `5 {- b( T" p2 n/ I! O                <bndbox>
      r+ c( K) ^) ~                        <xmin>254</xmin>
    % y! ?: X; `6 i) y' b                        <ymin>163</ymin>: g- ~) u. l9 k, ~+ A
                            <xmax>582</xmax>
    9 L% f- I* y! V: {) V5 f; m/ A                        <ymax>487</ymax>
    ' C! H4 Q/ @# e8 _% m. K: S                </bndbox>; p1 S, Y3 a8 Y6 z0 V; X
            </object>
    7 M. L; a" K' _# T: S6 g        <object>4 N2 M) e, y8 T# w6 [
                    <name>apple</name>. `8 R# }- R) N, t; g6 i) D$ o
                    <pose>Unspecified</pose>
      m1 b; U4 T& T                <truncated>0</truncated>
    . @  [4 j" g3 o                <difficult>0</difficult>4 z$ W$ y3 I5 T' f$ z) k
                    <bndbox>
    8 c* _  t- T6 w/ y4 H7 z                        <xmin>217</xmin>/ D  P" R# H7 d: q! ~
                            <ymin>448</ymin>
    . u6 g/ `( X( Q2 O                        <xmax>535</xmax>6 l6 J& _8 }* U" m7 l+ K7 i; z
                            <ymax>713</ymax>, V3 @8 m+ O( a& [. i, X
                    </bndbox>) x. z4 `/ C  i
            </object>
    0 G  n: `3 p/ q! F        <object>
    . R* F, ~& V! |, o( |1 B                <name>apple</name>
    5 M: |2 E# p, d1 @1 {, Q                <pose>Unspecified</pose>3 g; Q# k' W* D) K. d* m" \
                    <truncated>1</truncated>
    ; n; [5 ~9 {; U                <difficult>0</difficult>
    $ v, N1 ^) P. q' D) ]4 ^/ F                <bndbox>
    & o1 h, g) B$ @# p2 k                        <xmin>603</xmin>- R9 i: z& n9 s
                            <ymin>470</ymin>: ]2 f9 w$ r+ G; f$ T6 x
                            <xmax>800</xmax>
    : I% v2 e2 u! g                        <ymax>716</ymax>
    / F1 @3 Y/ X4 L5 P0 K- b4 Y                </bndbox>
    , V1 ]8 l9 ~6 d4 ?7 u        </object>
    ) }% m1 c! @3 Y/ W0 [4 w        <object>
    & @" D& T: g8 g                <name>apple</name>
    6 |, R/ p6 l) w) ]                <pose>Unspecified</pose>
    8 B+ K. O/ Q* M& Z3 h+ d                <truncated>0</truncated>2 z3 w* j6 Y) u. n5 F/ I
                    <difficult>0</difficult>/ y$ c3 V3 ]" X( ?# Z
                    <bndbox>
    , n7 R; ^" b* J0 @' L* B4 n                        <xmin>468</xmin>4 Y! U& N, s$ E( m  |: r4 T# ^
                            <ymin>179</ymin>
    ) D( }& E1 z' X+ b                        <xmax>727</xmax>7 ?  g0 G$ U/ o8 ^  U
                            <ymax>467</ymax>! G: }7 g. B6 k8 N- @
                    </bndbox>
    0 q4 H! ]6 n, C" {) x        </object>
    " W0 B8 P5 S6 W' V4 N        <object>
    7 X" D% M: N1 a; m& V                <name>apple</name>( X7 R* M* h; W  K% l: N0 Z
                    <pose>Unspecified</pose>8 G* T6 W: @7 E8 C/ l; s4 }
                    <truncated>1</truncated>8 G$ C' w5 p( |. J( o7 u, s$ B
                    <difficult>0</difficult>
    ( c; G! I* u/ I0 \                <bndbox>9 L, ?" U3 X0 _& y6 V
                            <xmin>1</xmin>* P# g2 S4 @6 w: j8 g; t
                            <ymin>63</ymin>' V9 g: n" X. J" W! D2 |
                            <xmax>308</xmax>2 i$ l2 M$ Q0 f$ C- Y) _  G
                            <ymax>414</ymax>
    - p: O) q' }8 U7 q* h+ A: S" U                </bndbox>* c6 v" J$ U* V+ p
            </object>
    0 k$ J2 @( m6 l; l/ O8 G) }</annotation>
    ( m8 i& ~% |/ l; b1
    * O. n3 [" p8 |' j2
    6 l9 u) ]0 u) c0 S1 e) A; w  w& p* C3) D4 L- v' b3 \) K8 x5 y
    4
    : `0 r: o% `- i& g$ r* R) Y  I5
    7 O+ w* ?& K9 k* o& Y69 N4 t: }( u1 x5 Q1 t) m
    7
    0 @; r. O: A% F6 l) e) {$ T8- y$ r6 x& [* R2 v! {6 j( T
    9
    - J) E( S, M- g9 a+ I10
    . \6 J# M3 @0 A11
    2 D6 M% E. ?3 r  V& c12. T, p% ?# j8 w0 V
    13
    * A: A) b* c3 _: W5 V- k- A. {14$ j$ D/ h9 M/ h7 h* Z2 L* J
    15' N7 B( r# b9 j! K: A; b
    16) L* Z8 \7 X' X5 v' r0 ]
    17
      E1 d8 e( X+ H/ ?! h+ |. E18
    ) o6 ?  K  ^7 ^* U' {4 Y* a% Z! R19. ?$ ?% a( d! |1 d* B
    20( M: X9 `% ?) ~5 [2 a
    21. U3 A4 y1 Y+ ^( m" u/ m
    22# t6 k- ], @" @( m: T
    233 H# o9 v  i) X: R' \* T
    24) {2 x/ C' B7 L& x8 O( {7 s! ?
    258 c& Y. u+ J0 `$ q4 u5 R
    26/ y- {* X1 n5 [! ~) F9 S( L+ U4 f
    27
    7 N+ E; }  D( l9 B286 G) }1 ?0 p! E9 k3 e8 n
    29  c  U3 c6 B+ G; J9 s
    30, |. E0 g( ^2 Z$ K- \* F
    31
    " L" c" j! G& c% q4 j, i328 \. T+ \; E5 M# s
    33
    ; M3 V; U. H4 V' {. `0 ~34# j. j; f$ E% g% {- |
    35
    5 @. F7 `0 W+ M2 w364 u1 W3 M4 t4 ?1 P3 u
    37
    . [1 o" E0 S* R) s. \# f38. B( Z4 ?+ v5 \6 n) b
    39
    ! Z; p7 L# F; t5 g- ~) D4 q; M40
    3 g2 s8 l+ l! k" Q415 g, H+ |: S+ ^8 H& z3 A
    426 y( Y, W  B& Z( Z6 R4 S) f
    433 V3 P- _% U" h: e
    44
    1 Q0 N4 J4 N+ a0 c/ j. N6 q45+ O, J* W& E! D! B! }: d
    463 g7 c4 A1 Z% E
    47) T2 ?) |: I. @# B
    48: D+ W' X! ^6 `! S! w- i
    49
    4 s5 a9 M- S5 Z% d: p! B9 h50
    4 W" f4 x$ }7 D% R  t51
      u6 h! r& |$ M  X% s526 F3 H9 D' c; |  Z1 f0 }8 q- C
    539 B. n* E; {2 I$ A" S
    54
    6 H) P/ I" h/ b55
      |$ X5 ]% k# }56
    - o. x$ a( f1 W( @8 R57
    4 u7 J2 A. L% k. b, G58
    2 x; w8 V, y- Z. i  D598 b+ F6 V+ w6 F! f/ V2 y7 X
    60' C. |2 U* @! m; Z& `
    61! p' A. y  U! u0 M( @6 s" H9 M
    62! D$ e/ {7 B. p+ y# f8 J3 _6 G/ B
    63: K1 d" L/ I) G/ S
    64+ v- c$ ^' d1 S  J1 C3 T& A1 W
    650 c& Z0 c: Z4 Z" Q; s
    66
    6 P& Q- D' L- |) i$ ~4 T4 k67* D3 M" o  O! h8 d
    683 p4 c5 e7 c% w, V# h5 s
    696 Z, H9 |7 o' q1 Y
    703 @4 B3 ?2 V3 T" s
    71
    & E7 y5 ]% t0 i2 Z. F$ ~: Q) e72
    0 f2 F5 d$ U8 f# n, T' ~73
      {3 K1 Y0 `- t: e! S% t747 @2 [: |$ j7 j0 D5 @
    将xml文件提取图像信息,主要使用xml和opencv,基于torch提取,代码比较凌乱。
    & n7 h5 i9 [! q/ R  K
    % i& |+ p2 z3 `4 L

    2 I$ l) D; b% ^/ I' simport os& t6 c! w1 E3 Z* Q
    import numpy as np
    $ }2 J. ^+ `( T" _* Jimport cv2
    ; Z' I( b3 M1 n8 j1 P; f: |( |2 Timport torch3 b+ f: Z$ z% t, U6 W; L
    import matplotlib.patches as patches
    * m5 [$ Z: n0 _* a& k) Fimport albumentations as A' U8 _$ w" ~8 C9 H4 `7 B
    from albumentations.pytorch.transforms import ToTensorV2' Z5 J7 S" h7 I/ C( u5 P
    from matplotlib import pyplot as plt
    4 `0 h8 ~5 R$ ~" b* Nfrom torch.utils.data import Dataset7 P: A/ D) B: ~
    from xml.etree import ElementTree as et6 T( d- T0 F& \: `& Q5 n; E3 ?
    from torchvision import transforms as torchtrans
    7 r# G; a( C) a1 s9 _" Y; M, W& w* I; Q% r

    " b) y3 _2 x; _# defining the files directory and testing directory6 S+ u8 s, N: ~
    train_image_dir = 'train/train/image'4 l$ F& L( {: K1 H1 b
    train_xml_dir = 'train/train/xml'+ S; G8 y# x4 g/ |# S) O
    # test_image_dir = 'test/test/image'
    * q) B# k4 R& e. G$ l3 P) |2 ?# test_xml_dir = 'test/test/xml'
    3 S5 N7 k6 I: }& `
    , a9 g$ d9 p  I! ]# I: y6 Z

    " X& B# ~/ y; l  i3 X0 C1 @; G" `class FruitImagesDataset(Dataset):- b5 s7 ^. K- S
    9 f' \; {/ n$ M* m) |
    0 Z( B5 k* u! S8 Y
        def __init__(self, image_dir, xml_dir, width, height, transforms=None):2 o4 r$ z% ^4 D
            self.transforms = transforms1 A% B2 r& L2 D, Z8 N
            self.image_dir = image_dir
    ! K  k3 I2 c8 R1 I- x        self.xml_dir = xml_dir: H" A- H' w, _- {
            self.height = height% q  H9 D  l! B$ j5 ]5 @
            self.width = width
    & d5 A  N* {+ T% ?  {. `% I6 s  m" z9 r9 S4 c

    / ~! H) ?, G$ q6 t' T1 t        # sorting the images for consistency
    ! s6 H+ _+ A' ?# Q( q3 K        # To get images, the extension of the filename is checked to be jpg3 v+ S: \: S% H4 E) U
            self.imgs = [image for image in os.listdir(self.image_dir)
      o; o. o/ q  z                     if image[-4:] == '.jpg']
    8 `/ v2 Y4 O. W6 H+ ]* {% |2 P        self.xmls = [xml for xml in os.listdir(self.xml_dir)
    - m, b+ Z$ t  D, {: Y7 L) M  l4 k! D9 W( c                     if xml[-4:] == '.xml']5 A% T0 g4 X: |% K
    9 I& _, @) ]6 s: C" P  a7 d- D

    ; q) |, u$ a. C: l- f        # classes: 0 index is reserved for background6 q0 _% ~6 o1 j! ^! L
            self.classes = ['apple', 'banana', 'orange']
    3 j! P, d* f1 u8 a
    ( z4 h) z9 @9 ]" R
    0 P0 g/ y9 M' t+ X9 Q) \$ c
        def __getitem__(self, idx):" e5 U( G4 [( [

    2 M& d4 |! J$ @% t. |
    ' s$ c6 }. d  k% P  X! U
            img_name = self.imgs[idx]4 t5 N) Z# z" P3 ?
            image_path = os.path.join(self.image_dir, img_name), Y% ]# {2 n2 D6 b8 Z8 s) D' m
    ) w  O- P  r& H
    3 U' C) M; I8 m
            # reading the images and converting them to correct size and color
    & f  U5 L: |: r4 a1 x        img = cv2.imread(image_path)& A! r7 h0 w& w9 y8 ]: n2 E
            img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.float32)* _5 a  z2 ~" d2 {% j
            img_res = cv2.resize(img_rgb, (self.width, self.height), cv2.INTER_AREA). z# @/ @9 M/ v
            # diving by 255' z9 x# B7 U- V1 F& L
            img_res /= 255.0
    4 f! G! I  c! i. }! @5 m1 Q+ y. g' r: d
    0 u# f0 e1 n6 V8 I! ^5 G4 p1 f# a
            # annotation file
    % f: A7 u( I( S% k8 h        annot_filename = img_name[:-4] + '.xml'7 Y  r" A$ f" K* v- s( r
            annot_file_path = os.path.join(self.xml_dir, annot_filename)
    # J7 R* a% y- a# [6 [$ @$ B! k& |% m6 q5 r% H0 T. ^: U; X

    8 B+ Q; O/ B: o" ?        boxes = []3 O! D$ E' _) c, D
            labels = []
    / E( \3 ~6 S- `. l5 S* f+ {        tree = et.parse(annot_file_path)
    ! ^, D1 b) f+ t, Z% D: K% p5 j) s) x        root = tree.getroot(); S& A2 a" l* `5 j; Z- h9 E& K/ e
    * F9 Y  ~  Y6 r* I1 ?! S& L% d

    * S% I  i! R5 Q- T. a        # cv2 image gives size as height x width0 G/ }% Z9 C- g! ]7 T" S/ E& a
            wt = img.shape[1]
    ' _* R2 p5 N: ^( A/ }        ht = img.shape[0]( o% A* ?( |( V4 ?7 Z9 C

    ' V7 P& P2 N! r. J! i3 X1 t

    & r4 ~' R% \3 f8 Y8 T" n5 x! i( {        # box coordinates for xml files are extracted and corrected for image size given$ J) U+ v# }) J. ?* W$ m
            for member in root.findall('object'):& q8 K" e# f* y9 e9 h, r% y
                labels.append(self.classes.index(member.find('name').text))
    9 }1 N: m' n. w0 e+ \
    4 a& _' m. I5 m4 X4 X. m& b
    : }( }. s" x4 o, ?
                # bounding box  s4 X% K2 H6 J$ F: y9 |
                xmin = int(member.find('bndbox').find('xmin').text)
    0 q1 D* z# s  }# S* p/ e            xmax = int(member.find('bndbox').find('xmax').text)
    3 k4 T( @+ j+ k, d9 j& H! _. U
    ' s1 H5 v/ M  ?* ~- k% M

    # S+ j4 @# ?4 {: ]+ ]' G1 L5 R            ymin = int(member.find('bndbox').find('ymin').text); B; U  h" F2 R4 J9 I4 {. z9 Q: n9 H
                ymax = int(member.find('bndbox').find('ymax').text)
    " {$ ^" }! b  o" J7 S" s* U- m. t- Y8 ^6 U- G( ]; R& A( y
    4 _9 \+ c, `" o9 j; l- B
                xmin_corr = (xmin / wt) * self.width
    3 C3 O/ |. S  O  W! C8 L            xmax_corr = (xmax / wt) * self.width% b3 U4 }, E, ]# n# D8 L6 J
                ymin_corr = (ymin / ht) * self.height) A8 Z- {6 E) E$ G. N$ t
                ymax_corr = (ymax / ht) * self.height
    % t+ T0 I) o+ c9 y* c            boxes.append([xmin_corr, ymin_corr, xmax_corr, ymax_corr])
    1 g) z. y1 K! A8 X- b
    0 A5 @+ g2 `) ^1 z% J$ r

    $ Q+ L+ U+ }1 y! ]7 c9 m+ L0 T/ l        # convert boxes into a torch.Tensor. |1 ?% h" y/ B4 J/ }
            boxes = torch.as_tensor(boxes, dtype=torch.float32)7 ?* D, t2 d" O9 p/ q- e% G
    - O) j: e5 K9 \, M
    - w2 u6 i- X8 Z/ g
            # getting the areas of the boxes
    ! I) B, f. a4 ~  |9 d0 O        area = (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0])3 G9 p/ L0 z* ^2 E

    * m  s! c/ X( D. _6 g
    , A* d! b/ s- X
            # suppose all instances are not crowd/ U0 p/ j8 ?' B& b$ Y0 s, P
            iscrowd = torch.zeros((boxes.shape[0],), dtype=torch.int64)
    9 R. ~. \! v& P# S! K2 D# i* ]6 j. @' Z
      C! F! `! d" g) `7 i, l& {. L: u/ Y
            labels = torch.as_tensor(labels, dtype=torch.int64)- t  X1 S2 k3 _) Y; U! M" d3 {/ g/ \; Y
      ]  X/ x/ B; T) ]3 R- J% D; w

    6 ^$ K% ^, D; l& ^; k" l, L0 I        target = {}
    5 L* ^; T9 b: p# ]) b/ f/ c$ D        target["boxes"] = boxes
    , D7 }" j) t( X( B        target["labels"] = labels
    ; i' @* d, d! |        target["area"] = area& S; L# o! H- H% S3 ^! `; z
            target["iscrowd"] = iscrowd
    % R# T) V/ ?/ x! o9 b        # image_id
    " L5 j/ ^/ q; \3 S* @        image_id = torch.tensor([idx])
    - Q$ C" ^4 q  y: i        target["image_id"] = image_id/ \3 O5 H8 u! q! {! {
    3 ]* c% |6 k" I: Q0 {. p
      T: T, b% b# c) \9 ~& X- V
            if self.transforms:) Q. V0 p' Y1 g: v
                sample = self.transforms(image=img_res,0 p( [' i% r4 D. G5 [
                                         bboxes=target['boxes'],
    " u6 D; }) C- T1 J                                     labels=labels)) B% y* a( E7 x" J- w2 W& E
    2 f1 p/ ]+ U: G& V4 Z

      r$ S( @" @/ Y            img_res = sample['image']
    # w: o9 h' ?' U) X8 s            target['boxes'] = torch.Tensor(sample['bboxes'])" j& _- J4 Z) Y4 u

    ; T) n) k) c9 V, m( j! j
    ' P  S$ D- v, T7 g
            return img_res, target/ t' R1 t0 F, D, Z  |& h
    / E; D8 z4 b  j2 A0 V

    : H5 O8 d+ Q$ s! |- M" E7 y7 o4 b) f( Z    def __len__(self):: y% ]. R/ z+ e/ @
            return len(self.imgs)
    & t4 W" G% A& B: k# I# F7 h' j6 n  t! y# Z

    $ E2 `$ ]6 A# w1 c6 D7 ?- ^# function to convert a torchtensor back to PIL image
    1 {9 P, k" b* q7 \3 U. Zdef torch_to_pil(img):
    4 j+ Q/ }' a7 E1 _* v% C    return torchtrans.ToPILImage()(img).convert('RGB')
    8 C( E! k" O0 k1 i: o5 [5 _3 ]4 Q" q" J" u; v- Y
    " x9 E( |2 L0 C3 R& D
    & c/ m; |9 o1 a6 {: J/ V

    4 w  ^" x9 t6 \- }def plot_img_bbox(img, target):
    ; C' w2 w7 T2 A7 A    # plot the image and bboxes+ v6 d6 u7 x0 R( C& m) S
        fig, a = plt.subplots(1, 1)
    ) L4 }: V- m3 a/ Y4 E: C" L" e2 |9 d    fig.set_size_inches(5, 5)+ X' K. S+ Y$ Q- w5 b1 @" S
        a.imshow(img)' ?+ S- s; L, V# b
        for box in (target['boxes']):
    . I4 p! a& V) A$ E# b( {        x, y, width, height = box[0], box[1], box[2] - box[0], box[3] - box[1]
    * v) e) g9 M0 b* w        rect = patches.Rectangle((x, y),$ d% ?) K# s8 J" S! B# X! X6 i
                                     width, height,
    6 e8 `" g: m: [5 k                                 linewidth=2,  g6 a# ]1 G3 w# T; f8 A+ g5 n: i
                                     edgecolor='r',  M; }& [1 E$ E
                                     facecolor='none')
    8 U& V) G1 X+ e( R" w% K
    1 C+ h7 A* {- T, [, o
    3 O6 ?+ ]3 F8 r, \) q
            # Draw the bounding box on top of the image2 Q. T6 m4 w# U6 D5 m3 U+ u9 O
            a.add_patch(rect)( J5 ~- Z$ E% c2 ^+ h! Z
        plt.show()
    2 j0 ^3 |6 D( m4 r% v* y2 K6 G( S4 r5 w- T1 j+ {' @- M

    , I, n% w8 ^: u! R; y0 E: ?
    7 N& X" {3 O! f1 e2 z
    ! d, e: k, i6 s# K. a: W  ]% ~
    def get_transform(train):* f* m+ @: |0 }
        if train:' [$ i$ t- s! K6 x. g2 |' t( f& H' M
            return A.Compose([$ q7 G8 \& W& j8 E% ]9 u
                A.HorizontalFlip(0.5),
    # u5 W' ~3 @2 l2 q            # ToTensorV2 converts image to pytorch tensor without div by 255
    2 |: P7 D: P2 n; W9 e            ToTensorV2(p=1.0)
    . |1 U6 l6 n/ }; [        ], bbox_params={'format': 'pascal_voc', 'label_fields': ['labels']})
    ! E. ~5 `' {  _3 k# w    else:2 n' b8 }2 F0 F& T; x# A
            return A.Compose([
    8 h4 @/ E5 x: o            ToTensorV2(p=1.0)
    / [  Q$ p/ N, s4 m4 }        ], bbox_params={'format': 'pascal_voc', 'label_fields': ['labels']})" y/ \$ k/ c  b
    ) _4 l6 m; ^% X( h
    / O- k0 f, z$ J, c4 ?$ D
    4 Q2 W1 {. u! c+ I% N2 r

    ) N5 T" t1 O% G; \
    $ T+ A; B. m7 x4 b7 Q, d

      c" x- u% X$ R6 ldataset = FruitImagesDataset(train_image_dir,train_xml_dir, 480, 480, transforms= get_transform(train=True))
    + O9 g/ t/ e0 P1 q+ c
    5 w( E: C! \8 i# j* V
    5 R% N4 I5 M" y( T7 t5 [% R
    print(len(dataset))
    - @% V: C, w* Y, S: c. ~( |! P  g# getting the image and target for a test index.  Feel free to change the index.$ m& S7 c: H7 H1 i9 {
    img, target = dataset[29]2 \$ Y6 }* v+ k1 X6 G0 ]
    print(img.shape, '\n', target)
    ; y( J- l. s  B1 p: ~% hplot_img_bbox(torch_to_pil(img), target)
    8 P  W+ E6 ]( R5 [/ |; r1
    # Q% a1 @9 r6 M" m# z- H, Y2" n; U$ _) e" |: L0 o) j
    3; S2 H% q2 G. d- n* L* J
    46 h- t4 Y; v2 t! M' W' T; [
    5
    6 S+ i+ {: r; M- d3 a6% H1 Z/ |0 G5 c; a( X% R% L' N
    7
    6 H$ d2 F- f6 [  u6 @+ a  ?85 d- i" e- o2 F6 f7 P
    9
    , J8 @8 L6 W6 {7 _0 J% ?8 a: ~2 A10' G+ i7 w8 [$ {2 D) |
    11
    ! p0 B9 b& `& A) B$ {' T12
    & L6 Y6 R, T0 z; Q. T0 n# d13
    1 K1 F5 V8 P. H2 I9 E14/ S  ]& j- d7 R% K& i
    15  M' R  s6 A) L/ J
    16
    2 ]3 z7 o) e3 @( r; l4 N; Z# `& ~" x17) s6 [5 @! a( ]: J; ]
    18
    0 w, J" y% [! s# M, ?19- t7 ~  F; P7 z$ f: ]4 P
    20
    4 `5 [5 R  l$ Y9 S21
    7 @0 Z/ F( ]8 B* L& x* a! n22
    ( y0 N+ J6 w) H: L1 l6 }. i# |" K23: J8 g0 h0 F3 U. g6 u+ F$ u( }. e
    24
    0 a( B8 Q" H7 t; i. x8 z, f/ [25# _- |1 W+ q* {6 q  t
    26# A; ^4 `0 j5 }- s/ d" ~2 L
    273 j4 l6 o  C( T
    28, m8 C9 \! x/ ]0 Q+ |, y" U* ^
    29
    # ]0 l$ B$ }; V5 i1 s30
    . r4 [9 s6 b0 x0 r; p1 r7 V31- G2 o! N% O0 Z* g
    32& L- r# t+ Z! P/ s% L$ w
    33
    . f+ c4 R( h. e0 z3 F34
    ( e: F  @* T. q4 b* ~1 [35: }  T$ z, |) z& ~2 N3 G$ Z3 M
    362 V5 }$ o! u0 h
    37
    3 B% W) F7 z0 [: z0 B: Q0 [2 h% ^0 F386 v' o, d7 V' |2 d! |& f5 I
    39
    / ~. _8 ]- ^4 D9 N* i8 i5 q40$ m7 U/ P2 o& _
    41; K( V1 v9 ?& j8 j( k* i6 A
    42% k; N& Q4 V" @1 a! h; f& t
    43
    $ A4 m1 j0 ?" I, ]44
    6 ^4 Y8 }7 g+ x; j7 `+ K7 B  H45
    $ R' Q+ X4 }9 @% I7 w468 V& b0 \- H0 ^; v2 r7 x, T
    47' N( i+ W. v: q' v4 `
    482 R, W; r5 g6 G
    49' f- d8 F4 p, I' w3 x, D
    50
    - _  K/ u0 b. W. w# o519 R1 `- j% k! |
    52& l8 I8 J9 ?1 x8 z" y# R3 x$ `
    53
    , L7 t- \7 ]  k7 [% o54
    5 B" Y& X! L: r2 f. R555 l) \$ I1 n- R
    56! r* b2 \5 _! r& |) H+ z- y
    57
    " k, {/ Q. F. j2 y58
    8 t) p' ]5 {" n( G" s59
    1 W9 ~+ n' @+ G0 @1 r5 T60
    4 f  U0 v' o! E% W0 R61
    $ W# x" F4 ]0 N, t1 I& j62& g+ O) u4 t4 f' I# N! [' u
    63$ _8 w1 {% y% A) h* n8 X% [
    64
    % e- m: ^9 l( ^6 b65
    8 B5 g3 K2 K9 x: _6 h5 k% `66
    4 q8 M  u5 e/ t6 e+ C672 @# W/ }: j2 l1 R6 V8 i3 A
    68
    , J9 y* _9 ?, l. V5 j" F4 Z69
    & o" {" K9 i: a+ }9 v/ L. {- e70& |& h3 |& O/ k( B& k) q
    71
    ) Z' ^% D( g6 k1 M) }" I72. S6 J& c( ]5 |& {5 G3 b
    73
    - b9 n% h' E; Y; c. `74
    % A7 N* e) P& Q! U5 h8 @4 Q75( i7 T  k, P1 ?8 Q
    761 ]# v/ N: T3 O8 {
    778 W! \5 ?5 N; v9 t
    78
      p" L( l" a2 x3 \9 t79
    $ q  }6 y5 _+ Z80, _" q" {+ w: ^
    81
    $ _3 R  z7 d4 e! z82( e+ B5 C. X& R/ V5 ^* [! p' z0 E
    83
    3 h" F) t7 j0 j1 i  z9 @84( t5 |; N6 g" E& C& a
    85/ x. |8 z0 l4 o  F
    860 z4 [& d9 W- c* ~/ \
    87. E3 D2 D, B9 s. |
    88% p0 V1 U9 Q2 Y5 b
    89
    # Y( q  u% N$ N6 I- }0 N90
    % Y5 H9 z8 u" m4 E- L$ n. X917 e0 o5 ?' k3 P& g* K" V
    92' e! G# G% }7 k! f
    93
    5 D. t( v* H* |, ?94
    0 m0 F( u3 C  m4 A: E+ }0 ]95
    6 I$ O  S" Q# S& y4 |969 N( q2 W4 ]0 f5 G: ?
    97
    3 U: X6 K  A" u2 V98
    / [" g: M+ y  E' b8 r+ O99
    6 e: H$ D9 f- a100
    ' j% ~) o/ y. B101. Q2 Q& i; U% o% i& l% P
    102
    ; N: I+ h! e" H5 z3 x, X103+ g1 f: g$ b5 @  X; r
    104
    % [" o0 j! k0 ?105( Z/ i% W' V. S
    106! p4 Z( ?1 @" J/ }* Q' L
    107  A  O+ N; L; V
    108! R/ g- G  U, d) o; O7 F0 D4 {2 s1 B/ U
    109" v% ?4 p1 p1 q" A8 Q
    110( V; H: z; s* C7 C, }1 M
    111
    - I) g: A! q; E2 g" b8 l112
    7 F. g2 [6 I7 Y) v1132 s8 z. T' t: c; R
    114
    0 T, g4 {0 d  c* M( u6 h# ^115# O# r* {' W+ _! d* k" }
    116
    6 A; u% V6 Q; f* E! w8 h117
    7 [0 B* h# O# i( T: |118) l- g5 S5 S4 g' n
    119
    " c  ~, U- b- ~: w120. V& U6 O9 a5 X7 {" m( M# F* `
    121
    5 P/ i7 A* Y, S# m- V, H122
    2 V+ w. o# P* Y( X5 o! m# |; U! X1230 w: g3 w  C; I
    124# q3 O! P" E/ p+ Y; [8 I* r  L
    125& @/ R, W% M% E8 ^% ~
    126
    ' r7 H, A2 ?4 ~+ U' d127/ K$ d& {" `  c$ |9 \2 U1 ]
    128/ [0 i2 d, s6 @
    129
    . L* U- H0 |  V, }; b130# U/ w9 V5 U. |* g! o
    131
    + S: s5 f# M8 u: S5 f6 ]3 d132
    7 A  W7 [2 z* T4 W0 y2 ~8 v, U1331 _4 F' e2 ~' h2 h: M* I
    134' q8 h3 s8 w% h
    1353 ]# d) P) q6 w1 j
    136
    . V& m4 G$ w7 k137, X0 k# l( |1 g( O& c
    1385 V6 a/ M- P$ K* G: E
    139
    - E/ D' X9 f5 i" g. v( @1407 V8 s: {4 S) w* b1 j) y) {0 ~
    141/ ~1 K5 v- e( s& W
    142
    9 Z7 Z& Y: X9 U. w- T143
    4 T5 f  N$ `3 \144) A- d" |7 @" d7 s4 Q# B3 X
    145
    - t4 w4 }$ \) d9 s1462 I; m" D" a: d8 z
    147
    + J% u& \# s6 u6 e148
    ; f5 p- M* g8 J1 q149
    ' w1 @% |: z3 k$ p9 t1509 S- r( X* M0 c# V! l- `
    151% M! g9 `# W% a0 l& t
    152
    ! M! `' n% U. E9 [153
      m* p/ H+ X. }& f5 g+ Q154
    ! |/ ~: L4 H4 r6 I- P+ C155# L. V* ?5 x) j7 z
    1562 B- o1 S) [0 z! |: R' h" j
    输出如下:
    1 y6 g: o: z. Z1 j
    % e+ J. {# P2 m9 H" ^4 E9 Q% p

    - p; S: L; {, I  p; @$ @torch.Size([3, 480, 480])
    ! J& [5 c3 a+ B# B) P$ } {'boxes': tensor([[130.8000,  97.8000, 327.6000, 292.2000],+ ^7 c2 _& B0 M
            [159.0000, 268.8000, 349.8000, 427.8000],
    $ Y; o' \7 F9 G4 H        [  0.0000, 282.0000, 118.2000, 429.6000],
    # v- B; F8 J) c: u3 X& z        [ 43.8000, 107.4000, 199.2000, 280.2000],9 W1 |( M* k1 n- f7 Q
            [295.2000,  37.8000, 479.4000, 248.4000]]), 'labels': tensor([0, 0, 0, 0, 0]), 'area': tensor([38257.9258, 30337.2012, 17446.3223, 26853.1270, 38792.5195]), 'iscrowd': tensor([0, 0, 0, 0, 0]), 'image_id': tensor([29])}; Q8 }0 Z. i6 U; W, o; F6 a
    1
    * ~2 u: S# T8 o: p$ V1 ^2 K2! N4 F9 r" _( ]# f3 I
    3/ G3 }' D+ E6 F* W6 v0 V" ~% f8 W
    4
    6 H0 _: a5 m8 O" `' K+ }! G5& R4 `3 l4 Y1 [8 _
    6
    8 p% T9 R# T2 Q; T* L" c; L- a9 k+ w  p3 e& ?
    ) M9 X; C5 _( N$ r' l
    , {( C' a) }& }5 s# H. w
    9 |7 X, B1 X. X" w! p% o1 `
    下载地址0 k! W8 R/ T2 Y6 v3 F# s) b
    链接:https://pan.baidu.com/s/1QZDgeYTHyAlD2xhtJqZ-Yw, k$ O/ P5 v* j" F
    提取码:srjn
    3 V+ X3 q  _9 H# g/ T; K————————————————
    ! C, i% X# L6 U: v! q$ ~+ }版权声明:本文为CSDN博主「刘润森!」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% W5 C+ U# W8 g: s& u8 Z
    原文链接:https://blog.csdn.net/weixin_44510615/article/details/118496273" P' H0 Y1 U2 T/ f, @% X
    7 |# c9 _: U- Y! d
    ' U2 h% N9 i& P7 v" y
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-8-1 16:42 , Processed in 2.187167 second(s), 51 queries .

    回顶部