QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3567|回复: 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
    ) k/ b* E' g' N
    深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提取图像信息, K% l6 f; I' m# H
    图像标注主要用于创建数据集进行图片的标注。本篇博客将推荐一款非常实用的图片标注工具LabelImg,重点介绍其安装使用过程。如果想简单点,请直接下载打包版(下载地址见结尾),无需编译,直接打开即可!
    7 S! ]. H4 f  L2 c) N" `% H) L  n  f9 c
    3 m2 X& D* R9 z& S
    感谢原作者对Github的贡献,博主发现软件已经更新,可以关注最新版本。这个工具是一个用 Python 和 Qt 编写的完整的图形界面。最有意思的是,它的标注信息可以直接转换成XML文件,这和PASCAL VOC和ImageNet使用的XML是一样的。
    - W' G$ C7 T3 h- m9 A
    * L5 `9 M  |7 {  P  F& H  n
    * |9 l4 i, i4 V* g: b* a% v
    附注。作者在5月份更新了代码,现在最新版本号是1.3.0,博主亲测,源码在Windows 10和Ubuntu 16.04上正常运行。8 h9 V9 ?/ B% n4 M: w5 ^% g
    2 w$ {9 N( o* u2 [
    ( u4 E, j% t* p; f$ R
    具体的安装查看Github教程:https://github.com/wkentaro/labelme/#installation% y9 Q7 f% v7 j$ Q3 h: f
    ( ^+ Q2 ?$ {# M, v8 d- W
    . e# x2 z  N( p/ ~
    在原作者的github下载源码:https://github.com/tzutalin/labelImg
      ^& z; P0 f$ ~7 M/ z$ R。解压名为labelImg-master的文件夹,进入当前目录的命令行窗口,输入如下语句依次打开软件。
    " \+ i  E8 u" V' V3 f9 T$ G9 `& N& e
    % A' T. g1 E, }8 X# k# s2 q( F' A
    * F9 C: c, j: V% D  C) S
    python labelImg.py
    + U+ a' y' E) h( [4 Q% ]1
    ; O. [5 X9 e8 [
    0 Y9 g8 {! v5 g

    ' e. t7 R0 T8 N  V3 ]" B2 W% Z; N; Z$ ~3 ~5 S, U2 E
    # {/ W0 ~& H5 y7 @' T
    具体使用4 @8 W% {  z( j# K  r1 a+ C9 y% `
    修改默认的XML文件保存位置,使用快捷键“Ctrl+R”,更改为自定义位置,这里的路径一定不能包含中文,否则不会保存。
    " @! j, Y; R0 Y5 h4 S& z  `5 ]( E$ M! c' J! h7 W) {
    8 J. ^' E/ V9 B) l9 K. u
    使用notepad++打开源文件夹中的data/predefined_classes.txt,修改默认分类,如person、car、motorcycle这三个分类。( b" c9 @0 l' t" N8 C* `0 V; o9 Q8 s4 i
    ; }/ m/ M, T- f  X2 I  |/ Y
    ) l3 ?4 T. o' R. K" |2 G% u2 F& d
    “打开目录”打开图片文件夹,选择第一张图片开始标注,用“创建矩形框”或“Ctrl+N”启动框,点击结束框,双击选择类别。完成一张图片点击“保存”保存后,XML文件已经保存到本地了。单击“下一张图片”转到下一张图片。" r" @0 L+ d* k* ~9 F0 Q
    # \" C+ E1 `1 E. X+ x- Q, z1 T

    4 `  G5 _: e: k" {& p% Z贴标过程可以随时返回修改,保存的文件会覆盖上一个。8 t( q; i+ I! E$ v- ]8 B
    $ Y2 P5 R% L" V' A
    5 G7 T# q# A) ^: b
    完成注解后,打开XML文件,发现和PASCAL VOC格式一样。
    , G: Z9 c3 z, Z+ K9 `
    - e2 d" |2 l4 K/ x
    5 d: f9 s7 b: d1 I- K5 V0 z8 H
    将xml文件提取图像信息: [' G7 z8 s" i- r: @2 n
    下面列举如何将xml文件提取图像信息,图片保存到image文件夹,xml保存标注内容。图片和标注的文件名字一样的。
    0 [# a1 j. w2 t4 A
    8 z+ d" ?$ r, |" H+ [. D
    ! X+ m2 T& U2 c) _
    " c2 {8 `0 m2 Y+ F) s6 e0 G

    ! Q3 X! t; \5 f' v* d下面是images图片中的一个。
    ; I2 [9 J. X3 E9 `
    % \& b6 E4 k$ Z: n7 Z* d0 Y# V
    : f. e% ]4 v4 F
    下面是对应的xml文件。. |5 @% t, s2 C; \1 p' l
    # B6 W5 M8 e! W

    3 Z. l0 N0 ^0 F. o% w6 D<annotation>( a# q8 U* y1 N  |, Q+ a* K
            <folder>train</folder>
    ) R% e9 \7 y- g9 l8 t        <filename>apple_30.jpg</filename>' {! G- A0 G' p! A
            <path>C:\tensorflow1\models\research\object_detection\images\train\apple_30.jpg</path>
    7 e5 D8 {4 E5 g# n        <source>0 V0 B1 y. s  K  H
                    <database>Unknown</database>
    ! R1 L2 x: u) y: y4 e# e        </source>
    ' B' d6 [, C! e7 N. E        <size>: ]2 A% j: t$ l( p& ~
                    <width>800</width>% T+ y( v, D* j, t
                    <height>800</height>% Z, n* K& S. c5 Q; v
                    <depth>3</depth>
    # ~# l; k0 f+ V0 ~2 y% |        </size># [- n- H2 z* R8 f
            <segmented>0</segmented>
    0 L- P0 q% b: w' R6 ?1 v' b        <object>
    - F0 s0 `/ S+ _* p                <name>apple</name>
    % F) c) {9 p! \& c                <pose>Unspecified</pose>. k/ `! z, K( u, C
                    <truncated>0</truncated>4 Q2 y' S. M, S0 _/ x9 A2 {
                    <difficult>0</difficult>  a3 b4 Q$ d/ r6 @
                    <bndbox>
    ( P8 e) R% B* k) |) A! Q2 p2 @                        <xmin>254</xmin>0 f0 e7 C8 Z) O1 D% a# C, t& t
                            <ymin>163</ymin>4 C; u/ _& ?/ J) a7 [1 Y; M1 I
                            <xmax>582</xmax>5 V4 R( ?3 k. _
                            <ymax>487</ymax># _3 ?8 J) X' `- D; {
                    </bndbox>
    . w0 D. R0 M& X        </object>9 W- B; F6 A* t
            <object>5 }6 Q9 K$ F6 j/ M3 ~2 ]
                    <name>apple</name>; n) I4 i  r* y  a
                    <pose>Unspecified</pose>
    5 P7 `. N# `! j- }                <truncated>0</truncated>
    ! Y, r( |/ F% U  A4 V* G( D& i                <difficult>0</difficult>  C8 g5 t- ?: k) _6 L* I" C
                    <bndbox>2 S" W$ e, m( l' y1 P& [2 }
                            <xmin>217</xmin>
    / w3 ?2 u  O, x0 v  n                        <ymin>448</ymin>
    4 r/ {5 X% I4 I$ |9 K                        <xmax>535</xmax>
    0 J. a( r7 K+ T  @                        <ymax>713</ymax>
    1 u- A' W' a4 c, }) w& k                </bndbox>
    " |3 q- q, i- |4 D! g/ ~* S        </object>
    - g/ A, A2 e* M) ^" E1 {        <object>
    ( g/ U4 C9 ]7 Q4 }; T7 r                <name>apple</name>% C; ]' F( r# v7 V( O% c( C
                    <pose>Unspecified</pose>2 p1 n+ g5 B3 s) ?2 E% A& ~
                    <truncated>1</truncated>
    - y0 Y5 A% t6 B+ T6 h                <difficult>0</difficult>
    3 \" f# V) z- p) q- `8 [, W0 B' P                <bndbox>. Y& A4 B5 L4 `
                            <xmin>603</xmin>
    5 F. m. }6 P, b8 `                        <ymin>470</ymin>
    ; r( R- A/ J3 \8 l, V                        <xmax>800</xmax>
    3 d3 E, X" F. s                        <ymax>716</ymax>5 w# P2 `3 Y: o  q3 f/ G- u) Q: n
                    </bndbox>
    ) m: y7 E$ o# N( u. S* I        </object>
    ! c6 A- ^, |) f' b0 K4 e' Z2 x        <object>$ G8 g  e7 b. y& G  B1 _0 |: r
                    <name>apple</name>
    0 K3 V8 C7 N  W/ W0 {6 U' t                <pose>Unspecified</pose>% r4 K" G6 X3 H6 `4 l
                    <truncated>0</truncated>  U! T6 Y, [5 f" S( z
                    <difficult>0</difficult>
    6 W% K* L, ]5 |8 ?. p2 f                <bndbox>5 H/ T' _/ s! w- i) h  o2 J! b# `
                            <xmin>468</xmin>; Y# U" n6 D* c' q; ^3 \. P0 u- V! {! e
                            <ymin>179</ymin>% u5 I; O3 Z3 W: M, H& N* n* q
                            <xmax>727</xmax>( x, e0 _8 _# T9 ~
                            <ymax>467</ymax>
    / q; k! F$ r% g+ Z  ?7 x/ p2 M                </bndbox>; {6 F$ R* G& ]1 s' p( U
            </object>
    3 l$ S( T, t- |9 y        <object>( E7 v2 y8 ^" ^+ v- P  ]
                    <name>apple</name>1 p* i: z1 y) b" u
                    <pose>Unspecified</pose>
    ' Q- i0 o% Z$ u/ ^% M                <truncated>1</truncated>
    # s! s8 _# X4 i/ D                <difficult>0</difficult>5 l2 \+ i. k3 U+ r
                    <bndbox>, w4 l2 L1 L' ]
                            <xmin>1</xmin>
    7 R% I! `' h: y* q9 d                        <ymin>63</ymin>& O( ^4 ^. S5 V  Z( }" T. L5 Z/ J4 ~: b
                            <xmax>308</xmax>
    - C) L* W3 x: h9 R3 Q  A  t                        <ymax>414</ymax>, p+ I! v: v) u5 S* ^
                    </bndbox>
    ; K& i" G4 \0 O& G# A( n        </object>) T4 [9 W6 r! z8 `: }% G5 j
    </annotation>
    * r' ?3 N6 n4 l6 w1  D% N) ?. K7 R$ n# c7 M% Y
    27 S  ?8 O+ g9 f' p6 |. S, o& C
    3
    3 y" C9 E" L4 t7 ^4/ z- O1 L+ h: L3 p8 ]
    58 \' O2 ^. I7 a+ H
    6; F  b8 C9 o2 ]6 N5 Y; C; `
    7
    $ L2 ?8 l0 L% |( |. l8
    1 D( B, |4 W" h( h' l+ Q  J9
    ( p$ A- S! l( b: @7 e102 t/ M8 \0 H: ~8 P6 e9 ~" K' k
    11
    0 W2 I8 E: a% l9 j, l, Y$ N/ U12: N8 Q9 o8 q6 D0 J/ o
    13
    * e8 A6 U9 n: M& x1 N4 N$ d+ p14! Z2 ^6 ^  U$ f, Z9 S* e, J
    15
    : H# f* x. G4 W16! n6 P+ l; R6 |8 t
    178 v% O! V" Q# f# V
    185 J( G8 g8 _, C
    19
    7 l( _1 B2 L4 f/ W2 u- f9 F20
    6 \6 Y& i  J# m21
    ! R. ], ~! {$ q4 w* A22  t4 u, o7 ?! {4 ], s2 Z/ Q' ~
    23- ^8 o. a! O$ U
    24% ?/ K* r( S0 Z1 p* i- |$ }
    25( v' t8 E; k& Y: t) _9 A1 Z& w, M
    26  e" O  h& i! L
    273 s! t3 L* N, f' ~. j
    28
    $ A9 }7 u5 |+ z  }( G6 z29  U5 Z5 }1 w& h' l" D7 H8 b7 F' A
    30+ n$ X2 O2 C2 k. a0 ^9 h3 P+ L+ B
    31
    2 z, |, e- o- ?3 Y+ w: m2 w32
    # }& W) o8 P0 w: G5 L33
    5 ~( b' ^$ f$ Z34
    . p; ]9 J- Q+ F# \" d, i  w35' x  X3 u2 b# e: f& E4 Z
    368 F9 ~3 |7 J  L1 B5 ?
    37
    0 R1 F3 c! }2 {7 Y' a' v8 O38
    $ ~: }, a% c1 Z- n! j39/ R7 f! J5 D9 z" {5 Y
    40: h- H1 p1 s( B, |  T  L+ m
    41
    9 Y* U/ t- s. H; M" Y42
    : j8 Z1 V9 I  ]; M5 F3 }439 v* k. w* l' y0 z
    44) k3 v. c5 A2 A7 A0 v
    45+ ]( a& P' _* B# N  t
    46  k. a& L' |+ z" E- b' X
    476 Q4 ~0 N3 K' B8 z* E1 Z
    48
    6 G- a) {3 W9 T% S4 P" y6 |4 F49, Z8 x; a! T! N- V5 F& q7 b
    502 C: Z  F6 h* e1 F  p8 B4 z" o( G) s
    51+ M+ h# M& T3 `/ u  ?* f( t
    52
    . V5 K* ?  I" f+ [2 }1 Y4 X6 m: C539 u* d1 i0 z6 J3 j: G
    54
    & ^  [+ O2 Q( k2 k; f$ P# @3 \55
    ) I5 ~3 n% h" i$ V5 u$ @* u56
    ; A4 ]' C! `" [- a* |9 Y+ D# b57
    5 P3 ~2 n+ f# ]* [0 _58, M9 W$ x. N$ w8 J/ K- A
    59
    4 h7 f& c- s  m& b; v60# j+ ~9 c5 d# O
    61
    ( A- F" a+ s, |( P62
    0 a2 M/ r6 {' G! J% |+ f" ?7 d: w6 r63
    , s( |& x9 Q1 C4 q0 ?641 o% H1 R* ?, u; M+ V% {
    65# {8 M# k" Z# W/ J) U2 T
    66
    ' v. g  ?9 r+ o3 V' e4 k4 D67# z8 l1 s; ]/ ~! {  V+ E
    68
    & h9 H9 Y: D; D1 d697 r1 N. l! j+ h* k5 m
    70
    * v0 ^, Z9 E: `* D* t9 D2 V71
    ! s* J6 Y0 a6 D8 H- w: p# R72: o+ I3 ?5 }+ m7 F6 {# w
    73. J0 l# K( M  S6 U( F
    74
    + O& @# ~7 @, J7 M% l. n1 Q# ^将xml文件提取图像信息,主要使用xml和opencv,基于torch提取,代码比较凌乱。
    ) Y4 \/ K0 e1 p/ n% ?* H2 h$ b& R, w# l0 a9 A% g
    7 L; L' o  r, T! L; h
    import os
    0 C1 d+ @) t. ^0 Dimport numpy as np
    . L6 i  @3 Y9 Q! d/ Pimport cv2& A' g$ j$ o0 A1 y; G' l
    import torch! U0 ^5 t- H  d7 @
    import matplotlib.patches as patches9 i+ x0 }$ m) d; M
    import albumentations as A
    $ a0 A6 w( s. H! h& \from albumentations.pytorch.transforms import ToTensorV2$ }3 u7 C6 O0 ?& C% Q% ?  ^1 V/ f
    from matplotlib import pyplot as plt
      w; B3 W' I1 X& E- bfrom torch.utils.data import Dataset, }+ Z8 E& O& I& L
    from xml.etree import ElementTree as et% L7 ?( E/ g- x( l' u* g- k7 s
    from torchvision import transforms as torchtrans, c  ]: C# t& h  q- e; w

    9 ^; ~! n) w2 e1 {4 z5 _
    / T# _0 j1 K8 D6 P$ z
    # defining the files directory and testing directory* C$ @8 h5 S" z7 K2 k6 V
    train_image_dir = 'train/train/image'
    * e1 }5 @. g6 v0 s' U% Ptrain_xml_dir = 'train/train/xml'0 B4 [; o4 I& m
    # test_image_dir = 'test/test/image'& Z# P2 t$ m- S! B+ \, B4 s
    # test_xml_dir = 'test/test/xml') e) r& z, i1 v; t
    2 x, v) Y# e& M, ?/ j
    ( i# M5 f) x- `- i
    class FruitImagesDataset(Dataset):
    3 t3 ?1 w% ~$ \0 L6 ^9 o. o  Y4 t$ R: b' y, z7 Y" f0 j, ]3 s

    " G' r4 L* r" ]# o) ]    def __init__(self, image_dir, xml_dir, width, height, transforms=None):" D1 V4 u9 O2 J! ]0 P. n+ l/ c( N. s, P
            self.transforms = transforms  p6 J+ j) k& o6 a( w( A: U, u
            self.image_dir = image_dir
    * T, H' d$ |4 ?& p" S        self.xml_dir = xml_dir/ o! }/ A, }: a$ l$ P7 {. W% U
            self.height = height% m) L% S% x6 k
            self.width = width: M2 R! H$ y+ C% {
    ( A9 X% J+ K0 p
    $ P$ z( a* x. y6 }5 X
            # sorting the images for consistency, k2 K: f6 G# Z+ E+ b
            # To get images, the extension of the filename is checked to be jpg: N4 o. ^2 Z& m5 x" p, u8 F, L* Q
            self.imgs = [image for image in os.listdir(self.image_dir)
    1 k* G) r( N4 T" f                     if image[-4:] == '.jpg']
    / o8 D2 o, ~/ p# d1 u4 |  }7 H        self.xmls = [xml for xml in os.listdir(self.xml_dir)9 I( r' y0 f3 h1 {( [
                         if xml[-4:] == '.xml']+ |1 S" p1 U( R6 ]8 K& J6 \

    . F! S- V2 i2 h0 l. o
    0 x& v% }2 }' W
            # classes: 0 index is reserved for background+ M7 D* C( ~5 d3 @% G4 d
            self.classes = ['apple', 'banana', 'orange']
    6 _( T- P) I0 Q9 Y& E: Z2 J/ d5 [2 n( H- B6 l! Y, R
    / a5 d5 C, J: s. z: n
        def __getitem__(self, idx):/ P* v7 i# G# O% m. ]# F

      K2 s0 ?% {! O2 a7 n6 x) R
    $ @# R0 P( s& S
            img_name = self.imgs[idx]  K4 k& o* o$ ]% P; O
            image_path = os.path.join(self.image_dir, img_name)
    7 Z6 `$ W0 e: r# _- f
    8 g  {' X0 F' P6 n$ {) R

    0 Z/ E; D! W4 v- s* A        # reading the images and converting them to correct size and color, K9 \" U& p* {3 g- W. ]
            img = cv2.imread(image_path)" a$ L% F* S/ U! T+ C8 _
            img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.float32)% e2 S, X9 j( o. c2 [+ X
            img_res = cv2.resize(img_rgb, (self.width, self.height), cv2.INTER_AREA)
    : B2 r# [. y  L  z& U        # diving by 255& w3 Y' @& U$ l2 \, x
            img_res /= 255.0$ D' J* w! q- V% b; ~

    9 P. l+ c- b5 H  ^( P9 e( Z

    2 |9 W$ ~4 l3 f: f. s; U7 U        # annotation file
    , s, u0 T- Y- h  |* i1 t* S        annot_filename = img_name[:-4] + '.xml'
    2 r9 N, C' p# T" [6 D" I2 `        annot_file_path = os.path.join(self.xml_dir, annot_filename)
    ( _4 [8 U7 E& Z# M# K/ r
    , B  a+ J* A: S4 V" H+ ]

    ' R( ]4 ^. b. a6 N0 e) U2 H6 c        boxes = []
    : @! @+ I' @# d& @' Q8 c0 A        labels = []
    ) J, }* [- ~; v7 Q- H3 C        tree = et.parse(annot_file_path)
    & K, M2 G& g, K4 J; H% X! l        root = tree.getroot()
    & B* V3 Z5 `+ D* t4 I
    + |& \  I# x) j  \/ E5 M: j
    . G* `1 ?9 g# x; o
            # cv2 image gives size as height x width+ m. i0 R9 i  R9 l
            wt = img.shape[1]
    3 L1 Y9 W* Z6 o# G+ u, C        ht = img.shape[0]$ V6 h, ^- w/ v$ r

    6 e' y& K+ A  k; f, {% I

    - v- ]  @( s3 I0 W+ n        # box coordinates for xml files are extracted and corrected for image size given9 S. f* I# `0 |! m2 s
            for member in root.findall('object'):
    " ^4 D& |6 f% O+ l- W& P% L            labels.append(self.classes.index(member.find('name').text))
    0 e. J; M. Y5 W( I. {
    " M- }6 v9 }- W  \3 C! v/ t& I

    * K9 Z, g- W% E            # bounding box/ ]6 f5 L7 `9 ^
                xmin = int(member.find('bndbox').find('xmin').text)
    2 ^$ z* t( q$ m) V$ D% Z            xmax = int(member.find('bndbox').find('xmax').text), i& M8 F, n7 @- B4 E, w
    2 |) ]: A  @+ ~* Q4 L

    . N) e/ r6 |0 P, c9 B            ymin = int(member.find('bndbox').find('ymin').text)
    2 d# X7 K6 Z0 M            ymax = int(member.find('bndbox').find('ymax').text)4 s0 c0 S/ u/ M/ p2 P% g

    ( a+ `% L2 C: r0 K1 C

    9 F9 D' a; K8 c' ~* d  C, J6 S            xmin_corr = (xmin / wt) * self.width. V& L; a9 V1 `8 \3 p
                xmax_corr = (xmax / wt) * self.width
    / a; @+ \, n4 j            ymin_corr = (ymin / ht) * self.height' I4 M! p7 l+ b( z2 O0 j
                ymax_corr = (ymax / ht) * self.height
    . U) O. Z7 ^* c% R$ a            boxes.append([xmin_corr, ymin_corr, xmax_corr, ymax_corr])$ U" i7 f1 R. y% B; ~" B
    5 f! }* X, E/ }
    ( M7 b. O5 Y/ h% F
            # convert boxes into a torch.Tensor
    9 U# a# b$ @6 d- ?& J        boxes = torch.as_tensor(boxes, dtype=torch.float32)
    # w" D1 V+ f% m* q" J) _2 q9 z' v3 T9 S

    3 J) x" F$ W# N" e* ?- ?        # getting the areas of the boxes% |( P$ V2 Q. T( D+ @' A% N# W
            area = (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0])  X+ T( B; A2 {7 P# F$ T
    , q& z+ R" `, r! Y7 T5 u, J0 P
      }- X7 f- o) c. S$ T
            # suppose all instances are not crowd
    8 u/ q5 o* B) u8 n% L        iscrowd = torch.zeros((boxes.shape[0],), dtype=torch.int64)
      Z. }8 c9 y0 ?4 p+ W* @$ j2 ?% W2 C9 |  U

    % w5 e( ?6 U3 B* Q0 C5 C        labels = torch.as_tensor(labels, dtype=torch.int64)- C- U1 v% D0 }# a
    - P9 C3 `5 N3 e( q6 L8 F5 p4 {

    ) \3 G; j8 k2 q  B; |( o        target = {}
    % A. s6 B3 R5 |$ }; F        target["boxes"] = boxes
      w0 [: N& v1 M' x. K9 L        target["labels"] = labels
    ! O: M7 ?* D2 ^* S4 Z& ^5 Q6 b! b        target["area"] = area( }, Y7 C. M  `' j/ g% J
            target["iscrowd"] = iscrowd' ^; g- F! ^6 G! y6 V; @
            # image_id
    $ H9 N# M. K, P; o- x3 V4 y        image_id = torch.tensor([idx])
    % r0 J: j6 V% W: b; q6 X        target["image_id"] = image_id
    " W, T: S" L' `% d5 h" Y3 W5 G. I0 u+ n$ b  `* J
    0 Z" ]0 B% i) D4 x: h! V0 _! ^
            if self.transforms:* ?+ w+ s* H. p/ Q( K4 h
                sample = self.transforms(image=img_res,$ c, i+ Z, R; ~( f
                                         bboxes=target['boxes'],# L& M9 e& }9 I
                                         labels=labels)
    # q$ L3 m3 P% F: |1 H/ G) G
    5 m* s) V/ |2 P) G1 C
    & ~9 t& N0 I' }% X( n6 [
                img_res = sample['image']
    ' a. r, c; D# K            target['boxes'] = torch.Tensor(sample['bboxes'])
    , D3 d% s; h+ i, r" Z5 i0 V+ V$ ?0 r4 M& b$ l3 k

    $ M3 m1 G/ b6 K  b5 v5 l9 z- O        return img_res, target/ R; w& P: M4 H# i

    6 V/ q$ j4 D1 Z& n4 }0 a# p- k

    2 m5 H# P6 ^6 O( G    def __len__(self):
    9 ~, r; S, R$ S7 }$ P: M, b        return len(self.imgs)9 }( U- Z8 o0 b- W# _

    3 W' v( w+ D" r
    & c+ W( C/ e: V8 b
    # function to convert a torchtensor back to PIL image
    ; A2 G* J& T9 q2 A  zdef torch_to_pil(img):( j9 g6 E6 H8 q/ O5 u  n7 @
        return torchtrans.ToPILImage()(img).convert('RGB')- L0 m0 u4 u5 F- p

    2 j7 M* Z  j, }" [
    # m9 H! L( u* s6 `5 a" O
    * }+ n/ }/ S/ R" F0 I0 \5 i- @' Q  ^
    - |# A% c$ S+ a8 }
    def plot_img_bbox(img, target):: U& I7 N( Q, L  D# }5 B
        # plot the image and bboxes( K9 b& I0 X. h6 i0 `7 s
        fig, a = plt.subplots(1, 1)
    4 O4 @% Y) ^5 U2 Z* r    fig.set_size_inches(5, 5)
    - n+ s' i+ B3 |    a.imshow(img). ~/ s% b) c/ a2 O) [& x) g0 U+ N) a
        for box in (target['boxes']):) J7 h, O8 N6 V+ K
            x, y, width, height = box[0], box[1], box[2] - box[0], box[3] - box[1]
    + w; ?( ~! C$ w* j1 c        rect = patches.Rectangle((x, y),* L0 Y$ \; N, G; V
                                     width, height,
    1 M- k2 C4 P7 p                                 linewidth=2,
      T5 h5 `1 l( V' Q" Q$ V                                 edgecolor='r',) c5 v, M; @7 _% @  Q
                                     facecolor='none')6 Y& N" e% f! S% m/ X3 M' H
    ) `# v7 R4 M8 p4 \% c6 S
    $ R( t; ^9 ]- {3 h$ c
            # Draw the bounding box on top of the image
    0 o* S& A, q2 ~% c        a.add_patch(rect)8 U9 K' N0 }/ a7 y
        plt.show()
    ' E2 Y1 G% s# k7 W
    5 d6 I, d8 D1 h* Q4 c% \; d5 X! Y

    " B. t7 X) k  v7 `2 J% _7 I- \& B: D8 f( I( y8 B; |" W
      I4 T' C" M" k
    def get_transform(train):
    / X3 l* t1 I7 m/ M1 E8 M; \    if train:
    6 c" N( V% n. ^! ~, ]' }        return A.Compose([
    ' A! u9 b" Z6 k            A.HorizontalFlip(0.5),
    ; E! R9 D# L# ?, S            # ToTensorV2 converts image to pytorch tensor without div by 255- n" F. i; x2 c
                ToTensorV2(p=1.0)
    8 i* W, p( m( n" c7 \2 ~        ], bbox_params={'format': 'pascal_voc', 'label_fields': ['labels']})5 _3 i9 N5 ~4 ?/ M( z6 o
        else:2 S6 Z# g) D- Y8 u
            return A.Compose([
    1 J6 J. ~2 K6 E) k+ O9 C            ToTensorV2(p=1.0)
    . C5 C5 n+ I( C6 K) h" g4 i        ], bbox_params={'format': 'pascal_voc', 'label_fields': ['labels']})$ I& D" \& G, ]

    6 F4 L) L$ V0 o3 _& A& q# I: \( l

    ! m5 X0 [" h5 P; L( z
    ! k" Y# n7 ^% v
    2 n8 x% J$ q% O$ S7 e& U
    5 b: s' e7 J0 e+ b, z- c

    - L5 o5 q- H% e: I% ]+ @; ?2 idataset = FruitImagesDataset(train_image_dir,train_xml_dir, 480, 480, transforms= get_transform(train=True))
    0 Y* m/ @3 A* a" U1 G( G9 B  {6 n
    , S6 T# W1 Z% ^$ d
    ' W9 O2 [" D( `# w5 }$ A
    print(len(dataset))
    $ X  p8 N$ M8 A  z. n& \# getting the image and target for a test index.  Feel free to change the index.1 ^3 ^) h! ^& b* G! d8 X. ~
    img, target = dataset[29]
    0 h1 {2 p& n  N" Z: Y& o$ kprint(img.shape, '\n', target)1 p& t! J" v/ o* A* @
    plot_img_bbox(torch_to_pil(img), target)- @: R0 S4 Q/ c4 w$ k, P
    18 X7 s( G5 W6 E" O6 f" y% I
    2+ f2 ]. m/ `. D. ?
    3: E  @7 }. M$ ~
    4
    # j/ I) w, R; U4 U5: h3 d" T4 Z2 {0 F* {: [
    6
    . K' {. i9 K( N+ {1 ^0 R$ S7
    + {6 N- D9 q7 L/ H! ?7 q+ U8
    " x2 M6 ~& `# ^' h% T9
    " q5 o" ~  ?3 P4 W3 Y10, P* L4 k$ A" m2 I, U7 e# h
    11
    % A  _6 l, t) V12
    # W) i: I) Z/ g6 f" ]13/ x1 T1 p; s, M$ s
    14! n: {1 y4 W' y
    15* m+ b2 y% u/ ^  ?2 ?
    16. X& g' z- t  `; D& Y& s* G
    171 G8 b% a2 K8 D& r5 A5 M7 u! h+ q( C/ Z5 M
    18
    ) g3 m" Q0 }3 M! m/ x7 A19
    ' h5 G# }5 |, I  h20
    : b4 N/ S! p3 W3 |6 c21
    4 I' N" V4 M# u% V/ j  B22
    . ]8 t' L! `. u  I1 G23
    : P& ~9 T8 W0 `24  f; `; J8 B- V$ \+ ~2 R
    25
    6 M" m. r3 }) X- v6 q% \26- t0 d1 b4 c# J# f+ x" D, x( t& a
    27* c2 s6 W" I. V2 h. k) e
    287 R) T! a% v4 w4 ~# }9 I9 `
    29/ h! [/ \8 G8 f2 g8 _4 E
    30
    / C- U& c/ C# `4 `% F311 {3 ^. z* U% c) p* w
    32
    / g# m* v& l7 e% ?, h3 c$ c1 H33
      e2 f$ b- o! ^& W/ C343 s7 F* ]: X1 f+ W, M
    35
    ; _$ W1 U3 X& r2 C  T% F6 ^* l36
      J& R2 d, K# ~7 u6 j37
    0 _  L; }# m! l) y* L  Z38
    , U& w$ |) v& p9 o7 P1 A39
    ) p! Q1 L3 Y. U6 g7 r" w) q40# z8 U" B3 t+ f& ~& H6 W
    41
    ! N( u4 U9 `  ~9 Q# i426 }4 d$ H$ Z: W- |
    43
    * [1 u# @, S) `5 R444 V4 m) {* E7 E( g# L1 Z: M% Y
    45
    8 |9 w5 X( }9 ]" v' q46
    . K) k& P: B, u! d. V4 k) e47( ^* q. M6 p, `; w5 K8 W- U! A+ r' G
    48
    ' O' u/ ^7 \# A# ?* ?* L, E49
    8 o- S& W' l2 d50
    7 G& E+ ]' H; X7 f, o51
    ; s% M8 X% M2 m( h52
    ) g! U0 |9 s+ z5 ]  Q7 b531 Y: A+ o! O  K" [" w
    54! S: l( ?  t' \. {. M' j& {
    55' e9 Y$ ~. |+ i1 G* j
    56; c- q: t! z6 T( `7 Z0 [
    57% [, }  l$ {" X/ H+ H
    58. ^. ~9 f4 ^4 U/ F5 _3 m: d- s
    59  E7 i; X- b6 _: u. ~  O1 p
    60
    & o4 \: W* u) D3 l1 T61% L/ V8 a: U$ N
    626 j" n/ ^# p7 k* a! l5 X
    63
    ; X* n. g# f/ n8 R2 `64
    ( o% Y! R9 t' o& `: x654 H" X( R8 K; s3 m8 X8 H( `/ B7 [, _
    66% G# E, J6 E; d! j9 g5 Y
    678 Z6 U- A$ L; ~7 Q4 o7 s/ W
    68
    + R' u$ Q. r( _69
    : W* a% O) e7 t6 I5 n2 k4 j7 Q704 R; R2 u' f; O% ]) H9 v9 m* M
    71( @/ F9 c1 |8 f6 w( A
    72
    & d) Z7 o( H5 C) n* b: Z3 l736 B7 P- C$ X; g4 ~
    74
    " c- _* K+ j; m( m+ p5 F4 n756 [7 g  C3 Q9 Z/ _" @* G
    76/ @  v6 P  x; K
    777 r/ F! C# b5 H; x+ x
    78, ?& i7 s' b3 Y: U  C& c" X/ r' q
    79, E6 M0 q1 m" D* d* i( _9 \: P
    80  F. D4 h/ o; y; S$ r
    81, R, V# p7 g& O+ p2 u0 W
    82
    : V# g) q$ _% x5 j83# Q+ ~# u; C, U# L2 f! _* V
    84" u( W. `3 q: S% e% c1 w
    851 [: D! E& _  t5 I; N' S4 Q5 u6 t8 Z7 Y
    86- a9 \8 ^% i1 q7 ~8 F! E
    87( A; t4 H- T7 w2 ]
    88' D$ y: c3 D( N, V) ]# d5 X  ?, L. C
    896 T7 f: o% Z& L! T8 g0 e
    90
    & Z; [3 M. B% O/ j, _( }5 R! G+ u" r91
    : J& [- f( N' H# J5 o6 a923 i! ~' s! X! V8 V) J0 Y! \8 T
    930 }+ w- E" ?4 @
    94: h6 ^. L  Y! w
    95
    : u' v9 x5 S, W96
    9 [! b' i7 N0 p- j97
    $ C7 \0 S- t( N+ p- U# ?98$ S; J2 V( f. `# B: D
    99
    % N8 B$ v8 i& e+ q. {3 V1008 E( r' `! A' J/ m( S9 s5 B* ?
    101! C4 A& N. j! b0 \
    102  f0 V+ j& C0 Y1 B% g% R( _) Q$ L
    103
    / Z- X# q$ A# H/ ^104
    4 U, B/ `+ c: f" A: I: L3 \" R105
    7 `: }& {9 z! A/ }: c1 r106
    ; @! i# B5 H# y3 u: D* x107
    " U) X# q# i9 W7 N# m1 n% h108
    ) g, Y; Z6 \' s0 i109
    / s/ U' n; t2 u5 T# |! d6 Y5 n& u1105 i/ [: c& j; v: I8 n+ [
    111# k+ j* V5 m+ e3 B, Q
    1128 f$ R1 A% ]1 A9 ^* [2 W# g5 h& t
    113. V1 u1 u! T$ `, L* J: d* m
    114
    4 O' H, u0 E3 X6 j. C9 D115
    - Y; V* I) k7 {* A" p116
    " N3 ?7 U* N# i' T& p117& v  F: m! S" e) `2 L" y% U
    1183 j# p) b! p9 r% Z) g& H4 a( Q; E
    119
    ' c/ s' t8 I2 v# [2 w. ~: v8 D; J120& q% ?7 P# _5 s, Z; R, x
    121+ r; E2 Y' u! P: r( F% t& w8 ^
    122
    0 p% s3 |) \; x- m1234 S5 `7 b* h0 k5 O4 ?3 e. M; R: {0 I5 K
    124
    0 _! D) }: z7 n# }125
    & _% U, h4 A( U126! B# n9 W8 A1 c- ^: p- `
    1279 S* Q, w2 V: i
    128
    7 v# ^1 o" k" [" \- j. H$ q# i$ e+ ]129
    , ^% Y4 z( U3 S& n4 ?1303 T2 _% _' p% Z( ^
    131) h% u8 m4 S- w! \! R/ g
    132
    # C9 C: h4 y" e  }$ }133
      f; [8 f; B. x  ~) V134
    ; k0 h( ^1 P, A, y8 Y135
    9 {, S& ?8 x3 D) V/ e  m8 Q5 D0 [136
    * a5 x# B" S5 H3 k# R: @2 S137
    ) D& U9 o8 M* K% |/ A& h138) n7 o3 B% \1 F# w3 Z4 {- `) ]
    139  I4 g! ~% _# o3 G9 L9 o% C* N
    140% j& K( a( K  f  Y5 Z+ d6 q
    141: T4 A- r" O4 W. d& K
    142. v' ?$ D# V3 h
    143
    5 N* E/ U! c3 O& p; U144
    " d2 W+ b/ @: o7 n& ?5 ~7 Z145
    : ?3 m  Q0 n$ ]. s1 l146
    9 t: Q: w" T. [1 D9 ~& Z147
    % S- x/ K* W8 i9 P- T* }' l& S$ O5 l148
    7 `' w7 X2 @: f149
    ; R& o# Q5 p9 L( L8 d150# z/ h. h4 \5 L  h4 d6 ~
    151$ F; G) {( j1 W( n- t0 K
    152
    9 {5 C8 M+ x+ r153$ m8 X/ _6 v* Z, F& ^
    154
    ( m  f# u/ y, R7 i- Q8 Y155" U. W4 k* K' B4 u  A* Y
    156
    - c+ ~7 S! S5 e, Y! l  A输出如下:) Z4 b! Q, l1 m; W4 s9 |/ B% ~
    * U: t4 A( c8 b0 n7 }9 i" q1 m3 f
    & C6 f8 V; n- P- O
    torch.Size([3, 480, 480])   B5 b7 ^' G! ?6 b
    {'boxes': tensor([[130.8000,  97.8000, 327.6000, 292.2000],
    0 V- ^; T2 {% l0 x( U# B: S, O        [159.0000, 268.8000, 349.8000, 427.8000],
    " C, H' y! K2 ~3 v  i( a        [  0.0000, 282.0000, 118.2000, 429.6000],8 u# L7 b$ d3 O% j$ \! S
            [ 43.8000, 107.4000, 199.2000, 280.2000],
    - G" e0 F- t! L; K8 }4 R2 ~        [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])}
    5 ?# T9 v" z5 j$ e1
    1 J/ F3 j! M3 d; E28 u% l2 ?- o" K4 R" e/ @
    3* w% |6 G; k9 }$ B3 |* y4 w
    4
    , p# K" c4 V" b4 Z' j9 }' N5- |* p4 W+ a( J
    6
    % w/ `$ h( O  G4 A$ N4 C
    $ h! @- l& P% E1 b$ j
    5 @8 L/ Q$ T+ q( j7 |$ x) \) \4 }
    % C2 v( V0 G. {* ^

    8 E( }! s9 s' ]1 m- m; S) H下载地址/ t: f; s* H* u- D' k
    链接:https://pan.baidu.com/s/1QZDgeYTHyAlD2xhtJqZ-Yw) F+ e+ j5 Y/ j. d
    提取码:srjn
    * c* {% X( ?. S  V: _0 ^' N) n————————————————
    . w- M/ f2 b) P版权声明:本文为CSDN博主「刘润森!」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 L$ w  j" D3 o- k6 m& l
    原文链接:https://blog.csdn.net/weixin_44510615/article/details/118496273
    ( {2 {1 p% J4 m- [! b/ F. ^7 n' D$ r$ {6 M6 I

    + h- Y, j& }( a! N) A+ t
    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-9-13 23:53 , Processed in 1.101300 second(s), 51 queries .

    回顶部